From sandeen@redhat.com Sat Aug 1 01:02:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D11887F54 for ; Sat, 1 Aug 2015 01:02:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FA8D8F8035 for ; Fri, 31 Jul 2015 23:02:03 -0700 (PDT) X-ASG-Debug-ID: 1438408922-04bdf06bd219dcb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zJKHyERI8NXJeUHh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 31 Jul 2015 23:02:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 34768A0B68 for ; Sat, 1 Aug 2015 06:02:02 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7161xNE024886 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sat, 1 Aug 2015 02:02:01 -0400 Message-ID: <55BC60D7.4020102@redhat.com> Date: Fri, 31 Jul 2015 23:01:59 -0700 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: xfs_repair: Fix malloc size of rt_ext_tree_ptr (harmless) Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: xfs_repair: Fix malloc size of rt_ext_tree_ptr (harmless) Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438408922 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 rt_ext_tree_ptr points to an avl64tree_desc_t, but we malloc memory according to the size of avltree_desc_t. Oddly, the latter happens to be larger, so we're ok, but may as well make it correct. Addresses-Coverity-Id: 1297533 Signed-off-by: Eric Sandeen --- Hm, I thought I sent this already, but don't see it on the list. diff --git a/repair/incore_ext.c b/repair/incore_ext.c index 826bf44..6611d5c 100644 --- a/repair/incore_ext.c +++ b/repair/incore_ext.c @@ -783,7 +783,7 @@ incore_ext_init(xfs_mount_t *mp) avl_init_tree(extent_bcnt_ptrs[i], &avl_extent_bcnt_tree_ops); } - if ((rt_ext_tree_ptr = malloc(sizeof(avltree_desc_t))) == NULL) + if ((rt_ext_tree_ptr = malloc(sizeof(avl64tree_desc_t))) == NULL) do_error(_("couldn't malloc dup rt extent tree descriptor\n")); avl64_init_tree(rt_ext_tree_ptr, &avl64_extent_tree_ops); From diagnostiic.smt@gmail.com Sat Aug 1 05:47:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HK_SCAM_S7,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E8AB7F75 for ; Sat, 1 Aug 2015 05:47:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D93C6304048 for ; Sat, 1 Aug 2015 03:46:59 -0700 (PDT) X-ASG-Debug-ID: 1438426017-04bdf06bd01a2a90001-NocioJ Received: from mail-wi0-f195.google.com (mail-wi0-f195.google.com [209.85.212.195]) by cuda.sgi.com with ESMTP id kfDwzYAjpeQzWjrM (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 01 Aug 2015 03:46:58 -0700 (PDT) X-Barracuda-Envelope-From: diagnostiic.smt@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.195 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.195] Received: by wixh2 with SMTP id h2so7067366wix.2 for ; Sat, 01 Aug 2015 03:46:57 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.195] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.195] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=vzAwaTwPgRfb0nYHZO1y2Rp5DbwjcqN04hBD+Q5CmiU=; b=gQgtRTc2H3a3LzTDYrTxdcn1F8+2+rcE4l23jkaywMUh3uFD5Snh5sHx3etb8VP/1J iuv3Vp3hwObmUg8HTngMK3P218FZ8j2G6BYrJYxZcfv56mLtLE600lJQcyJy3DexQ7E8 Vv7wUxf1ahFUhM/oH3C2ngHB4UT27YCn+36iPEsv6vOvAZH5jJsNuHwm3VA6qjxMFYJX GbppeghTkhDRgsYjO6LqQ9zFKhlrxu/9C3ZcSnA2yNg3BMrGXYzVb6Yj23i3Z89vmV7r PdUon9OzOYZ0lS/fR+12KLapiB+zAUWDRQakALDSLZtduiKScPsuT1HqaIChza3slRuP Ocwg== MIME-Version: 1.0 X-Received: by 10.194.61.44 with SMTP id m12mr15364159wjr.103.1438426016962; Sat, 01 Aug 2015 03:46:56 -0700 (PDT) Received: by 10.194.24.231 with HTTP; Sat, 1 Aug 2015 03:46:56 -0700 (PDT) Reply-To: jkinder013@gmail.com Date: Sat, 1 Aug 2015 18:46:56 +0800 Message-ID: Subject: Happy Weekend From: "Mr. Joseph" X-ASG-Orig-Subj: Happy Weekend To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=047d7b6700dfc6e123051c3da7b1 X-Barracuda-Connect: mail-wi0-f195.google.com[209.85.212.195] X-Barracuda-Start-Time: 1438426017 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646, BSF_SC0_TG783c, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0646 Custom rule MV0646 0.30 BSF_SC0_TG783c Custom Rule TG783c --047d7b6700dfc6e123051c3da7b1 Content-Type: text/plain; charset=UTF-8 *Happy WeekendI am Mr. Joseph. I have an important business proposal/investment that will be beneficial to discuss with you, reply to my email for more details. * *I anticipate your prompt response.Best Regards,Mr. Joseph* --047d7b6700dfc6e123051c3da7b1 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
= Happy Weekend

I am Mr. Joseph. I have an important business proposal/investment tha= t will be beneficial to discuss with you, reply to my=C2=A0email for more details.=C2=A0
<= /div>

I anticipate your prompt response.

Best Regards,
Mr. Joseph
--047d7b6700dfc6e123051c3da7b1-- From jeffpc@josefsipek.net Sat Aug 1 07:51:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 843B97F77 for ; Sat, 1 Aug 2015 07:51:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 635AD8F8033 for ; Sat, 1 Aug 2015 05:51:41 -0700 (PDT) X-ASG-Debug-ID: 1438433494-04bdf06bd01a4ea0001-NocioJ Received: from josefsipek.net (josefsipek.net [71.174.113.7]) by cuda.sgi.com with ESMTP id GK2kFu7oqGQ5VknJ for ; Sat, 01 Aug 2015 05:51:34 -0700 (PDT) X-Barracuda-Envelope-From: jeffpc@josefsipek.net X-Barracuda-Apparent-Source-IP: 71.174.113.7 Received: from meili.valhalla.31bits.net (meili.valhalla.31bits.net [172.27.0.10]) by josefsipek.net (Postfix) with ESMTPSA id CF18F55654; Sat, 1 Aug 2015 08:51:33 -0400 (EDT) Date: Sat, 1 Aug 2015 08:51:35 -0400 From: Josef 'Jeff' Sipek To: "Darrick J. Wong" Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 22/24] xfs: swap inode reflink flags when swapping inode extents Message-ID: <20150801125135.GC101746@meili.valhalla.31bits.net> X-ASG-Orig-Subj: Re: [PATCH 22/24] xfs: swap inode reflink flags when swapping inode extents References: <20150729223258.17414.91354.stgit@birch.djwong.org> <20150729223519.17414.25444.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150729223519.17414.25444.stgit@birch.djwong.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: josefsipek.net[71.174.113.7] X-Barracuda-Start-Time: 1438433494 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Jul 29, 2015 at 03:35:19PM -0700, Darrick J. Wong wrote: > When we're swapping the extents of two inodes, be sure to swap the > reflink inode flag too. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/xfs_bmap_util.c | 5 +++++ > 1 file changed, 5 insertions(+) > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 349a5a6..7bdec90 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1929,6 +1929,11 @@ xfs_swap_extents( > break; > } > > + if (xfs_is_reflink_inode(ip)) { > + tip->i_d.di_flags2 |= XFS_DIFLAG2_REFLINK; > + ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; Are you guaranteed that the temp inode does not have the flag set to begin with? This doesn't swap, but rather moves over the flag one way, and clears it the other way. Jeff. > + } > + > xfs_trans_log_inode(tp, ip, src_log_flags); > xfs_trans_log_inode(tp, tip, target_log_flags); > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Si hoc legere scis nimium eruditionis habes. From jeffpc@josefsipek.net Sat Aug 1 08:01:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2B1977F77 for ; Sat, 1 Aug 2015 08:01:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7E08AC001 for ; Sat, 1 Aug 2015 06:01:31 -0700 (PDT) X-ASG-Debug-ID: 1438434089-04bdf06bd11a5200001-NocioJ Received: from josefsipek.net (josefsipek.net [71.174.113.7]) by cuda.sgi.com with ESMTP id HrvPLCqYspxaqt6H for ; Sat, 01 Aug 2015 06:01:30 -0700 (PDT) X-Barracuda-Envelope-From: jeffpc@josefsipek.net X-Barracuda-Apparent-Source-IP: 71.174.113.7 Received: from meili.valhalla.31bits.net (meili.valhalla.31bits.net [172.27.0.10]) by josefsipek.net (Postfix) with ESMTPSA id 9C79A55654; Sat, 1 Aug 2015 09:01:29 -0400 (EDT) Date: Sat, 1 Aug 2015 09:01:31 -0400 From: Josef 'Jeff' Sipek To: "Darrick J. Wong" Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [RFC v2 00/24] xfs: add reflink and dedupe support Message-ID: <20150801130131.GD101746@meili.valhalla.31bits.net> X-ASG-Orig-Subj: Re: [RFC v2 00/24] xfs: add reflink and dedupe support References: <20150729223258.17414.91354.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150729223258.17414.91354.stgit@birch.djwong.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: josefsipek.net[71.174.113.7] X-Barracuda-Start-Time: 1438434089 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Jul 29, 2015 at 03:32:59PM -0700, Darrick J. Wong wrote: > Hi all, > > This is the second revision of an RFC for adding to XFS kernel support > for mapping multiple file logical blocks to the same physical block, > more commonly known as reflinking. The implementation a single [block > range, refcount] tree to track the reference counts of extents of > physical blocks. There's also support code to provide the desired > copy-on-write behavior and the userland interfaces to reflink, query > the status of, and un-reflink files. This is cool work. I have a random thought to share... IIRC, you keep a per-inode flag to avoid expensive ops on files that have no refcounted blocks. ZFS keeps a bit in each block pointer to indicate that the target is dedup'd. I'd have to check if xfs has a spare bit in its block pointer, but if it does that's one way to minimize the refcount btree overhead. Jeff. -- mainframe, n.: An obsolete device still used by thousands of obsolete companies serving billions of obsolete customers and making huge obsolete profits for their obsolete shareholders. And this year's run twice as fast as last year's. From david@fromorbit.com Sat Aug 1 17:52:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9278E7F74 for ; Sat, 1 Aug 2015 17:52:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D5DF304039 for ; Sat, 1 Aug 2015 15:52:36 -0700 (PDT) X-ASG-Debug-ID: 1438469553-04cb6c673f271c50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NsyKAG32rf3VPDaz for ; Sat, 01 Aug 2015 15:52:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlBwBjTL1VPG0mLHlbGQEBgn9UaYZRolcBBQaVG4V7BAICgSFNAQEBAQEBBwEBAQFBP4QjAQEBAQIBOhwjBQsIAxgJJQ8FJQMHGhOIJgfGYwEBCAIgGYYGhTCFCAeELAWHF4ZghwKEe4dPgUlGjxqIIYQ1LDGCTAEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail06.adl2.internode.on.net with ESMTP; 02 Aug 2015 08:22:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZLfdm-0005v2-VY; Sun, 02 Aug 2015 08:52:31 +1000 Date: Sun, 2 Aug 2015 08:52:30 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: Daniel Bast , 793495@bugs.debian.org, xfs@oss.sgi.com, Breno Leitao Subject: Re: xfsprogs fails to build on debian ppc64el Message-ID: <20150801225230.GR16638@dastard> X-ASG-Orig-Subj: Re: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55BBEF4F.6070809@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1438469553 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jul 31, 2015 at 06:57:35PM -0300, Fernando Seiti Furusato wrote: > That error is common when configure is generated using out-of-date config.guess > and config.sub. > The ones that come with the package are, in fact, old. config.sub and config.guess are generated by the build, we don't ship them directly from the git repository. Perhaps you are building from a release tarball rather than from a clean git repository working area? Can you confirm this is the case? If so, can you remove the configure, config.sub and config.guess files and see if you get the same problem? > This package used to run dh_autotools-dev_updateconfig and > dh_autotools-dev_restoreconfig, which worked because it only updates those > files. > > They were replaced by dh_autoreconf and dh_autoreconf_clean, which should > update them, but does not run flawlessly. > I think something is wrong with the m4 macros but I am not sure what. > There are errors when running dh_autoreconf alone. > > # dh_autoreconf > libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. > libtoolize: copying file `./ltmain.sh' > libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. > libtoolize: copying file `m4/libtool.m4' > libtoolize: copying file `m4/ltoptions.m4' > libtoolize: copying file `m4/ltsugar.m4' > libtoolize: copying file `m4/ltversion.m4' > libtoolize: copying file `m4/lt~obsolete.m4' > libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. > autoheader: warning: missing template: HAVE_UMODE_T > autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], [Description]) > autoheader: warning: missing template: HAVE___PSINT_T > autoheader: warning: missing template: HAVE___PSUNSIGNED_T > autoheader: warning: missing template: HAVE___U32 > autoreconf: /usr/bin/autoheader failed with exit status: 1 > dh_autoreconf: autoreconf -f -i returned exit code 1 > > I will keep working on it, but all I will be able to do if I get to a conclusion > is send a patch here. > Thus it will have to be dealt with by the maintainers anyway. The XFS list is cc'd on the bug, so the upstream maintainers are watching and will see the patch when you post it. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Sat Aug 1 17:57:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B1607F77 for ; Sat, 1 Aug 2015 17:57:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 064DEAC001 for ; Sat, 1 Aug 2015 15:57:07 -0700 (PDT) X-ASG-Debug-ID: 1438469826-04bdf06bcf1ae250001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 3ti0qDJo8q16bDDL (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 01 Aug 2015 15:57:06 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZLfiB-0007mx-UC; Sat, 01 Aug 2015 22:57:03 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Dave Chinner , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Sat, 01 Aug 2015 22:57:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143846955628301 (code B ref 793495); Sat, 01 Aug 2015 22:57:02 +0000 Received: (at 793495) by bugs.debian.org; 1 Aug 2015 22:52:36 +0000 Received: from ipmail06.adl2.internode.on.net ([150.101.137.129]) by buxtehude.debian.org with esmtp (Exim 4.84) (envelope-from ) id 1ZLfds-0007M2-Cf for 793495@bugs.debian.org; Sat, 01 Aug 2015 22:52:36 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlBwBjTL1VPG0mLHlbGQEBgn9UaYZRolcBBQaVG4V7BAICgSFNAQEBAQEBBwEBAQFBP4QjAQEBAQIBOhwjBQsIAxgJJQ8FJQMHGhOIJgfGYwEBCAIgGYYGhTCFCAeELAWHF4ZghwKEe4dPgUlGjxqIIYQ1LDGCTAEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail06.adl2.internode.on.net with ESMTP; 02 Aug 2015 08:22:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZLfdm-0005v2-VY; Sun, 02 Aug 2015 08:52:31 +1000 Date: Sun, 2 Aug 2015 08:52:30 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: Daniel Bast , 793495@bugs.debian.org, xfs@oss.sgi.com, Breno Leitao Message-ID: <20150801225230.GR16638@dastard> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55BBEF4F.6070809@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438469826 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jul 31, 2015 at 06:57:35PM -0300, Fernando Seiti Furusato wrote: > That error is common when configure is generated using out-of-date config.guess > and config.sub. > The ones that come with the package are, in fact, old. config.sub and config.guess are generated by the build, we don't ship them directly from the git repository. Perhaps you are building from a release tarball rather than from a clean git repository working area? Can you confirm this is the case? If so, can you remove the configure, config.sub and config.guess files and see if you get the same problem? > This package used to run dh_autotools-dev_updateconfig and > dh_autotools-dev_restoreconfig, which worked because it only updates those > files. > > They were replaced by dh_autoreconf and dh_autoreconf_clean, which should > update them, but does not run flawlessly. > I think something is wrong with the m4 macros but I am not sure what. > There are errors when running dh_autoreconf alone. > > # dh_autoreconf > libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. > libtoolize: copying file `./ltmain.sh' > libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. > libtoolize: copying file `m4/libtool.m4' > libtoolize: copying file `m4/ltoptions.m4' > libtoolize: copying file `m4/ltsugar.m4' > libtoolize: copying file `m4/ltversion.m4' > libtoolize: copying file `m4/lt~obsolete.m4' > libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. > autoheader: warning: missing template: HAVE_UMODE_T > autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], [Description]) > autoheader: warning: missing template: HAVE___PSINT_T > autoheader: warning: missing template: HAVE___PSUNSIGNED_T > autoheader: warning: missing template: HAVE___U32 > autoreconf: /usr/bin/autoheader failed with exit status: 1 > dh_autoreconf: autoreconf -f -i returned exit code 1 > > I will keep working on it, but all I will be able to do if I get to a conclusion > is send a patch here. > Thus it will have to be dealt with by the maintainers anyway. The XFS list is cc'd on the bug, so the upstream maintainers are watching and will see the patch when you post it. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Aug 1 17:58:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F27BA7F7D for ; Sat, 1 Aug 2015 17:58:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9ECE4AC003 for ; Sat, 1 Aug 2015 15:58:49 -0700 (PDT) X-ASG-Debug-ID: 1438469926-04bdf06bd21ae2b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id hOTGKMO825poOTfh for ; Sat, 01 Aug 2015 15:58:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BgBwChTr1VPG0mLHlbGQEBAYJ+gT2GUaJXAQUGmxYEAgKBIE0BAQEBAQEHAQEBAUE/hCQBAQQ6HCMQCAMYCSUPBSUDBxoTiC3GYgEBCAIgGYYGhTCFCAeELAWUeYxKmUqENSwxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail06.adl2.internode.on.net with ESMTP; 02 Aug 2015 08:28:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZLfjN-0005vf-7X; Sun, 02 Aug 2015 08:58:17 +1000 Date: Sun, 2 Aug 2015 08:58:17 +1000 From: Dave Chinner To: Josef 'Jeff' Sipek Cc: "Darrick J. Wong" , xfs@oss.sgi.com Subject: Re: [RFC v2 00/24] xfs: add reflink and dedupe support Message-ID: <20150801225817.GS16638@dastard> X-ASG-Orig-Subj: Re: [RFC v2 00/24] xfs: add reflink and dedupe support References: <20150729223258.17414.91354.stgit@birch.djwong.org> <20150801130131.GD101746@meili.valhalla.31bits.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150801130131.GD101746@meili.valhalla.31bits.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1438469926 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 01, 2015 at 09:01:31AM -0400, Josef 'Jeff' Sipek wrote: > On Wed, Jul 29, 2015 at 03:32:59PM -0700, Darrick J. Wong wrote: > > Hi all, > > > > This is the second revision of an RFC for adding to XFS kernel support > > for mapping multiple file logical blocks to the same physical block, > > more commonly known as reflinking. The implementation a single [block > > range, refcount] tree to track the reference counts of extents of > > physical blocks. There's also support code to provide the desired > > copy-on-write behavior and the userland interfaces to reflink, query > > the status of, and un-reflink files. > > This is cool work. I have a random thought to share... IIRC, you keep a > per-inode flag to avoid expensive ops on files that have no refcounted > blocks. ZFS keeps a bit in each block pointer to indicate that the target > is dedup'd. I'd have to check if xfs has a spare bit in its block pointer, > but if it does that's one way to minimize the refcount btree overhead. No, we don't. We'd have to steal a bit from the extent length field, similar to the way unwritten extents were implemented. As it is, we still need a separate tree to track the shared extent refcounts, so making this more fine grained to optimise freeing of extents can be looked at further down the track once we have an idea where the bottlenecks in the shared extent system are.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bounce@scienceknowconferences.com Sat Aug 1 23:38:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 59DA37F7B for ; Sat, 1 Aug 2015 23:38:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6AA2AC001 for ; Sat, 1 Aug 2015 21:38:42 -0700 (PDT) X-ASG-Debug-ID: 1438490316-04cbb0416d201020001-NocioJ Received: from armoniaeventos.vservers.es (scienceknowconferences.com [149.62.168.164]) by cuda.sgi.com with ESMTP id 4TXv4NZ2ActXvlD5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Aug 2015 21:38:38 -0700 (PDT) X-Barracuda-Envelope-From: bounce@scienceknowconferences.com X-Barracuda-Apparent-Source-IP: 149.62.168.164 Received: by armoniaeventos.vservers.es (Postfix, from userid 10000) id AF82F49B36B; Sun, 2 Aug 2015 05:38:35 +0100 (WEST) DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=6353; s=acy; t=1438490315; c=relaxed/simple; h=from:to:subject; d=scienceknowconferences.com; bh=+yWQ4DBgi/0aDe5ik+URGO5fPcE=; b=q4bZCcFWwlfdAMEAWD7rGmixyIr5GEGX+am63qkXZ2OWE9TmCXOy1Z4OnpHZ vTRc15kkZ1giREqQ7vbUE5r6jqbDV6kt7JdTPSKq+vq41y/pLMKx/M9gpjA3 PQwClD+2kk68N3ER62z+Op+JTVg0ESHl9xYVgnIkpTX5NSwCUrM= Date: Sun, 2 Aug 2015 06:38:35 +0200 To: Xfs From: ScienceKNOW Conferences Reply-To: bounce@scienceknowconferences.com Subject: Deadlines extended: International Congress on Education, Innovation and Learning Technologies (Granada, Spain) Message-ID: X-ASG-Orig-Subj: Deadlines extended: International Congress on Education, Innovation and Learning Technologies (Granada, Spain) X-Priority: 3 X-Mailer: PHPMailer 5.2.6 (https://github.com/PHPMailer/PHPMailer/) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_cb8e0167b5829914300a50ad0793ee04" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: scienceknowconferences.com[149.62.168.164] X-Barracuda-Start-Time: 1438490317 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, BSF_SC0_SA085, BSF_SC7_SA_HREF_HTTP_MISMATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21287 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_HTTP_MISMATCH BODY: Custom Phishing Mismatch -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA074b Custom Rule SA074b 0.10 BSF_SC0_SA085 Custom Rule SA085 --b1_cb8e0167b5829914300a50ad0793ee04 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit International Congress in Education, Innovation and Learning Technologies Granada, Spain 21st - 23rd September, 2015 Deadlines Abstracts sending: August 15th 2015 Decision notification: August 20th 2015 Early bird registration: August 30th 2015 (Please note that it is not compulsory to submit an Abstract to attend the Conference) Dear Colleague, We would like to remember you that the call to submit abstracts to the International Congress on Education, Innovation and Learning Technologies (ICEILT) is now open. Best time to register with ICEILT with lowest Registration Fee as early bird registration. The conference will be held at the World Heritage City of Granada ( http://whc.unesco.org/en/list/314 ) (Spain), in September 2015. Please register on the following link: http://iceilt.com/registration/on-line-registration-form/ ( http://iceilt.com/registration/on-line-registration-form/ ) Looking forward for your quick and positive response. Best regards, Paulo Sérgio Duque de Brito President of the Organizing Committee International Congress on Education, Innovation and Learning Technologies (ICEILT) E-mail: info@iceilt.com ( mailto:info@iceilt.com ) Webpage: www.iceilt.com ( http://www.iceilt.com ) Facebook: Click here for ICEILT's Facebook page ( https://www.facebook.com/pages/International-Congress-on-Education-Innovation-and-Learning-Technologies/1391116977785408 ) Twitter: @ICEILT ( https://twitter.com/ICEILT ) --b1_cb8e0167b5829914300a50ad0793ee04 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit Deadlines extended: International Congress on Education, Innovation and Learning Technologies (Granada, Spain)

International Congress in Education, Innovation and Learning Technologies

Granada, Spain
21st - 23rd September, 2015

Deadlines
Abstracts sending: August 15th 2015
Decision notification: August 20th 2015
Early bird registration: August 30th 2015

(Please note that it is not compulsory to submit an Abstract to attend the Conference)

Dear Colleague,
 
We would like to remember you that the call to submit abstracts to the International Congress on Education, Innovation and Learning Technologies (ICEILT) is now open. Best time to register with ICEILT with lowest Registration Fee as early bird registration.
 
The conference will be held at the World Heritage City of Granada (Spain), in September 2015.
 
Please register on the following link: http://iceilt.com/registration/on-line-registration-form/
 
Looking forward for your quick and positive response.
 
Best regards,
 
Paulo Sérgio Duque de Brito
President of the Organizing Committee
International Congress on Education, Innovation and Learning Technologies (ICEILT)
 
E-mail: info@iceilt.com
Webpage: www.iceilt.com
Facebook: Click here for ICEILT's Facebook page
Twitter: @ICEILT
  
--b1_cb8e0167b5829914300a50ad0793ee04-- From zqcj@rhmw.com Sun Aug 2 04:09:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=DEAR_SOMETHING, HTML_IMAGE_ONLY_12,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 898447F6F for ; Sun, 2 Aug 2015 04:09:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35D97AC001 for ; Sun, 2 Aug 2015 02:09:55 -0700 (PDT) X-ASG-Debug-ID: 1438506561-04bdf06bd01b56d0001-NocioJ Received: from rhmw.com ([100.42.227.142]) by cuda.sgi.com with ESMTP id RDRTSAN0jIJXUBQP for ; Sun, 02 Aug 2015 02:09:51 -0700 (PDT) X-Barracuda-Envelope-From: zqcj@rhmw.com X-Barracuda-Apparent-Source-IP: 100.42.227.142 Received: from MLCKTHQR8RLO1R1 ([127.0.0.1]) by localhost via TCP with ESMTPA; Sun, 02 Aug 2015 17:09:56 +0800 Disposition-Notification-To: rolandpower@yeah.net MIME-Version: 1.0 From: Roland Sender: Roland To: xfs@oss.sgi.com Reply-To: Roland Date: 2 Aug 2015 17:09:56 +0800 Subject: =?utf-8?B?c29sYXIgc3RyZWV0IGxpZ2h0IDMwd2F0dCB0byB4ZnM=?= Content-Type: multipart/mixed; boundary=--boundary_181879_c94da963-14f5-46cb-8a42-70058c15b673 X-ASG-Orig-Subj: =?utf-8?B?c29sYXIgc3RyZWV0IGxpZ2h0IDMwd2F0dCB0byB4ZnM=?= X-Barracuda-Connect: UNKNOWN[100.42.227.142] X-Barracuda-Start-Time: 1438506591 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_IMAGE_ONLY_12, HTML_MESSAGE, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 1.63 HTML_IMAGE_ONLY_12 BODY: HTML: images with 800-1200 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150802090955.D716CA42184@cuda.sgi.com> ----boundary_181879_c94da963-14f5-46cb-8a42-70058c15b673 Content-Type: multipart/alternative; boundary=--boundary_181878_a7e6cde2-b76b-4073-b231-3bcc239be08c ----boundary_181878_a7e6cde2-b76b-4073-b231-3bcc239be08c Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 DQpEZWFyJm5ic3A7U2lyLA0KJm5ic3A7DQpPdXIgU29sYXImbmJzcDtzdHJlZXQgbGlnaHQg MzAgd2F0dCZuYnNwO2NhbiBiZSB3b3JrZWQgZm9yJm5ic3A7MyByYWlueSBkYXlzLnByaWNl bGlzdCZuYnNwO3dpbGwgYmUgc2VuZCB0byB5b3UgY2hlY2sgaWYmbmJzcDt5b3UgaW50ZXJl c3RlZCAuDQpCZXN0IHJlZ2FyZHMsDQombmJzcDsNCg0KJm5ic3A7DQoNCg0KSWYgZGlzdHVy YiAscGxzJm5ic3A7IFVuc3Vic2NyaWJl ----boundary_181878_a7e6cde2-b76b-4073-b231-3bcc239be08c Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCc7IG1z by1zcGFjZXJ1bjogJ3llcyciPg0KPERJVj48Rk9OVCBjb2xvcj0jMDAwMDAwIGZhY2U9IlRp bWVzIE5ldyBSb21hbiI+RGVhciZuYnNwO1Npciw8L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05U IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PC9GT05UPjxGT05UIGNvbG9yPSMwMDAwMDA+Jm5i c3A7PC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMDAwMDAwIGZhY2U9IlRpbWVz IE5ldyBSb21hbiI+T3VyIFNvbGFyJm5ic3A7c3RyZWV0IGxpZ2h0IDMwIHdhdHQmbmJzcDtj YW4gYmUgd29ya2VkIGZvciZuYnNwOzMgcmFpbnkgZGF5cy5wcmljZWxpc3Q8L0ZPTlQ+PEZP TlQgY29sb3I9IzAwMDAwMD48Rk9OVCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPiZuYnNwO3dp bGwgYmUgc2VuZCB0byB5b3UgY2hlY2sgaWYmbmJzcDt5b3UgaW50ZXJlc3RlZCAuPC9GT05U PjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwMDAwMCBmYWNlPSJUaW1lcyBO ZXcgUm9tYW4iPkJlc3QgcmVnYXJkcyw8L0ZPTlQ+PC9ESVY+DQo8RElWPiZuYnNwOzxJTUcg c3JjPSJjaWQ6MEBsb2NhbGhvc3QiPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jNDA4MDgw PjxJTUcgc3JjPSJjaWQ6MUBsb2NhbGhvc3QiPjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQg Y29sb3I9IzQwODA4MD48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSM0 MDgwODA+PC9GT05UPjwvRElWPg0KPERJVj4NCjxESVY+PEZPTlQgY29sb3I9I2MwYzBjMCBz aXplPTI+SWYgZGlzdHVyYiAscGxzJm5ic3A7IDwvRk9OVD48QSBocmVmPSJtYWlsdG86cm9s YW5kZWFibGVwb3dlckAxNjMuY29tIj48Rk9OVCBjb2xvcj0jYzBjMGMwIHNpemU9Mj5VbnN1 YnNjcmliZTwvRk9OVD48L0E+PC9ESVY+PC9ESVY+PC9TUEFOPjwhLS1FbmRGcmFnbWVudC0tPg== ----boundary_181878_a7e6cde2-b76b-4073-b231-3bcc239be08c-- ----boundary_181879_c94da963-14f5-46cb-8a42-70058c15b673 Content-Type: multipart/mixed; boundary=--boundary_181880_0f3fd0a7-7d86-4394-908c-bde1eba29c6f ----boundary_181880_0f3fd0a7-7d86-4394-908c-bde1eba29c6f Content-Type: image/png; name="30watt street.png" Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: <0@localhost> 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 9MPBkxsAAAAASUVORK5CYII= ----boundary_181880_0f3fd0a7-7d86-4394-908c-bde1eba29c6f Content-Type: image/jpeg; name=logo.jpg Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: <1@localhost> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9 PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhC Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAAR CACmAagDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDvC/NV7q/gtB++cBj0Udah1O9FlblxzI3C iuft7K61OVmDYUn5pW/pXNVrNPkgrs6KGHU17So7RNoeILUtgrIB6kVoQXMU8e+Jw6+o7Vgt 4YXZlLt9/uowaoo13o14A4/wcVn7WrT/AIi0Oh4ejVX7mWp2G+jfUFvMlzCksf3WGac8saEB 5FU47tiuxSVrnm2lflJd9G+o1KsoZSGB5yDnNG9d+wMC3cZ5Hvii6FqSb6N9MBDZwQcde+D6 UgZWzgg44POcU7oNSTfRvptRvNGh2vIin0LAGk2luC5nsTb6N9NHPuDRTFdjt9G+m0UBclBy KKRfuiloLFopKKBi0UUUAFFFFABRSUtABRRRQAUUUUAFFFFABRRSUALRRRQAUUUUAFFJRQAt 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 ----boundary_181880_0f3fd0a7-7d86-4394-908c-bde1eba29c6f-- ----boundary_181879_c94da963-14f5-46cb-8a42-70058c15b673-- From daniel.bast@gmx.net Sun Aug 2 08:07:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, MIME_QP_LONG_LINE,TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5562D7F5A for ; Sun, 2 Aug 2015 08:07:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A30B30404E for ; Sun, 2 Aug 2015 06:07:18 -0700 (PDT) X-ASG-Debug-ID: 1438520833-04cb6c673d27e270001-NocioJ Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by cuda.sgi.com with ESMTP id 8uBvsIeHMZNxplsZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 02 Aug 2015 06:07:14 -0700 (PDT) X-Barracuda-Envelope-From: daniel.bast@gmx.net X-Barracuda-Apparent-Source-IP: 212.227.15.15 Received: from daniels-macbook.fritz.box ([80.131.214.241]) by mail.gmx.com (mrgmx001) with ESMTPSA (Nemesis) id 0MEXHd-1Z6moR2vYf-00Fo9O; Sun, 02 Aug 2015 15:06:54 +0200 Content-Type: multipart/alternative; boundary="Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017" Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2102\)) Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el From: Daniel Bast X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el In-Reply-To: <20150801225230.GR16638@dastard> Date: Sun, 2 Aug 2015 15:06:50 +0200 Cc: Fernando Seiti Furusato , xfs@oss.sgi.com, Breno Leitao Message-Id: <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> To: Dave Chinner , 793495@bugs.debian.org X-Mailer: Apple Mail (2.2102) X-Provags-ID: V03:K0:nR7tRdhjEJ75b6KwpvLvRxrvNsavZL+4vCdZDQtP4HhyY9+r6O/ oZpkTZ0XTDfwRv5lqqJ7YRyS+54mWVT79/yNzbSYEJcj32nqdW5We5XFdAX6QFCGCavMKcC 1+e1Xc+XiEamerTWOiIYeDh97u/dC8E4WTkU8nMW07f5POfkMXxNOnm77w2MsDKhnytDWLZ 8GFJrDNmscuZHQ+WilHow== X-UI-Out-Filterresults: notjunk:1;V01:K0:peR0+2i8W8Q=:UKgnu/P4xEflSzQ80cydlD vHPvLpqr5bEvyfmf1AVilsl1R1y13juWSuBeLbhtOVPAklRWRQqatFP2yn7dL5gyOr3cMCxS+ eUky+fsGiGbXdjrBxsUSjiz5N2f0XBoygcOQcWBJZ0Ectw7B04nSD3g9bBZ+F9XoT/XD3yf0+ 4IoyfULMiMYG5XCODXKTD/gk7opOpSgX48ZvsNgUbse9zrm7u+z+kFTplZJENaG7Jnfr26M/R VQEFVfiGiLOt1mNXhgB7LVMNqK7hAgIu024esQLTcSlPhA6JGsD4VgNpJQx1rCx8QZfyqWR/I 0Hxpa8aqsAmOM+29IwmCFuoh2joDp9N+mSS0OyGy/jStW6IU9DFpeWzib4xecyzXqMvvFYjRQ +Bw48Ef8QWXXSaJ1VsD5bNjWuLc3FVW8KYPGcejBAU74SbFwr6Rw2nz01dSR7RcF9R9bbEKQa KBwG6UbuRkiJILO3p5U7La7Zvo9TsJnpkFTIibbeueO/7jzdObR+m86ajDmGDGt22rhVop8CM 8ZdTLSNUHmrEPw1O3ucRBgrGmD39sXrxSzCnEfcNPJK+hxL/UBKDRdc92LIDrmAEqcK4DYOAc TX3Uj207iIFvTd+L/lLPlwercdSG9Ox6QXiRFgnRNuGJVoN69LbQZV8aafYU7soC0xU1Gypp2 456fiaTK8imQaArOwxKVgCws+Y/FuP7qHFIiKcP8bo8kGPRO3uFg/9kokvMIIm/dx5+w= X-Barracuda-Connect: mout.gmx.net[212.227.15.15] X-Barracuda-Start-Time: 1438520834 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21294 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars --Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 >=20 > Am 02.08.2015 um 00:52 schrieb Dave Chinner : >=20 > On Fri, Jul 31, 2015 at 06:57:35PM -0300, Fernando Seiti Furusato = wrote: >> That error is common when configure is generated using out-of-date = config.guess >> and config.sub. >> The ones that come with the package are, in fact, old. >=20 > config.sub and config.guess are generated by the build, we don't > ship them directly from the git repository. Perhaps you are building > from a release tarball rather than from a clean git repository > working area? Can you confirm this is the case? >=20 Just some observations from my side: Extracting the released tarball over a clean xfsprogs git repo and = removing the .gitignore file, then git status reveals: Untracked files: (use "git add ..." to include in what will be committed) .gitcensus aclocal.m4 config.guess config.sub configure install-sh ltmain.sh m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 po/xfsprogs.pot Looks like there are a lot of untracked file. Is this intentional, to = have potentially auto-generated but un-versioned files in a release = tarball? It gets even more interesting, comparing debian source vs official = release: http://http.debian.net/debian/pool/main/x/xfsprogs/xfsprogs_3.2.4.tar.gz = = ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.2.4.tar.gz = There are differences in the following files: modified: aclocal.m4 modified: config.guess modified: config.sub modified: configure modified: ltmain.sh modified: m4/libtool.m4 modified: po/xfsprogs.pot So, imho the debian source tarball also doesn=E2=80=99t look clean, = neither against the release tarball nor against a clean git checkout. Just my 2 cents, maybe that helps someone to solve this. Cheers, Daniel > If so, can you remove the configure, config.sub and config.guess > files and see if you get the same problem? >=20 >> This package used to run dh_autotools-dev_updateconfig and >> dh_autotools-dev_restoreconfig, which worked because it only updates = those >> files. >>=20 >> They were replaced by dh_autoreconf and dh_autoreconf_clean, which = should >> update them, but does not run flawlessly. >> I think something is wrong with the m4 macros but I am not sure what. >> There are errors when running dh_autoreconf alone. >>=20 >> # dh_autoreconf >> libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. >> libtoolize: copying file `./ltmain.sh' >> libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. >> libtoolize: copying file `m4/libtool.m4' >> libtoolize: copying file `m4/ltoptions.m4' >> libtoolize: copying file `m4/ltsugar.m4' >> libtoolize: copying file `m4/ltversion.m4' >> libtoolize: copying file `m4/lt~obsolete.m4' >> libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in = Makefile.am. >> autoheader: warning: missing template: HAVE_UMODE_T >> autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], [Description]) >> autoheader: warning: missing template: HAVE___PSINT_T >> autoheader: warning: missing template: HAVE___PSUNSIGNED_T >> autoheader: warning: missing template: HAVE___U32 >> autoreconf: /usr/bin/autoheader failed with exit status: 1 >> dh_autoreconf: autoreconf -f -i returned exit code 1 >>=20 >> I will keep working on it, but all I will be able to do if I get to a = conclusion >> is send a patch here. >> Thus it will have to be dealt with by the maintainers anyway. >=20 > The XFS list is cc'd on the bug, so the upstream maintainers are > watching and will see the patch when you post it. ;) >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

Am 02.08.2015 um 00:52 schrieb Dave Chinner <david@fromorbit.com>:

On Fri, Jul 31, 2015 = at 06:57:35PM -0300, Fernando Seiti Furusato wrote:
That error is common = when configure is generated using out-of-date config.guess
and config.sub.
The ones that come with the = package are, in fact, old.

config.sub and config.guess are generated by the build, we = don't
ship them directly from the git repository. Perhaps = you are building
from a release tarball rather than from a = clean git repository
working area? Can you confirm this is = the case?


Just some observations from my side:

Extracting the released tarball over a clean = xfsprogs git repo and removing the .gitignore file, then git status = reveals:

Untracked = files:
  (use "git add <file>..." to include in = what will be committed)

= .gitcensus
aclocal.m4
= config.guess
config.sub
= configure
install-sh
= ltmain.sh
m4/libtool.m4
= m4/ltoptions.m4
m4/ltsugar.m4
= m4/ltversion.m4
m4/lt~obsolete.m4
= po/xfsprogs.pot

Looks like = there are a lot of untracked file. Is this intentional, to have = potentially auto-generated but un-versioned files in a release = tarball?

It gets even more = interesting, comparing debian source vs official release:







If so, = can you remove the configure, config.sub and config.guess
files and see if you get the same problem?

This package used to run = dh_autotools-dev_updateconfig and
dh_autotools-dev_restoreconfig, which worked because it only = updates those
files.

They = were replaced by dh_autoreconf and dh_autoreconf_clean, which should
update them, but does not run flawlessly.
I = think something is wrong with the m4 macros but I am not sure what.
There are errors when running dh_autoreconf alone.

# dh_autoreconf
libtoolize: = putting auxiliary files in AC_CONFIG_AUX_DIR, `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in = Makefile.am.
autoheader: warning: missing template: = HAVE_UMODE_T
autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], = [Description])
autoheader: warning: missing template: = HAVE___PSINT_T
autoheader: warning: missing template: = HAVE___PSUNSIGNED_T
autoheader: warning: missing template: = HAVE___U32
autoreconf: /usr/bin/autoheader failed with = exit status: 1
dh_autoreconf: autoreconf -f -i returned = exit code 1

I will keep working on it, but = all I will be able to do if I get to a conclusion
is send = a patch here.
Thus it will have to be dealt with by the = maintainers anyway.

The XFS = list is cc'd on the bug, so the upstream maintainers are
watching and will see the patch when you post it. ;)

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

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

= --Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017-- From debbugs@buxtehude.debian.org Sun Aug 2 08:09:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, MIME_QP_LONG_LINE,TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 842C77F61 for ; Sun, 2 Aug 2015 08:09:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2069EAC002 for ; Sun, 2 Aug 2015 06:09:12 -0700 (PDT) X-ASG-Debug-ID: 1438520947-04bdf06bcf1bad00001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id kIcEtPRTmM4wEu4b (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 02 Aug 2015 06:09:07 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZLt0i-00082w-BJ; Sun, 02 Aug 2015 13:09:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Daniel Bast , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Daniel Bast Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Sun, 02 Aug 2015 13:09:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143852083330728 (code B ref 793495); Sun, 02 Aug 2015 13:09:02 +0000 Received: (at 793495) by bugs.debian.org; 2 Aug 2015 13:07:13 +0000 Received: from mout.gmx.net ([212.227.15.15]) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84) (envelope-from ) id 1ZLsyt-0007zN-RQ for 793495@bugs.debian.org; Sun, 02 Aug 2015 13:07:12 +0000 Received: from daniels-macbook.fritz.box ([80.131.214.241]) by mail.gmx.com (mrgmx001) with ESMTPSA (Nemesis) id 0MEXHd-1Z6moR2vYf-00Fo9O; Sun, 02 Aug 2015 15:06:54 +0200 Content-Type: multipart/alternative; boundary="Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017" Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2102\)) From: Daniel Bast In-Reply-To: <20150801225230.GR16638@dastard> Date: Sun, 2 Aug 2015 15:06:50 +0200 Cc: Fernando Seiti Furusato , xfs@oss.sgi.com, Breno Leitao Message-Id: <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> To: Dave Chinner , 793495@bugs.debian.org X-Mailer: Apple Mail (2.2102) X-Provags-ID: V03:K0:nR7tRdhjEJ75b6KwpvLvRxrvNsavZL+4vCdZDQtP4HhyY9+r6O/ oZpkTZ0XTDfwRv5lqqJ7YRyS+54mWVT79/yNzbSYEJcj32nqdW5We5XFdAX6QFCGCavMKcC 1+e1Xc+XiEamerTWOiIYeDh97u/dC8E4WTkU8nMW07f5POfkMXxNOnm77w2MsDKhnytDWLZ 8GFJrDNmscuZHQ+WilHow== X-UI-Out-Filterresults: notjunk:1;V01:K0:peR0+2i8W8Q=:UKgnu/P4xEflSzQ80cydlD vHPvLpqr5bEvyfmf1AVilsl1R1y13juWSuBeLbhtOVPAklRWRQqatFP2yn7dL5gyOr3cMCxS+ eUky+fsGiGbXdjrBxsUSjiz5N2f0XBoygcOQcWBJZ0Ectw7B04nSD3g9bBZ+F9XoT/XD3yf0+ 4IoyfULMiMYG5XCODXKTD/gk7opOpSgX48ZvsNgUbse9zrm7u+z+kFTplZJENaG7Jnfr26M/R VQEFVfiGiLOt1mNXhgB7LVMNqK7hAgIu024esQLTcSlPhA6JGsD4VgNpJQx1rCx8QZfyqWR/I 0Hxpa8aqsAmOM+29IwmCFuoh2joDp9N+mSS0OyGy/jStW6IU9DFpeWzib4xecyzXqMvvFYjRQ +Bw48Ef8QWXXSaJ1VsD5bNjWuLc3FVW8KYPGcejBAU74SbFwr6Rw2nz01dSR7RcF9R9bbEKQa KBwG6UbuRkiJILO3p5U7La7Zvo9TsJnpkFTIibbeueO/7jzdObR+m86ajDmGDGt22rhVop8CM 8ZdTLSNUHmrEPw1O3ucRBgrGmD39sXrxSzCnEfcNPJK+hxL/UBKDRdc92LIDrmAEqcK4DYOAc TX3Uj207iIFvTd+L/lLPlwercdSG9Ox6QXiRFgnRNuGJVoN69LbQZV8aafYU7soC0xU1Gypp2 456fiaTK8imQaArOwxKVgCws+Y/FuP7qHFIiKcP8bo8kGPRO3uFg/9kokvMIIm/dx5+w= X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438520947 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21294 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars --Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 >=20 > Am 02.08.2015 um 00:52 schrieb Dave Chinner : >=20 > On Fri, Jul 31, 2015 at 06:57:35PM -0300, Fernando Seiti Furusato = wrote: >> That error is common when configure is generated using out-of-date = config.guess >> and config.sub. >> The ones that come with the package are, in fact, old. >=20 > config.sub and config.guess are generated by the build, we don't > ship them directly from the git repository. Perhaps you are building > from a release tarball rather than from a clean git repository > working area? Can you confirm this is the case? >=20 Just some observations from my side: Extracting the released tarball over a clean xfsprogs git repo and = removing the .gitignore file, then git status reveals: Untracked files: (use "git add ..." to include in what will be committed) .gitcensus aclocal.m4 config.guess config.sub configure install-sh ltmain.sh m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 po/xfsprogs.pot Looks like there are a lot of untracked file. Is this intentional, to = have potentially auto-generated but un-versioned files in a release = tarball? It gets even more interesting, comparing debian source vs official = release: http://http.debian.net/debian/pool/main/x/xfsprogs/xfsprogs_3.2.4.tar.gz = = ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.2.4.tar.gz = There are differences in the following files: modified: aclocal.m4 modified: config.guess modified: config.sub modified: configure modified: ltmain.sh modified: m4/libtool.m4 modified: po/xfsprogs.pot So, imho the debian source tarball also doesn=E2=80=99t look clean, = neither against the release tarball nor against a clean git checkout. Just my 2 cents, maybe that helps someone to solve this. Cheers, Daniel > If so, can you remove the configure, config.sub and config.guess > files and see if you get the same problem? >=20 >> This package used to run dh_autotools-dev_updateconfig and >> dh_autotools-dev_restoreconfig, which worked because it only updates = those >> files. >>=20 >> They were replaced by dh_autoreconf and dh_autoreconf_clean, which = should >> update them, but does not run flawlessly. >> I think something is wrong with the m4 macros but I am not sure what. >> There are errors when running dh_autoreconf alone. >>=20 >> # dh_autoreconf >> libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. >> libtoolize: copying file `./ltmain.sh' >> libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. >> libtoolize: copying file `m4/libtool.m4' >> libtoolize: copying file `m4/ltoptions.m4' >> libtoolize: copying file `m4/ltsugar.m4' >> libtoolize: copying file `m4/ltversion.m4' >> libtoolize: copying file `m4/lt~obsolete.m4' >> libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in = Makefile.am. >> autoheader: warning: missing template: HAVE_UMODE_T >> autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], [Description]) >> autoheader: warning: missing template: HAVE___PSINT_T >> autoheader: warning: missing template: HAVE___PSUNSIGNED_T >> autoheader: warning: missing template: HAVE___U32 >> autoreconf: /usr/bin/autoheader failed with exit status: 1 >> dh_autoreconf: autoreconf -f -i returned exit code 1 >>=20 >> I will keep working on it, but all I will be able to do if I get to a = conclusion >> is send a patch here. >> Thus it will have to be dealt with by the maintainers anyway. >=20 > The XFS list is cc'd on the bug, so the upstream maintainers are > watching and will see the patch when you post it. ;) >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

Am 02.08.2015 um 00:52 schrieb Dave Chinner <david@fromorbit.com>:

On Fri, Jul 31, 2015 = at 06:57:35PM -0300, Fernando Seiti Furusato wrote:
That error is common = when configure is generated using out-of-date config.guess
and config.sub.
The ones that come with the = package are, in fact, old.

config.sub and config.guess are generated by the build, we = don't
ship them directly from the git repository. Perhaps = you are building
from a release tarball rather than from a = clean git repository
working area? Can you confirm this is = the case?


Just some observations from my side:

Extracting the released tarball over a clean = xfsprogs git repo and removing the .gitignore file, then git status = reveals:

Untracked = files:
  (use "git add <file>..." to include in = what will be committed)

= .gitcensus
aclocal.m4
= config.guess
config.sub
= configure
install-sh
= ltmain.sh
m4/libtool.m4
= m4/ltoptions.m4
m4/ltsugar.m4
= m4/ltversion.m4
m4/lt~obsolete.m4
= po/xfsprogs.pot

Looks like = there are a lot of untracked file. Is this intentional, to have = potentially auto-generated but un-versioned files in a release = tarball?

It gets even more = interesting, comparing debian source vs official release:







If so, = can you remove the configure, config.sub and config.guess
files and see if you get the same problem?

This package used to run = dh_autotools-dev_updateconfig and
dh_autotools-dev_restoreconfig, which worked because it only = updates those
files.

They = were replaced by dh_autoreconf and dh_autoreconf_clean, which should
update them, but does not run flawlessly.
I = think something is wrong with the m4 macros but I am not sure what.
There are errors when running dh_autoreconf alone.

# dh_autoreconf
libtoolize: = putting auxiliary files in AC_CONFIG_AUX_DIR, `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in = Makefile.am.
autoheader: warning: missing template: = HAVE_UMODE_T
autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], = [Description])
autoheader: warning: missing template: = HAVE___PSINT_T
autoheader: warning: missing template: = HAVE___PSUNSIGNED_T
autoheader: warning: missing template: = HAVE___U32
autoreconf: /usr/bin/autoheader failed with = exit status: 1
dh_autoreconf: autoreconf -f -i returned = exit code 1

I will keep working on it, but = all I will be able to do if I get to a conclusion
is send = a patch here.
Thus it will have to be dealt with by the = maintainers anyway.

The XFS = list is cc'd on the bug, so the upstream maintainers are
watching and will see the patch when you post it. ;)

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

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

= --Apple-Mail=_29B83BC4-7055-48A6-B519-DC2032CCD017-- From sandeen@sandeen.net Sun Aug 2 12:32:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3EC547F62 for ; Sun, 2 Aug 2015 12:32:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 24DC9304064 for ; Sun, 2 Aug 2015 10:32:08 -0700 (PDT) X-ASG-Debug-ID: 1438536726-04cbb0416f20e0a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 5PE2jk2DLGVOJUBO for ; Sun, 02 Aug 2015 10:32:06 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8BAB163CE6C3; Sun, 2 Aug 2015 12:32:05 -0500 (CDT) Message-ID: <55BE5413.4070106@sandeen.net> Date: Sun, 02 Aug 2015 10:32:03 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH] xfs_repair: Fix malloc size of rt_ext_tree_ptr (harmless) References: <55BC60D7.4020102@redhat.com> X-ASG-Orig-Subj: [PATCH] xfs_repair: Fix malloc size of rt_ext_tree_ptr (harmless) In-Reply-To: <55BC60D7.4020102@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438536726 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- rt_ext_tree_ptr points to an avl64tree_desc_t, but we malloc memory according to the size of avltree_desc_t. Oddly, the latter happens to be larger, so we're ok, but may as well make it correct. Addresses-Coverity-Id: 1297533 Signed-off-by: Eric Sandeen --- (sorry, missed [PATCH] on the first one, durrr...) Hm, I thought I sent this already, but don't see it on the list. diff --git a/repair/incore_ext.c b/repair/incore_ext.c index 826bf44..6611d5c 100644 --- a/repair/incore_ext.c +++ b/repair/incore_ext.c @@ -783,7 +783,7 @@ incore_ext_init(xfs_mount_t *mp) avl_init_tree(extent_bcnt_ptrs[i], &avl_extent_bcnt_tree_ops); } - if ((rt_ext_tree_ptr = malloc(sizeof(avltree_desc_t))) == NULL) + if ((rt_ext_tree_ptr = malloc(sizeof(avl64tree_desc_t))) == NULL) do_error(_("couldn't malloc dup rt extent tree descriptor\n")); avl64_init_tree(rt_ext_tree_ptr, &avl64_extent_tree_ops); _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From lrhorer@mygrande.net Sun Aug 2 15:24:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 181D47F62 for ; Sun, 2 Aug 2015 15:24:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0078A304048 for ; Sun, 2 Aug 2015 13:24:31 -0700 (PDT) X-ASG-Debug-ID: 1438547068-04cbb0416f212ce0001-NocioJ Received: from mail02.lsn.net (mail02.lsn.net [66.90.130.128]) by cuda.sgi.com with ESMTP id y8KlFqbKU2tlPets for ; Sun, 02 Aug 2015 13:24:28 -0700 (PDT) X-Barracuda-Envelope-From: lrhorer@mygrande.net X-Barracuda-Apparent-Source-IP: 66.90.130.128 Received: from [192.168.1.121] (66-90-232-145.dyn.grandenetworks.net [66.90.232.145]) (authenticated bits=0) by mail02.lsn.net (8.14.4/8.13.6) with ESMTP id t72KOJu5001252 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Sun, 2 Aug 2015 15:24:20 -0500 X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.98.4 at av01.lsn.net Message-ID: <55BE7C75.4060604@mygrande.net> Date: Sun, 02 Aug 2015 15:24:21 -0500 From: Leslie Rhorer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Brian Foster CC: "Rhorer, Leslie" , Kris Rusocki , Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <03864DDC681E664EBF5D47682BE7D7CF0D3574DF@USADCWVEMBX07.corp.global.level3.com> <55AA5FCE.4080702@sandeen.net> <03864DDC681E664EBF5D47682BE7D7CF0D358740@USADCWVEMBX07.corp.global.level3.com> <55AAF73A.4040903@mygrande.net> <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <20150728221150.GA26604@bfoster.bfoster> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail02.lsn.net[66.90.130.128] X-Barracuda-Start-Time: 1438547068 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- OK, this is goofy. It seems to be working, now. As usual, I've been doing some work on the server this weekend, but I can't think of anything I have done that would fix the issue. I did replace the remaining good 4G RAM module with a pair of 8G RAM modules, but memtest reported the remaining 4G module as good, and I verified the removed module really was bad. I also replaced the removable drive carrier and cables that were feeding the two SSDs, once of which was reporting failures as noted in the syslog. It's hard for me to believe either of those things could have been causing the issue, though. I attached a 1.5T external drive to the server and formatted it as XFS in preparation to continue troubleshooting. To make sure of things, I tried decompressing the tarball, again, and this time it worked all the way to the end. I then deleted the entire directory structure created by the tarball and decompressed the file again twice. I'll see if the rsync process works. That will take a couple of days. On 7/28/2015 5:11 PM, Brian Foster wrote: > On Tue, Jul 28, 2015 at 10:13:01AM -0500, Leslie Rhorer wrote: >> On 7/28/2015 7:33 AM, Brian Foster wrote: >>> On Tue, Jul 28, 2015 at 02:46:45AM -0500, Leslie Rhorer wrote: >>>> On 7/20/2015 6:17 AM, Brian Foster wrote: >>>>> On Sat, Jul 18, 2015 at 08:02:50PM -0500, Leslie Rhorer wrote: >>>>>> > ... >>> >>>> I then copied both the tarball and the image over to the root, and while >>>> the system would not let me create the image on the root, it did let me copy >>>> the image to the root. I then umounted the RAID array, mounted the image, >>>> and attempted to cd to the original directory in the image mount where the >>>> tarball was saved. That failed with an I/O error: >>>> >>> >>> It sounds a bit strange for the mdrestore to fail on root but a cp of >>> the resulting image to work. Do the resulting images have the same file >>> size or is the rootfs copy truncated? If the latter, you could be >>> missing part of the fs and thus any of the following tests are probably >>> moot. >> >> Well, it can't be as large as it is reported, let's put it that way, >> although the reported file size is the same. Ls claims it to be 16T in >> size, which cannot be the case on a 100G partition. I forgot to mention cp >> does complain: >> >> RAID-Server:/# cp /RAID/TEST/RAIDfile.img ./ >> cp: cannot lseek ‘./RAIDfile.img’: Invalid argument >> >> But it does the same thing on the backup server, and it works there. I >> tried a cmp, and it seems to be hung. It just may be taking a long time, >> however. >> > > Yeah, you can't really trust the resulting image. It doesn't take much > space to create a very large sparse file, but different filesystems have > different maximum file size limits. The problem here is that some > metadata near the beginning of the file might reference or depend on > something near the end, and I/Os beyond the end of the file will > probably result in errors. > > I'd probably try the nouuid approach since the hardware is similar as > well as some of the other interesting suggestions that have been made to > try and get the image on the rootfs and see what happens there too. > > Brian > >>> Brian >>> >>>> RAID-Server:/# cd "/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>> Adapters/Rocket 2722/Driver/" >>>> bash: cd: /media/Server-Main/Equipment/Drive Controllers/HighPoint >>>> Adapters/Rocket 2722/Driver/: Input/output error >>>> >>>> I changed directories to a point two directories above the previous attempt >>>> and did a long listing: >>>> >>>> RAID-Server:/# cd "/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>> Adapters" >>>> RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>> Adapters# ll >>>> ls: cannot access RocketRAID 2722: Input/output error >>>> total 4 >>>> drwxr-xr-x 6 root lrhorer 4096 Jul 18 19:26 Rocket 2722 >>>> ?????????? ? ? ? ? ? RocketRAID 2722 >>>> >>>> As you can see, Rocket 2722 is still there, but RocketRAID 2722 is very >>>> sick. Rocket 2722 is the parent of where the tarbal was, however, so I did >>>> a cd and an ll again: >>>> >>>> RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>> Adapters# cd "Rocket 2722"/ >>>> RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>> Adapters/Rocket 2722# ll >>>> ls: cannot access BIOS: Input/output error >>>> ls: cannot access Driver: Input/output error >>>> ls: cannot access HighPoint RAID Management Software: Input/output error >>>> ls: cannot access Manual: Input/output error >>>> total 248 >>>> -rwxr--r-- 1 root lrhorer 245760 Nov 20 2008 autorun.exe >>>> -rwxr--r-- 1 root lrhorer 51 Mar 21 2001 autorun.inf >>>> ?????????? ? ? ? ? ? BIOS >>>> ?????????? ? ? ? ? ? Driver >>>> ?????????? ? ? ? ? ? HighPoint RAID Management >>>> Software >>>> ?????????? ? ? ? ? ? Manual >>>> -rwxr--r-- 1 root lrhorer 1134 Feb 5 2012 readme.txt >>>> >>>> So now, what? >>>> >>>> _______________________________________________ >>>> xfs mailing list >>>> xfs@oss.sgi.com >>>> http://oss.sgi.com/mailman/listinfo/xfs >>> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > From opxwov@gwwn.com Sun Aug 2 16:07:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3817A7F62 for ; Sun, 2 Aug 2015 16:07:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 202F0304067 for ; Sun, 2 Aug 2015 14:07:48 -0700 (PDT) X-ASG-Debug-ID: 1438549665-04cbb0416c2135e0001-NocioJ Received: from xkxz.com ([114.96.69.226]) by cuda.sgi.com with ESMTP id CzVbR3p0z77fuc4m for ; Sun, 02 Aug 2015 14:07:46 -0700 (PDT) X-Barracuda-Envelope-From: opxwov@gwwn.com X-Barracuda-Apparent-Source-IP: 114.96.69.226 Received: from SKY-20150201SFT ([127.0.0.1]) by localhost via TCP with ESMTPA; Mon, 03 Aug 2015 04:26:15 +0800 MIME-Version: 1.0 From: Icy Sender: Icy To: xfs@oss.sgi.com Reply-To: Icy Date: 3 Aug 2015 04:26:15 +0800 Subject: =?utf-8?B?UjogbWFudWZhY3R1cmUgZm9yIHJhY2tpbmcgc3lzdGVt?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?UjogbWFudWZhY3R1cmUgZm9yIHJhY2tpbmcgc3lzdGVt?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[114.96.69.226] X-Barracuda-Start-Time: 1438549665 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150802210748.CC0AA106C926@cuda.sgi.com> PGh0bWw+PGJvZHk+PERJViBzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9V TkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IEZPTlQ6IDE0 cHgg5b6u6L2v6ZuF6buRLCBUYWhvbWE7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1T UEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48Rk9OVCBzaXplPTMgZmFjZT0iVGlt ZXMgTmV3IFJvbWFuIj5IaSwgPC9GT05UPjwvRElWPg0KPERJViBzdHlsZT0iVEVYVC1UUkFO U0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQt SU5ERU5UOiAwcHg7IEZPTlQ6IDE0cHgg5b6u6L2v6ZuF6buRLCBUYWhvbWE7IFdISVRFLVNQ QUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDAp OyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48 Rk9OVCBzaXplPTMgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5UaGlzJm5ic3A7IGlzIEljeSBm cm9tIEd1YW5nZG9uZyZuYnNwO1NtYWNvJm5ic3A7QXV0b21hdGlvbiBUZWNobm9sb2d5IENv LixMdGQuPC9GT05UPjwvRElWPg0KPERJViBzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7 IEZPTlQ6IDE0cHgg5b6u6L2v6ZuF6buRLCBUYWhvbWE7IFdISVRFLVNQQUNFOiBub3JtYWw7 IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJ Tkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48Rk9OVCBzaXplPTMg ZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48L0ZPTlQ+Jm5ic3A7PC9ESVY+DQo8RElWIHN0eWxl PSJURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUs MjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgRk9OVDogMTRweCDlvq7ova/pm4Xpu5EsIFRhaG9t YTsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6 IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdp ZHRoOiAwcHgiPjxGT05UIHNpemU9MyBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPlNtYWNvIGlz IGEmbmJzcDtyYWNraW5nIHN5c3RlbSBtYW51ZmFjdHVyZXImbmJzcDt3aXRoIDE0IHllYXJz JyBleHBlcmllbmNl77yMIHNwZWNpYWxpemVkIGluJm5ic3A7d2FyZWhvdXNlIHJhY2tpbmcg c3lzdGVtcyBsaWtlIHNlbGVjdGl2ZSByYWNraW5nLCBsb25nIHNwYW4gcmFja2luZywgZHJp di1pbiByYWNraW5nIG1lenphbmluZSxNb2JpbGUgQ2FiaWVudCZuYnNwO2V0Yy4mbmJzcDs8 L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dS T1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgRk9OVDog MTRweCDlvq7ova/pm4Xpu5EsIFRhaG9tYTsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVS LVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4 OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxGT05UIHNpemU9MyBmYWNlPSJU aW1lcyBOZXcgUm9tYW4iPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVYgc3R5bGU9IlRFWFQt VFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBU RVhULUlOREVOVDogMHB4OyBGT05UOiAxNHB4IOW+rui9r+mbhem7kSwgVGFob21hOyBXSElU RS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAs MCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBw eCI+PEZPTlQgc2l6ZT0zIGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+T0RNLE9FTSBzZXJ2aWNl IGF2YWlsYWJsZS48L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJURVhULVRSQU5TRk9STTog bm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6 IDBweDsgRk9OVDogMTRweCDlvq7ova/pm4Xpu5EsIFRhaG9tYTsgV0hJVEUtU1BBQ0U6IG5v cm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQt U1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxGT05UIHNp emU9MyBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVYg c3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1 LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBGT05UOiAxNHB4IOW+rui9r+mbhem7kSwg VGFob21hOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBD T0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJv a2Utd2lkdGg6IDBweCI+PEZPTlQgc2l6ZT0zIGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+UGxl YXNlIGZlZWwgZnJlZSB0byBjb250YWN0IG1lIGZvciBtb3JlIGluZm8uPEJSPjwvRk9OVD48 L0RJVj4NCjxESVYgc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNP TE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBGT05UOiAxNHB4IOW+ rui9r+mbhem7kSwgVGFob21hOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJr aXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEZPTlQgc2l6ZT0zIGZhY2U9IlRpbWVzIE5l dyBSb21hbiI+PEJSPiZuYnNwOzwvRElWPjwvRk9OVD4NCjxESVYgc3R5bGU9IlRFWFQtVFJB TlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhU LUlOREVOVDogMHB4OyBGT05UOiAxNHB4IOW+rui9r+mbhem7kSwgVGFob21hOyBXSElURS1T UEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCww KTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+ QmVzdCBSZWdhcmRzLDwvRElWPg0KPERJViBzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7 IEZPTlQ6IDE0cHgg5b6u6L2v6ZuF6buRLCBUYWhvbWE7IFdISVRFLVNQQUNFOiBub3JtYWw7 IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJ Tkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4mbmJzcDs8L0RJVj4N CjxESVYgc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiBy Z2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBGT05UOiAxNHB4IOW+rui9r+mb hem7kSwgVGFob21hOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9y bWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4 dC1zdHJva2Utd2lkdGg6IDBweCI+SWN5PC9ESVY+DQo8RElWIHN0eWxlPSJURVhULVRSQU5T Rk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1J TkRFTlQ6IDBweDsgRk9OVDogMTRweCDlvq7ova/pm4Xpu5EsIFRhaG9tYTsgV0hJVEUtU1BB Q0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7 IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPiZu YnNwOzwvRElWPg0KPERJViBzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9V TkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IEZPTlQ6IDE0 cHgg5b6u6L2v6ZuF6buRLCBUYWhvbWE7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1T UEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij5NU07vvJppY3kxODhAaG90bWFpbC5j b208L0RJVj48L2JvZHk+PC9odG1sPg== From david@fromorbit.com Sun Aug 2 17:13:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 247697F62 for ; Sun, 2 Aug 2015 17:13:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B5920AC00C for ; Sun, 2 Aug 2015 15:13:05 -0700 (PDT) X-ASG-Debug-ID: 1438553582-04bdf06bd11c76b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id jqiAwfIiEj3MzeAu for ; Sun, 02 Aug 2015 15:13:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CpCAABlb5VPG0mLHlbGQEBgn9UaYZRok8MAQEBAQEBBpUbhXsCAgEBAoEfTQEBAQEBAQcBAQEBQT+EJAEBBDocIxAIAxQECSUPBSUDBxoTiC3HRwEBAQEGAgEfGYYGhTCFCAeELAWUeYR7h0+CD5c7hDUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail06.adl2.internode.on.net with ESMTP; 03 Aug 2015 07:43:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZM1V7-0007lD-4L; Mon, 03 Aug 2015 08:13:01 +1000 Date: Mon, 3 Aug 2015 08:13:01 +1000 From: Dave Chinner To: Daniel Bast Cc: 793495@bugs.debian.org, Fernando Seiti Furusato , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el Message-ID: <20150802221301.GO3902@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1438553582 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 02, 2015 at 03:06:50PM +0200, Daniel Bast wrote: > > Am 02.08.2015 um 00:52 schrieb Dave Chinner > > : > > > > On Fri, Jul 31, 2015 at 06:57:35PM -0300, Fernando Seiti > > Furusato wrote: > >> That error is common when configure is generated using > >> out-of-date config.guess and config.sub. The ones that come > >> with the package are, in fact, old. > > > > config.sub and config.guess are generated by the build, we don't > > ship them directly from the git repository. Perhaps you are > > building from a release tarball rather than from a clean git > > repository working area? Can you confirm this is the case? > > > > Just some observations from my side: > > Extracting the released tarball over a clean xfsprogs git repo and > removing the .gitignore file, then git status reveals: > > Untracked files: > (use "git add ..." to include in what will be committed) > > .gitcensus > aclocal.m4 > config.guess > config.sub > configure > install-sh > ltmain.sh > m4/libtool.m4 > m4/ltoptions.m4 > m4/ltsugar.m4 > m4/ltversion.m4 > m4/lt~obsolete.m4 > po/xfsprogs.pot > > Looks like there are a lot of untracked file. Is this intentional, > to have potentially auto-generated but un-versioned files in a > release tarball? Goes back to 2009: commit 1eb10ccb85261931d5401adbff11acd2dbc5bf63 Author: Christoph Hellwig Date: Wed Apr 29 15:32:28 2009 +0200 keep autoconf-generated files over make distclean We do want to ship the autoconf-generated files over make distclean and pick them up in Makepkgs so that a user compiling the program doesn't require autoconf. For that split up make distclean from make realclean and exclude the files we want to keep form the former. To make this easier to maintain adher to stricter rules of use for CONFIGURE and LDIRT. CONFIGURE now includes all generated files from autoconf (or for it like our copied install-sh) and gets only removed on make realclean, but added to LSRCFILES so that Makepkgs can pick it up. Everything else than needs to be removed on a realclean gets assigned to LDIRT. Also split up the configure rule into one to generate the configure script and one to run it. Signed-off-by: Christoph Hellwig Reviewed-by: Mike Frysinger So we've been doing this with release tarballs for more than 6 years - I checked and found these files in the tarballs back to 3.0.1. The above commit is the last commit prior to the release of 3.0.1... Nowdays, the generated files in the 3.2.4 tarball created via a 'make dist' rule. I run that on an up to date debian unstable box with autoconfig 2.69 installed to generate the files, so the question I have is this: why is an up-to-date build box generating "out of date" configure/m4 scripts? What, exactly, is out of date, and how do I ensure that the pre-build config files are correctly up-to-date? Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Sun Aug 2 17:15:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CA0847F62 for ; Sun, 2 Aug 2015 17:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4103BAC00C for ; Sun, 2 Aug 2015 15:15:08 -0700 (PDT) X-ASG-Debug-ID: 1438553705-04cb6c673e28b020001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 5CqUlFAfYWjqRK01 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 02 Aug 2015 15:15:06 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZM1X5-0008J9-JQ; Sun, 02 Aug 2015 22:15:03 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Dave Chinner , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Sun, 02 Aug 2015 22:15:01 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143855358531649 (code B ref 793495); Sun, 02 Aug 2015 22:15:01 +0000 Received: (at 793495) by bugs.debian.org; 2 Aug 2015 22:13:05 +0000 Received: from ipmail06.adl2.internode.on.net ([150.101.137.129]) by buxtehude.debian.org with esmtp (Exim 4.84) (envelope-from ) id 1ZM1VB-0008EC-DK for 793495@bugs.debian.org; Sun, 02 Aug 2015 22:13:05 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CpCAABlb5VPG0mLHlbGQEBgn9UaYZRok8MAQEBAQEBBpUbhXsCAgEBAoEfTQEBAQEBAQcBAQEBQT+EJAEBBDocIxAIAxQECSUPBSUDBxoTiC3HRwEBAQEGAgEfGYYGhTCFCAeELAWUeYR7h0+CD5c7hDUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail06.adl2.internode.on.net with ESMTP; 03 Aug 2015 07:43:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZM1V7-0007lD-4L; Mon, 03 Aug 2015 08:13:01 +1000 Date: Mon, 3 Aug 2015 08:13:01 +1000 From: Dave Chinner To: Daniel Bast Cc: 793495@bugs.debian.org, Fernando Seiti Furusato , xfs@oss.sgi.com, Breno Leitao Message-ID: <20150802221301.GO3902@dastard> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438553706 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 02, 2015 at 03:06:50PM +0200, Daniel Bast wrote: > > Am 02.08.2015 um 00:52 schrieb Dave Chinner > > : > > > > On Fri, Jul 31, 2015 at 06:57:35PM -0300, Fernando Seiti > > Furusato wrote: > >> That error is common when configure is generated using > >> out-of-date config.guess and config.sub. The ones that come > >> with the package are, in fact, old. > > > > config.sub and config.guess are generated by the build, we don't > > ship them directly from the git repository. Perhaps you are > > building from a release tarball rather than from a clean git > > repository working area? Can you confirm this is the case? > > > > Just some observations from my side: > > Extracting the released tarball over a clean xfsprogs git repo and > removing the .gitignore file, then git status reveals: > > Untracked files: > (use "git add ..." to include in what will be committed) > > .gitcensus > aclocal.m4 > config.guess > config.sub > configure > install-sh > ltmain.sh > m4/libtool.m4 > m4/ltoptions.m4 > m4/ltsugar.m4 > m4/ltversion.m4 > m4/lt~obsolete.m4 > po/xfsprogs.pot > > Looks like there are a lot of untracked file. Is this intentional, > to have potentially auto-generated but un-versioned files in a > release tarball? Goes back to 2009: commit 1eb10ccb85261931d5401adbff11acd2dbc5bf63 Author: Christoph Hellwig Date: Wed Apr 29 15:32:28 2009 +0200 keep autoconf-generated files over make distclean We do want to ship the autoconf-generated files over make distclean and pick them up in Makepkgs so that a user compiling the program doesn't require autoconf. For that split up make distclean from make realclean and exclude the files we want to keep form the former. To make this easier to maintain adher to stricter rules of use for CONFIGURE and LDIRT. CONFIGURE now includes all generated files from autoconf (or for it like our copied install-sh) and gets only removed on make realclean, but added to LSRCFILES so that Makepkgs can pick it up. Everything else than needs to be removed on a realclean gets assigned to LDIRT. Also split up the configure rule into one to generate the configure script and one to run it. Signed-off-by: Christoph Hellwig Reviewed-by: Mike Frysinger So we've been doing this with release tarballs for more than 6 years - I checked and found these files in the tarballs back to 3.0.1. The above commit is the last commit prior to the release of 3.0.1... Nowdays, the generated files in the 3.2.4 tarball created via a 'make dist' rule. I run that on an up to date debian unstable box with autoconfig 2.69 installed to generate the files, so the question I have is this: why is an up-to-date build box generating "out of date" configure/m4 scripts? What, exactly, is out of date, and how do I ensure that the pre-build config files are correctly up-to-date? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 2 18:42:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5DFC67F61 for ; Sun, 2 Aug 2015 18:42:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EE754AC01A for ; Sun, 2 Aug 2015 16:42:55 -0700 (PDT) X-ASG-Debug-ID: 1438558972-04cbb0416d215500001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id oKZRlwQwUZJJK9rM for ; Sun, 02 Aug 2015 16:42:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2COCADtqb5VPG0mLHlbGQEBAYJ+gT2GUaJbAQEBAQEBBpsWAgIBAQKBIE0BAQEBAQEHAQEBAUE/hCMBAQEBAgE6HCMFCwgDDgoJJQ8FJQMHGhMbiAsHx00BCwEfGYYGhTCFCAeELAWMTYgsjEqORIsGgjQcgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail06.adl2.internode.on.net with ESMTP; 03 Aug 2015 09:12:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZM2u2-0007rA-VV; Mon, 03 Aug 2015 09:42:51 +1000 Date: Mon, 3 Aug 2015 09:42:50 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... Message-ID: <20150802234250.GT16638@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... References: <1437397018-12864-1-git-send-email-jtulak@redhat.com> <1437397018-12864-2-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1437397018-12864-2-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1438558972 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Jul 20, 2015 at 02:56:55PM +0200, Jan Tulak wrote: > OS X has some conflicting LIST_ macros, so prefix the XFS ones. What macros, and how do we get them included in the build? I shouldn't need to go and use google to work out why a change is beign made.... > Signed-off-by: Jan Tulak > --- > include/list.h | 6 +++--- > repair/phase6.c | 2 +- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/include/list.h b/include/list.h > index 3f087a4..7e9f748 100644 > --- a/include/list.h > +++ b/include/list.h > @@ -27,10 +27,10 @@ struct list_head { > struct list_head *prev; > }; > > -#define LIST_HEAD_INIT(name) { &(name), &(name) } > +#define XFS_LIST_HEAD_INIT(name) { &(name), &(name) } > > -#define LIST_HEAD(name) \ > - struct list_head name = LIST_HEAD_INIT(name) > +#define XFS_LIST_HEAD(name) \ > + struct list_head name = XFS_LIST_HEAD_INIT(name) > > #define INIT_LIST_HEAD(list) list_head_init(list) > static inline void list_head_init(struct list_head *list) This is supposed to match what is required for libxfs/ so we don't have to modify the kernel code we bring across. Without knowing exactly how we are including conflicting definitions from the OS X include files, it's really hard to suggest other possible solutions... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Aug 3 02:41:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 418807F59 for ; Mon, 3 Aug 2015 02:41:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D1068F811E for ; Mon, 3 Aug 2015 00:41:16 -0700 (PDT) X-ASG-Debug-ID: 1438587672-04cb6c673f2945f0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id rNdCVqIxlcwflGOc for ; Mon, 03 Aug 2015 00:41:15 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3FwDNGr9V/20mLHlbGQEBAYJ+gT2pLgEBAQMGnEJNAQEBAQEBgQtBAoNhAQUnLzMIGDE5AxsZiC3JGYYfilaEFQWUeZsOiwYmgUoBCzgcgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:10:44 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAMH-0000AS-LR for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAMH-0008Cc-Km for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: growfs not aware of sb_meta_uuid Date: Mon, 3 Aug 2015 17:40:23 +1000 X-ASG-Orig-Subj: [PATCH 2/4] xfs: growfs not aware of sb_meta_uuid Message-Id: <1438587625-31437-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438587625-31437-1-git-send-email-david@fromorbit.com> References: <1438587625-31437-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587675 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Adding this simple change to xfstests:common/rc::_scratch_mkfs_xfs: + if [ $mkfs_status -eq 0 ]; then + xfs_admin -U generate $SCRATCH_DEV > /dev/null + fi triggers all sorts of errors in xfstests. xfs/104 is an example, where growfs fails with a UUID mismatch corruption detected by xfs_agf_write_verify() when trying to write the first new AG headers. Fix this problem by making sure we copy the sb_meta_uuid into new metadata written by growfs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_fsops.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 9b3438a..ee3aaa0a 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -250,7 +250,7 @@ xfs_growfs_data_private( agf->agf_freeblks = cpu_to_be32(tmpsize); agf->agf_longest = cpu_to_be32(tmpsize); if (xfs_sb_version_hascrc(&mp->m_sb)) - uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); + uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid); error = xfs_bwrite(bp); xfs_buf_relse(bp); @@ -273,7 +273,7 @@ xfs_growfs_data_private( if (xfs_sb_version_hascrc(&mp->m_sb)) { agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); agfl->agfl_seqno = cpu_to_be32(agno); - uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); + uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid); } agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, bp); @@ -309,7 +309,7 @@ xfs_growfs_data_private( agi->agi_newino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO); if (xfs_sb_version_hascrc(&mp->m_sb)) - uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); + uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid); if (xfs_sb_version_hasfinobt(&mp->m_sb)) { agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); agi->agi_free_level = cpu_to_be32(1); -- 2.1.4 From dave@fromorbit.com Mon Aug 3 02:41:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F1367F59 for ; Mon, 3 Aug 2015 02:41:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B5A9304053 for ; Mon, 3 Aug 2015 00:41:18 -0700 (PDT) X-ASG-Debug-ID: 1438587672-04cb6c673f2945f0003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oLQhCzMsohp0DrLy for ; Mon, 03 Aug 2015 00:41:16 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3FwDNGr9V/20mLHlbGQEBAYJ+gT2pLgEBAQMGnEJNAQEBAQEBgQtBAoNhAQUnLzMIGDE5AxsZiC3JGYYfiVOBA4QVBYcXhmCHApsOiwYmgUoBCzgcgWUsMYEFgUcBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:10:44 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAMH-0000AR-L9 for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAMH-0008CX-KR for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: fix sb_meta_uuid usage Date: Mon, 3 Aug 2015 17:40:22 +1000 X-ASG-Orig-Subj: [PATCH 1/4] xfs: fix sb_meta_uuid usage Message-Id: <1438587625-31437-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438587625-31437-1-git-send-email-david@fromorbit.com> References: <1438587625-31437-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587676 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner After changing the UUID on a v5 filesystem, xfstests fails immediately on a debug kernel with: XFS: Assertion failed: uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid), file: fs/xfs/xfs_inode.c, line: 799 This needs to check against the sb_meta_uuid, not the user visible UUID that was changed. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index fb52ff0..4156e37 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -796,7 +796,7 @@ xfs_ialloc( if (ip->i_d.di_version == 3) { ASSERT(ip->i_d.di_ino == ino); - ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid)); ip->i_d.di_crc = 0; ip->i_d.di_changecount = 1; ip->i_d.di_lsn = 0; -- 2.1.4 From dave@fromorbit.com Mon Aug 3 02:41:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 52E057F59 for ; Mon, 3 Aug 2015 02:41:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3F3E58F811E for ; Mon, 3 Aug 2015 00:41:15 -0700 (PDT) X-ASG-Debug-ID: 1438587672-04cb6c673f2945f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9lC2LLGTN87o38gJ for ; Mon, 03 Aug 2015 00:41:13 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BUOQDNGr9V/20mLHlbGQEBgn8BgQepYwEBAQMGlRSHLk0BAQEBAQFpIkEChD07gQIDiGGjMKVphh+KVoQVBZF3gwKbDosGJoFKAQEIAQEBATYcgWUsgn0BAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:10:44 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAMH-0000AQ-Kh for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAMH-0008CU-Jl for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/4] xfs: sb_meta_uuid fixes Date: Mon, 3 Aug 2015 17:40:21 +1000 X-ASG-Orig-Subj: [PATCH 0/4] xfs: sb_meta_uuid fixes Message-Id: <1438587625-31437-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587673 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, These are fixes to problems I found int eh sb_meta_uuid changes I recently pushed to for-next. They were all found by augmenting _scratch_mkfs_xfs in xfstests with an extra command to change the UUID after the filesystem had been created. I think we should probably do that randomly in xfstests to get coverage of both cases. No-one shoul dhave been exposed to these yet, because I haven't released a userspace that can change the UUID yet on v5 filesystems. Cheers, Dave. From dave@fromorbit.com Mon Aug 3 02:41:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD3FA7F7C for ; Mon, 3 Aug 2015 02:41:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9B428F811E for ; Mon, 3 Aug 2015 00:41:19 -0700 (PDT) X-ASG-Debug-ID: 1438587677-04cbb0416e21cb80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id nHDBw6yIXrYBi9of for ; Mon, 03 Aug 2015 00:41:17 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3FwDNGr9V/20mLHlbGQEBAYJ+gT2pLgEBAQMGnEJNAQEBAQEBgQtBAoNhAQUnLzMIGDE5AxsZiC3JGYYfiVOBA4QVBZR5mw6LBiaBSgELOByBZSwxgQWBRwEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:10:44 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAMH-0000AU-MH for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAMH-0008Cm-LM for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: dquots should be stamped with sb_meta_uuid Date: Mon, 3 Aug 2015 17:40:25 +1000 X-ASG-Orig-Subj: [PATCH 4/4] xfs: dquots should be stamped with sb_meta_uuid Message-Id: <1438587625-31437-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438587625-31437-1-git-send-email-david@fromorbit.com> References: <1438587625-31437-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587677 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Once the sb_uuid is changed, the wrong uuid is stamped into new dquots on disk. Found by inspection, verified by generic/219. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dquot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 4143dc7..b1b26b6 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -251,7 +251,7 @@ xfs_qm_init_dquot_blk( d->dd_diskdq.d_id = cpu_to_be32(curid); d->dd_diskdq.d_flags = type; if (xfs_sb_version_hascrc(&mp->m_sb)) { - uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid); xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), XFS_DQUOT_CRC_OFF); } -- 2.1.4 From dave@fromorbit.com Mon Aug 3 02:41:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A9EA57F7C for ; Mon, 3 Aug 2015 02:41:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36F99AC045 for ; Mon, 3 Aug 2015 00:41:18 -0700 (PDT) X-ASG-Debug-ID: 1438587675-04cb6c6740294600001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id XRUcMF4z58pWImYP for ; Mon, 03 Aug 2015 00:41:16 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3FwDNGr9V/20mLHlbGQEBAYJ+gT2pLgEBAQMGnEJNAQEBAQEBgQtBAoNhAQUnLzMIGDE5AxsZiC3JGYYfilaEFQWUeZsOiwYmgUoBCzgcgWUsMYEHJYEgAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:10:44 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAMH-0000AT-Li for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAMH-0008Ch-L4 for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:40:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: log recovery needs to validate against sb_meta_uuid Date: Mon, 3 Aug 2015 17:40:24 +1000 X-ASG-Orig-Subj: [PATCH 3/4] xfs: log recovery needs to validate against sb_meta_uuid Message-Id: <1438587625-31437-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438587625-31437-1-git-send-email-david@fromorbit.com> References: <1438587625-31437-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587675 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that sb_uuid can be changed by the user, we cannot use this to validate the metadata blocks being recovered belong to this filesystem. We must check against the sb_meta_uuid as that will remain unchanged. There is a complication in this code - the superblock itself. We can not check the sb_meta_uuid unconditionally, as that may not be set on disk. Hence we must verify the superblock sb_uuid matches between the log record and the in-core superblock. Found by inspection after the previous two problems were found. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c674b40..6f83d12 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1895,15 +1895,25 @@ xlog_recover_get_buf_lsn( */ goto recover_immediately; case XFS_SB_MAGIC: + /* + * superblock uuids are magic. We may or may not have a + * sb_meta_uuid on disk, but it will be set in the in-core + * superblock. We set the uuid pointer for verification + * according to the superblock feature mask to ensure we check + * the relevant UUID in the superblock. + */ lsn = be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn); - uuid = &((struct xfs_dsb *)blk)->sb_uuid; + if (xfs_sb_version_hasmetauuid(&mp->m_sb)) + uuid = &((struct xfs_dsb *)blk)->sb_meta_uuid; + else + uuid = &((struct xfs_dsb *)blk)->sb_uuid; break; default: break; } if (lsn != (xfs_lsn_t)-1) { - if (!uuid_equal(&mp->m_sb.sb_uuid, uuid)) + if (!uuid_equal(&mp->m_sb.sb_meta_uuid, uuid)) goto recover_immediately; return lsn; } -- 2.1.4 From dave@fromorbit.com Mon Aug 3 02:42:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4F25F7F59 for ; Mon, 3 Aug 2015 02:42:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DFDC8AC046 for ; Mon, 3 Aug 2015 00:42:47 -0700 (PDT) X-ASG-Debug-ID: 1438587765-04bdf06bd21cfff0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id hRnvpNZwBzyxzTGe for ; Mon, 03 Aug 2015 00:42:46 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BiHQDNGr9V/20mLHlbGQEBgn8BqmoBAQEDBpUUhy5NAQEBAQEBaSJBAoQ9O4ECA4hhozClaYYfilaEFQWUeZsOiwYmgUoBAQgBAQEBgjcsgn0BAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:12:45 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAOG-0000Az-EF for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:42:32 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAOG-0008Eb-DL for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:42:32 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfsprogs: sb_meta_uuid fixes Date: Mon, 3 Aug 2015 17:42:27 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfsprogs: sb_meta_uuid fixes Message-Id: <1438587749-31597-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587766 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- HI folks, THis is the userspace side fixes that I've needed to make to get xfstests to pass without regressions with a modified sb_meta_uuid. Same circumstances as the kernel side patches I just sent.... Cheers, Dave. From dave@fromorbit.com Mon Aug 3 02:42:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 101EA7F59 for ; Mon, 3 Aug 2015 02:42:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A34BCAC045 for ; Mon, 3 Aug 2015 00:42:48 -0700 (PDT) X-ASG-Debug-ID: 1438587765-04bdf06bd21cfff0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 74tD2RvFPceYr5HA for ; Mon, 03 Aug 2015 00:42:47 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3FwDNGr9V/20mLHlbGQEBAYJ+gT2pLgEBAQMGnEJNAQEBAQEBgQtBAoNhAQUnLzMIGDE5AxsZiC3JGYYfilaEFQWUeZsOiwYmgUoBCzgcgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:12:45 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAOG-0000B0-EY for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:42:32 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAOG-0008Ee-Dv for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:42:32 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] repair: use sb_meta_uuid for checking of metadata headers Date: Mon, 3 Aug 2015 17:42:28 +1000 X-ASG-Orig-Subj: [PATCH 1/2] repair: use sb_meta_uuid for checking of metadata headers Message-Id: <1438587749-31597-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438587749-31597-1-git-send-email-david@fromorbit.com> References: <1438587749-31597-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587767 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that we can change the uuid on v5 filesystems, we always need to verify the metadata uuid against sb_meta_uuid, not sb_uuid. This fixes quite a few xfstests failures when UUIDs are changed before executing tests. Signed-off-by: Dave Chinner --- repair/phase6.c | 2 +- repair/scan.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index 09da2e2..ad9be38 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1960,7 +1960,7 @@ _("expected block %" PRIu64 ", got %llu, directory inode %" PRIu64 "\n"), return 1; } /* verify uuid */ - if (platform_uuid_compare(uuid, &mp->m_sb.sb_uuid) != 0) { + if (platform_uuid_compare(uuid, &mp->m_sb.sb_meta_uuid) != 0) { do_warn( _("wrong FS UUID, directory inode %" PRIu64 " block %" PRIu64 "\n"), ino, bp->b_bn); diff --git a/repair/scan.c b/repair/scan.c index 8711b94..95b8ade 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -237,7 +237,7 @@ _("expected block %" PRIu64 ", got %llu, bmbt block %" PRIu64 "\n"), } /* verify uuid */ if (platform_uuid_compare(&block->bb_u.l.bb_uuid, - &mp->m_sb.sb_uuid) != 0) { + &mp->m_sb.sb_meta_uuid) != 0) { do_warn( _("wrong FS UUID, bmbt block %" PRIu64 "\n"), bno); -- 2.1.4 From dave@fromorbit.com Mon Aug 3 02:42:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB4227F85 for ; Mon, 3 Aug 2015 02:42:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4924DAC045 for ; Mon, 3 Aug 2015 00:42:50 -0700 (PDT) X-ASG-Debug-ID: 1438587767-04cbb0416f21cc00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id EPruC7DbaYELG2aw for ; Mon, 03 Aug 2015 00:42:48 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A3FwDNGr9V/20mLHlbGQEBAYJ+gT2pLgEBAQMGnEJNAQEBAQEBgQtBAoNhAQUnLzMIGDE5AxsZiC3JGYYfiVOBA4QVBZR5phQmgUoBCzgcgWUsMYEFgUcBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Aug 2015 17:12:45 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMAOG-0000B1-GE for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:42:32 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMAOG-0008Ej-ED for xfs@oss.sgi.com; Mon, 03 Aug 2015 17:42:32 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] libxfs: fix uuid check durign inode allocation Date: Mon, 3 Aug 2015 17:42:29 +1000 X-ASG-Orig-Subj: [PATCH 2/2] libxfs: fix uuid check durign inode allocation Message-Id: <1438587749-31597-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438587749-31597-1-git-send-email-david@fromorbit.com> References: <1438587749-31597-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438587767 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21303 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Needs to check sb_meta_uuid now that we the sb_uuid can change on v5 filesystems. Signed-off-by: Dave Chinner --- libxfs/util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxfs/util.c b/libxfs/util.c index 719a5b7..f427d22 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -262,7 +262,7 @@ libxfs_ialloc( if (ip->i_d.di_version == 3) { ASSERT(ip->i_d.di_ino == ino); - ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid)); ip->i_d.di_crc = 0; ip->i_d.di_changecount = 1; ip->i_d.di_lsn = 0; -- 2.1.4 From jtulak@redhat.com Mon Aug 3 04:35:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 84A9D7F6A for ; Mon, 3 Aug 2015 04:35:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73D0E8F8066 for ; Mon, 3 Aug 2015 02:35:22 -0700 (PDT) X-ASG-Debug-ID: 1438594519-04cbb0416f21f380001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id srrORWElGlr8SMGI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 02:35:20 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t739YmG6021041; Mon, 3 Aug 2015 05:34:48 -0400 Date: Mon, 3 Aug 2015 05:34:48 -0400 (EDT) From: Jan Tulak To: Dave Chinner , Christoph Hellwig Cc: xfs@oss.sgi.com Message-ID: <1142980605.1953560.1438594488229.JavaMail.zimbra@redhat.com> In-Reply-To: <20150802234250.GT16638@dastard> References: <1437397018-12864-1-git-send-email-jtulak@redhat.com> <1437397018-12864-2-git-send-email-jtulak@redhat.com> <20150802234250.GT16638@dastard> Subject: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.7.200] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: Prefix LIST_... macros to XFS_LIST_... Thread-Index: iVgzoIoF5iC1uqBGzKmDUsPfzEOiww== X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1438594520 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21305 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Dave Chinner" > What macros, and how do we get them included in the build? I > shouldn't need to go and use google to work out why a change is > beign made.... > > > > > > > > > This is supposed to match what is required for libxfs/ so we don't > have to modify the kernel code we bring across. Without knowing > exactly how we are including conflicting definitions from the OS X > include files, it's really hard to suggest other possible > solutions... > Ahh, sorry, I already wrote a reply to Chris, but it looks like I pressed "save" instead "send" - I found it in drafts and not in send emails. /shy I will edit the commit message appropriately when resubmitting. The conflicting macros are LIST_HEAD and LIST_HEAD_INIT. Here is the reply I didn't sent: ----- Original Message ----- > From: "Christoph Hellwig" > > Can you post the compiler warnings you see without this patch? > Sure, these: ../include/xfs/list.h:32:9: warning: 'LIST_HEAD' macro redefined [-Wmacro-redefined] #define LIST_HEAD(name) \ ^ /usr/include/sys/queue.h:417:9: note: previous definition is here #define LIST_HEAD(name, type) \ ^ (and the same for LIST_HEAD_INIT) sys/queue.h is not linked directly, but from many system libraries. A quick grep on /usr/include/ shows 24 header files including the queue, sys/mount.h one of them. And I didn't found a way how to avoid it. If you have an idea what else to to with it, I'm happy to try it. Cheers, Jan -- Jan Tulak jtulak@redhat.com From jtulak@redhat.com Mon Aug 3 05:40:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FC587F4E for ; Mon, 3 Aug 2015 05:40:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E4E08F8126 for ; Mon, 3 Aug 2015 03:40:29 -0700 (PDT) X-ASG-Debug-ID: 1438598427-04cb6c673f298820001-NocioJ Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by cuda.sgi.com with ESMTP id qi0QTQvqGat0Pkp6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 03:40:28 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.37 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73Ae4Zc017876; Mon, 3 Aug 2015 06:40:04 -0400 Date: Mon, 3 Aug 2015 06:40:04 -0400 (EDT) From: Jan Tulak To: Christoph Hellwig Cc: sandeen@redhat.com, xfs@oss.sgi.com Message-ID: <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> In-Reply-To: <20150726162530.GE29329@infradead.org> References: <1156743222.24471614.1436281858017.JavaMail.zimbra@redhat.com> <1436346893-11831-1-git-send-email-jtulak@redhat.com> <1508777144.956841.1437482376774.JavaMail.zimbra@redhat.com> <20150726162530.GE29329@infradead.org> Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v3] xfsprogs: blkid is now mandatory Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.7.200] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: blkid is now mandatory Thread-Index: Q3gefSeH6cK8SLOIdQCKoVXORsejtQ== X-Barracuda-Connect: mx5-phx2.redhat.com[209.132.183.37] X-Barracuda-Start-Time: 1438598427 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21306 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Christoph Hellwig" > > On Tue, Jul 21, 2015 at 08:39:36AM -0400, Jan Tulak wrote: > > I just found that while it is possible to get blkid on OS X, it is > > in 1.0.0 version which doesn't have blkid_probe_get function. > > I'm examining whether it is possible to get an updated version there, > > but right now, this patch breaks OS X support. Unfortunately I didn't > > noticed of this before, as the OS X port was terribly out of date. > > > > So this patch shouldn't be included until I find how to get around. > > I don't think this is a lbocker given that OSX support doesn't > even work. > > To the contrary I'd really prefer to go in ASAP to avoid anyone > relying on it longer than nessecary. I tried to get newer blkid on OSX, but so far without a big success (well, it looks like a kind of a small dependency hell that would have to be ported, with bigger or smaller effort...). With regards on the priorities, I think if we can make the OS X support in "manual patching required" way, then? So lets include this patch, and just note it OS X doc "you have to revert commit XXX and re-apply any changes to the relevant code"? Jan -- Jan Tulak jtulak@redhat.com From joe@perches.com Mon Aug 3 06:45:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 21BA87F5A for ; Mon, 3 Aug 2015 06:45:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8D2AAC04B for ; Mon, 3 Aug 2015 04:45:47 -0700 (PDT) X-ASG-Debug-ID: 1438602344-04cb6c673f29a000001-NocioJ Received: from smtprelay.hostedemail.com (smtprelay0103.hostedemail.com [216.40.44.103]) by cuda.sgi.com with ESMTP id D3K0uvlI25iu4mDQ for ; Mon, 03 Aug 2015 04:45:45 -0700 (PDT) X-Barracuda-Envelope-From: joe@perches.com X-Barracuda-Apparent-Source-IP: 216.40.44.103 Received: from filter.hostedemail.com (unknown [216.40.38.60]) by smtprelay04.hostedemail.com (Postfix) with ESMTP id 6CFC93512DA; Mon, 3 Aug 2015 11:45:44 +0000 (UTC) X-Session-Marker: 6A6F6540706572636865732E636F6D X-HE-Tag: beef84_3200a1a1a364e X-Filterd-Recvd-Size: 1436 Received: from joe-X200MA.home (pool-173-51-221-2.lsanca.fios.verizon.net [173.51.221.2]) (Authenticated sender: joe@perches.com) by omf04.hostedemail.com (Postfix) with ESMTPA; Mon, 3 Aug 2015 11:45:43 +0000 (UTC) Message-ID: <1438602342.30149.22.camel@perches.com> Subject: [TRIVIAL PATCH] xfs: Correct misuse of %0x From: Joe Perches X-ASG-Orig-Subj: [TRIVIAL PATCH] xfs: Correct misuse of %0x To: Dave Chinner Cc: xfs , LKML Date: Mon, 03 Aug 2015 04:45:42 -0700 Content-Type: text/plain; charset="ISO-8859-1" X-Mailer: Evolution 3.16.0-fta1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay0103.hostedemail.com[216.40.44.103] X-Barracuda-Start-Time: 1438602345 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Correct misuse of 0x%u in logging message. Signed-off-by: Joe Perches --- fs/xfs/xfs_discard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index e85a951..272c3f8 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -227,7 +227,7 @@ xfs_discard_extents( GFP_NOFS, 0); if (error && error != -EOPNOTSUPP) { xfs_info(mp, - "discard failed for extent [0x%llu,%u], error %d", + "discard failed for extent [0x%llx,%u], error %d", (unsigned long long)busyp->bno, busyp->length, error); From jtulak@redhat.com Mon Aug 3 09:40:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8F75B7F59 for ; Mon, 3 Aug 2015 09:40:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79D3F304053 for ; Mon, 3 Aug 2015 07:40:22 -0700 (PDT) X-ASG-Debug-ID: 1438612820-04cb6c673e29dc00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xa0CDWvTvLjZvjfY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:21 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id A15DFBB99E; Mon, 3 Aug 2015 14:40:20 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhX031559; Mon, 3 Aug 2015 10:40:19 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 00/11] xfsprogs: OS X partial support Date: Mon, 3 Aug 2015 16:39:38 +0200 X-ASG-Orig-Subj: [PATCH v3 00/11] xfsprogs: OS X partial support Message-Id: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612821 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi folks. All right, this is a third iteration of fixing the out-of-date OS X code in xfsprogs (4 years since the last touch). Against v2, I made these changes: - Patch 4/4 was broken to 8 smaller patches - Issues in that patch were addressed - Greatly enhanced commit message about LIST_ macros renaming The last point is still open and may change, so I moved it into the last commit. First two commits were already reviewed, but I include them to keep their trace in this new numbering of the patchset. Cheers, Jan Jan Tulak (11): xfsprogs: Don't Make .po files with gettext disabled xfsprogs: Use glibtoolize on osx xfsprogs: undefined variable fix xfsprogs: Add ifdef dirent checks where it was missing xfsprogs: Change OS X-specific CFLAGS/LDFLAGS xfsprogs: Add includes required for OS X builds xfsprogs: missing and dummy calls for OS X support xfsprogs: Add fls check into autoconf xfsprogs: Add mntent.h check into autoconf xfsprogs: replace obsolete memalign with posix_memalign xfsprogs: Prefix LIST_... macros to XFS_LIST_... Makefile | 19 +++++- configure.ac | 2 + copy/xfs_copy.c | 2 +- db/attrset.c | 2 +- fsr/xfs_fsr.c | 17 ++++-- include/bitops.h | 2 + include/builddefs.in | 10 +++- include/darwin.h | 159 ++++++++++++++++++++++++++++++++++++++++++++------ include/freebsd.h | 1 - include/gnukfreebsd.h | 1 - include/linux.h | 1 - include/list.h | 6 +- io/pread.c | 4 +- io/readdir.c | 4 ++ libdisk/fstype.c | 1 + libhandle/Makefile | 4 ++ libxcmd/paths.c | 2 +- libxfs/rdwr.c | 19 ++++-- m4/package_libcdev.m4 | 26 +++++++++ mkfs/xfs_mkfs.c | 6 +- repair/incore.c | 2 +- repair/incore_ino.c | 13 ++++- repair/phase1.c | 2 +- repair/phase6.c | 2 +- repair/prefetch.c | 7 +-- repair/sb.c | 10 ++-- rtcp/xfs_rtcp.c | 7 ++- 27 files changed, 274 insertions(+), 57 deletions(-) -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3C09D7F5F for ; Mon, 3 Aug 2015 09:40:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD6D8AC006 for ; Mon, 3 Aug 2015 07:40:24 -0700 (PDT) X-ASG-Debug-ID: 1438612823-04cbb0416d225590001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BPTr34i2gX6NchdH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:23 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 1DDF58E921; Mon, 3 Aug 2015 14:40:23 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhZ031559; Mon, 3 Aug 2015 10:40:22 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v2 02/11] xfsprogs: Use glibtoolize on osx Date: Mon, 3 Aug 2015 16:39:40 +0200 X-ASG-Orig-Subj: [PATCH v2 02/11] xfsprogs: Use glibtoolize on osx Message-Id: <1438612789-17486-3-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612823 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 (Already reviewed by Chris, but resubmiting as the patchset itself was partially reworked.) OS X doesn't have libtoolize binary by default, and the available$ ports are named "glibtoolize". Autodetect this issue. Signed-off-by: Jan Tulak Reviewed-by: Christoph Hellwig --- Makefile | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3da4d5d..4abaaac 100644 --- a/Makefile +++ b/Makefile @@ -52,6 +52,14 @@ ifneq ("$(XGETTEXT)","") TOOL_SUBDIRS += po endif +# If we are on OS X, use glibtoolize from MacPorts, as OS X doesn't have +# libtoolize binary itself. +LIBTOOLIZE_TEST=$(shell libtoolize --version >/dev/null 2>&1 && echo found) +LIBTOOLIZE_BIN=libtoolize +ifneq ("$(LIBTOOLIZE_TEST)","found") +LIBTOOLIZE_BIN=glibtoolize +endif + # include is listed last so it is processed last in clean rules. SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) include @@ -85,13 +93,14 @@ else clean: # if configure hasn't run, nothing to clean endif + # Recent versions of libtool require the -i option for copying auxiliary # files (config.sub, config.guess, install-sh, ltmain.sh), while older # versions will copy those files anyway, and don't understand -i. -LIBTOOLIZE_INSTALL = `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` +LIBTOOLIZE_INSTALL = `$(LIBTOOLIZE_BIN) -n -i >/dev/null 2>/dev/null && echo -i` configure: - libtoolize -c $(LIBTOOLIZE_INSTALL) -f + $(LIBTOOLIZE_BIN) -c $(LIBTOOLIZE_INSTALL) -f cp include/install-sh . aclocal -I m4 autoconf -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F0F87F60 for ; Mon, 3 Aug 2015 09:40:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7D5088F8065 for ; Mon, 3 Aug 2015 07:40:25 -0700 (PDT) X-ASG-Debug-ID: 1438612824-04cb6c673d29dc10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xa2S1snynzZihCgq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:25 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 66B65AB96A; Mon, 3 Aug 2015 14:40:24 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIha031559; Mon, 3 Aug 2015 10:40:23 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 03/11] xfsprogs: undefined variable fix Date: Mon, 3 Aug 2015 16:39:41 +0200 X-ASG-Orig-Subj: [PATCH v3 03/11] xfsprogs: undefined variable fix Message-Id: <1438612789-17486-4-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612824 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Typo fix, which wasn't catch earlier due to #ifdef branching. The 'rmnttomname' does not exists anywhere and looks like a hybrid between rmntfromname and rmntonname. And because the previous if has has 'fromname' on both arguments of realpath, I choose the same approach when fixing it. Signed-off-by: Jan Tulak --- libxcmd/paths.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxcmd/paths.c b/libxcmd/paths.c index c0b1ddb..b360617 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -364,7 +364,7 @@ fs_table_initialise_mounts( continue; if (!realpath(stats[i].f_mntfromname, rmntfromname)) continue; - if (!realpath(stats[i].f_mntonname, rmnttomname))) + if (!realpath(stats[i].f_mntonname, rmntonname)) continue; if (path && -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 43EF07F60 for ; Mon, 3 Aug 2015 09:40:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30D64304066 for ; Mon, 3 Aug 2015 07:40:27 -0700 (PDT) X-ASG-Debug-ID: 1438612825-04cbb0416c225590001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aYCRe58BXQkz8vXS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:26 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 9C5C1A0B2A; Mon, 3 Aug 2015 14:40:25 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhb031559; Mon, 3 Aug 2015 10:40:24 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing Date: Mon, 3 Aug 2015 16:39:42 +0200 X-ASG-Orig-Subj: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing Message-Id: <1438612789-17486-5-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612826 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add check for _DIRENT_HAVED_RECLEN/_OFF to read_directory(). In dump_dirent() these checks already are used, but they were missing in read_directory. Signed-off-by: Jan Tulak --- io/readdir.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/io/readdir.c b/io/readdir.c index 20b8898..ed8f04d 100644 --- a/io/readdir.c +++ b/io/readdir.c @@ -104,12 +104,16 @@ read_directory( if (!dirent) break; +#ifdef _DIRENT_HAVE_D_RECLEN *total += dirent->d_reclen; +#endif count++; if (dump) { dump_dirent(offset, dirent); +#ifdef _DIRENT_HAVE_D_OFF offset = dirent->d_off; +#endif } } -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3EE877F76 for ; Mon, 3 Aug 2015 09:40:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B9338F8049 for ; Mon, 3 Aug 2015 07:40:28 -0700 (PDT) X-ASG-Debug-ID: 1438612827-04cbb0416f2255a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BXyBNHpCLzIyBZD5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:27 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id D4CD3AC85C; Mon, 3 Aug 2015 14:40:26 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhc031559; Mon, 3 Aug 2015 10:40:25 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 05/11] xfsprogs: Change OS X-specific CFLAGS/LDFLAGS Date: Mon, 3 Aug 2015 16:39:43 +0200 X-ASG-Orig-Subj: [PATCH v3 05/11] xfsprogs: Change OS X-specific CFLAGS/LDFLAGS Message-Id: <1438612789-17486-6-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612827 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 OS X uses clang as a default compiler. So remove incompatible options. Signed-off-by: Jan Tulak --- include/builddefs.in | 2 +- libhandle/Makefile | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/builddefs.in b/include/builddefs.in index 7e9f53d..7f939f6 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -119,7 +119,7 @@ ifeq ($(PKG_PLATFORM),gnukfreebsd) PCFLAGS = -D_GNU_SOURCE $(GCCFLAGS) endif ifeq ($(PKG_PLATFORM),darwin) -PCFLAGS = -traditional-cpp $(GCCFLAGS) +PCFLAGS = $(GCCFLAGS) DEPENDFLAGS = -D__APPLE__ endif ifeq ($(PKG_PLATFORM),irix) diff --git a/libhandle/Makefile b/libhandle/Makefile index 865ca22..0b5e1ad 100644 --- a/libhandle/Makefile +++ b/libhandle/Makefile @@ -10,7 +10,11 @@ LT_CURRENT = 1 LT_REVISION = 3 LT_AGE = 0 +ifeq ($(PKG_PLATFORM),darwin) +LTLDFLAGS += -Wl,libhandle.sym +else LTLDFLAGS += -Wl,--version-script,libhandle.sym +endif CFILES = handle.c jdm.c LSRCFILES = libhandle.sym -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 856D67F6A for ; Mon, 3 Aug 2015 09:40:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F5A78F8065 for ; Mon, 3 Aug 2015 07:40:23 -0700 (PDT) X-ASG-Debug-ID: 1438612822-04cb6c673f29dc10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Cjqj0FummYykyk1F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:22 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 2950B8E90F; Mon, 3 Aug 2015 14:40:22 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhY031559; Mon, 3 Aug 2015 10:40:20 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v2 01/11] xfsprogs: Don't Make .po files with gettext disabled Date: Mon, 3 Aug 2015 16:39:39 +0200 X-ASG-Orig-Subj: [PATCH v2 01/11] xfsprogs: Don't Make .po files with gettext disabled Message-Id: <1438612789-17486-2-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612822 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 (Already reviewed by Chris, but resubmiting as the patchset itself was partially reworked.) "po" target is added only if gettext binary is found. Without this patch, Make tried to build the target even with --enable-gettext=no configure option, which led to a failing build. Signed-off-by: Jan Tulak Reviewed-by: Christoph Hellwig --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6d6803b..3da4d5d 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,11 @@ HDR_SUBDIRS = include libxfs DLIB_SUBDIRS = libxlog libxcmd libhandle libdisk LIB_SUBDIRS = libxfs $(DLIB_SUBDIRS) TOOL_SUBDIRS = copy db estimate fsck fsr growfs io logprint mkfs quota \ - mdrestore repair rtcp m4 man doc po debian + mdrestore repair rtcp m4 man doc debian + +ifneq ("$(XGETTEXT)","") +TOOL_SUBDIRS += po +endif # include is listed last so it is processed last in clean rules. SUBDIRS = $(LIB_SUBDIRS) $(TOOL_SUBDIRS) include -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 594B47F81 for ; Mon, 3 Aug 2015 09:40:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 456C9304059 for ; Mon, 3 Aug 2015 07:40:29 -0700 (PDT) X-ASG-Debug-ID: 1438612828-04cbb0416d2255a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o71BOAUIEl2RqMHF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:28 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 1B27BAEF2F; Mon, 3 Aug 2015 14:40:28 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhd031559; Mon, 3 Aug 2015 10:40:27 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 06/11] xfsprogs: Add includes required for OS X builds Date: Mon, 3 Aug 2015 16:39:44 +0200 X-ASG-Orig-Subj: [PATCH v3 06/11] xfsprogs: Add includes required for OS X builds Message-Id: <1438612789-17486-7-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612828 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- include/darwin.h | 5 +++++ libdisk/fstype.c | 1 + 2 files changed, 6 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index 30f0052..2b470b4 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -24,6 +24,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #define __BYTE_ORDER BYTE_ORDER diff --git a/libdisk/fstype.c b/libdisk/fstype.c index 548f297..c8bde34 100644 --- a/libdisk/fstype.c +++ b/libdisk/fstype.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "fstype.h" /* -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4217B7F8D for ; Mon, 3 Aug 2015 09:40:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E11330404E for ; Mon, 3 Aug 2015 07:40:31 -0700 (PDT) X-ASG-Debug-ID: 1438612829-04cb6c673d29dc30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dpiiJaQ5WJ5VEQBE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:30 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 6CAE092475; Mon, 3 Aug 2015 14:40:29 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhe031559; Mon, 3 Aug 2015 10:40:28 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 07/11] xfsprogs: missing and dummy calls for OS X support Date: Mon, 3 Aug 2015 16:39:45 +0200 X-ASG-Orig-Subj: [PATCH v3 07/11] xfsprogs: missing and dummy calls for OS X support Message-Id: <1438612789-17486-8-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612829 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add and update various API, macros and types where is some change in OS X or xfsprogs. Most changes are in darwin.h. Add dummy implementations where native support is nonexistent and the tools are not expected to work anyway, so all tools can be at least compiled. Signed-off-by: Jan Tulak --- fsr/xfs_fsr.c | 8 +++ include/darwin.h | 153 +++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 145 insertions(+), 16 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index efc17a8..d8a4ece 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -43,6 +43,14 @@ #define _PATH_FSRLAST "/var/tmp/.fsrlast_xfs" #define _PATH_PROC_MOUNTS "/proc/mounts" +#ifdef USE_DUMMY_XATTR + /* OS X has fsetxattr with different number of arguments. + * Because it won't work anyway (no fstab/mtab and so on), + * hijack the call to a dummy function so it can at least + * compile. + */ +# define fsetxattr(a,b,c,d,e) dummy_fsetxattr(a,b,c,d,e) +#endif char *progname; diff --git a/include/darwin.h b/include/darwin.h index 2b470b4..caec897 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -73,45 +73,37 @@ static __inline__ void platform_getoptreset(void) static __inline__ int platform_uuid_compare(uuid_t *uu1, uuid_t *uu2) { - return uuid_compare(uu1, uu2, NULL); + return uuid_compare((const unsigned char *) uu1, (const unsigned char*) uu2); } static __inline__ void platform_uuid_unparse(uuid_t *uu, char *buffer) { - uint32_t status; - char *s; - uuid_to_string(uu, &s, &status); - if (status == uuid_s_ok) - strcpy(buffer, s); - else buffer[0] = '\0'; - free(s); + uuid_unparse(*uu, buffer); } static __inline__ int platform_uuid_parse(char *buffer, uuid_t *uu) { - uint32_t status; - uuid_from_string(buffer, uu, &status); - return (status == uuid_s_ok); + return uuid_parse(buffer, *uu); } static __inline__ int platform_uuid_is_null(uuid_t *uu) { - return uuid_is_nil(uu, NULL); + return uuid_is_null(*uu); } static __inline__ void platform_uuid_generate(uuid_t *uu) { - uuid_create(uu, NULL); + uuid_generate(*uu); } static __inline__ void platform_uuid_clear(uuid_t *uu) { - uuid_create_nil(uu, NULL); + uuid_clear(*uu); } static __inline__ void platform_uuid_copy(uuid_t *dst, uuid_t *src) { - memcpy(dst, src, sizeof(uuid_t)); + uuid_copy(*dst, *src); } #define __int8_t int8_t @@ -147,11 +139,13 @@ typedef int64_t xfs_daddr_t; #define O_SYNC 0 #endif -#define ENOATTR 989 /* Attribute not found */ #define EFSCORRUPTED 990 /* Filesystem is corrupted */ #define EFSBADCRC 991 /* Bad CRC detected */ #define constpp char * const * +#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ +#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ + #define HAVE_FID 1 static __inline__ int @@ -160,4 +154,131 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) return 0; } + +/* + * Dummy POSIX timer replacement + */ +#define CLOCK_REALTIME 1 +typedef uint64_t timer_t; +typedef double timer_c; +typedef clock_id_t clockid_t; +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +static inline int timer_create (clockid_t __clock_id, + struct sigevent *__restrict __evp, + timer_t *__restrict __timerid) +{ + return 0; +} + +static inline int timer_settime (timer_t __timerid, int __flags, + const struct itimerspec *__restrict __value, + struct itimerspec *__restrict __ovalue) +{ + return 0; +} + +static inline int timer_delete (timer_t __timerid) +{ + return 0; +} + +static inline int timer_gettime (timer_t __timerid, struct itimerspec *__value) +{ + return 0; +} + +static inline int nftw64(const char *path, int (*fn)(const char *, const struct stat *ptr, int flag, struct FTW *), int depth, + int flags) +{ + return nftw(path, fn, depth, flags); +} + +#define MREMAP_FIXED 1 +#define MREMAP_MAYMOVE 2 +static inline void *mremap(void *old_address, size_t old_size, + size_t new_size, int flags, ... /* void *new_address */) +{ + return NULL; +} + +/* FSR */ + +#define _PATH_MOUNTED "/etc/mtab" +#define USE_DUMMY_XATTR + +typedef int __fsblkcnt_t; +typedef int __fsfilcnt_t; +typedef long long int __fsblkcnt64_t; +typedef long long int __fsfilcnt64_t; + +struct statvfs64 +{ + unsigned long int f_bsize; + unsigned long int f_frsize; + __fsblkcnt64_t f_blocks; + __fsblkcnt64_t f_bfree; + __fsblkcnt64_t f_bavail; + __fsfilcnt64_t f_files; + __fsfilcnt64_t f_ffree; + __fsfilcnt64_t f_favail; + unsigned long int f_fsid; + int __f_unused; + unsigned long int f_flag; + unsigned long int f_namemax; + int __f_spare[6]; +}; + +struct mntent +{ + char *mnt_fsname; /* Device or server for filesystem. */ + char *mnt_dir; /* Directory mounted on. */ + char *mnt_type; /* Type of filesystem: ufs, nfs, etc. */ + char *mnt_opts; /* Comma-separated options for fs. */ + int mnt_freq; /* Dump frequency (in days). */ + int mnt_passno; /* Pass number for `fsck'. */ +}; + +static inline FILE *setmntent(const char *filename, const char *type) +{ + return NULL; +} + +static inline int endmntent(FILE *fp) +{ + return 0; +} + +static inline struct mntent *getmntent(FILE *fp) +{ + return NULL; +} + +static inline int addmntent(FILE *fp, const struct mntent *mnt) +{ + return 0; +} + +static inline char *hasmntopt(const struct mntent *mnt, const char *opt) +{ + return NULL; +} + +static inline int statvfs64 (const char *__restrict __file, + struct statvfs64 *__restrict __buf) +{ + return 0; +} + +static inline int dummy_fsetxattr (int filedes, const char *name, + const void *value, size_t size, int flags) +{ + return 0; +} + + #endif /* __XFS_DARWIN_H__ */ -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ABF4D7F7C for ; Mon, 3 Aug 2015 09:40:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 478A7AC002 for ; Mon, 3 Aug 2015 07:40:32 -0700 (PDT) X-ASG-Debug-ID: 1438612830-04cbb0416d2255b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id T6IZOXR1t4GGoZEc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:31 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id A21C292485; Mon, 3 Aug 2015 14:40:30 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhf031559; Mon, 3 Aug 2015 10:40:29 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf Date: Mon, 3 Aug 2015 16:39:46 +0200 X-ASG-Orig-Subj: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf Message-Id: <1438612789-17486-9-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612831 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add a check for fls call, and a replacement call for platforms without fls. Signed-off-by: Jan Tulak --- configure.ac | 1 + include/bitops.h | 2 ++ include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 14 ++++++++++++++ 4 files changed, 21 insertions(+) diff --git a/configure.ac b/configure.ac index fe991cc..8f966a6 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,7 @@ AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_BLKID_TOPO($enable_blkid) AC_HAVE_READDIR +AC_HAVE_FLS AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([char *]) diff --git a/include/bitops.h b/include/bitops.h index 930f64a..44599a7 100644 --- a/include/bitops.h +++ b/include/bitops.h @@ -5,6 +5,7 @@ * fls: find last bit set. */ +#ifndef HAVE_FLS static inline int fls(int x) { int r = 32; @@ -32,6 +33,7 @@ static inline int fls(int x) } return r; } +#endif /* HAVE_FLS */ static inline int fls64(__u64 x) { diff --git a/include/builddefs.in b/include/builddefs.in index 7f939f6..9feb096 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -104,6 +104,7 @@ HAVE_FIEMAP = @have_fiemap@ HAVE_PREADV = @have_preadv@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ +HAVE_FLS = @have_fls@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -131,6 +132,9 @@ PLDLIBS = -L/usr/local/lib -lintl PCFLAGS = -I/usr/local/include $(GCCFLAGS) DEPENDFLAGS = -D__FreeBSD__ endif +ifeq ($(HAVE_FLS),yes) +LCFLAGS+= -DHAVE_FLS +endif GCFLAGS = $(OPTIMIZER) $(DEBUG) \ -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 919ae0a..d7f37ca 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -202,3 +202,17 @@ AC_DEFUN([AC_HAVE_READDIR], AC_SUBST(have_readdir) ]) +# +# Check if we have a flc call (Mac OS X) +# +AC_DEFUN([AC_HAVE_FLS], + [ AC_MSG_CHECKING([for fls]) + AC_TRY_LINK([ +#include + ], [ + fls(0); + ], have_fls=yes + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_SUBST(have_fls) + ]) -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F24E87F8D for ; Mon, 3 Aug 2015 09:40:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 80B83AC003 for ; Mon, 3 Aug 2015 07:40:33 -0700 (PDT) X-ASG-Debug-ID: 1438612832-04cb6c673e29dc40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wsB7zE8ACLtOa0Vh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:32 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id DF8B283F68; Mon, 3 Aug 2015 14:40:31 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhg031559; Mon, 3 Aug 2015 10:40:30 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 09/11] xfsprogs: Add mntent.h check into autoconf Date: Mon, 3 Aug 2015 16:39:47 +0200 X-ASG-Orig-Subj: [PATCH v3 09/11] xfsprogs: Add mntent.h check into autoconf Message-Id: <1438612789-17486-10-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612832 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- configure.ac | 1 + fsr/xfs_fsr.c | 6 +++--- include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 12 ++++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 8f966a6..e2d395b 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,7 @@ AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_BLKID_TOPO($enable_blkid) AC_HAVE_READDIR +AC_HAVE_MNTENT AC_HAVE_FLS AC_CHECK_SIZEOF([long]) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index d8a4ece..12eb172 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -25,16 +25,16 @@ #include #include -#include -#include #include #include #include #include -#include #include #include +#ifdef HAVE_MNTENT +# include +#endif #ifndef XFS_XFLAG_NODEFRAG #define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ diff --git a/include/builddefs.in b/include/builddefs.in index 9feb096..1132f26 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -104,6 +104,7 @@ HAVE_FIEMAP = @have_fiemap@ HAVE_PREADV = @have_preadv@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ +HAVE_MNTENT = @have_mntent@ HAVE_FLS = @have_fls@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall @@ -135,6 +136,9 @@ endif ifeq ($(HAVE_FLS),yes) LCFLAGS+= -DHAVE_FLS endif +ifeq ($(HAVE_MNTENT),yes) +PCFLAGS+= -DHAVE_MNTENT +endif GCFLAGS = $(OPTIMIZER) $(DEBUG) \ -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index d7f37ca..bb7bcdb 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -216,3 +216,15 @@ AC_DEFUN([AC_HAVE_FLS], AC_MSG_RESULT(no)) AC_SUBST(have_fls) ]) + +# +# Check if there is mntent.h +# +AC_DEFUN([AC_HAVE_MNTENT], + [ AC_MSG_CHECKING([for mntent]) + AC_CHECK_HEADERS(mntent.h, + have_mntent=yes + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_SUBST(have_mntent) + ]) -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E23787F92 for ; Mon, 3 Aug 2015 09:40:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CED1F8F8049 for ; Mon, 3 Aug 2015 07:40:34 -0700 (PDT) X-ASG-Debug-ID: 1438612833-04cb6c674029dc50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id liSkrYC7mgztpMxL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:33 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 51CEB92499; Mon, 3 Aug 2015 14:40:33 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhh031559; Mon, 3 Aug 2015 10:40:32 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v3 10/11] xfsprogs: replace obsolete memalign with posix_memalign Date: Mon, 3 Aug 2015 16:39:48 +0200 X-ASG-Orig-Subj: [PATCH v3 10/11] xfsprogs: replace obsolete memalign with posix_memalign Message-Id: <1438612789-17486-11-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612833 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Memalign from was marked obsolete in favor of a posix variant from . So replace all calls and remove includes. This also enhances support on other posix platforms, which doesn't have . Because posix_memalign returns any error as a return code, not in errno, change relevant checks in code (and add a missing one). Signed-off-by: Jan Tulak --- copy/xfs_copy.c | 2 +- db/attrset.c | 2 +- fsr/xfs_fsr.c | 3 ++- include/darwin.h | 1 - include/freebsd.h | 1 - include/gnukfreebsd.h | 1 - include/linux.h | 1 - io/pread.c | 4 ++-- libxfs/rdwr.c | 19 +++++++++++++++---- mkfs/xfs_mkfs.c | 6 +++++- repair/incore.c | 2 +- repair/incore_ino.c | 13 ++++++++++--- repair/phase1.c | 2 +- repair/prefetch.c | 7 +++---- repair/sb.c | 10 +++++----- rtcp/xfs_rtcp.c | 7 ++++++- 16 files changed, 52 insertions(+), 29 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 44a32e8..5badd74 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -332,7 +332,7 @@ wbuf * wbuf_init(wbuf *buf, int data_size, int data_align, int min_io_size, int id) { ASSERT(data_size % BBSIZE == 0); - while ((buf->data = memalign(data_align, data_size)) == NULL) { + while (posix_memalign((void**)&(buf->data), data_align, data_size)) { data_size >>= 1; if (data_size < min_io_size) return NULL; diff --git a/db/attrset.c b/db/attrset.c index 1afadd2..3e293be 100644 --- a/db/attrset.c +++ b/db/attrset.c @@ -141,7 +141,7 @@ attr_set_f( name = argv[optind]; if (valuelen) { - value = (char *)memalign(getpagesize(), valuelen); + posix_memalign((void**)&value, getpagesize(), valuelen); if (!value) { dbprintf(_("cannot allocate buffer (%d)\n"), valuelen); goto out; diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 12eb172..44626ba 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1306,7 +1306,8 @@ packfile(char *fname, char *tname, int fd, dio.d_maxiosz, pagesize); } - if (!(fbuf = (char *)memalign(dio.d_mem, blksz_dio))) { + posix_memalign((void **)&fbuf, dio.d_mem, blksz_dio); + if (!fbuf) { fsrprintf(_("could not allocate buf: %s\n"), tname); goto out; } diff --git a/include/darwin.h b/include/darwin.h index caec897..34264f9 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -129,7 +129,6 @@ typedef int64_t xfs_daddr_t; #define pwrite64 pwrite #define ftruncate64 ftruncate #define fdatasync fsync -#define memalign(a,sz) valloc(sz) #define O_LARGEFILE 0 #ifndef O_DIRECT diff --git a/include/freebsd.h b/include/freebsd.h index e59b1e8..b4051ea 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -40,7 +40,6 @@ #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync -#define memalign(a,sz) valloc(sz) #define constpp char * const * diff --git a/include/gnukfreebsd.h b/include/gnukfreebsd.h index f2e1bf5..f9c0c15 100644 --- a/include/gnukfreebsd.h +++ b/include/gnukfreebsd.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include diff --git a/include/linux.h b/include/linux.h index 31c077a..2abda79 100644 --- a/include/linux.h +++ b/include/linux.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include diff --git a/io/pread.c b/io/pread.c index 280cc9d..2dd5b7a 100644 --- a/io/pread.c +++ b/io/pread.c @@ -78,7 +78,7 @@ alloc_iovec( buffersize = 0; for (i = 0; i < vectors; i++) { - iov[i].iov_base = memalign(pagesize, bsize); + posix_memalign((void**)&(iov[i].iov_base), pagesize, bsize); if (!iov[i].iov_base) { perror("memalign"); goto unwind; @@ -109,7 +109,7 @@ alloc_buffer( if (bsize > highwater) { if (buffer) free(buffer); - buffer = memalign(pagesize, bsize); + posix_memalign((void**)&buffer, pagesize, bsize); if (!buffer) { perror("memalign"); highwater = buffersize = 0; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 4e0c75b..d75bf1c 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -74,12 +74,18 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len) ssize_t zsize, bytes; char *z; int fd; + int ret; zsize = min(BDSTRAT_SIZE, BBTOB(len)); - if ((z = memalign(libxfs_device_alignment(), zsize)) == NULL) { + ret = posix_memalign( + (void **)&z, + libxfs_device_alignment(), + zsize + ); + if (!z) { fprintf(stderr, _("%s: %s can't memalign %d bytes: %s\n"), - progname, __FUNCTION__, (int)zsize, strerror(errno)); + progname, __FUNCTION__, (int)zsize, strerror(ret)); exit(1); } memset(z, 0, zsize); @@ -409,6 +415,7 @@ static void __initbuf(xfs_buf_t *bp, struct xfs_buftarg *btp, xfs_daddr_t bno, unsigned int bytes) { + int ret; bp->b_flags = 0; bp->b_bn = bno; bp->b_bcount = bytes; @@ -416,12 +423,16 @@ __initbuf(xfs_buf_t *bp, struct xfs_buftarg *btp, xfs_daddr_t bno, bp->b_target = btp; bp->b_error = 0; if (!bp->b_addr) - bp->b_addr = memalign(libxfs_device_alignment(), bytes); + ret = posix_memalign( + (void**)&(bp->b_addr), + libxfs_device_alignment(), + bytes + ); if (!bp->b_addr) { fprintf(stderr, _("%s: %s can't memalign %u bytes: %s\n"), progname, __FUNCTION__, bytes, - strerror(errno)); + strerror(ret)); exit(1); } memset(bp->b_addr, 0, bytes); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 11e9f4b..a0273f7 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -856,7 +856,11 @@ zero_old_xfs_structures( * read in existing filesystem superblock, use its geometry * settings and zero the existing secondary superblocks. */ - buf = memalign(libxfs_device_alignment(), new_sb->sb_sectsize); + posix_memalign( + (void**)&buf, + libxfs_device_alignment(), + new_sb->sb_sectsize + ); if (!buf) { fprintf(stderr, _("error reading existing superblock -- failed to memalign buffer\n")); diff --git a/repair/incore.c b/repair/incore.c index d5ecfd6..57cbeb6 100644 --- a/repair/incore.c +++ b/repair/incore.c @@ -224,7 +224,7 @@ init_rt_bmap( rt_bmap_size = roundup(mp->m_sb.sb_rextents / (NBBY / XR_BB), sizeof(__uint64_t)); - rt_bmap = memalign(sizeof(__uint64_t), rt_bmap_size); + posix_memalign((void**)&rt_bmap, sizeof(__uint64_t), rt_bmap_size); if (!rt_bmap) { do_error( _("couldn't allocate realtime block map, size = %" PRIu64 "\n"), diff --git a/repair/incore_ino.c b/repair/incore_ino.c index 7e19657..71d6d4c 100644 --- a/repair/incore_ino.c +++ b/repair/incore_ino.c @@ -626,8 +626,11 @@ set_inode_parent( irec->ino_un.plist = ptbl; ptbl->pmask = 1LL << offset; - ptbl->pentries = (xfs_ino_t*)memalign(sizeof(xfs_ino_t), - sizeof(xfs_ino_t)); + posix_memalign( + (void**)&(ptbl->pentries), + sizeof(xfs_ino_t), + sizeof(xfs_ino_t) + ); if (!ptbl->pentries) do_error(_("couldn't memalign pentries table\n")); #ifdef DEBUG @@ -673,7 +676,11 @@ set_inode_parent( #endif ASSERT(cnt >= target); - tmp = (xfs_ino_t*)memalign(sizeof(xfs_ino_t), (cnt + 1) * sizeof(xfs_ino_t)); + posix_memalign( + (void**)&tmp, + sizeof(xfs_ino_t), + (cnt + 1) * sizeof(xfs_ino_t) + ); if (!tmp) do_error(_("couldn't memalign pentries table\n")); diff --git a/repair/phase1.c b/repair/phase1.c index bd9adcb..20d7b24 100644 --- a/repair/phase1.c +++ b/repair/phase1.c @@ -35,7 +35,7 @@ alloc_ag_buf(int size) { char *bp; - bp = (char *)memalign(libxfs_device_alignment(), size); + posix_memalign((void**)&bp, libxfs_device_alignment(), size); if (!bp) do_error(_("could not allocate ag header buffer (%d bytes)\n"), size); diff --git a/repair/prefetch.c b/repair/prefetch.c index 08c0394..2843042 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -631,10 +631,9 @@ pf_io_worker( void *param) { prefetch_args_t *args = param; - void *buf = memalign(libxfs_device_alignment(), - pf_max_bytes); - - if (buf == NULL) + void *buf; + posix_memalign((void**)&buf, libxfs_device_alignment(), pf_max_bytes); + if (!buf) return NULL; pthread_mutex_lock(&args->lock); diff --git a/repair/sb.c b/repair/sb.c index f6a1f15..f2e32aa 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -102,7 +102,7 @@ find_secondary_sb(xfs_sb_t *rsb) do_warn(_("\nattempting to find secondary superblock...\n")); - sb = (xfs_sb_t *)memalign(libxfs_device_alignment(), BSIZE); + posix_memalign((void**)&sb, libxfs_device_alignment(), BSIZE); if (!sb) { do_error( _("error finding secondary superblock -- failed to memalign buffer\n")); @@ -438,8 +438,8 @@ write_primary_sb(xfs_sb_t *sbp, int size) if (no_modify) return; - buf = memalign(libxfs_device_alignment(), size); - if (buf == NULL) { + posix_memalign((void**)&buf, libxfs_device_alignment(), size); + if (!buf) { do_error(_("failed to memalign superblock buffer\n")); return; } @@ -472,8 +472,8 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) int error, rval; xfs_dsb_t *buf; - buf = memalign(libxfs_device_alignment(), size); - if (buf == NULL) { + posix_memalign((void**)&buf, libxfs_device_alignment(), size); + if (!buf) { do_error( _("error reading superblock %u -- failed to memalign buffer\n"), agno); diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index 7f48060..417b066 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -327,7 +327,12 @@ rtcp( char *source, char *target, int fextsize) } iosz = dioattr.d_miniosz; - fbuf = memalign( dioattr.d_mem, iosz); + posix_memalign((void**)&fbuf, dioattr.d_mem, iosz); + if (!fbuf) { + perror( + _("error finding secondary superblock -- failed to memalign buffer\n")); + exit(1); + } memset(fbuf, 0, iosz); /* -- 2.4.3 From jtulak@redhat.com Mon Aug 3 09:40:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A078D7F96 for ; Mon, 3 Aug 2015 09:40:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BCD5304064 for ; Mon, 3 Aug 2015 07:40:36 -0700 (PDT) X-ASG-Debug-ID: 1438612835-04cb6c673d29dc50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vIbriqlWzAK2kDaE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 07:40:35 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id E59CFA1018; Mon, 3 Aug 2015 14:40:34 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73EeIhi031559; Mon, 3 Aug 2015 10:40:33 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH v2 11/11] xfsprogs: Prefix LIST_... macros to XFS_LIST_... Date: Mon, 3 Aug 2015 16:39:49 +0200 X-ASG-Orig-Subj: [PATCH v2 11/11] xfsprogs: Prefix LIST_... macros to XFS_LIST_... Message-Id: <1438612789-17486-12-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-1-git-send-email-jtulak@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438612835 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 OS X has two conflicting LIST_ macros: - LIST_HEAD - LIST_HEAD_INIT These results in tons of warnings like: In file included from init.c:22: In file included from ./libxfs_priv.h:63: ../include/xfs/list.h:32:9: warning: 'LIST_HEAD' macro redefined [-Wmacro-redefined] \#define LIST_HEAD(name) \ These macros are included from sys/queue.h through sys/mount.h and possibly through more system libraries. So far, I didn't found a way how to prevent the inclusion. Attempted solution was to avoid including with -D_SYS_QUEUE_H_ for the compiler, but this resulted in another error: In file included from crc32.c:36: In file included from ../include/xfs/platform_defs.h:79: In file included from ../include/xfs/darwin.h:26: In file included from /usr/include/sys/mount.h:76: In file included from /usr/include/sys/attr.h:42: /usr/include/sys/ucred.h:90:2: error: type name requires a specifier or qualifier TAILQ_ENTRY(ucred) cr_link; /* never modify this without KAUTH_CRE... I tried renaming. This works, but it doesn't look like a good solution. So this patch is still not final. Signed-off-by: Jan Tulak --- include/list.h | 6 +++--- repair/phase6.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/list.h b/include/list.h index 3f087a4..7e9f748 100644 --- a/include/list.h +++ b/include/list.h @@ -27,10 +27,10 @@ struct list_head { struct list_head *prev; }; -#define LIST_HEAD_INIT(name) { &(name), &(name) } +#define XFS_LIST_HEAD_INIT(name) { &(name), &(name) } -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) +#define XFS_LIST_HEAD(name) \ + struct list_head name = XFS_LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(list) list_head_init(list) static inline void list_head_init(struct list_head *list) diff --git a/repair/phase6.c b/repair/phase6.c index 9a5cba7..87732e1 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -49,7 +49,7 @@ typedef struct dotdot_update { int ino_offset; } dotdot_update_t; -static LIST_HEAD(dotdot_update_list); +static XFS_LIST_HEAD(dotdot_update_list); static int dotdot_update; static void -- 2.4.3 From 93193@wjjmm.com Mon Aug 3 10:35:58 2015 Return-Path: <93193@wjjmm.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5F8BA7F50 for ; Mon, 3 Aug 2015 10:35:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3A80B8F8033 for ; Mon, 3 Aug 2015 08:35:54 -0700 (PDT) X-ASG-Debug-ID: 1438616148-04bdf06bd11dab50001-NocioJ Received: from wjjmm.com ([219.134.238.78]) by cuda.sgi.com with ESMTP id cLfLWoQ3XI8TfB0w for ; Mon, 03 Aug 2015 08:35:50 -0700 (PDT) X-Barracuda-Envelope-From: 93193@wjjmm.com X-Barracuda-Apparent-Source-IP: 219.134.238.78 Received: from 20120301-2207[169.254.181.172] by wjjmm.com with SMTP id 3834BB6B; Mon, 3 Aug 2015 23:35:34 +0800 From: 93193@wjjmm.com Subject: =?GB2312?B?tPovv6qhqqGqt6IvxrE=?= To: "xfs" X-ASG-Orig-Subj: =?GB2312?B?tPovv6qhqqGqt6IvxrE=?= Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit Date: Mon, 3 Aug 2015 23:35:38 +0800 X-Mailer: FoxMail 4.0 beta 2 [cn] X-Barracuda-Connect: UNKNOWN[219.134.238.78] X-Barracuda-Start-Time: 1438616150 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.24 X-Barracuda-Spam-Status: No, SCORE=0.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_MID, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21311 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20150803153554.19858A42185@cuda.sgi.com> ÄúºÃ£º ÎÒ¹«Ë¾ÓÐÒ»²¿·ÖרÓÃ˰¡ª¡ªÆ±/´ú¿ª£» Èç: (1)ÆÕͨÉÌÆ·ÏúÊÛ˰¡ª¡ªÆ±£» (2)¹ã¸æÒµ¡¢¸÷Àà·þÎñҵ˰¡ª¡ªÆ±/µÈµÈ¡£ £¨±¾¹«Ë¾¸ß¼Û»ØÊÕÔöֵ˰·¢Æ±£© ¹ó¹«Ë¾ÈçÓÐÐèÒª£¬»¶Ó­ÄúµÄÀ´µçÓëÎÒÁªÏµ£º ¸ºÔðÈË£ºÕÅÏÈÉú13682493193 From sandeen@sandeen.net Mon Aug 3 11:12:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D32A07F56 for ; Mon, 3 Aug 2015 11:12:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B066D304039 for ; Mon, 3 Aug 2015 09:12:20 -0700 (PDT) X-ASG-Debug-ID: 1438618338-04bdf06bd21dba00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id uBagNdILtn5EI5st for ; Mon, 03 Aug 2015 09:12:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5DE3D61C8FDF; Mon, 3 Aug 2015 11:12:17 -0500 (CDT) Message-ID: <55BF92DF.6080506@sandeen.net> Date: Mon, 03 Aug 2015 09:12:15 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: fix sb_meta_uuid usage References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-2-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: fix sb_meta_uuid usage In-Reply-To: <1438587625-31437-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438618338 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 12:40 AM, Dave Chinner wrote: > From: Dave Chinner > > After changing the UUID on a v5 filesystem, xfstests fails > immediately on a debug kernel with: > > XFS: Assertion failed: uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid), file: fs/xfs/xfs_inode.c, line: 799 > > This needs to check against the sb_meta_uuid, not the user visible > UUID that was changed. > > Signed-off-by: Dave Chinner first of a few brown paper bags for me :( I guess I didn't test on debug after all. :( Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_inode.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index fb52ff0..4156e37 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -796,7 +796,7 @@ xfs_ialloc( > > if (ip->i_d.di_version == 3) { > ASSERT(ip->i_d.di_ino == ino); > - ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); > + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid)); > ip->i_d.di_crc = 0; > ip->i_d.di_changecount = 1; > ip->i_d.di_lsn = 0; > From sandeen@sandeen.net Mon Aug 3 11:18:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6351D7F58 for ; Mon, 3 Aug 2015 11:18:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E284FAC004 for ; Mon, 3 Aug 2015 09:18:05 -0700 (PDT) X-ASG-Debug-ID: 1438618683-04cb6c673d2a05f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id i1tZ23fbqr7GWDDa for ; Mon, 03 Aug 2015 09:18:03 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2289061C8FDF; Mon, 3 Aug 2015 11:18:02 -0500 (CDT) Message-ID: <55BF9439.8010003@sandeen.net> Date: Mon, 03 Aug 2015 09:18:01 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: growfs not aware of sb_meta_uuid References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: growfs not aware of sb_meta_uuid In-Reply-To: <1438587625-31437-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438618683 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 12:40 AM, Dave Chinner wrote: > From: Dave Chinner > > Adding this simple change to xfstests:common/rc::_scratch_mkfs_xfs: > > + if [ $mkfs_status -eq 0 ]; then > + xfs_admin -U generate $SCRATCH_DEV > /dev/null > + fi > > triggers all sorts of errors in xfstests. xfs/104 is an example, > where growfs fails with a UUID mismatch corruption detected by > xfs_agf_write_verify() when trying to write the first new AG > headers. > > Fix this problem by making sure we copy the sb_meta_uuid into new > metadata written by growfs. > > Signed-off-by: Dave Chinner Ok, at least this one has a plausible story; I did have this in my tree, and must have somehow (re?)sent outdated patches. :( Yeah, it was in all the series I sent up until the last re-send, damn. I'll re-check those prior patches against what we end up with, to make sure everything is in sync. Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_fsops.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 9b3438a..ee3aaa0a 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -250,7 +250,7 @@ xfs_growfs_data_private( > agf->agf_freeblks = cpu_to_be32(tmpsize); > agf->agf_longest = cpu_to_be32(tmpsize); > if (xfs_sb_version_hascrc(&mp->m_sb)) > - uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid); > + uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid); > > error = xfs_bwrite(bp); > xfs_buf_relse(bp); > @@ -273,7 +273,7 @@ xfs_growfs_data_private( > if (xfs_sb_version_hascrc(&mp->m_sb)) { > agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); > agfl->agfl_seqno = cpu_to_be32(agno); > - uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); > + uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid); > } > > agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, bp); > @@ -309,7 +309,7 @@ xfs_growfs_data_private( > agi->agi_newino = cpu_to_be32(NULLAGINO); > agi->agi_dirino = cpu_to_be32(NULLAGINO); > if (xfs_sb_version_hascrc(&mp->m_sb)) > - uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid); > + uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid); > if (xfs_sb_version_hasfinobt(&mp->m_sb)) { > agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); > agi->agi_free_level = cpu_to_be32(1); > From sandeen@sandeen.net Mon Aug 3 11:23:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC8077F59 for ; Mon, 3 Aug 2015 11:23:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B77148F8049 for ; Mon, 3 Aug 2015 09:23:20 -0700 (PDT) X-ASG-Debug-ID: 1438618999-04cbb0416c227da0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bl34CrCza0q8EGJY for ; Mon, 03 Aug 2015 09:23:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D653161C8FDF; Mon, 3 Aug 2015 11:23:18 -0500 (CDT) Message-ID: <55BF9575.2010106@sandeen.net> Date: Mon, 03 Aug 2015 09:23:17 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: dquots should be stamped with sb_meta_uuid References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-5-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: dquots should be stamped with sb_meta_uuid In-Reply-To: <1438587625-31437-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438618999 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 12:40 AM, Dave Chinner wrote: > From: Dave Chinner > > Once the sb_uuid is changed, the wrong uuid is stamped into new > dquots on disk. Found by inspection, verified by generic/219. > > Signed-off-by: Dave Chinner Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_dquot.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index 4143dc7..b1b26b6 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -251,7 +251,7 @@ xfs_qm_init_dquot_blk( > d->dd_diskdq.d_id = cpu_to_be32(curid); > d->dd_diskdq.d_flags = type; > if (xfs_sb_version_hascrc(&mp->m_sb)) { > - uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); > + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_meta_uuid); > xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), > XFS_DQUOT_CRC_OFF); > } > From sandeen@sandeen.net Mon Aug 3 11:26:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9E0CD7F58 for ; Mon, 3 Aug 2015 11:26:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38C88AC001 for ; Mon, 3 Aug 2015 09:26:14 -0700 (PDT) X-ASG-Debug-ID: 1438619172-04bdf06bd11dbf50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AAJgecJsDbhGdjjP for ; Mon, 03 Aug 2015 09:26:12 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 179B761C8FDF; Mon, 3 Aug 2015 11:26:10 -0500 (CDT) Message-ID: <55BF9621.3090202@sandeen.net> Date: Mon, 03 Aug 2015 09:26:09 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: dquots should be stamped with sb_meta_uuid References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-5-git-send-email-david@fromorbit.com> <55BF9575.2010106@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: dquots should be stamped with sb_meta_uuid In-Reply-To: <55BF9575.2010106@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438619172 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 9:23 AM, Eric Sandeen wrote: > On 8/3/15 12:40 AM, Dave Chinner wrote: >> From: Dave Chinner >> >> Once the sb_uuid is changed, the wrong uuid is stamped into new >> dquots on disk. Found by inspection, verified by generic/219. >> >> Signed-off-by: Dave Chinner > > Reviewed-by: Eric Sandeen And yeah, sigh, this was in a prior version of my patch as well. -Eric From sandeen@sandeen.net Mon Aug 3 11:27:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA3977F5D for ; Mon, 3 Aug 2015 11:27:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 950A4AC002 for ; Mon, 3 Aug 2015 09:27:53 -0700 (PDT) X-ASG-Debug-ID: 1438619272-04bdf06bd01dbfe0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TCRuokkupq0rTYB3 for ; Mon, 03 Aug 2015 09:27:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8E69161C8FDF; Mon, 3 Aug 2015 11:27:51 -0500 (CDT) Message-ID: <55BF9686.30101@sandeen.net> Date: Mon, 03 Aug 2015 09:27:50 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: fix sb_meta_uuid usage References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-2-git-send-email-david@fromorbit.com> <55BF92DF.6080506@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: fix sb_meta_uuid usage In-Reply-To: <55BF92DF.6080506@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438619272 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 9:12 AM, Eric Sandeen wrote: > On 8/3/15 12:40 AM, Dave Chinner wrote: >> From: Dave Chinner >> >> After changing the UUID on a v5 filesystem, xfstests fails >> immediately on a debug kernel with: >> >> XFS: Assertion failed: uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid), file: fs/xfs/xfs_inode.c, line: 799 >> >> This needs to check against the sb_meta_uuid, not the user visible >> UUID that was changed. >> >> Signed-off-by: Dave Chinner > > first of a few brown paper bags for me :( I guess I didn't test on debug after all. :( Actually I did, this was also in my prior patches. Le sigh. -Eric From sandeen@sandeen.net Mon Aug 3 11:41:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 512267F58 for ; Mon, 3 Aug 2015 11:41:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1EA698F8052 for ; Mon, 3 Aug 2015 09:41:23 -0700 (PDT) X-ASG-Debug-ID: 1438620081-04bdf06bd01dc500001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id oMeewHVA0CVGo1un for ; Mon, 03 Aug 2015 09:41:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6F6FC61C8FDF; Mon, 3 Aug 2015 11:41:20 -0500 (CDT) Message-ID: <55BF99AD.2090103@sandeen.net> Date: Mon, 03 Aug 2015 09:41:17 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: log recovery needs to validate against sb_meta_uuid References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-4-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: log recovery needs to validate against sb_meta_uuid In-Reply-To: <1438587625-31437-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438620081 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 12:40 AM, Dave Chinner wrote: > From: Dave Chinner > > Now that sb_uuid can be changed by the user, we cannot use this to > validate the metadata blocks being recovered belong to this > filesystem. We must check against the sb_meta_uuid as that will > remain unchanged. > > There is a complication in this code - the superblock itself. We can > not check the sb_meta_uuid unconditionally, as that may not be set > on disk. Hence we must verify the superblock sb_uuid matches between > the log record and the in-core superblock. > > Found by inspection after the previous two problems were found. So, I also had this in my older patchset, I think it's needed for proper log recovery as well. I'm not sure why I didn't hit the xlog_recover_get_buf_lsn problem, though: diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 4f5784f..4da291c 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -325,7 +325,7 @@ xlog_header_check_recover( XFS_ERROR_REPORT("xlog_header_check_recover(1)", XFS_ERRLEVEL_HIGH, mp); return -EFSCORRUPTED; - } else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) { + } else if (!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid)) { xfs_warn(mp, "dirty log entry has mismatched uuid - can't recover"); xlog_header_check_dump(mp, head); @@ -353,7 +353,7 @@ xlog_header_check_mount( * by IRIX and continue. */ xfs_warn(mp, "nil uuid in log - IRIX style log"); - } else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) { + } else if (!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid)) { xfs_warn(mp, "log has mismatched uuid - can't recover"); xlog_header_check_dump(mp, head); XFS_ERROR_REPORT("xlog_header_check_mount", as for your patch ... looks fine. Not sure why I didn't hit that. Reviewed-by: Eric Sandeen unless you want to roll the above changes in as well... -Eric > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log_recover.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index c674b40..6f83d12 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -1895,15 +1895,25 @@ xlog_recover_get_buf_lsn( > */ > goto recover_immediately; > case XFS_SB_MAGIC: > + /* > + * superblock uuids are magic. We may or may not have a > + * sb_meta_uuid on disk, but it will be set in the in-core > + * superblock. We set the uuid pointer for verification > + * according to the superblock feature mask to ensure we check > + * the relevant UUID in the superblock. > + */ > lsn = be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn); > - uuid = &((struct xfs_dsb *)blk)->sb_uuid; > + if (xfs_sb_version_hasmetauuid(&mp->m_sb)) > + uuid = &((struct xfs_dsb *)blk)->sb_meta_uuid; > + else > + uuid = &((struct xfs_dsb *)blk)->sb_uuid; > break; > default: > break; > } > > if (lsn != (xfs_lsn_t)-1) { > - if (!uuid_equal(&mp->m_sb.sb_uuid, uuid)) > + if (!uuid_equal(&mp->m_sb.sb_meta_uuid, uuid)) > goto recover_immediately; > return lsn; > } > From sandeen@redhat.com Mon Aug 3 12:20:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 139237F59 for ; Mon, 3 Aug 2015 12:20:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 91C0CAC001 for ; Mon, 3 Aug 2015 10:20:09 -0700 (PDT) X-ASG-Debug-ID: 1438622407-04cb6c673d2a1d30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KXFvr2gDulp3vaVL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 10:20:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id AED4B8EB48; Mon, 3 Aug 2015 17:20:07 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t73HK50r008864 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Aug 2015 13:20:06 -0400 Message-ID: <55BFA2C5.20408@redhat.com> Date: Mon, 03 Aug 2015 10:20:05 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Jan Tulak , Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory References: <1156743222.24471614.1436281858017.JavaMail.zimbra@redhat.com> <1436346893-11831-1-git-send-email-jtulak@redhat.com> <1508777144.956841.1437482376774.JavaMail.zimbra@redhat.com> <20150726162530.GE29329@infradead.org> <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfsprogs: blkid is now mandatory In-Reply-To: <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438622408 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 8/3/15 3:40 AM, Jan Tulak wrote: > > > ----- Original Message ----- >> From: "Christoph Hellwig" >> >> On Tue, Jul 21, 2015 at 08:39:36AM -0400, Jan Tulak wrote: >>> I just found that while it is possible to get blkid on OS X, it is >>> in 1.0.0 version which doesn't have blkid_probe_get function. >>> I'm examining whether it is possible to get an updated version there, >>> but right now, this patch breaks OS X support. Unfortunately I didn't >>> noticed of this before, as the OS X port was terribly out of date. >>> >>> So this patch shouldn't be included until I find how to get around. >> >> I don't think this is a lbocker given that OSX support doesn't >> even work. >> >> To the contrary I'd really prefer to go in ASAP to avoid anyone >> relying on it longer than nessecary. > > I tried to get newer blkid on OSX, but so far without a big success > (well, it looks like a kind of a small dependency hell that would > have to be ported, with bigger or smaller effort...). With regards > on the priorities, I think if we can make the OS X support in > "manual patching required" way, then? > > So lets include this patch, and just note it OS X doc "you have to revert > commit XXX and re-apply any changes to the relevant code"? IIRC block device signature detection isn't really required, it's just a nice-to-have; perhaps if blkid isn't present, that functionality can simply be disabled? -Eric From joe.landman@gmail.com Mon Aug 3 12:27:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8678D7F59 for ; Mon, 3 Aug 2015 12:27:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 72E9A8F8035 for ; Mon, 3 Aug 2015 10:27:09 -0700 (PDT) X-ASG-Debug-ID: 1438622827-04cb6c673d2a2020001-NocioJ Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by cuda.sgi.com with ESMTP id n6Fe79kOJbmXIH7Q (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 03 Aug 2015 10:27:08 -0700 (PDT) X-Barracuda-Envelope-From: joe.landman@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] Received: by wibud3 with SMTP id ud3so145069760wib.1 for ; Mon, 03 Aug 2015 10:27:07 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=to:from:subject:message-id:date:user-agent:mime-version :content-type:content-transfer-encoding; bh=1vkcPD4xIfbQ6q4JgpW08ZXgjf3O/6k86JcRlLJX71s=; b=prisBZKRAZKifsTnn+lMiq2+4KMGPRCDaBgXhMNROz6XOi6XOFpAXTG2jWWR1/022u f34pGAwXt+wlFD0xamdJCdLwyQ94VCpvHstBv6xx10HohWFfnFWIGRf3wn2LQh9pX9iD UAbDxoZl7IqreR613Oe2Dt6Ud0WuQTjoRoOJcrYRYuYOJg8dIYFSIkEWsA+e4210qEFO LA7EFWCPbznxKsiveFC/AGZgdxaecKw7pfGCC16D7BNe7v1COEnqBSjgc9fPJTvMxRAd i+phEEHM9zSlrq1vRxL9ibPrETpB8nF6X4W1+wHNeM73dhU2Iix0TYO5vJPyRljV/2Qk Ui5w== X-Received: by 10.180.20.15 with SMTP id j15mr35670483wie.76.1438622826979; Mon, 03 Aug 2015 10:27:06 -0700 (PDT) Received: from [192.168.1.171] (50-197-102-113-static.hfc.comcastbusiness.net. [50.197.102.113]) by smtp.googlemail.com with ESMTPSA id r6sm14582236wiy.13.2015.08.03.10.27.04 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Aug 2015 10:27:05 -0700 (PDT) To: xfs@oss.sgi.com From: Joe Landman Subject: swalloc/allocsize question Message-ID: <55BFA467.8000707@gmail.com> X-ASG-Orig-Subj: swalloc/allocsize question Date: Mon, 3 Aug 2015 13:27:03 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wi0-f172.google.com[209.85.212.172] X-Barracuda-Start-Time: 1438622827 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21313 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi folks: I've noticed some "odd" behavior while experimenting with xfs mounts on relatively recent kernels (3.18 series). Basically, the swalloc,allocsize=x options are being modified to something different. That is: root@usn-04:~/burn-in/fio# uname -r 3.18.12.scalable root@usn-04:~/burn-in/fio# mount -o inode64,noatime,nodiratime,swalloc,allocsize=1280k /dev/sda /data/1 root@usn-04:~/burn-in/fio# mount | grep sda /dev/sda on /data/1 type xfs (rw,noatime,nodiratime,swalloc,attr2,inode64,allocsize=256k,noquota) This is a hardware RAID6 with a 128k chunk size and 12 elements (so 10 data drives, thus the 1280k allocsize for stripe width allocation). Is this something specific to xfs itself, or is this an issue in the mount tools ? FWIW: we are using xfs-tools 3.2.2, kernel 3.18.12. I've also seen this with the 3.10 series though, so I am not sure where to look to track this down. Any guidance/suggestion? Thanks! Joe joe.landman@gmail.com From joe.landman@gmail.com Mon Aug 3 13:22:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D20247F59 for ; Mon, 3 Aug 2015 13:22:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF8118F8049 for ; Mon, 3 Aug 2015 11:22:50 -0700 (PDT) X-ASG-Debug-ID: 1438626166-04cbb0416c22a8d0001-NocioJ Received: from mail-ig0-f181.google.com (mail-ig0-f181.google.com [209.85.213.181]) by cuda.sgi.com with ESMTP id b7GMOo99xb12BZOW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 03 Aug 2015 11:22:46 -0700 (PDT) X-Barracuda-Envelope-From: joe.landman@gmail.com Received: by iggf3 with SMTP id f3so61236785igg.1 for ; Mon, 03 Aug 2015 11:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=to:from:subject:message-id:date:user-agent:mime-version :content-type:content-transfer-encoding; bh=mXEqKb6OvJChXoYPz8bNSt4dZAWBGxRCmtY7IJrZS9U=; b=07BasHjUok0oPlxoMUAFHzUjae++R+ZoBBu3oUP4rMqi5WBVesMmk7sJpzCgz3ocZZ 0mG2wQTej6n3pdIuMHlYatg754gh5p2q1Cp5bdyijaXh1u7bW4D4If9xfdum5CWjKSAH ZGg6dEs+lLmxuq9MKSuzM0yf/QyNtRfG7SpYQlM+jSsTPf04ak7d+nNHa7D0z9/9RohV +FtBYCZYp+si95wQ9rsPFnkoMRhD7CpRAfC0KRGkkt1QzTAfQrP/6BRPNVaIyFhu6bn2 rOv01g1CUKXpcGX+AhDQLJz7LpL6nDKvvSVr3jkPx01hsvE0SDiMerNGgyaVyX5a62v6 r5Gw== X-Received: by 10.50.88.8 with SMTP id bc8mr2775091igb.46.1438626165894; Mon, 03 Aug 2015 11:22:45 -0700 (PDT) Received: from [192.168.1.171] (50-197-102-113-static.hfc.comcastbusiness.net. [50.197.102.113]) by smtp.googlemail.com with ESMTPSA id rs4sm6262231igb.13.2015.08.03.11.22.44 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Aug 2015 11:22:44 -0700 (PDT) To: xfs From: Joe Landman Subject: Nevermind (RTFMP): swalloc/allocsize question Message-ID: <55BFB173.1010302@gmail.com> X-ASG-Orig-Subj: Nevermind (RTFMP): swalloc/allocsize question Date: Mon, 3 Aug 2015 14:22:43 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ig0-f181.google.com[209.85.213.181] X-Barracuda-Start-Time: 1438626166 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Yeah ... so its a decaffeinated day /sigh from mount man page allocsize=size Sets the buffered I/O end-of-file preallocation size when doing delayed allocation writeout (default size is 64KiB). Valid values for this option are page size (typically 4KiB) through to 1GiB, inclusive, in power-of-2 increments Its doing the right thing. I wasn't. RTFMP == Read The Fine Man Page Joe joe.landman@gmail.com From shrinand@maginatics.com Mon Aug 3 14:11:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D38147F59 for ; Mon, 3 Aug 2015 14:11:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0AFF304039 for ; Mon, 3 Aug 2015 12:11:26 -0700 (PDT) X-ASG-Debug-ID: 1438629083-04cbb0416c22ba20001-NocioJ Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com [209.85.212.175]) by cuda.sgi.com with ESMTP id KblXs63ExEeGkAya (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 03 Aug 2015 12:11:23 -0700 (PDT) X-Barracuda-Envelope-From: shrinand@maginatics.com X-Barracuda-Apparent-Source-IP: 209.85.212.175 Received: by wibxm9 with SMTP id xm9so134955249wib.0 for ; Mon, 03 Aug 2015 12:11:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=1I/BPM2I99kDxFb6N9+WGSrlEGnVk2b5ctF91CE4omY=; b=d9Ly1v9aXFLLMn5Nz7YSUv6/iItCy5V1x/q0YwrMsLc4/z11ITShQjKRo0Bp1oMOR5 qp0MsyQ/3KyXb/tVCskS3oINpfUhyTij7qNR9tD6BoZ/UoUR4MmIiLm+JI/xWGADN5Wl 0O11sNOPjtUI8iRQSPnwe3DJRcbIS3rGN1n7N5vroZ5A2IOi3usDF2pK4B+dv5lF2LuF iC4wxZ7sJw+t5GzYjUYEDOr4PBvK+wjnzMWj4CZMJMcSc/k+6MuWwfVdw5c4Nn9ILH2u ZAsvRqXh+0mT4DICjmrrruQF/kb0JD2exgXZt0btZGfprIRbmlZn6KzDZhPpSID5Oe3b yFeQ== X-Gm-Message-State: ALoCoQlAlf7GaYmVeLI3GWHUsmuALhZCRa8ovU4OQAK3YjXjjqUWbkAojt0Dq1I0xLa6iJuca3B2 MIME-Version: 1.0 X-Received: by 10.180.107.67 with SMTP id ha3mr37490484wib.42.1438629081665; Mon, 03 Aug 2015 12:11:21 -0700 (PDT) Received: by 10.27.12.67 with HTTP; Mon, 3 Aug 2015 12:11:21 -0700 (PDT) In-Reply-To: <55846F92.3080500@sandeen.net> References: <8BF495B8-F444-415A-B7BF-5E1961C75817@sandeen.net> <556666B2.8060301@sandeen.net> <54A83597-7AE8-4846-944F-EEE7E2AD8B3C@sandeen.net> <55846F92.3080500@sandeen.net> Date: Mon, 3 Aug 2015 12:11:21 -0700 Message-ID: Subject: Re: XFS crashes on VMs From: Shrinand Javadekar X-ASG-Orig-Subj: Re: XFS crashes on VMs To: Eric Sandeen Cc: "xfs@oss.sgi.com" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f175.google.com[209.85.212.175] X-Barracuda-Start-Time: 1438629083 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.85 X-Barracuda-Spam-Status: No, SCORE=0.85 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580G, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580G Custom Rule 7580G 0.10 BSF_SC0_SA085 Custom Rule SA085 We hit this again on one of our VMs. This is running the 3.13 kernel. So, now we have seen this crash on 3.16 and 3.13 kernels. We had another setup with a 3.8 kernel and for several months we haven't seen this problem. Is there a way to narrow down what changed between 3.8 and 3.13 and get to the bottom of this? I had provided info about the workload on a different thread: http://oss.sgi.com/archives/xfs/2015-06/msg00108.html If that doesn't work, let me know and I can get it again. -Shri On Fri, Jun 19, 2015 at 12:37 PM, Eric Sandeen wrote: > On 6/19/15 1:34 PM, Shrinand Javadekar wrote: >> I hit this problem again and captured the output of all the steps >> while repairing the filesystem. Here's the crash: >> http://pastie.org/private/prift1xjcc38s0jcvehvew > > that starts with: > > Jun 18 18:40:19 foods-12 kernel: [3639696.006884] ffff8801740f8000: 00 00 00 00 00 00 00 00 fb ee 00 00 00 00 00 00 ................ > Jun 18 18:40:19 foods-12 kernel: [3639696.007056] ffff8801740f8010: 10 00 00 00 00 20 0f e0 00 00 00 00 00 00 00 00 ..... .......... > Jun 18 18:40:19 foods-12 kernel: [3639696.007140] ffff8801740f8020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > Jun 18 18:40:19 foods-12 kernel: [3639696.007230] ffff8801740f8030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > > I think there should have been other interesting bits prior to that line, can you check, and provide it please? Full dmesg in a pastebin would be just fine. > > xfs_attr3_leaf_write_verify at line 216 of file /build/buildd/linux-lts-trusty-3.13.0/fs/xfs/xfs_attr_leaf.c. Caller 0xffffffffa00a193a > > which is ... interesting; something went wrong on the way _to_ disk? > > Ok, what is wrong, then. here's the first 64 bytes of the buffer, > it contains: > > typedef struct xfs_attr_leafblock { > xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ > > where > > typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ > xfs_da_blkinfo_t info; /* block type, links, etc. */ > __be16 count; /* count of active leaf_entry's */ > __be16 usedbytes; /* num bytes of names/values stored */ > __be16 firstused; /* first used byte in name area */ > __u8 holes; /* != 0 if blk needs compaction */ > __u8 pad1; > xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; > /* N largest free regions */ > } xfs_attr_leaf_hdr_t; > > and > > typedef struct xfs_da_blkinfo { > __be32 forw; /* previous block in list */ > __be32 back; /* following block in list */ > __be16 magic; /* validity check on block */ > __be16 pad; /* unused */ > } xfs_da_blkinfo_t; > > so: > > 00 00 00 00 00 00 00 00 fb ee 00 00 00 00 00 00 > | forw | back |magic| pad |count|used| > 10 00 00 00 00 20 0f e0 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > and the only thing the verifier checks on non-crc is > magic (which is good), and count (which is what tripped here) > > if (xfs_sb_version_hascrc(&mp->m_sb)) { > > } else { > if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) > return false; > } > if (ichdr.count == 0) > return false; > > so this failed to verify because count was 0. > >> And the output of the xfs_repair steps (also attached if needed): >> http://pastie.org/private/gvq3aiisudfhy69ezagw > > Ok, no on-disk corruption, that's good. > > Can you please provide as much info as possible about your system > and setup? > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > -Eric > >> Hope this can provide some insights. >> >> -Shri > From iustin@k1024.org Mon Aug 3 15:10:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F2B429DF6 for ; Mon, 3 Aug 2015 15:10:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5CF82304053 for ; Mon, 3 Aug 2015 13:10:04 -0700 (PDT) X-ASG-Debug-ID: 1438632600-04cb6c673f2a58f0001-NocioJ Received: from mail-wi0-f179.google.com (mail-wi0-f179.google.com [209.85.212.179]) by cuda.sgi.com with ESMTP id FfhyWrDmTf0YGVqh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 03 Aug 2015 13:10:01 -0700 (PDT) X-Barracuda-Envelope-From: iustin@k1024.org X-Barracuda-Apparent-Source-IP: 209.85.212.179 Received: by wibud3 with SMTP id ud3so150089764wib.1 for ; Mon, 03 Aug 2015 13:10:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:subject:message-id:mail-followup-to :mime-version:content-type:content-disposition:user-agent; bh=icu3YIsbwvFpbMvXcz5tMErW0GAbXyndEIFRMfURijQ=; b=JaAtPC7ehl7yf6vH3RjgJfgSuPOxJgEMcFArkZ1TIwAzTkeUHmmHVLGklBr19jC1J/ Rm31zQRggC88W9w1U9uLxHHYsNUmfq84tjIV2FX2B6cS6TUmFtiZa50u32h9wO7R52dk LTcSCXtfnh6eyu9O0fPX59BVN8HYT38QNbYozKmdi0tkDeoQLHtLOKJh1CQyhWfDRl/6 nGqzhl6XzlUv70Ly4MMeAW1+wlO3xN3BOdjz3cO0x4hl1kqyKUTeaR3l4bg7rig9papy oujYMwvtwjSmu+hwWsG5zOns1puhTvgNVrnYbX84QgWmi+G9X5D6MhbYp6JzKhkcELzE K67Q== X-Gm-Message-State: ALoCoQlfWUaDd3TV4KZJwSX98jwAMy4nSbiuk3uSG/t3HfbPLhfASriddVoC0lVsui7VTVAp0yGt X-Received: by 10.194.5.4 with SMTP id o4mr41012460wjo.51.1438632600383; Mon, 03 Aug 2015 13:10:00 -0700 (PDT) Received: from teal.hq.k1024.org (178-83-234-80.dynamic.hispeed.ch. [178.83.234.80]) by smtp.gmail.com with ESMTPSA id gj6sm15161541wib.22.2015.08.03.13.09.59 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 03 Aug 2015 13:09:59 -0700 (PDT) Received: by teal.hq.k1024.org (Postfix, from userid 4004) id 8A345206161; Mon, 3 Aug 2015 22:09:58 +0200 (CEST) Date: Mon, 3 Aug 2015 22:09:58 +0200 From: Iustin Pop To: xfs@oss.sgi.com Subject: Question about ftype Message-ID: <20150803200958.GA14819@teal.hq.k1024.org> X-ASG-Orig-Subj: Question about ftype Mail-Followup-To: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Linux: This message was written on Linux X-Header: /usr/include gives great headers User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-wi0-f179.google.com[209.85.212.179] X-Barracuda-Start-Time: 1438632601 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi all, I recently saw that a newly created filesystem has ftype=1. Reading the man pages of mkfs.xfs and xfs_admin/xfs_db and not finding anything about changing ftype (xfsprogs 3.2.4) leads me to believe that this feature can only be set at mkfs time, but could someone confirm if it is indeed so? thanks, iustin From sandeen@sandeen.net Mon Aug 3 15:23:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ABFDC7F56 for ; Mon, 3 Aug 2015 15:23:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86CB2304053 for ; Mon, 3 Aug 2015 13:23:06 -0700 (PDT) X-ASG-Debug-ID: 1438633384-04cb6c673d2a5ec0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BnVWMQTLZSkARmRF for ; Mon, 03 Aug 2015 13:23:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 49E6561C2D89 for ; Mon, 3 Aug 2015 15:23:04 -0500 (CDT) Message-ID: <55BFCDA7.1060904@sandeen.net> Date: Mon, 03 Aug 2015 13:23:03 -0700 From: Eric Sandeen MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Question about ftype References: <20150803200958.GA14819@teal.hq.k1024.org> X-ASG-Orig-Subj: Re: Question about ftype In-Reply-To: <20150803200958.GA14819@teal.hq.k1024.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438633384 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21318 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 1:09 PM, Iustin Pop wrote: > Hi all, > > I recently saw that a newly created filesystem has ftype=1. Reading the > man pages of mkfs.xfs and xfs_admin/xfs_db and not finding anything > about changing ftype (xfsprogs 3.2.4) leads me to believe that this > feature can only be set at mkfs time, but could someone confirm if it is > indeed so? That is correct - it is an on-disk format change, and can only be set at mkfs time. It was enabled by default (along with metadata CRCs) in xfsprogs v3.2.3 -Eric From sandeen@sandeen.net Mon Aug 3 16:43:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7896D7F5A for ; Mon, 3 Aug 2015 16:43:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11891AC004 for ; Mon, 3 Aug 2015 14:43:02 -0700 (PDT) X-ASG-Debug-ID: 1438638180-04cb6c67402a7930001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wet5CmyR52kMwWAz for ; Mon, 03 Aug 2015 14:43:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 32285653B8AD; Mon, 3 Aug 2015 16:43:00 -0500 (CDT) Message-ID: <55BFE062.8020704@sandeen.net> Date: Mon, 03 Aug 2015 14:42:58 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: log recovery needs to validate against sb_meta_uuid References: <1438587625-31437-1-git-send-email-david@fromorbit.com> <1438587625-31437-4-git-send-email-david@fromorbit.com> <55BF99AD.2090103@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: log recovery needs to validate against sb_meta_uuid In-Reply-To: <55BF99AD.2090103@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438638180 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 9:41 AM, Eric Sandeen wrote: > On 8/3/15 12:40 AM, Dave Chinner wrote: >> From: Dave Chinner >> >> Now that sb_uuid can be changed by the user, we cannot use this to >> validate the metadata blocks being recovered belong to this >> filesystem. We must check against the sb_meta_uuid as that will >> remain unchanged. >> >> There is a complication in this code - the superblock itself. We can >> not check the sb_meta_uuid unconditionally, as that may not be set >> on disk. Hence we must verify the superblock sb_uuid matches between >> the log record and the in-core superblock. >> >> Found by inspection after the previous two problems were found. > > So, I also had this in my older patchset, I think it's needed for > proper log recovery as well. I'm not sure why I didn't hit the > xlog_recover_get_buf_lsn problem, though: Oh god, all this is is a difference in unlikely's upstream. Kill me now! -Eric From david@fromorbit.com Mon Aug 3 17:16:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 24F9929DF6 for ; Mon, 3 Aug 2015 17:16:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E99BA8F8035 for ; Mon, 3 Aug 2015 15:16:50 -0700 (PDT) X-ASG-Debug-ID: 1438640204-04bdf06bcf1e3f40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id U9K9o8eBQG0anbHZ for ; Mon, 03 Aug 2015 15:16:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BnBwC1579V/20mLHlbGQEBAYJ+gT2pMQEBAgEBBpsWAgIBAQKBN00BAQEBAQGBC4QjAQEBAQIBOhwYCwULCAMOBwMJJQ8FJQMhExuICwfLOgELAR8ZhgaFMIUIB4QsAQSMTYgsjEqORIsGJoQPLDGBBQeBQAEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Aug 2015 07:46:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMO22-00027V-1v; Tue, 04 Aug 2015 08:16:30 +1000 Date: Tue, 4 Aug 2015 08:16:30 +1000 From: Dave Chinner To: Jan Tulak Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... Message-ID: <20150803221629.GT3902@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... References: <1437397018-12864-1-git-send-email-jtulak@redhat.com> <1437397018-12864-2-git-send-email-jtulak@redhat.com> <20150802234250.GT16638@dastard> <1142980605.1953560.1438594488229.JavaMail.zimbra@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1142980605.1953560.1438594488229.JavaMail.zimbra@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438640204 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 03, 2015 at 05:34:48AM -0400, Jan Tulak wrote: > > From: "Dave Chinner" > > What macros, and how do we get them included in the build? I > > shouldn't need to go and use google to work out why a change is > > beign made.... > > > > This is supposed to match what is required for libxfs/ so we don't > > have to modify the kernel code we bring across. Without knowing > > exactly how we are including conflicting definitions from the OS X > > include files, it's really hard to suggest other possible > > solutions... > > > > Ahh, sorry, I already wrote a reply to Chris, but it looks like > I pressed "save" instead "send" - I found it in drafts and not > in send emails. /shy No worries, we all do silly things like that from time to time, myself included. > Sure, these: > > ../include/xfs/list.h:32:9: warning: 'LIST_HEAD' macro redefined [-Wmacro-redefined] > #define LIST_HEAD(name) \ > ^ > /usr/include/sys/queue.h:417:9: note: previous definition is here > #define LIST_HEAD(name, type) \ > ^ > (and the same for LIST_HEAD_INIT) > > sys/queue.h is not linked directly, but from many system libraries. > A quick grep on /usr/include/ shows 24 header files including the queue, > sys/mount.h one of them. And I didn't found a way how to avoid it. Ok, so 4.4BSD introduced these years ago. Now it rings a bell, but I can't find the relevant thread I'm thinking of (google has become almost useless as a mailing list search engine in recent times). I suspect that we are going to need an #undef LIST_HEAD somewhere in include/libxfs.h, libxfs/libxfs_priv.h and/or include/list.h just to ensure we don't use the system definitions (with a large comment explaining it). Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 3 17:24:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC6CE7F5A for ; Mon, 3 Aug 2015 17:24:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82792AC001 for ; Mon, 3 Aug 2015 15:24:09 -0700 (PDT) X-ASG-Debug-ID: 1438640646-04bdf06bd21e4200001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qtsHCeuygAd76IDB for ; Mon, 03 Aug 2015 15:24:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AcBwCv6L9V/20mLHlbGQEBAYJ+gT2pMQEBAgEBBpsWBAICgTdNAQEBAQEBgQuEJAEBBDocIxAIAxgJJQ8FJQMhE4gty0ABAQgCIBmGBoUwhQgHhCwFlHmMSoFJhCCTYSaEDywxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Aug 2015 07:54:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMO9B-000289-9K; Tue, 04 Aug 2015 08:23:53 +1000 Date: Tue, 4 Aug 2015 08:23:53 +1000 From: Dave Chinner To: Joe Landman Cc: xfs@oss.sgi.com Subject: Re: swalloc/allocsize question Message-ID: <20150803222353.GU3902@dastard> X-ASG-Orig-Subj: Re: swalloc/allocsize question References: <55BFA467.8000707@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55BFA467.8000707@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438640646 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 03, 2015 at 01:27:03PM -0400, Joe Landman wrote: > Hi folks: > > I've noticed some "odd" behavior while experimenting with xfs > mounts on relatively recent kernels (3.18 series). Basically, the > swalloc,allocsize=x options are being modified to something > different. That is: > > root@usn-04:~/burn-in/fio# uname -r > 3.18.12.scalable > > root@usn-04:~/burn-in/fio# mount -o > inode64,noatime,nodiratime,swalloc,allocsize=1280k /dev/sda /data/1 > > root@usn-04:~/burn-in/fio# mount | grep sda > /dev/sda on /data/1 type xfs > (rw,noatime,nodiratime,swalloc,attr2,inode64,allocsize=256k,noquota) > > This is a hardware RAID6 with a 128k chunk size and 12 elements (so > 10 data drives, thus the 1280k allocsize for stripe width > allocation). Is this something specific to xfs itself, or is this > an issue in the mount tools ? Please provide: - xfs_info output from the filesystem in question - dmesg output of all the mount messages Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Aug 3 17:28:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A63F37F5A for ; Mon, 3 Aug 2015 17:28:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 494BFAC003 for ; Mon, 3 Aug 2015 15:28:41 -0700 (PDT) X-ASG-Debug-ID: 1438640920-04bdf06bd21e43c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BIU7FMiDOSCtrlyo for ; Mon, 03 Aug 2015 15:28:40 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8EB4A6571E0E; Mon, 3 Aug 2015 17:28:39 -0500 (CDT) Message-ID: <55BFEB16.3090200@sandeen.net> Date: Mon, 03 Aug 2015 15:28:38 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 1/2] repair: use sb_meta_uuid for checking of metadata headers References: <1438587749-31597-1-git-send-email-david@fromorbit.com> <1438587749-31597-2-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] repair: use sb_meta_uuid for checking of metadata headers In-Reply-To: <1438587749-31597-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438640920 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 12:42 AM, Dave Chinner wrote: > From: Dave Chinner > > Now that we can change the uuid on v5 filesystems, we always need to > verify the metadata uuid against sb_meta_uuid, not sb_uuid. This > fixes quite a few xfstests failures when UUIDs are changed before > executing tests. > > Signed-off-by: Dave Chinner I have no plausible excuse for this one... ;) Reviewed-by: Eric Sandeen > --- > repair/phase6.c | 2 +- > repair/scan.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/repair/phase6.c b/repair/phase6.c > index 09da2e2..ad9be38 100644 > --- a/repair/phase6.c > +++ b/repair/phase6.c > @@ -1960,7 +1960,7 @@ _("expected block %" PRIu64 ", got %llu, directory inode %" PRIu64 "\n"), > return 1; > } > /* verify uuid */ > - if (platform_uuid_compare(uuid, &mp->m_sb.sb_uuid) != 0) { > + if (platform_uuid_compare(uuid, &mp->m_sb.sb_meta_uuid) != 0) { > do_warn( > _("wrong FS UUID, directory inode %" PRIu64 " block %" PRIu64 "\n"), > ino, bp->b_bn); > diff --git a/repair/scan.c b/repair/scan.c > index 8711b94..95b8ade 100644 > --- a/repair/scan.c > +++ b/repair/scan.c > @@ -237,7 +237,7 @@ _("expected block %" PRIu64 ", got %llu, bmbt block %" PRIu64 "\n"), > } > /* verify uuid */ > if (platform_uuid_compare(&block->bb_u.l.bb_uuid, > - &mp->m_sb.sb_uuid) != 0) { > + &mp->m_sb.sb_meta_uuid) != 0) { > do_warn( > _("wrong FS UUID, bmbt block %" PRIu64 "\n"), > bno); > From sandeen@sandeen.net Mon Aug 3 17:29:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 92D4A7F5A for ; Mon, 3 Aug 2015 17:29:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80040304043 for ; Mon, 3 Aug 2015 15:29:26 -0700 (PDT) X-ASG-Debug-ID: 1438640964-04cb6c67402a8860001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id x1SG8QtfZCCVFOnN for ; Mon, 03 Aug 2015 15:29:25 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9A53C6571E0E; Mon, 3 Aug 2015 17:29:24 -0500 (CDT) Message-ID: <55BFEB43.3030002@sandeen.net> Date: Mon, 03 Aug 2015 15:29:23 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] libxfs: fix uuid check durign inode allocation References: <1438587749-31597-1-git-send-email-david@fromorbit.com> <1438587749-31597-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] libxfs: fix uuid check durign inode allocation In-Reply-To: <1438587749-31597-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438640964 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/15 12:42 AM, Dave Chinner wrote: > From: Dave Chinner > > Needs to check sb_meta_uuid now that we the sb_uuid can change on v5 > filesystems. > > Signed-off-by: Dave Chinner ASSERTs are off in libxfs anyway right? Still: Reviewed-by: Eric Sandeen > --- > libxfs/util.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/libxfs/util.c b/libxfs/util.c > index 719a5b7..f427d22 100644 > --- a/libxfs/util.c > +++ b/libxfs/util.c > @@ -262,7 +262,7 @@ libxfs_ialloc( > > if (ip->i_d.di_version == 3) { > ASSERT(ip->i_d.di_ino == ino); > - ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_uuid)); > + ASSERT(uuid_equal(&ip->i_d.di_uuid, &mp->m_sb.sb_meta_uuid)); > ip->i_d.di_crc = 0; > ip->i_d.di_changecount = 1; > ip->i_d.di_lsn = 0; > From rofsjan@diskoteka.nl Mon Aug 3 18:37:21 2015 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 715A77F5A for ; Mon, 3 Aug 2015 18:37:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A9FF8F8035 for ; Mon, 3 Aug 2015 16:37:17 -0700 (PDT) X-ASG-Debug-ID: 1438645030-04cbb0416f230b40001-NocioJ Received: from rs209878.rs.hosteurope.de (rs209878.rs.hosteurope.de [5.35.251.80]) by cuda.sgi.com with ESMTP id Vc2ekw8MgXwuhmJb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 16:37:11 -0700 (PDT) X-Barracuda-Envelope-From: rofsjan@diskoteka.nl X-Barracuda-Apparent-Source-IP: 5.35.251.80 X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network Received: from soscza (host-95-189-186-144.pppoe.omsknet.ru [95.189.186.144]) by rs209878.rs.hosteurope.de (Postfix) with ESMTPA id DB3E947F20AF; Tue, 4 Aug 2015 01:38:45 +0200 (CEST) Message-ID: <393C8AD9D20621E23E3B72C96DBF0065@jawdwr> From: =?windows-1251?B?y/7h7uzo8CDM8+Tw7vHr4OI=?= To: , , , , , , , , Subject: =?windows-1251?B?wuDm7eD/IOjt9O7w7OD26P8g7uEg7vDj4O3o?= =?windows-1251?B?5+D26Ogg8+/w4OLr5e3o/yM=?= Date: Tue, 4 Aug 2015 02:31:02 +0400 X-ASG-Orig-Subj: =?windows-1251?B?wuDm7eD/IOjt9O7w7OD26P8g7uEg7vDj4O3o?= =?windows-1251?B?5+D26Ogg8+/w4OLr5e3o/yM=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1FCA_01D0CE5D.9B270350" X-Priority: 3 X-Barracuda-Connect: rs209878.rs.hosteurope.de[5.35.251.80] X-Barracuda-Start-Time: 1438645031 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 This is a multi-part message in MIME format. ------=_NextPart_000_1FCA_01D0CE5D.9B270350 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1FCB_01D0CE5D.9B270350" ------=_NextPart_001_1FCB_01D0CE5D.9B270350 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C7=E4=F0=E0=E2=F1=F2=E2=F3=E9=F2=E5! =C2=FB =E7=ED=E0=E5=F2=E5 =EA=E0=EA= =EE=F0=E3=E0=ED=E8=E7=EE=E2=E0=ED=EE =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =ED=E0= =F8=E8=EC =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=EE=EC, =F1=F2=F0=E0=ED=EE=E9 =E8= =EE=E1=F9=E5=F1=F2=E2=EE=EC =E2 =F6=E5=EB=EE=EC? =CA=E0=EA =FD=F2=EE =E2= =EB=E8=FF=E5=F2 =ED=E0 =C2=E0=F1 =E8 =C2=E0=F8=E5 =E4=E5=EB=EE? =CD=E0 =E3= =ED=E8=E5=ED=E8=E5 =E8 =E2=FB=EC=E8=F0=E0=ED=E8=E5 =ED=E0=F8=E5=E3=EE =ED= =E0=F0=EE=E4=E0? =CD=E0 =E2=EE=E9=ED=F3 =ED=E0 =D3=EA=F0=E0=E8=ED=E5? =CF= =F0=E5=E4=EB=E0=E3=E0=E5=EC =E1=E5=F1=EF=EB=E0=F2=ED=EE =EE=E7=ED=E0=EA=EE= =EC=E8=F2=FC=F1=FF =F1 =EA=ED=E8=E3=E0=EC=E8, =E2 =EA=EE=F2=EE=F0=FB=F5 =EE= =F1=E2=E5=F9=E5=ED=FB =F1=EA=F0=FB=F2=FB=E5 =E8 =EE=F7=E5=ED=FC =E2=E0=E6= =ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB: =CA=CD=C8=C3=C01: - =F1=EA=F0=FB=F2=E0=FF =E8=F1=F2=EE=F0=E8=FF =E4=F0=E5=E2=ED=EE=F1=F2=E8= =E8 =E2=EE=E9=ED=FB =E7=E0 =EC=E8=F0=EE=E2=EE=E5 =E3=EE=F1=EF=EE=E4=F1=F2= =E2=EE - =E8=F1=F2=F0=E5=E1=EB=E5=ED=E8=E5 =F0=F3=F1=F1=EA=EE=E3=EE =ED=E0=F0=EE= =E4=E0 - =F7=F2=EE =F2=E0=EA=EE=E5 =F0=F3=F1=F1=EA=E8=E9 =FF=E7=FB=EA =E8 =E4=F0= =E5=E2=ED=E8=E5 =F0=F3=ED=FB =C3=E8=EF=E5=F0=E1=EE=F0=E5=E8 - =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =E3=EB=EE=E1=E0=EB=FC=ED=FB=EC=E8 =EF=F0= =EE=F6=E5=F1=F1=E0=EC=E8 - =E0=EB=FC=F2=E5=F0=ED=E0=F2=E8=E2=E0 =F1=E0=EC=EE=F3=E1=E8=E9=F1=F2=E2= =E5=ED=ED=EE=EC=F3 =F0=E0=E7=E2=E8=F2=E8=FE =EC=E8=F0=E0 =CA=CD=C8=C3=C02: - =EC=EE=ED=EE=EF=EE=EB=E8=E8 =EA=E0=EA =F1=F0=E5=E4=F1=F2=E2=EE =F3=EF=F0= =E0=E2=EB=E5=ED=E8=FF =EE=E1=F9=E5=F1=F2=E2=EE=EC - =F7=E5=EB=EE=E2=E5=F7=E5=F1=EA=E8=E5 =E1=EE=EB=E5=E7=ED=E8 =E8 =F1=EC=E5= =F0=F2=E8 =E2=F1=E2=FF=E7=E8 =F1 =EC=EE=ED=EE=EF=EE=EB=E8=E7=E0=F6=E8=E5=E9 - =EF=F0=EE=EF=E0=E3=E0=ED=E4=E0 =E8 =EC=E0=ED=E8=EF=F3=EB=FF=F6=E8=E8 =EA= =E0=EA =E3=EB=E0=E2=ED=EE=E5 =EE=F0=F3=E6=E8=E5 =F3=EF=F0=E0=E2=EB=E5=ED=E8= =FF - =EB=E5=E3=E0=EB=E8=E7=E0=F6=E8=FF =E8 =E4=E5=EC=EE=ED=EE=EF=EE=EB=E8=E7= =E0=F6=E8=FF ------=_NextPart_001_1FCB_01D0CE5D.9B270350 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
 =C7=E4=F0=E0=E2=F1=F2= =E2=F3=E9=F2=E5! =C2=FB =E7=ED=E0=E5=F2=E5 =EA=E0=EA=20 =EE=F0=E3=E0=ED=E8=E7=EE=E2=E0=ED=EE =F3=EF=F0=E0=E2=EB=E5=ED=E8=E5 =ED=E0= =F8=E8=EC =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=EE=EC, =F1=F2=F0=E0=ED=EE=E9 =E8= =EE=E1=F9=E5=F1=F2=E2=EE=EC =E2 =F6=E5=EB=EE=EC? =CA=E0=EA =FD=F2=EE=20 =E2=EB=E8=FF=E5=F2 =ED=E0 =C2=E0=F1 =E8 =C2=E0=F8=E5 =E4=E5=EB=EE? =CD=E0= =E3=ED=E8=E5=ED=E8=E5 =E8 =E2=FB=EC=E8=F0=E0=ED=E8=E5 =ED=E0=F8=E5=E3=EE= =ED=E0=F0=EE=E4=E0? =CD=E0 =E2=EE=E9=ED=F3 =ED=E0=20 =D3=EA=F0=E0=E8=ED=E5? =CF=F0=E5=E4=EB=E0=E3=E0=E5=EC =E1=E5=F1=EF=EB=E0=F2= =ED=EE =EE=E7=ED=E0=EA=EE=EC=E8=F2=FC=F1=FF =F1 =EA=ED=E8=E3=E0=EC=E8, =E2= =EA=EE=F2=EE=F0=FB=F5 =EE=F1=E2=E5=F9=E5=ED=FB =F1=EA=F0=FB=F2=FB=E5=20 =E8 =EE=F7=E5=ED=FC =E2=E0=E6=ED=FB=E5 =E2=EE=EF=F0=EE=F1=FB:
=CA=CD=C8= =C3=C01:
 - =F1=EA=F0=FB=F2=E0=FF =E8=F1=F2=EE=F0=E8=FF =E4=F0=E5= =E2=ED=EE=F1=F2=E8 =E8 =E2=EE=E9=ED=FB=20 =E7=E0 =EC=E8=F0=EE=E2=EE=E5 =E3=EE=F1=EF=EE=E4=F1=F2=E2=EE
 - =E8= =F1=F2=F0=E5=E1=EB=E5=ED=E8=E5 =F0=F3=F1=F1=EA=EE=E3=EE =ED=E0=F0=EE=E4=E0=
 - =F7=F2=EE=20 =F2=E0=EA=EE=E5 =F0=F3=F1=F1=EA=E8=E9 =FF=E7=FB=EA =E8 =E4=F0=E5=E2=ED=E8= =E5 =F0=F3=ED=FB =C3=E8=EF=E5=F0=E1=EE=F0=E5=E8
 - =F3=EF=F0=E0=E2= =EB=E5=ED=E8=E5 =E3=EB=EE=E1=E0=EB=FC=ED=FB=EC=E8=20 =EF=F0=EE=F6=E5=F1=F1=E0=EC=E8
 - =E0=EB=FC=F2=E5=F0=ED=E0=F2=E8=E2= =E0 =F1=E0=EC=EE=F3=E1=E8=E9=F1=F2=E2=E5=ED=ED=EE=EC=F3 =F0=E0=E7=E2=E8=F2= =E8=FE=20 =EC=E8=F0=E0
=CA=CD=C8=C3=C02:
 - =EC=EE=ED=EE=EF=EE=EB=E8=E8 = =EA=E0=EA =F1=F0=E5=E4=F1=F2=E2=EE =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF=20 =EE=E1=F9=E5=F1=F2=E2=EE=EC
 - =F7=E5=EB=EE=E2=E5=F7=E5=F1=EA=E8=E5= =E1=EE=EB=E5=E7=ED=E8 =E8 =F1=EC=E5=F0=F2=E8 =E2=F1=E2=FF=E7=E8 =F1=20 =EC=EE=ED=EE=EF=EE=EB=E8=E7=E0=F6=E8=E5=E9
 - =EF=F0=EE=EF=E0=E3=E0= =ED=E4=E0 =E8 =EC=E0=ED=E8=EF=F3=EB=FF=F6=E8=E8 =EA=E0=EA =E3=EB=E0=E2=ED= =EE=E5 =EE=F0=F3=E6=E8=E5=20 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF
 - =EB=E5=E3=E0=EB=E8=E7=E0=F6=E8=FF= =E8 =E4=E5=EC=EE=ED=EE=EF=EE=EB=E8=E7=E0=F6=E8=FF
------=_NextPart_001_1FCB_01D0CE5D.9B270350-- ------=_NextPart_000_1FCA_01D0CE5D.9B270350 Content-Type: application/msword; name="=?windows-1251?B?wu7n8O7m5OXt6OUg0PPx6C4gze7i4P8gw+jv?= =?windows-1251?B?5fDh7vDl/y5kb2M=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?wu7n8O7m5OXt6OUg0PPx6C4gze7i4P8gw+jv?= =?windows-1251?B?5fDh7vDl/y5kb2M=?=" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAIAAAAkQMAAAAAAAAA EAAAkwMAAAEAAAD+////AAAAAIkDAACKAwAAiwMAAIwDAACNAwAAjgMAAI8DAACQAwAA//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAcWAZBAAA+BK/AAAAAAAAEAAAAAAABgAANlkFAA4AYmpianFQcVAAAAAAAAAAAAAAAAAAAAAA AAAZBBYALtIFABM6AQATOgEAXg8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAAOwDAAAAAAAA7AMAAOwD AAAAAAAA7AMAAAAAAADsAwAAAAAAAOwDAAAAAAAA7AMAABQAAAAAAAAAAAAAAAAEAAAAAAAAaIgA AAAAAABoiAAAAAAAAGiIAAAAAAAAaIgAAOQEAABMjQAAxAEAAAAEAAAAAAAA9dIAAPIAAAAcjwAA FgAAADKPAAAAAAAAMo8AAAAAAAAyjwAAAAAAADKPAAAAAAAAMo8AAFYAAACIjwAAJAAAAKyPAAAU AAAAINIAAAIAAAAi0gAAAAAAACLSAAAAAAAAItIAAAAAAAAi0gAAAAAAACLSAAAAAAAAItIAACQA AADn0wAAaAIAAE/WAAA+AAAARtIAAGkAAAAAAAAAAAAAAAAAAAAAAAAA7AMAAAAAAABckgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAyjwAAAAAAADKPAAAAAAAAXJIAAAAAAABckgAAAAAAAEbSAAAAAAAA AAAAAAAAAADsAwAAAAAAAOwDAAAAAAAAMo8AAAAAAAAAAAAAAAAAADKPAAAAAAAAr9IAABYAAABS tQAAAAAAAFK1AAAAAAAAUrUAAAAAAABckgAAGg4AAOwDAAAAAAAAMo8AAAAAAADsAwAAAAAAADKP AAAAAAAAINIAAAAAAAAAAAAAAAAAAFK1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAXJIAAAAAAAAg0gAAAAAAAAAAAAAAAAAAUrUAAAAAAAAAAAAA AAAAAFK1AAAAAAAA7AMAAAAAAADsAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUrUAAAAAAAAyjwAAAAAAABCPAAAMAAAAwBsCf6Gx 0AEAAAAAAAAAAGiIAAAAAAAAdqAAANYSAABStQAAAAAAAAAAAAAAAAAAfMkAAKQIAADF0gAAMAAA APXSAAAAAAAAUrUAAAAAAACN1gAAAAAAAEyzAAD8AQAAjdYAAAAAAABStQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABS tQAAsgEAAI3WAAAAAAAAAAAAAAAAAADsAwAAAAAAAAS3AAB4EgAAwI8AAK4AAABukAAAfAAAAFK1 AAAAAAAA6pAAAGQAAABOkQAADgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwI8A AAAAAADAjwAAAAAAAMCPAAAAAAAARtIAAAAAAABG0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAASLUAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCPAAAA AAAAwI8AAAAAAADAjwAAAAAAAPXSAAAAAAAAXJIAAAAAAABckgAAAAAAAFySAAAAAAAAXJIAAAAA AAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAhFoAAIReAADkKQAAAAQAAAAAAAAABAAAAAAA AAAEAAAAAAAAhF4AAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAADsAwAAAAAAAOwDAAAAAAAA 7AMAAAAAAADsAwAAAAAAAOwDAAAAAAAA7AMAAAAAAAD/////AAAAAAIADAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoADQAS BD4ENwRABD4ENgQ0BDUEPQQ4BDUEIAAgBEMEQQQ4BC4AIAAdBD4EMgQwBE8EIAATBDgEPwQ1BEAE MQQ+BEAENQRPBC4ADQANADIAMAAxADUAIAAzBD4ENAQgAD4EQgQgACAEPgQ2BDQENQRBBEIEMgQw BCAAJQRABDgEQQRCBD4EMgQwBA0ADQANAB4EMQRABDAESQQ1BD0EOAQ1BA0ADQAXBDQEQAQwBDIE QQRCBDIEQwQ5BEIENQQsACAAQwQyBDAENgQwBDUEPARLBDkEIABHBDgEQgQwBEIENQQ7BEwEIQAN ACAAIAAgABEEOwQwBDMEPgQ0BDAEQAQ4BDwEIAA3BDAEIAAyBD0EOAQ8BDAEPQQ4BDUELgAgABIE MAQ8BCAAPwRABDUENAQ7BDAEMwQwBE4EQgRBBE8EIAA3BD0EMAQ9BDgETwQsACAAQQQ+BDEEQAQw BD0EPQRLBDUEIAA4BCAAPgQxBEAEMAQxBD4EQgQwBD0EPQRLBDUEIAAwBDQEPAQ4BD0EOARBBEIE QAQwBEYEOAQ1BDkEIAAzBEAEQwQ/BD8ESwQgACIAIAQ+BDQELgAgBEMEQQRMBC4AIQQyBD4EMQQ+ BDQEMAQuACIALgAgABIEQQRRBCAAPgQ/BDgEQQQwBD0EPgQgADIEIABBBEIEMARCBEwENQQgAD4E QgQgADgERQQgADgEPAQ1BD0EOAQuACAAHwQ+BCAAMgQ+BD8EQAQ+BEEEMAQ8BCAAPgQxBEAEMARJ BDAEOQRCBDUEQQRMBCAARwQ1BEAENQQ3BCAAPgQxBEkENQRBBEIEMgQ+BCAAdgBrAC4AYwBvAG0A LQAgABMAIABIAFkAUABFAFIATABJAE4ASwAgACIAaAB0AHQAcABzADoALwAvAHYAawAuAGMAbwBt AC8AYwBsAHUAYgA3ADUAMAAxADcANQA5ADgAIgAgAAEAFABoAHQAdABwAHMAOgAvAC8AdgBrAC4A YwBvAG0ALwBjAGwAdQBiADcANQAwADEANwA1ADkAOAAVAC4AIAARBEMENAQ1BDwEIABABDAENARL BCAAOgQ+BD0EQQRCBEAEQwQ6BEIEOAQyBD0EPgQ5BCAAOgRABDgEQgQ4BDoENQQgADgEIAA/BD4E NgQ1BDsEMAQ9BDgETwQ8BC4ADQAgAB4ERwQ1BDIEOAQ0BD0ESwQ1BCAAOARBBEIEOAQ9BEsEIAA9 BDAESAQ1BDMEPgQgADwEOARABDAEIAA4BCAAQQQ7BD4ENgQ9BEsENQQsACAAMgQ+BDcEPAQ+BDYE PQQ+BCAAQQQ6BEAESwRCBEsENQQsACAANwQ9BDAEPQQ4BE8ELAAgAD4EMQRKBDUENAQ4BD0ETwRP BEEETAQsACAAPwQ+BEAEPgQ2BDQEMAROBEIEIABGBDUEOwQ+BEEEQgQ9BD4ENQQgADcEPQQwBD0E OAQ1BCAAOgQwBDoEIAA+BEEEPQQ+BDIEQwQgADQEOwRPBCAAPgRCBDIENQRCBDAEIAA9BDAEIAA6 BDsETgRHBDUEMgRLBDUEIAAyBD4EPwRABD4EQQRLBCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ+BDME PgQgADEESwRCBDgETwQ6ACAAMgQ+BD8EQAQ+BEEESwQgADgEQQRCBD4EQAQ4BDgELAAgAEEEPgRG BDgEPgQ7BD4EMwQ4BDgELAAgAD8EQQQ4BEUEPgQ7BD4EMwQ4BDgEIAA4BCAAOgRDBDsETARCBEME QARLBCwAIAA0BDAETgRCBCAAQAQ1BEgENQQ9BDgETwQgAD8EQAQ+BDEEOwQ1BDwEIABABDAENwQy BDgEQgQ4BE8EIAA+BDEESQQ1BEEEQgQyBDAEKAA3BDQENQRBBEwEIAA4BCAANAQwBDsENQQ1BCAA TQRCBD4EIAAyBEEENQQgADsETgQ0BDgEIAAXBDUEPAQ7BDgEKQAsACAAQARDBEEEQQQ6BD4EMwQ+ BCAAPQQwBEAEPgQ0BDAEIAA4BCAAIARDBEEEOAQuACAAHAQ+BDYEPQQ+BCAAPwQ+BD0ETwRCBEwE IAA/BEAEOARHBDgEPQRLBCAARwQwBEEEQgQ9BEsERQQgAD8EQAQ+BEYENQRBBEEEPgQyBCwAIAA4 BEUEIAA6BD4EPQQ6BEAENQRCBD0EPgQzBD4EIABFBD4ENAQwBCwAIABBBEIEQARDBDoEQgRDBEAE SwQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCwAIAAyBCAAPgRCBD0EPgRIBDUEPQQ4BDgEIABB BD4EMgRABDUEPAQ1BD0EPQRLBEUEIAAyBD4EOQQ9BCwAIABBBD4EQQRCBD4ETwQ9BDgETwQgADME PgRBBEMENAQwBEAEQQRCBDIEIAA4BCAATQQ6BD4EPQQ+BDwEOAQ6BCwAIABHBDUEOwQ+BDIENQRH BDUEQQQ6BD4EOQQgAD8EQAQ4BEAEPgQ0BEsEIAA4BCAARwQ1BDsEPgQyBDUERwQ1BEEEQgQyBDAE IAAyBCAARgQ1BDsEPgQ8BC4AIAAkBDAEOgRCBCAARwRCBDUEPQQ4BE8EIABNBEIEPgQ5BCAAQQRC BDAEQgRMBDgEIAA/BD4ENARABDAENwRDBDwENQQyBDAENQRCBCAAMAQyBEIEPgQ8BDAEQgQ4BEcE NQRBBDoEPgQ1BCAAQQQ+BDMEOwQwBEEEOAQ1BCAAQQQgAEMEQQQ7BD4EMgQ4BE8EPAQ4BCAANAQ+ BDMEPgQyBD4EQAQwBCAAPQQ4BDYENQQgADwENQQ2BDQEQwQgABIEMAQ8BDgEIAA4BCAAPQQwBEgE NQQ5BCAAMwRABEMEPwQ/BD4EOQQsACAAMAQgAEIEMAQ6BDYENQQgAGMAIAA/BEAEMAQyBDgEOwQw BDwEOAQgAEEEMAQ8BD4EOQQgADMEQARDBD8EPwRLBC4ADQAgAB8EQAQ1BDQEOwQwBDMEMAQ1BDwE PgQ1BCAAEgQwBDwEIAA3BD0EMAQ9BDgENQQgAD4EQQQ9BD4EMgQwBD0EPgQgAD0EMAQgAD4EMQRK BDUENAQ4BD0ENQQ9BDgEOAQgAEEEQgRABD4EMwQ+BDMEPgQgAD0EMARDBEcEPQQ+BDMEPgQgAD8E PgQ0BEUEPgQ0BDAEIABBBCAAPQQ1BDoEPgRCBD4EQARLBDwEOAQgAE0EOwQ1BDwENQQ9BEIEMAQ8 BDgELAAgAEEEMgQ+BDkEQQRCBDIENQQ9BD0ESwQ8BDgEIABCBEAEMAQ0BDgERgQ4BD4EPQQ9BD4E IAA9BDUEPQQwBEMERwQ9BD4EPARDBCAAOAQgADMEQwQ8BDAEPQQ4BEIEMARABD0EPgQ8BEMEIAA3 BD0EMAQ9BDgETgQsACAAPwRABDgENwQyBDAEPQQ+BCAAPwQ+BDwEPgRHBEwEIAA+BEEEPgQ3BD0E MARCBEwELAAgAEcEQgQ+BCAAQgQwBDoEPgQ1BCAARwQ1BDsEPgQyBDUEOgQgADIEIABCBD4EPAQg ADIEOAQ0BDUELAAgADIEIAA6BD4EQgQ+BEAEPgQ8BCAAPgQ9BCAAPwRABDgEQQRDBEIEQQRCBDIE QwQ1BEIEIAA9BDAEIAA/BDsEMAQ9BDUEQgQ1BCAAFwQ1BDwEOwRPBCwAIAA1BDMEPgQgADgEQQRC BDgEPQQ9BEsENQQgAD8EQAQ4BEAEPgQ0BEMEIAA4BCAAPQQwBDcEPQQwBEcENQQ9BDgENQQgADIE IABABDAEOgRDBEAEQQQ1BCAAQQQ4BD0EQgQ1BDcEMAQgADQEOAQwBDsENQQ6BEIEOAQ6BDgEIAA4 BCAAQQQ6BEAESwRCBD4EOQQgAEQEOAQ7BD4EQQQ+BEQEQQQ6BD4EOQQgADoEMARCBDUEMwQ+BEAE OAQ4BCAAIAQeBBQELgAgABQEMARRBEIEQQRPBCAANwQ9BDAEPQQ4BDUELAAgAEYENQQ7BD4EQQRC BD0EPgQgADgEIAA8BD0EPgQzBD4EQQRCBD4EQAQ+BD0EPQQ1BCAAPgQ/BDgEQQRLBDIEMAROBEkE NQQ1BCAAQQQ7BD4ENgQ9BEsENQQgADIEPgQ/BEAEPgRBBEsEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5 BCAAOARBBEIEPgRABDgEOAQgAEcENQQ7BD4EMgQ1BEcENQRBBEIEMgQwBCAAOAQgADMEOwQ+BDEE MAQ7BEwEPQQ+BDMEPgQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8ELAAgAEEEQgRABEMEOgRCBEMEQARD BCAAOAQgADcEMAQ6BD4EPQRLBCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQsACAAQQQ6BEAESwRCBEsE NQQgAD4EQgQgADMEOwQwBDcEIAA8BD0EPgQ2BDUEQQRCBDIEPgQ8BCAAQgRABEMENAQ9BD4EPwRA BDUEPgQ0BD4EOwQ4BDwESwRFBCAAMwRABDAEPQQ1BDkEIAA8BDgEQAQ+BD8EPgQ9BDgEPAQwBD0E OARPBC4AIAAcBEsEIAA/BD4EQQRCBDAEQAQwBDsEOARBBEwEIAA0BDAEQgRMBCAAOgQwBEAEQgQ4 BD0EQwQsACAAQQRCBEAEPgQzBD4EIAA+BD8EOARBBEsEMgQwBE4ESQRDBE4EIAA6BEIEPgQsACAA OgQwBDoEIAA4BCAAOgQwBDoEOAQ8BCAAPgQxBEAEMAQ3BD4EPAQgAD8EQAQ+BE8EMgQ7BE8ENQRC BCAAQQQ1BDEETwQgADIEIAA4BEEEQgQ+BEAEOAQ4BCAAOAQgADQENQQ7BDAENQRCBCAATQRCBD4E IAAyBCAANAQwBD0EPQRLBDkEIAA8BD4EPAQ1BD0EQgQsACAAPAQwBD0EOAQ/BEMEOwQ4BEAEQwRP BCAAMgRBBDUEPAQgADwEOARABD4EPAQgAEcENQRABDUENwQgADgENwQxBEAEMAQ9BD0ESwRFBCAA OAQgAD8EPgRBBDIETwRJBFEEPQQ9BEsERQQgADgEMwRABD4EOgQ+BDIELAAgAEEEOgRABEsEMgQw BE8EIAAyBCAAMgRLBEEEPgQ6BD4EOQQgAEEEQgQ1BD8ENQQ9BDgEIAA4BEEEQgQ4BD0EPQQ+BDUE IAA3BD0EMAQ9BDgENQQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAAPgQ/BDgEQQQwBD0EPQQ+ BDUEIAA9BDgENgQ1BCAAOgQ7BE4ERwQ1BDIEPgQ1BCAARgQ1BDsEPgRBBEIEPQQ+BDUEIAA/BD4E PQQ4BDwEMAQ9BDgENQQgAEAENQQwBDsETAQ9BD4EQQRCBDgELgANACAAHwQ+BD0ETwRCBEwEIABB BDoEQARLBEIEPgQ1BCAAPwRABD4EQQRCBD4EIAA4BCAAQQQ7BD4ENgQ9BD4ELgAgABUEQQQ7BDgE IAASBEsEIAA+BDEEOwQwBDQEMAQ1BEIENQQgAEcEOARBBEIESwQ8BCAAQAQwBDcEQwQ8BD4EPAQg ADgEIAA9BDUENwQwBDEEOwQ+BDoEOARABD4EMgQwBD0EPQQ+BDkEIABBBD4EMgQ1BEEEQgRMBE4E LAAgAEIEPgQgAD8EPgQ9BE8EQgRMBCAATQRCBEMEIAA6BDAEQgQ1BDMEPgRABDgETgQsACAAQQQ+ BDMEOwQwBEEEQwROBEkEQwROBCAAPQQwBEMERwQ9BD4ENQQgADgEIAAzBEMEPAQwBD0EOARCBDAE QAQ9BD4ENQQgADcEPQQwBD0EOARPBCwAIAA8BD4ENgQ9BD4EIAA/BD4EPwRLBEIEMAQyBEgEOARB BEwEIAAyBD0EMARHBDAEOwQ1BCAAPwRABDUENARBBEIEMAQyBDgEQgRMBCwAIAAzBDQENQQgADcE MAQ6BDAEPQRHBDgEMgQwBE4EQgRBBE8EIAA/BEAENQQ0BDwENQRCBEsEIAA4BCAAPgQxBEoENQQ6 BEIESwQgAEQEOAQ3BDgERwQ1BEEEOgQ+BDkEIABABDUEMAQ7BEwEPQQ+BEEEQgQ4BCwAIAA6BCAA OgQ+BEIEPgRABEsEPAQgADwEPgQ2BD0EPgQgAD8EQAQ4BDwENQQ9BDgEQgRMBCAAPwQ+BD0ETwRC BDgENQQgACAEHgQUBEEEQgQyBDAELAAgAEIEPgQgADUEQQRCBEwEIAAzBEAEMAQ9BDgERgRLBCAA QQQwBDwEPgQ5BCAAHwRABDgEIAQeBBQESwQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAANAQw BDsENQQ6BDgEOQQgADoEPgRBBDwEPgRBBCwAIABABDUEMQQ1BD0EPgQ6BCAAQwQgADIEMARBBCAA PQQwBCAAOgQ+BDsENQQ9BE8ERQQsACAAOwROBDQEOAQsACAAPAQ4BEAEIAA8BDgEOgRABD4EMQQ+ BDIELAAgADAEQgQ+BDwEPgQyBCAAOAQgADIEPgQ+BDEESQQ1BCAAIgAyBEEEUQQiACAAOAQ7BDgE IAA/BD4ERwRCBDgEIAAyBEEEUQQsACAARwRCBD4EIAA/BD4EIAQ+BDYENAQ1BD0EPgQgAEcENQQ8 BC0AOwQ4BDEEPgQgADUESQRRBC4AIAAYBCAAQgQ1BD8ENQRABEwELAAgAD8EPgQ9BDgEPAQwBE8E LAAgAEcEQgQ+BCAAHwRABDgEQAQ+BDQEMAQsACAAOgQwBDoEIABBBDAEPAQgACAEPgQ0BCwAIAAx BDUEQQQ6BD4EPQQ1BEcEPQQwBCwAIAA/BEAENQQ0BEEEQgQwBDIETARCBDUELAAgADoEMAQ6BCAA OAQ8BDUEPQQ9BD4EIAA4BCAAPQQwBEEEOgQ+BDsETAQ6BD4EIABBBDgEOwRMBD0EPgQgAD4EQgRA BDAENgQ1BD0EMAQgAE0EQgQwBCAAOgQwBEIENQQzBD4EQAQ4BE8EIAAyBCAAQQQ+BDIEQAQ1BDwE NQQ9BD0EPgQ8BCAAPgQxBEkENQRBBEIEMgQ1BCwAIAA1BDMEPgQgAEQEOAQ7BD4EQQQ+BEQEOAQ4 BCAAOAQgADwEOARABD4EMgQ+BDcENwRABDUEPQQ4BDgELAAgADIEIAA4BD0EQgQ1BDsEOwQ1BDoE QgQ1BCwAIAA7BDgERwQ9BD4EQQRCBDgELAAgAD8EPgQ7BDgEQgQ4BDoENQQgADgEIAA4BDQENQQ+ BDsEPgQzBDgEOAQsACAAMgQgACEEHAQYBCAAOAQgAD4EMQRABDAENwQ+BDIEMAQ9BDgEOAQsACAA MgQgADgEPQRBBEIEOARCBEMEQgQwBEUEIAA4BCAAMgQgAEEEPgQyBEAENQQ8BDUEPQQ9BD4EOQQg AEIEQAQwBDQEOARGBDgEOAQuACAAFQRRBCAAPQQ1BEIELgAgAB0ENQRCBCAAOAQ9BEEEQgQ4BEIE QwRCBD4EMgQsACAAQAQwBDcEMgQ4BDIEMAROBEkEOARFBCAAQgQ1BD4EQAQ4BDgEIABDBEEEPwQ1 BEgEPQRLBEUEIABBBDUEPAQ1BDkEIAA4BCAAQAQ+BDQEHgQyBCwAIAA/BD4EOwQ4BEIEOAQ6BDgE IAA9BDUEIABBBD8EPgRABE8EQgQsACAAOgQwBDoEIAA/BD4EPAQ+BEcETAQgAEIEPgQ8BEMEIAA4 BDsEOAQgADgEPQQ+BDwEQwQgAEAEPgQ0BEMELAAgAEEENQQ8BEwENQQgADgEOwQ4BCAAPQQ1BDEE PgQ7BEwESAQ+BDwEQwQgAE0EQgQ9BD4EQQRDBCwAIAAyBDAENgQ9BEsENQQgAEQEOAQ7BD4EQQQ+ BEQESwQgADIEIAAxBDUEQQQ1BDQEOgQwBEUEIAA9BDUEIAA+BDEEQQRDBDYENAQwBE4EQgQgAD8E QAQ+BDEEOwQ1BDwESwQgADIEOwQ4BE8EPQQ4BE8EIAA/BD4EQQQ7BDUENAQ9BDgERQQgADQEPgRB BEIEOAQ2BDUEPQQ4BDkEIAA9BDAEIABBBD4EQQRCBD4ETwQ9BDgENQQgADcENAQ+BEAEPgQyBEwE TwQgACAEPgQ0BDAEIAA4BCAAPQQwBCAAPwQ+BDoEMAQ3BDAEQgQ1BDsEOAQgADQENQRPBEIENQQ7 BEwEPQQ+BEEEQgQ4BCAANAQ4BD0EMARBBEIEOAQ5BCAAOAQgADoEOwQwBD0EPgQyBCwAIAAwBCAA PAQ1BDQEOARGBDgEPQQwBCAAPQQ1BCAAOARBBEEEOwQ1BDQEQwQ1BEIEIAAyBDsEOARPBD0EOAQ1 BCAAOgQ+BDsEOARHBDUEQQRCBDIEMAQgADQENQRCBDUEOQQgADIEIABBBDUEPARMBDUEIAA9BDAE IAA6BD4EPQRGBDUEPQRCBEAEMARGBDgETgQgACIAMwQ+BEAEPAQ+BD0EMAQgAEAEMAQ0BD4EQQRC BDgEIgAgAEEENQRABD4EQgQ+BD0EOAQ9BDAEIAAyBCAAQAQ+BDQEOARCBDUEOwRPBEUELAAgAD0E NQQgADIESwQ3BDIEMAQ9BD0EQwROBCAAPQQwBEAEOgQ+BEIEOARHBDUEQQQ6BDgEPAQgADIEOwQ4 BE8EPQQ4BDUEPAQsACAAMAQgADcEMAQ+BDQEPQQ+BCAAOAQgADIEOwQ4BE8EPQQ4BDUEIAA9BDAE QAQ6BD4EQgQ4BDoEPgQyBCAAPQQwBCAAOgQ+BDsEOARHBDUEQQRCBDIEPgQgAEEEMAQ8BDgERQQg AE0EQgQ4BEUEIAA9BDUEQQRHBDAEQQRCBD0ESwRFBCAANAQ1BEIENQQ5BCAAMgQgAEEENQQ8BEwE NQQhACAAEAQgAEIENQQ/BDUEQARMBCAAMgQ8BDUEQQRCBDUEIABBBCAAMgQwBDwEOAQgAD8EQAQ1 BDQEQQRCBDAEMgQ4BDwELAAgAEcEQgQ+BCwAIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCwAIAAyBEEE UQQgADIEIAA/BD4EQARPBDQEOgQ1BCwAIAA9BDgEOgQwBDoEPgQzBD4EIAA/BEAEPgRCBDgEMgQ+ BEAENQRHBDgETwQgAD0ENQRCBCAAOAQgADoEMAQ6BDAETwQgAEAEMAQ3BD0EOARGBDAELAAgACAE PgQ0BCwAIAAfBEAEOARABD4ENAQwBCwAIAAyBD4EPgQxBEkENQQuAC4ALgAgAB0EPgQgADoEMAQ6 BCAANgQ1BCAAQgQwBDoELAAgADoEOwROBEcENQQyBDAETwQgAEQEOAQ7BD4EQQQ+BEQEQQQ6BDAE TwQgADoEMARCBDUEMwQ+BEAEOARPBCAAHQQVBCAAHwQgBBUEFAQhBCIEEAQSBBsEFQQdBBAEIAAy BCAAPQQwBEgENQQ5BCAANgQ4BDcEPQQ4BD8AIAAfBEAEOARHBDUEPAQsACAATQRCBD4EIAA6BDsE TgRHBCAAOgQgAEEEQgRABD4EMwQ+BDwEQwQgAD8EPgQ9BDgEPAQwBD0EOAROBCAAQAQ1BDAEOwRM BD0EPgRBBEIEOAQuACAAEgQ+BC0APwQ1BEAEMgRLBEUELAAgADUEQQRCBEwEIAA6BDAEQgQ1BDME PgRABDgETwQgACAEHgQUBCwAIAAwBCAANQRBBEIETAQgADQEQARDBDMEMARPBC0AIAAyBEEEUQQs ACAARwRCBD4EIAAcID8EQAQ4BCAAPQRRBDwEHSAsACAAHwQgBBgEIAQ+BDQEMAQuACAAIgQ+BCAA NQRBBEIETAQsACAANQRBBDsEOAQgADUEMwQ+BCAAIgA3BDAEQQRDBD0EQwRCBEwEIAAyBCAAQQQw BDwEPgQzBD4EIABBBDUEMQRPBCIALAAgAEIEPgQgAD4EPQQgADUETgQgAEEEQgQwBD0ENQRCBCwA IAA9BD4ELAAgAEcEQgQ+BDEEIAA4BDcEMQQ1BDYEMARCBEwEIAA/BDAEQAQwBDQEPgQ6BEEEMAQs ACAAPARLBCAAPgRCBDQENQQ7BDgEPAQgADoEMARCBDUEMwQ+BEAEOAROBCAAPgRCBCAAMgRBBDUE MwQ+BCwAIABHBDUEMwQ+BCAAPgQ9BDAEIAA6BDAEQQQwBDUEQgRBBE8ELAAgAEIEPgQzBD4ELAAg AEcEQgQ+BCAAHwQgBBgEIAA9BFEEPAQgAC0AIAAfBEAEOARABD4ENARLBC4AIAAQBCwAIAAyBD4E LQAyBEIEPgRABEsERQQsACAARQQ+BEIETAQgAEIEPgQ7BDoEQwQgAD4EQgQgADgERQQgAEAEMAQ3 BD0EOARGBEsEIAA4BCAAPAQwBDsEPgQsACAAPQQ+BCwAIAAzBDsEMAQyBD0EPgQ1BCwAIABHBEIE PgQgAB8EQAQ4BEAEPgQ0BDAEIAAdBBgEGgQeBBMEFAQQBCAAPQQ1BCAAOAQ0BDUEPQRCBDgERwQ9 BDAEIAAgBD4ENARDBCwAIABNBEIEPgQgAEMEQAQ1BDcEMAQ9BDgENQQgAEMEPQQ4BDoEMAQ7BEwE PQQ+BDkEIABBBEMEQgQ4BCAAIAQ+BDQEMAQgADQEPgQgAD0ENQQ6BD4EOQQgACIAQAQ1BDAEOwRM BD0EPgRBBEIEOAQiACAAOgQ7BDAEQQRBBDgERwQ1BEEEOgQ+BDkEIABEBDgEOwQ+BEEEPgREBDgE OAQsACAAMwQ0BDUEIAA+BD0EIAA8BDUEPQRPBDUEQgQgAD8EPgQ7BCwAIABBBEIEMAQ9BD4EMgQ4 BEIEQQRPBCAAHwQgBBgEQAQ+BDQEPgQ5BCwAIAA4BCAAMgQ8BDUEQQRCBD4EIAAXBB0EEAQdBBgE LwQgAD4EIAAgBD4ENAQ1BCAAOAQgAD4EIABCBD4EPAQsACAARwRCBD4EIAAfBCAEGAQgAD0EUQQ8 BCwAIAA8BEsEIAA4BDwENQQ1BDwEIAAdBBAEIwQaBCMEKAA+BCAAPwRABDgEQAQ+BDQENQQpACwA IABHBEIEPgQgAEIEPgQ2BDUEIAAyBDUENAQ1BEIEIAA6BCAAQwRABDUENwQwBD0EOAROBCAAQQQ8 BEsEQQQ7BDAELAAgAEMENAQwBDsENQQ9BDgETgQgAD4EQgQgADgEQQRCBDgEPQRLBCAAOAQgADQE NQQzBEAEMAQ0BDAERgQ4BDgEIAA/BD4EPQQ4BDwEMAQ9BDgETwQgACAEPgQ0BDAELgAgABgEIAAS BCsELAAgAEMEMgQwBDYEMAQ1BDwESwQ5BCAARwQ4BEIEMARCBDUEOwRMBCwAIAA9BDgERwQ1BDME PgQgADoEQAQ+BDwENQQgAD0EMARDBDoEOAQgADIEIAASBDAESAQ1BDkEIAA2BDgENwQ9BDgEIAA9 BDUEIAA4BDwENQQ1BEIENQQsACAAOgQ+BD0ENQRHBD0EPgQsACAANQRBBDsEOAQgABIESwQgAD0E NQQgAEAENQQ7BDgEMwQ4BD4ENwQ9BEsEOQQgAEQEMAQ9BDAEQgQ4BDoEIAA4BDsEOAQgAD8EPgRB BDIETwRJBFEEPQQ9BDAETwQgAE0EOwQ4BEIEMAQuACAAGAQgADQEMAQ2BDUEIAAyBCAATQRCBD4E PAQgAEEEOwRDBEcEMAQ1BCwAIAA9BDAEQwQ6BDAEIAAyBCAAMgQ4BDQENQQgADMEQwQ7BDAEIABC BDUERQQ9BD4EQQREBDUEQARLBCwAIABBBDoEPgRABDUENQQgADIEQQQ1BDMEPgQsACAANAQwBDIE PQQ+BCAAOAQgAD8EQAQ+BEcEPQQ+BCAAPwRABD4EPQQ4BDoEOwQwBCAAMgQgABIEMARIBCAAPAQ1 BD0EQgQwBDsEOARCBDUEQgQuAA0AIAAiBDAEOgQgABIEIAAnBBUEHAQgABYEFQQgABQEFQQbBB4E PwAgABQEOwRPBCAAQgQ1BEUELAAgADoEQgQ+BCAAMgQgAEIEMAQ9BDoENQQtACAAOgRDBDQEMAQg AD8EPgQ0BDUEMgQwBDsEOAQgACAEHgQUBD8APwA/ACAAIwQgABIEMARBBCAANQRBBEIETAQgAD4E QgQyBDUEQgQgAD0EMAQgAE0EQgQ+BEIEIAAyBD4EPwRABD4EQQQ/ACAAFAQ1BDsEPgQgAD0ENQQg ADIEIABCBD4EPAQsACAARwRCBD4EIAA1BDMEPgQgADcEMARBBEMEPQRDBDsEOAQgADIEIABEBDgE NwQ4BDoEQwQoAD0EMARDBDoEQwQgAD4EIAAfBEAEOARABD4ENAQ1BCkAIABBBD4EIAAyBEEENQQ8 BDgEIAA/BD4EQgRABD4ERQQwBDwEOAQtACAAMgQgAD0EMARDBDoEMARFBCAAOgQwBEIENQQzBD4E QAQ4BE8EIAAgBB4EFAQvAB8EQAQ4BEAEPgQ0BDAEIAAyBCAAPwRABE8EPAQ+BDwEIABBBDwESwRB BDsENQQgAEIEPgQ2BDUEIAA/BEAEMAQ6BEIEOARHBDUEQQQ6BDgEIAA9BDUEIAA4BEEEPwQ+BDsE TAQ3BEMENQRCBEEETwQuACAAHAQ+BDYENQRCBCAAMQRLBEIETAQsACAAEgRLBCAAMwRABDAENgQ0 BDAEPQQ4BD0EIAAQBDwENQRABDgEOgQ4BCwAIABDBCAAEgQwBEEEIAA9BDUEQgQgAEEENQQ8BEwE OAQsACAAMAQgAEAEPgQ2BDAEQgRMBCAAMgRLBCAAPQQ1BCAAQQQ+BDEEOARABDAENQRCBDUEQQRM BCwAIAA/BD4EQgQ+BDwEQwQgAEcEQgQ+BCAAQQRHBDgEQgQwBDUEQgQ1BCAAQQQyBD4ETgQgAEEE MgQ+BDEEPgQ0BEMEIAA+BEIEIAAiAEEEPwQ4BD0EPgQzBEAESwQ3BD4EMgQiACAAMgQwBDYEPQQ1 BDUEIAA6BDAEOgQ4BEUELQBCBD4EIABNBEQENQQ8BDUEQAQ9BEsERQQgACIARgQ1BDsENQQ5BCAA QAQwBDcEPAQ9BD4ENgQ1BD0EOARPBCIALAAgADgEIAAyBDAESAQgADsEOAQxBDUEQAQwBDsEOAQ3 BDwEIAA/BEAEPgRCBDgEMgQgACIAIgQQBBoEIAAdBBAEFwQrBBIEEAQVBBwEHgQZBCIAKAAhACEA IQApACAANwQ0BD4EQAQ+BDIEPgQ5BDoAIAA8BD0EPgQzBD4ENAQ1BEIEPQQ+BDkELAAgAEIEQAQw BDQEOARGBDgEPgQ9BD0EPgQ5BCAAQQQ1BDwETAQ4BCAAOAQgADwENQQ9BEIEMAQ7BDgEQgQ1BEIE MAQgAD0EMAQ7BDgERwQ4BE8EIAA4BCAAPgRCBDsEOARHBDgETwQgAD4ENAQ9BD4EMwQ+BCAAQAQ+ BDQEMAQgAD4EQgQgADQEQARDBDMEPgQzBD4ELAAgAEAEPgQ0BEEEQgQyBDAEIAA4BCAANwQwBEkE OARCBEsEIAA/BEAEMAQyBCAAQQQ1BDwETAQ4BCAAOAQgAEAEPgQ0BDAELAAgADAEIAAgBD4ENAQg ADwEPgQ2BDUEQgQ1BCAAMgRBBEIEQAQ1BEIEOARCBEwEIAA6BEAEPgQ8BDUEIABHBEIEPgQgADIE IABBBD8ENQRGBDgEMAQ7BEwEPQQ+BDkEIAA7BDgEQgQ1BEAEMARCBEMEQAQ1BCAAPwQ+BCAAMQQ4 BD4EOwQ+BDMEOAQ4BCAAOAQgAEIEPgQgAEIEMAQ8BCAAPQQ1BCAATwRBBD0EPgQsACAAPgQ9BCAA IAQ+BDQEIAA4BDsEOAQgABIEOAQ0BD8AIAASBCAAPQQwBEgENQQ8BCAATwQ3BEsEOgQ1BCAAPAQ9 BD4EMwQ+BCAAQQQ7BD4EMgQgAD4ENAQ9BD4EOgQ+BEAENQQ9BD0ESwRFBCAAQQQgACAEPgQ0BD4E PAQsACAAPQQ+BCAAPwRABDgEIABNBEIEPgQ8BCAANQQzBD4EIABBBDAEPAQ+BDMEPgQsACAAOgQw BDoEIAAzBDsEMAQyBD0EPgQ5BCAAOgQ+BD0ERgQ1BD8ERgQ4BDgELAAgADIEIABDBD8EPgRCBEAE NQQxBDsENQQ9BDgEOAQgAD8EQAQwBDoEQgQ4BEcENQRBBDoEOAQgAD0ENQRCBC4AIAASBCAAPQQw BEgENQQ5BCAANgQ4BDcEPQQ4BCAAIAQ+BDQEIAA9BDAENARRBDYEPQQ+BCAAQwRBBEIEQAQwBD0E TwQ1BEIEQQRPBCAAOAQ3BCAANgQ4BDcEPQQ4BCAAPgQxBEkENQRBBEIEMgQwBCwAIABDBD0EOARH BEIEPgQ2BDAENQRCBEEETwQgAD0EMAQgADMENQQ9BDUEQgQ4BEcENQRBBDoEPgQ8BCwAIAA/BD4E NARBBD4ENwQ9BDAEQgQ1BDsETAQ9BD4EPAQgADgEIAA/BEAEPgRHBDgERQQgAEMEQAQ+BDIEPQRP BEUEIAA9BDAESAQ1BDMEPgQgADEESwRCBDgETwQgADIEPAQ1BEEEQgQ1BCAAQQQgAEQEOAQ3BDgE RwQ1BEEEOgQ4BDwEOAQgADwEQwRHBDUEPQQ4BE8EPAQ4BCAAOAQgAEMEMQQ4BDkEQQRCBDIEMAQ8 BDgEIAA9BDAESAQ4BEUEIABABD4ENAQ9BEsERQQsACAAQQQ1BDwENQQ5BCwAIAA0BEAEQwQ3BDUE OQQgADgEIAAyBEEENQQzBD4EIABABD4ENAQ9BD4EMwQ+BCAAPQQwBEAEPgQ0BDAELgAgACEEQgQ1 BD8ENQQ9BEwEIAA4BDcEPAQ1BD0ENQQ9BDgETwQgAD8EPgQ6BDAEIAA9BDUEIABCBDAEOgQwBE8E LAAgADoEMAQ6BCAAMgQgABAEPAQ1BEAEOAQ6BDUEIAA4BCAANwQwBD8EMAQ0BD0ESwRFBCAAQQRC BEAEMAQ9BDAERQQsACAAPQQ+BCAAPQQwBDQEUQQ2BD0ESwQ1BCAAQQQ/BD4EQQQ+BDEESwQgADgE NwQ+BDEEQAQ1BEIENQQ9BEsEIAA4BCAAPwRABD4EMgQ1BEAENQQ9BEsEIAA9BDAEIAAwBDwENQRA BDgEOgQwBD0ERgQwBEUELAAgADAEIABCBD4ELAAgAEcEQgQ+BCAAPwRABD4ESAQ7BDAEIAAQBDwE NQRABDgEOgQwBCwAIAA4BCAAMAQ/BEAEPgQxBDgEQAQ+BDIEMAQ9BD4ELAAgADoEPgQ9BDUERwQ9 BD4ELAAgAD8EOwQwBD0EOARABEMENQRCBEEETwQgADgEIAA0BDsETwQgACAEQwRBBDgELQAcBDAE QgRDBEgEOgQ4BC4AIAATBD0ENQRCBEMESQQwBE8EIAA/BEAEPgQ/BDAEMwQwBD0ENAQwBCAAQQQ1 BDoEQQQwBCgAQgQ+BEcEPQQ1BDUELAAgADEEOwRPBDQEQQRCBDIEMAQpACAAQQQgADAEPAQ1BEAE OAQ6BDAEPQRBBDoEOAQ8BCAAOwQ4BEYEPgQ8BCAAMwRABD4EPAQ6BD4EIAA+BDEEIABNBEIEPgQ8 BCAAMwQ+BDIEPgRABDgEQgQuAA0AIAAdBD4EIAAgBD4ENAQgAD0EMARIBCAAMgQ1BDsEOAQ6BCAA OAQgADwEPgQzBEMERwQgADgELAAgAEIEMAQ6BCAAOgQwBDoEIAA+BD0EIAAyBDUENwQ0BDUELAAg ABIESwQgADsENQQzBDoEPgQgAD0EMAQ5BDQENQRCBDUEIABBBDIENQRCBCAAMgQgADoEPgQ9BEYE NQQgAEIEPgQ9BD0ENQQ7BE8EIAA4BCAAPwQ+BD0EOAQ8BDAEPQQ4BDUELAAgADUEQQQ7BDgEIAA3 BDAERQQ+BEIEOARCBDUELgAgACIEMAQ6BCAARwRCBD4ELAAgADQEMAQ2BDUEIAA1BEEEOwQ4BCAA EgRLBCAAPQQ1BCAAQwQ7BD4EMgQ4BDsEOAQgAEEEQwRCBEwEIAA9BDUEQQQ6BD4EOwRMBDoEPgQg AEEEQwQ8BDEEQwRABD0EPgQzBD4EIAA/BEAEOAQyBDUEQgRBBEIEMgQ4BE8ELAAgAD0ENQQgAEAE MARBBEEEQgRABDAEOAQyBDAEOQRCBDUEQQRMBCwAIAAyBEEEUQQgAD8EPgQ0BEAEPgQxBD0EPgQg ADgEIAA/BD4EPQRPBEIEPQQ+BCAAPgQ/BDgEQQQwBD0EPgQgADQEMAQ7BEwESAQ1BDoAIABHBEIE PgQgADYENQQgAEIEMAQ6BD4ENQQgACAEPgQ0BCwAIAA6BDAEOgQgAD4EPQQgAE8EMgQ7BE8ENQRC BCAAPQQwBDwEIABBBDUEMQRPBCAAMgQgADIEOAQ0BDUEIABEBEMEPQQ0BDAEPAQ1BD0EQgQwBDsE TAQ9BD4EOQQgAEQEOAQ7BD4EQQQ+BEQEQQQ6BD4EOQQgADoEMARCBDUEMwQ+BEAEOAQ4BCAAOAQg ADoEMAQ6BCAAPgRCBEAEMAQ2BDAENQRCBEEETwQgADIEIABABDUEMAQ7BEwEPQQ+BEEEQgQ4BCAA OAQgADgEQQRCBD4EQAQ4BEcENQRBBDoEPgQ5BCAAOgQwBEAEQgQ4BD0ENQQsACAAOgRCBD4EIAA4 BCAAOgQwBDoEIABBBCAAPQQ4BDwEIAAxBD4EQAQ1BEIEQQRPBCAAOAQgAD4EMQQ8BDAEPQQ+BDwE IABBBDoEQARLBDIEMAQ1BEIEIAA+BEIEIAAyBEEENQRFBC4AIAAiBDAEOgQ2BDUEIAAyBEsEIAA9 BDAEOQQ0BFEEQgQ1BCAAPgRCBDIENQRCBEsEIAA9BDAEIABHBDAEQQRCBD0ESwQ1BCAAMgQ+BD8E QAQ+BEEESwQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAAMgQ+BD8EQAQ+BEEESwQgAEMEPwQ+ BDwETwQ9BEMEQgQ+BDMEPgQgADMENQQ9BD4ERgQ4BDQEMAQsACAAQQQyBE8ENwQwBD0EPQQ+BDkE IABBBCAATQRCBDgEPAQgADQENQQzBEAEMAQ0BDAERgQ4BDgELAAgAEEEPAQ1BEAEQgQ4BCAAPgQx BEkENQRBBEIEMgQwBC4ALgAuACAAGAQgADwEPQQ+BDMEPgQ1BCAANARABEMEMwQ+BDUELgANACAA FQRBBDsEOAQgABIESwQgAD0ENQQgACIAPQQwBCAAQgRLBCIAIABBBCAARAQ4BDsEPgRBBD4ERAQ4 BDUEOQQgADgEIAA9BDAEQwQ6BDAEPAQ4BCwAIAASBEsEIAA8BD4ENgQ1BEIENQQgAD8EQAQ+BD8E QwRBBEIEOARCBEwEIAAiAEkAYQApACAAFwQ9BDAEPQQ4BDUELAAgADgEQQRCBDgEPQQwBCAAOAQg AEQEQAQwBDoEQgQwBDsESwQuACIALAAgAEIEMAQ6BCAAOgQwBDoEIABCBDAEPAQgAD4EPwQ4BEEE SwQyBDAENQRCBEEETwQgAEEEOwQ+BDYEPQRLBDkEIAA/BEMEQgRMBCAAPARLBEEEOwQ4BCwAIAA/ BEAEOAQyBD4ENARPBEkEOAQ5BCAAOgQgAD4EQAQ4BDMEOAQ9BDAEOwRMBD0EPgQ8BEMEIABABDAE NwRABDUESAQ1BD0EOAROBCAARAQ4BDsEPgRBBD4ERARBBDoEPgQ5BCAANwQwBDQEMARHBDgEIAA/ BD4EOARBBDoEMAQgADgEQQRCBDgEPQRLBCwAIAA4BCAAPwQ1BEAENQQ5BEIEOAQgADoEIAAgACIA SQAxBCkAIgAuAA0ADQANAA0AKgANACoAKgAqAA0AFAQ+BDMEPgQyBD4EQAQgACgAQwRBBDsEPgQy BDgETwQgAEAEMARBBD8EQAQ+BEEEQgRABDAEPQQ1BD0EOARPBCAAPAQwBEIENQRABDgEMAQ7BD4E MgQpADoADQANAB4EQAQ4BDMEOAQ9BDAEOwRMBD0ESwQ5BCAAQgQ1BDoEQQRCBCAAPgQ/BEMEMQQ7 BDgEOgQ+BDIEMAQ9BCAAMgQgADMEQARDBD8EPwQ1BCAAdgBrAC4AYwBvAG0AIAAiACAEPgQ0BC4A IARDBEEETAQuACEEMgQ+BDEEPgQ0BDAELgAiACAAMgA5ACAAMAQ/BEAENQQ7BE8EIAAyADAAMQA1 ACAAMwQ+BDQEMAQuAA0AEgRLBCAAPgQxBE8ENwRDBDUEQgQ1BEEETAQgAEAEMARBBD8EQAQ+BEEE QgRABDAEPQRPBEIETAQgADQEMAQ9BD0ESwQ1BCAAPAQwBEIENQRABDgEMAQ7BEsELAAgAD0ENQQg ADIEPQQ+BEEETwQgAD0EOAQ6BDAEOgQ4BEUEIAA4BDcEPAQ1BD0ENQQ9BDgEOQQgADgEOwQ4BCAA QQQ+BDMEOwQwBEEEPgQyBDAEMgQgADgERQQgAEEEIAA9BDAEPAQ4BC4ADQAQBDIEQgQ+BEAEQQRC BDIEPgQgAD8EQAQ4BD0EMAQ0BDsENQQ2BDgEQgQgAD0EMARIBDUEOQQgADMEQARDBD8EPwQ1BCAA OAQgABIESwQgAD4EMQRPBDcEQwQ1BEIENQRBBEwEIABDBDoEMAQ3BEsEMgQwBEIETAQgAD0EMARB BCAAOgQwBDoEIAAwBDIEQgQ+BEAEMAQgAD8EQAQ4BCAAQAQwBEEEPwRABD4EQQRCBEAEMAQ9BDUE PQQ4BDgEIABBBEIEMARCBEwEOAQgADgEOwQ4BCAANQRRBCAATQQ7BDUEPAQ1BD0EQgQ+BDIELgAN AA0ADQAqACAAKgAgACoAIAAqACAAKgAgACoAIAAqAA0ADQBJACAAIAAgACQEMAQ6BEIESwQsACAA PAQ4BEQESwQgADgEIAAzBDsEPgQxBDAEOwRMBD0EPgQ1BCAAOARBBEIEPgRABDgERwQ1BEEEOgQ+ BDUEIABABEMEQQQ7BD4EDQANACAAIAAgACAAIAAgACAASQBhACkAIAAXBD0EMAQ9BDgENQQsACAA OARBBEIEOAQ9BDAEIAA4BCAARARABDAEOgRCBDAEOwRLBA0AIAASBCAAPQQwBEgENQQgADEENQQ3 BEMEQQQ7BD4EMgQ9BD4EIAA9BDUEOwQ1BDMEOgQ+BDUEIAAyBEAENQQ8BE8EIAAiADMEOwQ+BDEE MAQ7BEwEPQRLBEUEIABCBEAEMAQ9BEEERAQ+BEAEPAQwBEYEOAQ5BCIAIAA4BCAAIgAzADkEIAA8 BDgEQAQ+BDIEPgQ5BCAAMgQ+BDkEPQRLBCIAIAA8BD0EPgQ2BDUEQQRCBDIEPgQgADsETgQ0BDUE OQQgAEAEMAQ3BDsEOARHBD0ESwRFBCAAQQQ7BD4ENQQyBCAAPgQxBEkENQRBBEIEMgQwBCAANwQw BDQEMAROBEIEQQRPBCAAPAQwBEEEQQQ+BDkEIAAyBD4EPwRABD4EQQQ+BDIELQAgACIARwRCBD4E IAA/BEAEPgQ4BEEERQQ+BDQEOARCBD8AIgAsACIARwRCBD4EIAA0BDUEOwQwBEIETAQ/ACIALAAi ADoEQgQ+BCAAMgQ4BD0EPgQyBDAEQgQ/ACIALAAuAC4ALgAuAC4ALgAuACAAEgQgAD4EMQRJBDUE PAQtACAAPQQwBEUEPgQ0BE8EQgRBBE8EIAAyBCAAPwQ+BDgEQQQ6BDUEIAA3BD0EMAQ9BDgEOQQg ADgEIAA4BEEEQgQ4BD0ELAAgAD0EMAQgADoEPgRCBD4EQARLBDUEIAA8BD4ENgQ9BD4EIAAxBEsE OwQ+BCAAMQRLBCAAPgQ/BDUEQAQ1BEIETARBBE8ELAAgAD0ENQQgAD8EPgRCBDUEQARPBEIETAQg AEEENQQxBE8EIAA4BCAAQQQyBD4EOARFBCAAMQQ7BDgENwQ6BDgERQQgADIEIABFBDAEPgRBBDUE IAA4BCAAMAQ9BDAEQARFBDgEOAQgADEEQwQ0BEMESQQ1BDMEPgQuACAAEgQgAD8EPgQ4BEEEOgQ1 BCAAPAQ4BEQEOARHBDUEQQQ6BD4EMwQ+BCAAEAQ7BDAEQgRLBEAETwQtACAAOgQwBDwEPQRPBC0A EQQ+BDMEMAQsACAANwQwBCAAOgQ+BEIEPgRABEsEOQQgADwEPgQ2BD0EPgQgADEESwQ7BD4EIAAx BEsEIABDBEYENQQ/BDgEQgRMBEEETwQgADgEIAA9BDUEIAAxBEsEQgRMBCAAQQQ8BEsEQgRLBDwE LAAgAEEENARDBEIESwQ8BCAAQwRABDAEMwQwBD0EPgQ8BCAAQQQyBDUEQARFBEEEOAQ7BC4AIAAf BD4EQQRCBDAEMgQ4BDwEIABCBD4EQgQgADYENQQgADIEPgQ/BEAEPgRBBDoAIAAzBDQENQQgADYE NQQgADwEPgQ2BD0EPgQgAD0EMAQ5BEIEOAQgADgEQQRCBDgEPQRDBC0AIAAxBDUEQQRBBDwENQRA BEIEPQQ+BDUEIAA4BCAAMAQxBEEEPgQ7BE4EQgQ9BD4ENQQgADcEPQQwBD0EOAQ1BCwAIAA6BD4E QgQ+BEAEPgQ1BCAAPQQ1BCAANAQwBEEEQgQgAEMEPAQ1BEAENQRCBEwEIAA4BCAAQQRCBDAEQgRM BCAAQAQwBDEEMAQ8BDgELAAgAEMEOgQwBDYENQRCBCAAPwRDBEIETAQgAD4EQQQyBD4EMQQ+BDYE NAQ1BD0EOARPBCAAOAQgAD8EQAQ+BEYEMgQ1BEIEMAQ9BDgETwQ/ACAAFAQ7BE8EIABNBEIEPgQz BD4EIABABDAEQQRBBDwEPgRCBEAEOAQ8BCwAIAA6BDAEOgRDBE4EIAA4BD0ERAQ+BEAEPAQwBEYE OAROBCAANAQwBE4EQgQgADoEOwQwBEEEQQQ4BEcENQRBBDoEOAQ1BCAAPgQxBDsEMARBBEIEOAQg ADcEPQQwBD0EOAQ5BC4AIAASBCAAOgQwBDoEOARFBCAANgQ1BCAAOAQ3BCAAPQQ4BEUEIAA1BEEE QgRMBCAAMAQxBEEEPgQ7BE4EQgQ9BEsENQQgAD0ENQQ/BD4EOgQ+BDsENQQxBDgEPARLBDUEIAA4 BEEEQgQ4BD0ESwQ/ACAAEgQ+BDcEPAQ+BDYEPQQ+BCwAIAAyBCAAQAQ1BDsEOAQzBDgEOAQsACAA PQQ+BCAAQAQ1BDsEOAQzBDgEOQQgADwEPQQ+BDMEPgQgADgEIAAzBD4EMgQ+BEAEOARCBEwEIAA+ BCAAOgQwBDoEPgQ8BC0AQgQ+BCAANQQ0BDgEPQRBBEIEMgQ1BCAAOAQgADAEMQRBBD4EOwROBEIE PQQ+BEEEQgQ4BCAAPQQ1BEIEIABBBDwESwRBBDsEMAQoAEUEPgRCBE8EIAA9BDAEIAA4BEEEQgQ4 BD0EQwQgAD4EPQQ4BCAAMgRBBDUEIAA/BEAENQRCBDUEPQQ0BEMETgRCBCkALAAgADcEMAQgADgE QQQ6BDsETgRHBDUEPQQ4BDUEPAQgAD0ENQQ6BD4EQgQ+BEAESwRFBCAAPgQxBEkEOARFBCAAPwRA BDUENARBBEIEMAQyBDsENQQ9BDgEOQQsACAAPgQgADoEPgRCBD4EQARLBEUEIAA9BDgENgQ1BC4A IAAhBCAAQgQ+BEcEOgQ4BCAANwRABDUEPQQ4BE8EIABEBDgENwQ4BDoEOAQtACAAQgQ+BEcEPQRL BEUEIAA3BD0EMAQ9BDgEOQQgAD0ENQQgADEESwQyBDAENQRCBCwAIABCBDAEOgQgADoEMAQ6BCAA PgRBBD0EPgQyBDAEIAA7BE4EMQRLBEUEIAA3BDAEOgQ+BD0EPgQyBCAAOAQgADIESwQyBD4ENAQ+ BDIEIABNBEIEPgQgAE0EOgRBBD8ENQRABDgEPAQ1BD0EQgQsACAAOgQ+BEIEPgRABEsEOQQgAD0E OAQ6BD4EMwQ0BDAEIAA9BDUEIAAxBEsEMgQwBDUEQgQgADAEMQRBBD4EOwROBEIEPQQ+BCAAQgQ+ BEcEPQRLBDwEKAAyBEEENQQzBDQEMAQgADUEQQRCBEwEIAA/BD4EMwRABDUESAQ9BD4EQQRCBEwE IAA4BDcEPAQ1BEAENQQ9BDgEOQQsACAAMQQ+BDsETARIBDAETwQgADgEOwQ4BCAAPAQwBDsEMARP BCkALgAgAC0EQgQ+BCAANAQwBDYENQQgAD0ENQQgADMEPgQyBD4EQARPBCAAPgQgAD8EQAQ4BD0E RgQ4BD8EOAQwBDsETAQ9BD4EOQQgAD4EMwRABDAEPQQ4BEcENQQ9BD0EPgRBBEIEOAQgADsETgQx BEsERQQgAEQEOAQ3BDgERwQ1BEEEOgQ4BEUEIAA8BD4ENAQ1BDsENQQ5BC4AIAAUBDAENgQ1BCAA PwQ+BD8EQwQ7BE8EQAQ9BDAETwQgADIEIAA9BDAESAQ1BCAAMgRABDUEPARPBCAARwQwBEEEQgQ4 BEYEMAQsACAAMQQ+BDcEPgQ9BCAAJQQ4BDMEMwRBBDAELAAgAEEEQwRJBDUEQQRCBDIEPgQyBDAE PQQ4BDUEIAA6BD4EQgQ+BEAEPgQ5BCAAPwQ+BDQEQgQyBDUEQAQ0BDgEOwQ+BCAAOARBBEIEOAQ9 BD0EPgRBBEIETAQgAEEEQgQwBD0ENAQwBEAEQgQ9BD4EOQQgAEIENQQ+BEAEOAQ4BCgARgQ1BD0E PQQ+BEEEQgRMBCAAOgQ+BEIEPgRABD4EOQQgADIEIABEBDgENwQ4BDoENQQgAEcEMARBBEIEOARG BCAAQQQ7BD4ENgQ9BD4EIAA/BDUEQAQ1BD4ERgQ1BD0EOARCBEwEKQAgADEESwQ7BDAEIAA+BDEE PQQwBEAEQwQ2BDUEPQQwBCAAMgQgADIAMAAxADIAIAAzBD4ENARDBCAAOgQ+BEEEMgQ1BD0EPQQ+ BCAARwQ1BEAENQQ3BCAAIgA7BDUENgQwBEkEOAQ1BCAAQARPBDQEPgQ8BCIAIAA8BD0EPgQ2BDUE QQRCBDIENQQ9BD0ESwQ1BCAAQQQ+BDEESwRCBDgETwQsACAAPQQwBCAAPgRBBD0EPgQyBDUEIAA6 BD4EQgQ+BEAESwRFBCAAQQQgADIESwRBBD4EOgQ+BDkEIAAyBDUEQAQ+BE8EQgQ9BD4EQQRCBEwE TgQoAD0EPgQsACAAPQQ1BCAAQAQwBDIEPQQ+BDkEIAAxACEAKQAsACAAPAQ+BDYEPQQ+BCAAQwRC BDIENQRABDYENAQwBEIETAQgAD4EIABCBD4EPAQsACAARwRCBD4EIAA/BEAENQQ0BD8EPgQ7BD4E NgQ1BD0EOAQ1BCAAJQQ4BDMEMwRBBDAEIAAyBDUEQAQ9BD4ENQQuACAAGAQgAE0EQgQ+BCAAQQQy BD4EOQRBBEIEMgQ+BCAARAQ4BDcEOAQ6BDgEIAA/BEAEOAQ9BEYEOAQ/BDgEMAQ7BEwEPQQ+BDUE IQAgAB4EPQQ+BCAAPQQ1BCAANwQwBDIEOARBBDgEQgQgAD4EQgQgADgENwQ8BDUEQAQ4BEIENQQ7 BEwEPQRLBEUEIAA/BEAEOAQxBD4EQAQ+BDIEIAA4BDsEOAQgADwENQRCBD4ENAQ+BDIEIAA4BDcE PAQ1BEAENQQ9BDgETwQgADgEOwQ4BCAAOAQ9BEIENQQzBEAEMARGBDgEOAQgADQEMAQ9BD0ESwRF BC4AIAAiBD4EIAA1BEEEQgRMBCAARAQ4BDcEOAQ6BDAEKAA0BDAENgQ1BCAAMQQwBDcEPgQyBDAE TwQsACAAQgQ1BD4EQAQ1BEIEOARHBDUEQQQ6BDAETwQpACAAPQQ1BCAANAQwBFEEQgQgADAEMQRB BD4EOwROBEIEPQQ+BDMEPgQgADcEPQQwBD0EOARPBCAAPgQgAD8EQAQ4BEAEPgQ0BDUELgAgABwE PgQ2BDUEQgQgADEESwRCBEwELAAgAEIEPgQzBDQEMAQgAD0EQwQ2BD0EPgQgADgEQQQ6BDAEQgRM BCAAOgQ+BD0ENQRHBD0EQwROBCAAOARBBEIEOAQ9BEMEIAAyBCAAPAQwBEIENQQ8BDAEQgQ4BDoE NQQ/ACAAEgQ1BDQETAQgAE0EQgQ+BCAAIgBPBDcESwQ6BCAAMgRBBDUERQQgAD0EMARDBDoEIgAg ADgELAAgADoEMAQ3BDAEOwQ+BEEETAQgADEESwQsACAAOARBBEIEOAQ9BDAEIAA8BD4EMwQ7BDAE IAAxBEsEQgRMBCAAQQREBD4EQAQ8BEMEOwQ4BEAEPgQyBDAEPQQwBCAAPQQwBCAATQRCBD4EPAQg AEEEMAQ8BD4EPAQgAE8ENwRLBDoENQQtACAAIgBDBD0EOAQyBDUEQARBBDAEOwRMBD0EPgQ8BCIA IAA3BD0EMAQ9BDgEOAQgADIEQQQ1BDsENQQ9BD0EPgQ5BD8AIAAUBDUEOQRBBEIEMgQ4BEIENQQ7 BEwEPQQ+BCwAIAA8BDAEQgQ1BDwEMARCBDgEOgQwBCAAMgRLBDQEMAQ1BEIEIABCBD4ERwQ9BEsE NQQgAEAENQRIBDUEPQQ4BE8EIABBBDIEPgQ4BEUEIAA3BDAENAQwBEcELgAgAB0EPgQgADUEQQRC BEwEIAAxBD4EOwRMBEgEMARPBCAAPwRABD4EMQQ7BDUEPAQwBC0AIAAyBEEENQQgADcEMAQ0BDAE RwQ4BCAAPAQwBEIENQQ8BDAEQgQ4BDoEOAQoADoEMAQ6BCAAOAQgAEQEOAQ3BDgEOgQ4BCkAIAA/ BD4ENARABDAENwRDBDwENQQyBDAETgRCBCAAPgQzBEAEMAQ9BDgERwQ1BD0EOAQ1BC0AIABABDAE PAQ6BDAEPAQ4BC8APAQ9BD4ENgQ1BEEEQgQyBDAEPAQ4BCAAPgQ/BEAENQQ0BDUEOwQ1BD0EPQQ+ BDkEIAA8BDAEQgQ1BDwEMARCBDgERwQ1BEEEOgQ+BDkEIABCBDUEPgRABDgEOAQuACAAFQRBBDsE OAQgADYENQQgAE0EQgQ4BCAAQAQwBDwEOgQ4BCAAPwRABDUEPgQ0BD4EOwQ1BDIEMAROBEIEQQRP BCwAIABCBD4EIAA/BDUEQAQ1BDQEIAA8BDAEQgQ1BDwEMARCBDgEOgQwBDwEOAQgADIEQQRCBDAE NQRCBCAAMQQ+BDsENQQ1BCAAPAQ+BEkEPQQwBE8EIAAzBEAEMAQ9BEwELQAgAD8EMARABDAENAQ+ BDoEQQQoACAEMARBBEEENQQ7BDAEIAA4BCAAQQQ7BDUENARBBEIEMgQ4BE8EKQAuACAALQRCBDAE IAAzBEAEMAQ9BEwEIABABDAEQQQ/BEAEPgRBBEIEQAQwBD0ETwQ1BEIEQQRPBCAAPwQ+BCAAMgRB BDUEOQQgADwEMARCBDUEPAQwBEIEOAQ6BDUEIAA4BCAAPwQ1BEAENQRHBDUEQAQ6BDgEMgQwBDUE QgQgAD0EMAQ0BDUENgQ0BEsEIAA8BDAEQgQ1BDwEMARCBDgEOgQ+BDIEIABYAFgALQAzBD4EIAAy BDUEOgQwBCAAMAQ6BEEEOAQ+BDwEMARCBDgENwQ4BEAEPgQyBDAEQgRMBCAAPAQwBEIENQQ8BDAE QgQ4BDoEQwQsACAAMgRLBDsEOAQyBEgEOARBBEwEIAAyBCAAQgQ1BD4EQAQ1BDwEQwQgABMEUQQ0 BDUEOwRPBC4AIAAtBEIEMAQgAEIENQQ+BEAENQQ8BDAEIABDBEIEMgQ1BEAENgQ0BDAENQRCBCwA IABHBEIEPgQgAD0ENQRCBCAAQQQ4BEEEQgQ1BDwESwQgADAEOgRBBDgEPgQ8BCwAIAA9BDAEIAA+ BEEEPQQ+BDIENQQgADoEPgRCBD4EQAQ+BDkEIAA8BD4ENgQ9BD4EIAAxBEsEOwQ+BCAAMQRLBCAA PwQ+BDsEQwRHBDAEQgRMBCAAMAQxBEEEPgQ7BE4EQgQ9BD4EIABCBD4ERwQ9BD4ENQQgADcEPQQw BD0EOAQ1BCAAPgQgADIEQQQ1BEUEKAAyBCAAQAQwBDwEOgQwBEUEIAA4BDsEOAQgADEENQQ3BCkA IAA8BDAEQgQ1BDwEMARCBDgERwQ1BEEEOgQ4BEUEIABEBDAEOgRCBDAERQQuACAAGwROBDEEMARP BCAAQQQ4BEEEQgQ1BDwEMAQgAD8EPgQgAEIENQQ+BEAENQQ8BDUEIAA+BDoEMAQ3BEsEMgQwBDUE QgRBBE8EIAA4BDsEOAQgAD0ENQQ0BD4EQQRCBDAEQgQ+BEcEPQQ+BDkEIAA4BDsEOAQgADIEPgQ+ BDEESQQ1BCAAPwRABD4EQgQ4BDIEPgRABDUERwQ4BDIEPgQ5BC4AIAAUBDAENgQ1BCAAPAQwBEIE NQQ8BDAEQgQ4BDoEMAQgAEEEPgQgAEEEMgQ+BDgEPAQ4BCAAIgAyBDgEQARCBEMEMAQ7BEwEPQRL BDwEOAQiACAAPgQzBEAEMAQ9BDgERwQ1BD0EPQRLBDwEOAQgADwEOARABDAEPAQ4BCAAPQQ1BCAA NQRBBEIETAQgACIAOARBBEIEOAQ9BDAEIAAyBCAAPwQ+BEEEOwQ1BDQEPQQ1BDkEIAA4BD0EQQRC BDAEPQRGBDgEOAQiACwAIABCBDAEOgQgADoEMAQ6BCAAPwQ+BEAEPgRHBD0EMAQgADgELAAgADoE MAQ6BCAAOAQgADIEIABBBDsEQwRHBDAENQQgAEEEIABEBDgENwQ4BDoEPgQ5BCwAIAA/BD4EQAQ+ BEcEPQQ+BEEEQgRMBCAAHwQgBBgEHQQmBBgEHwQYBBAEGwQsBB0EEAQhACAAJAQ4BDsEPgRBBD4E RAQ4BE8EKAA6BD4EQgQ+BEAEMARPBCAANwQwBD0EOAQ8BDAENQRCBCAAPwRABD4EPAQ1BDYEQwRC BD4ERwQ9BEMETgQgAD8EPgQ3BDgERgQ4BE4EIAA8BDUENgQ0BEMEIAAiAEIEPgRHBD0ESwQ8BDgE IgAgAD0EMARDBDoEMAQ8BDgEIAA4BCAAQAQ1BDsEOAQzBDgETwQ8BDgEKQAgAEIEMAQ6BDYENQQg AD4EQgRPBDMEPgRJBDUEPQQwBCAAPQQ1BD4EPwRABDUENAQ1BDsENQQ9BD0EPgRBBEIETwQ8BDgE IAA4BCAAPAQ9BD4ENgQ1BEEEQgQyBDUEPQQ9BD4EQQRCBE8EPAQ4BCAAQgRABDAEOgRCBD4EMgQ+ BDoEIAA4BCAAPwQ+BD0EOAQ8BDAEPQQ4BDkEIAA4BCAAOAQ8BDUENQRCBCAAPwQ+BEAEPgQ6BDgE LAAgAEEERQQ+BDYEOAQ1BCAAQQQgAD8EPgRABD4EOgQwBDwEOAQgAEIENQRFBCAAPgQxBDsEMARB BEIENQQ5BCwAIABABE8ENAQ+BDwEIABBBCAAOgQ+BEIEPgRABEsEPAQ4BCAAPgQ9BDAEIAA9BDAE RQQ+BDQEOARCBEEETwQtACAAOgQ7BDAEQQRBBDgERwQ1BEEEOgQ+BDUEIAA/BD4EPQRPBEIEOAQ1 BCAAOARBBEIEOAQ9BEsEIAAyBCAAPQQ1BDkEIAA+BEcENQQ9BEwEIAA9BDUEPgQ/BEAENQQ0BDUE OwRRBD0EPQQ+BCwAIAAwBCAAQQQwBDwEMAQgADgEQQRCBDgEPQQwBCAAMgQgAD8EQAQ+BEYENQRB BEEENQQgAD8EPgQ3BD0EMAQ9BDgETwQgADQEPgRBBEIEOAQzBDAENQRCBEEETwQgAEIEPgQ7BEwE OgQ+BCAAQQRDBDEESgQ1BDoEQgQ4BDIEPQQ+BC4ADQAgAB0EMAQgAD4EQQQ9BD4EMgQwBD0EOAQ4 BCAAMgRBBDUEMwQ+BCAATQRCBD4EMwQ+BCAAPAQ+BDYEPQQ+BCAAMQRLBDsEPgQgADEESwQgAD4E PwRDBEEEQgQ4BEIETAQgAEAEQwQ6BDgEIAA4BCAAIgA+BEIENAQwBEIETARBBE8EIgAgAD0EMAQg ADIEPgQ7BE4EIABFBDAEPgRBBDAELAAgAD0ENQQgADQEMAROBEkENQQzBD4EIAAyBD4ENwQ8BD4E NgQ9BD4EQQRCBDgEIABHBDUEOwQ+BDIENQQ6BEMEIAA/BD4EPQRPBEIETAQgADgEIABDBDIENQRA BDUEPQQ9BD4EIAA0BDIEOAQzBDAEQgRMBEEETwQgADIEIAA9BDAEPwRABDAEMgQ7BDUEPQQ4BDgE IABBBDIEPgQ1BDMEPgQgAEEERwQwBEEEQgRMBE8ELgAgAB0EPgQgAD0EMAQ0BDUENgQ0BEMEIAA0 BDAENQRCBCAAQgQ1BD4EQAQ4BE8EIABEBEAEMAQ6BEIEMAQ7BD4EMgQuACAAGAQ3BD0EMARHBDAE OwRMBD0EPgQsACAATQRCBD4EIABEBDgENwQ4BEcENQRBBDoEMARPBCAAQgQ1BD4EQAQ4BE8ELAAg AD4EQQQ9BD4EMgQwBD0EPQQwBE8EIAARBDUEPQRDBDAEIAAcBDAEPQQ0BDUEOwRMBDEEQAQ+BEIE PgQ8BCAAPwRABDgEPAQ1BEAEPQQ+BCAAPwQ+BDsEIAAyBDUEOgQwBCAAPQQwBDcEMAQ0BCwAIABP BDIEOwRPBDUEQgRBBE8EIAA9BDAEQQRCBD4EOwRMBDoEPgQgAD0ENQRCBDgEPwQ4BEcEPQQ+BDkE IAA4BCAAPQQwBEEEQgQ+BDsETAQ6BD4EIAA0BDAEOwQ1BDoEPgQgAD4EQgRBBEIEPgQ4BEIEIAA+ BEIEIAA6BDsEMARBBEEEOARHBDUEQQQ6BDgERQQgADIEPgQ3BDcEQAQ1BD0EOAQ5BCwAIABHBEIE PgQgADQEPgQgAEEEOARFBCAAPwQ+BEAEIAA9BDUENAQ+BEAEMAQ3BDIEOARCBDAEIAA4BCAANgQ0 BDUEQgQgAEEEMgQ+BDgERQQgACIAJQQ4BDMEMwRBBD4EMgQiAC4AIAAeBDQEPQQwBDoEPgQsACAA PQQ1BEEEPAQ+BEIEQARPBCAAPQQwBCAAPQQ1BEAEMAQ3BDIEOARCBD4EQQRCBEwELAAgAD4EPQQw BCAAPgQxBDsEMAQ0BDAENQRCBCAAIgAxBDUEQQQ6BD4EPQQ1BEcEPQRLBDwEIAA/BD4EQgQ1BD0E RgQ4BDAEOwQ+BDwEIgA6ACAAQQQ+BDMEOwQwBEEEPQQ+BCAATQRCBD4EOQQgAEIENQQ+BEAEOAQ4 BCwAIAA8BD0EPgQ2BDUEQQRCBDIEPgQgAEAENQQwBDsETAQ9BEsERQQgAD4EMQRKBDUEOgRCBD4E MgQgAD8EQAQ4BEAEPgQ0BEsEIAA+BDoEMAQ3BEsEMgQwBE4EQgRBBE8EIABEBEAEMAQ6BEIEMAQ7 BDAEPAQ4BC4AIAAfBEAEOARHBDUEPAQsACAAMQQ1BDcEIAAyBEEETwQ6BDgERQQgAD8EQAQ4BDEE OwQ4BDYENQQ9BDgEOQQhACAAHwRABD4EQQRCBD4ENQQgADgEIAA9BDAEIABDBDQEOAQyBDsENQQ9 BDgENQQgAFEEPAQ6BD4ENQQgAD4EPwRABDUENAQ1BDsENQQ9BDgENQQgAEQEQAQwBDoEQgQwBDsE PgQyBCwAIAA6BDAEOgQgACIAPgQxBEoENQQ6BEIEPgQyBCwAIABNBDsENQQ8BDUEPQRCBEsEIAA6 BD4EQgQ+BEAESwRFBCAAPwQ+BDQEPgQxBD0ESwQgADQEQARDBDMEIAA0BEAEQwQzBEMEIAA4BCAA RgQ1BDsEPgQ8BEMEIgAgAEEEPgQ+BEIEMgQ1BEIEQQRCBDIEQwQ1BEIEIAA8BDgEQAQ+BEMEQQRC BEAEPgQ5BEEEQgQyBEMEIAAyBCAAQgQwBDoEPgQ1BCAAPAQ1BEAENQQsACAARwRCBD4EIAA4BDcE IABABDUEMAQ7BEwEPQRLBEUEIAA/BEAEOARABD4ENAQ9BEsERQQgAD4EMQRKBDUEOgRCBD4EMgQg AEEEOwQ+BDYEPQQ+BCAAPQQwBDkEQgQ4BCAAQgQ1BCwAIABHBEIEPgQgAD0ENQQgADgEPAQ1BE4E QgQgAE8EMgQ9BD4EOQQgAEQEQAQwBDoEQgQwBDsETAQ9BD4EOQQgAEEEQgRABEMEOgRCBEMEQARL BC4AIAAtBEIEMAQgAEIENQQ+BEAEOARPBCwAIAA6BDAEOgQgADoEOwQ1BDkELAAgAEEEMgRPBDcE SwQyBDAENQRCBCAAQAQwBDcEPQRLBDUEIAA+BDEEOwQwBEEEQgQ4BCAANwQ9BDAEPQQ4BDkEIAA4 BCAAPgQxBEAEMAQ3BEMENQRCBCAANQQ0BDgEPQQ+BDUEIAA3BD0EMAQ9BDgENQQsACAAPgRBBD0E PgQyBDAEPQQ9BD4ENQQgAD0ENQQgAEEEQgQ+BDsETAQ6BD4EIAA9BDAEIAA8BDAEQgQ1BDwEMARC BDgERwQ1BEEEOgQ4BEUEIAA8BD4ENAQ1BDsETwRFBCAAOAQgAE0EOgRBBD8ENQRABDgEPAQ1BD0E QgQ1BCwAIAAwBCAAQQQ6BD4EQAQ1BDUEIAA9BDAEIAA+BD8EOARBBDAEPQQ4BDgEIAA4BCAAMgRL BDQENQQ7BDUEPQQ4BDgEIAA+BEEEPQQ+BDIEPQQ+BDMEPgQgAEAEQwRBBDsEMAQuACAAHQQ1BCAA MgQ0BDAEMgQwBE8EQQRMBCAAMgQgAD8EPgQ0BEAEPgQxBD0EPgRBBEIEOAQoADQEPgRBBEIEMARC BD4ERwQ9BD4EIAA/BD4EPwRDBDsETwRABD0EPgQ5BCAAOwQ4BEIENQRABDAEQgRDBEAESwQgAD0E MAQgAE0EQgRDBCAAQgQ1BDwEQwQpACwAIAA+BEIEMgQ1BEIEOAQ8BCAAPQQwBCAAMgQ+BD8EQAQ+ BEEEIAA+BDEEIAAwBDEEQQQ+BDsETgRCBD0EPgQ8BCAANwQ9BDAEPQQ4BDgELgAgABAEIABCBD4E RwQ9BDUENQQsACAAPwQ1BEAENQREBD4EQAQ8BEMEOwQ4BEAEQwQ1BDwEIAA1BDMEPgQuACAAEgQ1 BDQETAQgAEQEOAQ3BDgERwQ1BEEEOgQ4BDkEIABEBEAEMAQ6BEIEMAQ7BCAAPQQ1BCAAOAQ8BDUE NQRCBCAAOgQwBDoEOARFBC0AQgQ+BCAAMAQxBEEEPgQ7BE4EQgQ9BEsERQQgADoEMARCBDUEMwQ+ BEAEOAQ5BC4AIAAeBD0EIAA9BDUEPwRABDUEQARLBDIEPQQ+BC0AQAQwBDcEQARLBDIENQQ9BCAA OAQgAD0ENQQgADgEPAQ1BDUEQgQgAEIEPgRHBD0ESwRFBCAAMwRABDAEPQQ1BDkELAAgAD4EQgQ0 BDUEOwRPBE4ESQQ4BEUEIAA1BDMEPgQgAD4EQgQgADQEQARDBDMEOARFBCAARARABDAEOgRCBDAE OwQ+BDIEIAAyBCAAPwRABDgEQAQ+BDQENQQuACAAHwQ+BEEEPAQ+BEIEQAQ4BEIENQQgAD0EMAQg ADsENQRBBCgAMAQgADsENQRBBCAATQRCBD4EIABEBEAEMAQ6BEIEMAQ7BCkALQAgAD4EPQQgADgE PAQ1BDUEQgQgAD0EMARHBDAEOwQ+BCAAOAQgADoEPgQ9BDUERgQsACAAOgQ+BEIEPgRABEsENQQg AD0EOAQ6BD4EMwQ0BDAEIAA9BDUEIAA+BD8EQAQ1BDQENQQ7BDUEPQRLBCAAMAQxBEEEPgQ7BE4E QgQ9BD4EIABCBD4ERwQ9BD4ELAAgADIEQQQ1BDMENAQwBCAANQRBBEIETAQgADEEPgQ7BDUENQQg ADgEOwQ4BCAAPAQ1BD0ENQQ1BCAAPwQ7BDAEMgQ9BEsEOQQgAD8ENQRABDUERQQ+BDQEIAA+BEIE IAA7BDUEQQQwBCAAOgQgAEEEQgQ1BD8EOAQgADgEIAA9BDAEPgQxBD4EQAQ+BEIELgANACAAFQRB BDsEOAQgAD8EQAQ4BD0ETwRCBEwELAAgAEcEQgQ+BCAAPQQwBEgEIAA8BDgEQAQgAD4EPwQ4BEEE SwQyBDAENQRCBEEETwQgADIEPgQgADIEQQQ1BEUEIAA+BEIEPQQ+BEgENQQ9BDgETwRFBCAAQgQ1 BD4EQAQ4BDUEOQQgAEQEQAQwBDoEQgQwBDsEPgQyBCwAIABCBD4EIAA1BEEEQgRMBCAAPwQ+BDsE PQQ+BEEEQgRMBE4EIABEBEAEMAQ6BEIEMAQ7BDUEPQQsACAAQgQ+BCAAOAQgADgEQQRCBDgEPQQ9 BD4EQQRCBEwEIABCBD4ENgQ1BCAATwQyBDsETwQ1BEIEQQRPBCAARARABDAEOgRCBDAEOwRMBD0E SwQ8BCAAPgQxBEoENQQ6BEIEPgQ8BC0AIAA+BD0EMAQgAD0ENQQgADgEPAQ1BDUEQgQgADIEIABA BDUEMAQ7BEwEPQQ+BEEEQgQ4BCAAQgQ+BEcEPQRLBEUEIAA6BDAEQgQ1BDMEPgRABDgEOQQgACIA OARBBEIEOAQ9BDAELQA7BD4ENgRMBCIAIAA4BDsEOAQgADMEQAQwBD0EOAQgADwENQQ2BDQEQwQg AD0EOAQ8BDgELgAgACIEPgQgADUEQQRCBEwEIAA4BEEEQgQ4BD0EMAQsACAAOwQ+BDYETAQgADgE IABBBDAEPAQwBCAAMwRABDAEPQRMBCAANQRBBEIETAQsACAAPQQ+BCAAPgQ9BDgEIAA9BDUEIABC BD4ERwQ9BEsELQAgADIEQQQ1BCAAMQQ+BDsENQQ1BCAAOAQ7BDgEIAA8BDUEPQQ1BDUEIAA/BDsE MAQyBD0EPgQsACAAPQQ1BD8EQAQ1BEAESwQyBD0EPgQtAEAEMAQ3BEAESwQyBD0ESwQ8BCAAPgQx BEAEMAQ3BD4EPAQsACAAPwQ1BEAENQRCBDUEOgQwBE4EQgQgADgENwQgAD4ENAQ9BD4EMwQ+BCAA MgQgADQEQARDBDMEPgQ1BC4AIAAiBD4EIAA2BDUEIAA+BEIEPQQ+BEEEOARCBEEETwQgADoEPgQg ADIEQQQ1BDwEIAA3BD0EMAQ9BDgETwQ8BCwAIAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA8BDAE QgQ1BDwEMARCBDgERwQ1BEEEOgQ4BDwEIABABDAENwQ0BDUEOwQwBDwELAAgADgEIAA4BEEEPwQ+ BDsETAQ3BD4EMgQwBD0EOAQ1BCAAPAQ9BD4EMwQ4BEUEIAA0BDAENgQ1BCAAIgAwBDEEQQQ+BDsE TgRCBD0ESwRFBCAAOARBBEIEOAQ9BCIAIAA6BDAEOgQsACAAPQQwBD8EQAQ4BDwENQRABCwAIAAi ADIAKwAyAD0ANAAiACwAIAA+BDoEMAQ3BEsEMgQwBDUEQgRBBE8EIAAyBCAANAQ1BDkEQQRCBDIE OARCBDUEOwRMBD0EPgRBBEIEOAQgAD0ENQQ/BEAEMAQyBDgEOwRMBD0ESwQ8BC4AIAASBDUENARM BCAANQRBBDsEOAQgADUEQQRCBEwEIAAyACAARARABDAEOgRCBDAEOwQwBCgAPwRDBEEEQgRMBCwA IAA0BDsETwQgAD8EQAQ+BEEEQgQ+BEIESwQtACAAMgAgAD4EMQRLBEcEPQRLBEUEIAA6BEMEQQRC BDAEIAAyBCAAMgQwBEgENQQ8BCAAPgQzBD4EQAQ+BDQENQQpACAAOAQgADoEMAQ2BDQESwQ5BCAA OAQ3BCAAPQQ4BEUEIABBBD4EQQRCBD4EOARCBCAAOAQ3BCAAMgBFBCAARwQwBEEEQgQ1BDkELAAg AEIEPgQgAD8EQAQ4BCAAPgQxBEoENQQ0BDgEPQQ1BD0EOAQ4BCAAMgQgAEAENQQwBDsETAQ9BD4E QQRCBDgEIAA8BD4ENgQ1BEIEIAA/BD4EOwRDBEcEOARCBEEETwQgAD0ENQQgADQALAAgADAEIAAz ACAARwQwBEEEQgQ4BCgAOAQgADoEQwRBBEIEMAQpACwAIAAyBCAANwQwBDIEOARBBDgEPAQ+BEEE QgQ4BCAAPgRCBCAAQQQ/BD4EQQQ+BDEEMAQgAD4EMQRKBDUENAQ4BD0ENQQ9BDgETwQgAEcEMARB BEIENQQ5BCAARARABDAEOgRCBDAEOwRMBD0EPgQzBD4EIAA6BEMEQQRCBDAEIAAyBCAAPgRCBDQE NQQ7BEwEPQRLBDUEIAA6BEMEQQRCBEsEIAA4BCAANQRJBDUEIAA+BEIEIABCBD4EMwQ+BCwAIAA1 BEEEQgRMBCAAOwQ4BCAAMgQ+BD4EMQRJBDUEIABCBDAEOgQ+BDkEIABBBD8EPgRBBD4EMQQgADgE IAA0BDAENQRCBCAAOwQ4BCAAPgQ9BCAARgQ1BDsESwQ1BCAANwQ9BDAERwQ1BD0EOARPBCAAMgQg ADoEMARHBDUEQQRCBDIENQQgAEAENQQ3BEMEOwRMBEIEMARCBDAELAAgADAEIABNBEIEPgQgADcE MAQyBDgEQQQ4BEIEIABCBD4EOwRMBDoEPgQgAD4EQgQgAEEEOgQ7BDAENARLBDIEMAROBEkENQQz BD4EIABNBEIEOAQgADoEQwRBBEIESwQgAEEEQwQxBEoENQQ6BEIEMAQuACAAEgQ+BCAARARABDAE OgRCBDAEOwRMBD0EPgQ8BCAAPAQ4BEAENQQgAD0ENQQ6BD4EQARABDUEOgRCBDUEPQQgAEEEMAQ8 BCAAMgQ+BD8EQAQ+BEEEIAA/BD4EOARBBDoEMAQgADAEMQRBBD4EOwROBEIEPQQ+BDkEIAA4BEEE QgQ4BD0ESwQgADIEIABBBDwESwRBBDsENQQgADQEMgQ+BDgERwQ9BD4EOQQgADsEPgQzBDgEOgQ4 BCwAIAA6BDAEOgQgADgEIAAzBDsEMAQ0BDoEOAQ1BCAAOAQ7BDgEIAA6BDIEMAQ9BEIEPgQyBEsE NQQoADQEMgQ+BDgERwQ9BEsENQQsACAAQgRABD4EOARHBD0ESwQ1BCkAIAA7BD4EMwQ4BDoEOAQg ADIEPgQ+BDEESQQ1BCEAIAAUBD4EOwQ2BDUEPQQgADEESwRCBEwEIAA/BD4EOARBBDoEIAA9BDUE MAQxBEEEPgQ7BE4EQgQ9BD4EOQQgADgEQQRCBDgEPQRLBCAAOAQ7BDgEIABHBDUEMwQ+BC0AQgQ+ BCwAIABHBEIEPgQgADIEPgQ+BDEESQQ1BCAAPQQ1BCAANQRBBEIETAQgADgEQQRCBDgEPQQwBCgA OgQwBDoEIAAwBDEEQQQ+BDsETgRCBD0EPgQgADQEPgRBBEIEPgQyBDUEQAQ9BD4ENQQgADcEPQQw BD0EOAQ1BCkALAAgADAEIAA7BDgESARMBCAAPgQxBDsEMAQ0BDAENQRCBCAAOARBBEIEOAQ9BD0E PgRBBEIETAROBCAAMgQgAD4EPwRCBDgEPAQwBDsETAQ9BD4EOQQgADwENQRABDUELQAgAD0EQwQ2 BD0ESwQ8BCAAPgQxBEAEMAQ3BD4EPAQgADoEPgQ7BDgERwQ1BEEEQgQyBDUEPQQ9BD4EIAA4BCAA OgQwBEcENQRBBEIEMgQ1BD0EPQQ+BCAAPgRCBEAEMAQ2BDAENQRCBCAAPgQ6BEAEQwQ2BDAETgRJ BEMETgQgADQENQQ5BEEEQgQyBDgEQgQ1BDsETAQ9BD4EQQRCBEwEIAAyBCAARwQ1BDsEPgQyBDUE RwQ1BEEEOgQ+BDwEIAA3BD0EMAQ9BDgEOAQuACAAHQQ1BCAAPQRDBDYEPQQ+BCAAOARBBDoEMARC BEwEIABCBD4ERwQ9BD4ENQQgADQEPQQ+BCAAQAQ1BDoEOAQsACAARwRCBD4EMQQgAD4EPwRABDUE NAQ1BDsEOARCBEwEIAA1BDUEIAAzBDUEPgQ8BDUEQgRABDgETgQtACAANAQ+BEEEQgQwBEIEPgRH BD0EPgQgAD0EMAQ5BEIEOAQgADUEUQQgAEAEQwRBBDsEPgQuACAAIgQ+BCAANQRBBEIETAQgAEQE PgRABDwEMAQ7BEwEPQQ+BCwAIAA4BEEEQgQ4BD0EMAQgAD0ENQQgAD8EPgRBBEIEOAQ2BDgEPAQw BCwAIABNBEIEPgQgAD0ENQQgADcEPQQwBEcEOARCBCwAIABHBEIEPgQgADUEUQQgAD0ENQRCBCAA MgQ+BD4EMQRJBDUEKAA6BDAEOgQgADwEOAQ9BDgEPARDBDwEIAA+BD0EMAQgAD8EQAQ4BEEEQwRC BEEEQgQyBEMENQRCBCAAMgQgADIEOAQ0BDUEIABEBDgEOwQ+BEEEPgREBEEEOgQ+BDkEIAA6BDAE QgQ1BDMEPgRABDgEOAQgADgEIAA9BDUEIABBBDIEPgQ0BDgEQgRBBE8EIAA6BCAAPgRBBEIEMAQ7 BEwEPQRLBDwEKQAsACAAPQQ+BCAAOAQ3BCAANwQwBCAAOARABEAEMARGBDgEPgQ9BDAEOwRMBD0E SwRFBCAAQQQyBD4EOQRBBEIEMgQgADUEUQQgAD4EQgRABDAENgQ1BD0EOARPBCAAMgQgAEEEQwQx BEoENQQ6BEIENQQgADsEOARIBEwEIAAyBCAAMgQ4BDQENQQgADcEPQQwBD0EOARPBCwAIABHBDUE OwQ+BDIENQQ6BCAAPwQ+BEEEQgQ4BEcETAQgADgEQQRCBDgEPQRDBCAAPQQ1BCAAPAQ+BDYENQRC BCwAIAAwBCAAPAQ+BDYENQRCBCAAMQRLBEIETAQgADEEOwQ4BDYENQQgADgEOwQ4BCAANAQwBDsE TARIBDUEIAA+BEIEIAA9BDUEUQQgADgEIABNBEIEPgQgADcEMAQyBDgEQQQ4BEIEIAA+BEIEIABC BD4EMwQ+BCwAIAA/BEAEOAQ8BDUEPQRPBDUEQgQgADsEOAQgAD4EPQQgAD8EPgQ7BD0EPgRGBDUE PQQ9BD4EIAA4BD0ERAQ+BEAEPAQwBEYEOAROBCAANAQ7BE8EIABBBDgEPQRCBDUENwQwBCAAOAQ7 BDgEIAA9BDUEQgQuACAAFQRBBDsEOAQgAEcENQQ7BD4EMgQ1BDoEIAA+BDEESgQ1BDQEOAQ9BE8E NQRCBCAAMgRBBDUEIAAyBD4ENwQ8BD4ENgQ9BD4EQQRCBDgEIAA/BD4EOwRDBEcENQQ9BDgETwQg ADcEPQQwBD0EOAQ5BCwAIAA+BD0EIAA/BD4EQgQ+BDwEIABBBDgEPQRCBDUENwQ4BEAEQwQ1BEIE IAA4BDcEIAA9BDgERQQgAD4EPwRABDUENAQ1BDsENQQ9BD0EPgQ1BCAAQARDBEEEOwQ+BCwAIAAy BCAARgQ1BDsEPgQ8BCAAPgQxBDsEMAQ0BDAETgRJBDUENQQgAD0EQwQ2BD0EPgQ5BCAAOARBBEIE OAQ9BD0EPgRBBEIETAROBC4AIAAtBEIEOAQgAD8EPgQ0BEUEPgQ0BCAAOAQgAD8EPgQ9BDgEPAQw BD0EOAQ1BCAAQgQ+BDMEPgQsACAARwRCBD4EIABEBEAEMAQ6BEIEMAQ7BEwEPQRLBDkEIAA8BDgE QAQgAD0ENQQgACIANAQ1BDsEOARCBEwEQQRPBCAAMQQ1BDcEIAA+BEEEQgQwBEIEOgQwBCIAIAA9 BDAEIAAiAEcENQRABD0EPgQ1BCIAIAA4BCAAIgAxBDUEOwQ+BDUEIgAgADwESwQgADEEQwQ0BDUE PAQgADgEQQQ/BD4EOwRMBDcEPgQyBDAEQgRMBCAAPQQ4BDYENQQuACAAHwQ+BDQERQQ+BDQEIAA/ BEAEOAQ8BDUEPQQ4BDwEIAA6BEAEPgQ8BDUEIAA4BEEEQgQ4BD0EPQQ+BEEEQgQ4BCwAIAA4BCAA OgQgADQEQARDBDMEOAQ8BCAARQQwBEAEMAQ6BEIENQRABDgEQQRCBDgEOgQwBDwEIAA3BD0EMAQ9 BDgETwQsACAAQgQwBDoEOAQ8BCAAOgQwBDoEIAA/BD4EQQRCBDgENgQ4BDwEPgRBBEIETAQsACAA PwRABD4EQgQ4BDIEPgRABDUERwQ4BDIEPgRBBEIETAQsACAAPwQ+BDsEPQQ+BEIEMAQsACAAPwRA BDAEOgRCBDgERwQ1BEEEOgQwBE8EIABNBEQERAQ1BDoEQgQ4BDIEPQQ+BEEEQgRMBCwAIAA+BDEE SQQ9BD4EQQRCBEwEIAA4BCAATQQyBEAEOARBBEIEOARHBD0EPgRBBEIETAQtACAAOAQ0BDUEMAQ7 BDAEIAA+BD0EOAQgAD0ENQQgADQEPgRBBEIEOAQzBDAETgRCBC4ADQAgABQEOwRPBCAAQAQwBDcE QwQ8BD0EPgQzBD4EIABBBDgEPQRCBDUENwQwBCAAOARBBEIEOAQ9BD0EPgQzBD4EIAA3BD0EMAQ9 BDgETwQgAD0EQwQ2BD0EPgQgAD0ENQQgAEEEQgRABDUEPAQ4BEIETARBBE8EIABCBD4ERwQ9BD4E IAA4BCAAIgAwBDEEQQQ+BDsETgRCBD0EPgQgADsEPgQzBDgERwQ1BEEEOgQ4BCIAIAAyBD4EQQRB BEIEMAQ9BDAEMgQ7BDgEMgQwBEIETAQgADgEQQRCBD4EQAQ4BE4EIAA4BDsEOAQgADoEMAQ6BDgE NQQtAEIEPgQgAEQEMAQ6BEIESwQsACAARwRCBD4EIAA6BCAAQgQ+BDwEQwQgADYENQQgAD0ENQQg ADIEPgQ3BDwEPgQ2BD0EPgQgADIEIABABDUEMAQ7BEwEPQQ+BEEEQgQ4BCwAIAAwBCAAQQRCBDAE MgQ4BEIETAQgADcEMAQ0BDAERwRDBCAAPQQwBDgEOwRDBEcESAQ1BDMEPgQoADIEIABBBDwESwRB BDsENQQgADgEPQRCBDUEQAQ1BEEEPgQyBCAAOARBBEEEOwQ1BDQEPgQyBDAEQgQ1BDsETwQpACAA PgRCBEAEMAQ2BDUEPQQ4BE8EIAA/BEAEPgRIBDsEPgQzBD4ELAAgADgEQQRCBD4EQAQ4BDgEIAA8 BDgEQAQwBCwAIAAyBCAAPQQwBEgENQQ8BCAAPQQwBEEEQgQ+BE8ESQQ1BDwEIAA3BD0EMAQ9BDgE OAQgAEEEIABDBEcENQRCBD4EPAQgAD0ENQQgAEIEPgQ7BEwEOgQ+BCAAOARBBEIEPgRABDgEOAQs ACAAPQQ+BCAAMgQ+BD4EMQRJBDUEIAAyBEEENQRFBCAANwQ9BDAEPQQ4BDkEKABCBD4ERwQ9BEsE RQQgADgEIAA9BDUEQgQ+BEcEPQRLBEUEKQAgADIEIABBBDwESwRBBDsENQQgADwENQRABEsEIAA4 BCAAOgRABDgEQgQ1BEAEOAQ1BDIEIAA4BEEEQgQ4BD0EPQQ+BEEEQgQ4BC4AIAAiBDAEOgQgADoE MAQ6BCAAPgRCBEAEMAQ2BDUEPQQ4BDUEIAA9BDgEOgQ+BDMENAQwBCAAMgQgAEAENQQwBDsETAQ9 BD4EQQRCBDgEIAA9BDUEIAAxBEsEMgQwBDUEQgQgADAEMQRBBD4EOwROBEIEPQQ+BCAAPgQ0BDgE PQQwBDoEPgQyBEsEPAQsACAAQgQ+BCAAPgQxBEkENQQ1BCAAOARBBEIEOAQ9BD0EPgQ1BCAANwQ9 BDAEPQQ4BDUEIAA+BCAAPAQ4BEAENQQsACAANQQzBD4EIABDBEEEQgRABD4EOQRBBEIEMgQ1BCwA IAA4BEEEQgQ+BEAEOAQ4BCAAOAQgAEMEPwRABDAEMgQ7BDUEPQQ4BDgEIAAyBEEENQQzBDQEMAQg AD8EPgQ0BCAAQwQzBEAEPgQ3BD4EOQQgADgENwQgADcEMAQgAEEEOwQ+BDYEPQQ+BEEEQgQ4BCwA IAA9BDUEPgQ0BD0EPgQ3BD0EMARHBD0EPgRBBEIEOAQgAD4EMQRABDAENwQ+BDIEIAA4BEEEQgQ4 BD0ESwQgADgEIAAyBEsEQQQ+BDoEPgQ5BCAARgQ1BD0EPQQ+BEEEQgQ4BCAAQQQwBDwEPgQzBD4E IAA3BD0EMAQ9BDgETwQgADQEOwRPBCAAOwROBDQENQQ5BCwAIAA4BDcEIAA3BDAEIABHBDUEMwQ+ BCAAMgQ+BDcEPQQ4BDoEMAQ1BEIEIABBBDoEOwQ+BD0EPQQ+BEEEQgRMBCAAOgQgADwEPgQ9BD4E PwQ+BDsEOAQ3BDAERgQ4BDgEIAA4BCwAIAAyBCAAOARCBD4EMwQ1BCwAIAA8BD4EPQQ+BD8EPgQ7 BDgEOAQgAD0EMAQgADcEPQQwBD0EOARPBC4AIAAmBDUEPQQ9BD4EQQRCBEwEIAA/BEAEOAQyBD4E NAQ4BEIEIAA4BCAAOgQgADEEPgQ7BEwESAQ1BDkEIABGBDUEPQQ1BCwAIAA6BD4EQgQ+BEAEQwRO BCAARwQ1BDsEPgQyBDUEOgQgAD8EOwQwBEIEOARCBCAANwQwBCAAQQQyBD4EOAQgAD4ESAQ4BDEE OgQ4BCAAOAQ7BDgEIAA3BDAEIABCBD4ELAAgAEcEQgQ+BCAANAQ+BD8EQwRBBEIEOAQ7BCAAPQQ1 BE0ERAREBDUEOgRCBDgEMgQ9BD4ENQQgADwEPgQ9BD4EPwQ+BDsETAQ9BD4ENQQgADgEQQQ/BD4E OwRMBDcEPgQyBDAEPQQ4BDUEIAAyBDAENgQ9BD4EMwQ+BCAAPgQxBEkENQRBBEIEMgQ1BD0EPQQ+ BDMEPgQgAEAENQRBBEMEQARBBDAELgAgACEEOwQ1BD8EMARPBCAAMgQ1BEAEMAQgAEEEQwRJBDUE QQRCBDIEQwROBEkEOAQ8BCAAOARBBEIEPgRHBD0EOAQ6BDAEPAQgADgEPQREBD4EQAQ8BDAERgQ4 BDgEIAAyBCAAQQQ+BDIEQAQ1BDwENQQ9BD0EPgQ8BCAAPAQ4BEAENQQgAD8EQAQ4BDIEPgQ0BDgE QgQgADoEIAA/BD4EQAQ+BEcEPQQ+BDwEQwQgADoEQARDBDMEQwQsACAAOgQ+BDMENAQwBCAAOwRO BDQEOAQgAEIENQRABE8ETgRCBCAAOAQ3BCAANwQwBCAAPQQ1BDcEPQQwBD0EOARPBCAAMgQ+BDcE PAQ+BDYEPQQ+BEEEQgRMBCAAPAQwBD0EUQQyBEAEMAQgADgEIABNBEIEMAQgAD0ENQRBBDIEPgQx BD4ENAQwBCAANAQ1BDsEMAQ1BEIEIAAyBDsEMARBBEIETAQgAEIENQRFBCAAOgRCBD4EIAA3BD0E MAQ1BEIEIAA4BCAANgQ4BDIEUQRCBCAANwQwBCAARwRDBDYEPgQ5BCAAQQRHBFEEQgQgADUESQQ1 BCAAMQQ+BDsETARIBDUEIAA4BCAARgQ1BD0EPQQ1BDUEIAA0BDsETwQgAD4EQQRCBDAEOwRMBD0E SwRFBCwAIABHBEIEPgQgADIENQQ0BDUEQgQgADoEIAA4BEUEIAA1BEkENQQgADEEPgQ7BEwESAQ1 BDwEQwQgAD8EPgRABDAEMQQ+BEkENQQ9BDgETgQgADgEIABCBDAEOgQgADQEPgQgAD8EPgQ7BD0E PgQzBD4EIAA2BDgEMgQ+BEIEPQQ+BDMEPgQgAD8EPgQ0BEcEOAQ9BDUEPQQ4BE8ELAAgADIESwRA BD4ENgQ0BDUEPQQ4BE4EIAA4BCAAQQQ8BDUEQARCBDgELgAgAB8EQAQ4BCAATQRCBD4EPAQgADcE PQQwBE4ESQQ4BDUEIAA0BDAENgQ1BCAAPQQ1BCAAQQRCBEAENQQ8BE8EQgRBBE8EIABABDAENwQy BDgEMgQwBEIETARBBE8EIABBBDAEPAQ4BCwAIAAwBCAAQQQ6BDsEPgQ9BD0ESwQgAD4EMQQ8BDAE PQRDBEIETAQgAEEEOwQwBDEEPgQzBD4EIAA4BCAANwQwBCAANQQzBD4EIABBBEcENQRCBCAAPwQ+ BDsEQwRHBDgEQgRMBCAAQQQyBDUEQARFBD8EQAQ4BDEESwQ7BEwEIAA4BCwAIAAyBCAAOARCBD4E MwQ1BCwAIAAyBEsENgQ4BEIETAQuACAALQRCBD4EIAAyBCAASAQ4BEAEPgQ6BD4EPAQgAEEEPARL BEEEOwQ1BCAATQREBEQENQQ6BEIEIAAcBB4EHQQeBB8EHgQbBBgEGAQgADIEIAA8BDgEQAQ1BCAA OAQgAD8EQAQ4BEAEPgQ0BDUEIABHBDUEOwQ+BDIENQQ6BDAELgANACAAIgQ+BDsETAQ6BD4EIABA BDAENwQ+BEAEMgQwBDIEIABNBEIEPgRCBCAAOgRABEMEMwQsACAARwQ1BDsEPgQyBDUEOgQsACAA PgQxBEoENQQ0BDgEPQRPBE8EIABBBDgEOwRMBD0ESwRFBCAAOAQgAEEEOwQwBDEESwRFBCwAIAA6 BDAEOgQgADEEQAQwBEIETAQ1BDIELAAgADwEPgQ2BDUEQgQgAD8EQAQ4BDEEOwQ4BDcEOARCBEwE QQRPBCAAOgQgADgEQQRCBDgEPQQ1BC4AIAAUBDsETwQgAE0EQgQ+BDMEPgQgAD0EQwQ2BD0EPgQg AEEEQgRABDUEPAQ7BDUEPQQ4BDUEIAA7BE4ENAQ1BDkEIAA6BCAAPwRABD4ENwRABDAERwQ9BD4E QQRCBDgEIAAyBCAAQQQyBD4EOARFBCAAPgRCBD0EPgRIBDUEPQQ4BE8ERQQgADgEIAAyBCAAMgRL BEEEPgQ6BD4EOQQgADwENQRABDUEIAA4BEEEQgQ4BD0EPQQ+BDUEKABFBD4EQgRMBCAAOAQgAD0E NQQgADAEMQRBBD4EOwROBEIEPQQ+BCkAIAA4BCAARgQ1BDsEPgRBBEIEPQQ+BDUEIAA3BD0EMAQ9 BDgENQQgAEEEOwQ+BDYEPQQ+BDMEPgQgAEMEQQRCBEAEPgQ5BEEEQgQyBDAEIAA9BDAESAQ1BDME PgQgADwEOARABDAELgAgABQEOwRPBCAATQREBEQENQQ6BEIEOAQyBD0EPgQzBD4EIAA/BD4EQQRC BDgENgQ1BD0EOARPBCAAOARBBEIEOAQ9BEsEIAA9BEMENgQ9BD4EIAA4BEEEPwQ+BDsETAQ3BD4E MgQwBEIETAQgAD4EMQQ+BDEESQQ1BD0EOAQ1BCAAPAQ1BEIEPgQ0BDAEIABABEMEQQQ7BDAEIAA0 BDsETwQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQzBD4EIAAyBD4EQQQ/BEAEOARPBEIEOARPBC0A IAA+BDEESgQ1BDQEOAQ9BDUEPQQ4BDUEIAA/BD4ENwQ9BDAEMgQwBDUEPAQ+BDMEPgQgAEAEMARG BDgEPgQ9BDAEOwRMBD0EPgQgADgEIABCBEAEMAQ9BEEERgQ1BD0ENAQ1BD0EQgQ9BD4EIABHBDUE QAQ1BDcEIAAiAEMEPAQiACAAOAQgACIAQQQ1BEAENARGBDUEIgAgADgEIAA+BDEEOwQwBDQEMARC BEwEIAAiAEEEOAQ7BDAEPAQ4BCAANARDBEUEMAQiAC0AIAA+BEEEPgQ3BD0EMAQ9BDgENQQ8BCAA QQQyBD4ENQQ5BCAANAQ1BE8EQgQ1BDsETAQ9BD4EQQRCBDgELAAgADIEPQQ4BDwEMAQ9BDgENQQ8 BCAAOgQgAD0ENQQ5BCwAIABCBEAENQQ3BDIEPgRBBEIETAROBCwAIABBBD8EPgQ6BD4EOQRBBEIE MgQ4BDUEPAQsACAAMwQwBEAEPAQ+BD0EOARHBD0EPgRBBEIETAROBCAAQQQ+BDcEPQQwBD0EOARP BCAAOAQgADwESwRIBDsENQQ9BDgETwQgADgEIABCBC4ANAQuACAALQRCBD4EIABCBDAEOgQ2BDUE IAA4BCAANAQ+BDwEOAQ9BDgEQARDBE4ESQQ4BDkEIABEBDAEOgRCBD4EQAQgAEAEPgRBBEIEMAQg AD0EQAQwBDIEQQRCBDIENQQ9BD0EPgRBBEIEOAQgADgEIABEBD4EQAQ8BDgEQAQ+BDIEMAQ9BDgE TwQgAD0EQAQwBDIEQQRCBDIENQQ9BD0ESwRFBCAARgQ1BD0EPQQ+BEEEQgQ1BDkELQAgAD8EPgRA BE8ENAQ+BEcEPQQ+BEEEQgQ4BCAAOAQgAEEEPgQyBDUEQQRCBDgELgAgAB8EPgRABE8ENAQ+BEcE PQQ+BEEEQgRMBCAAMgQgAEgEOARABD4EOgQ+BDwEIABBBDwESwRBBDsENQQgADcEMAQ0BDAENQRC BCAAPwQ+BEAETwQ0BD4EOgQgADIEIABDBDwENQQgADgEIAAyBD4EIAAyBEEENQQ8BCwAIABHBDUE MwQ+BCAAPgQ9BDAEIAA6BDAEQQQwBDUEQgRBBE8EOgAgADIEIAAxBEsEQgRDBCwAIABCBEAEQwQ0 BDUELAAgAD4EQgQ9BD4ESAQ1BD0EOARPBEUEIABBBCAAPAQ4BEAEPgQ8BCwAIAAyBCAAPwRABD4E RgQ1BEEEQQQ1BCAAPwQ+BDcEPQQwBD0EOARPBC4AIAAeBD0EMAQgAE8EMgQ7BE8ENQRCBEEETwQg AD4EQQQ9BD4EMgQ+BDkEIAA4BCAANwQwBDsEPgQzBD4EPAQgADsETgQxBD4EOQQgAEMEQQQ/BDUE SAQ9BD4EOQQgADQENQRPBEIENQQ7BEwEPQQ+BEEEQgQ4BC4AIAAhBD4EMgQ1BEEEQgRMBCAANgQ1 BCAAPwQ+BDcEMgQ+BDsETwQ1BEIEIABNBEQERAQ1BDoEQgQ4BDIEPQQ+BCAAOARBBD8EPgQ7BEwE NwQ+BDIEMARCBEwEIAAwBDsETARCBDUEQAQ9BDAEQgQ4BDIEPQRLBDkEIABDBDwEQwQgADoEMAQ9 BDAEOwQgAD8EPgQ7BEMERwQ1BD0EOARPBCAAOAQ9BEQEPgRABDwEMARGBDgEOAQgAD4EIAA8BDgE QAQ1BCwAIAA0BD4EPwQ+BDsEPQRPBE4ESQQ4BDkEIAA/BD4ENwQ9BDAEPQQ9BD4ENQQgAEAEMARG BDgEPgQ9BDAEOwRMBD0EPgQgADgEIAA+BD8EQAQ1BDQENQQ7BE8ETgRJBDgEOQQgADMEQAQwBD0E TAQgADwENQQ2BDQEQwQgADAEMQRBBEIEQAQwBDoEQgQ9BD4ELQA7BD4EMwQ4BEcENQRBBDoEPgQ5 BCAAOARBBEIEOAQ9BD0EPgRBBEIETAROBCAAOAQgADgEQQRCBDgEPQQ9BD4EQQRCBEwETgQgAEIE QAQwBD0EQQRGBDUEPQQ0BDUEPQRCBD0EPgQzBD4EIAA3BD0EMAQ9BDgETwQgAEcEQwQyBEEEQgQy BCAAOAQgAE0EPAQ+BEYEOAQ5BCwAIAAiADgEQQRCBDgEPQQ9BD4EQQRCBEwETgQiACAAMQQ1BEEE QQQ+BDcEPQQwBEIENQQ7BEwEPQRLBEUEIAA/BEAEPgRGBDUEQQRBBD4EMgQgADgEPQRCBEMEOARG BDgEOAQsACAAPgQ9BDAEIABDBEEEQgQwBD0EMAQyBDsEOAQyBDAENQRCBCAAPgRBBD4EMQQ+BDUE IABBBD4EQQRCBD4ETwQ9BDgENQQgAD8EPgQ3BD0EMAQ9BDgETwQtACAARwRRBEIEOgQ+BDUEIAAy BDgENAQ1BD0EOAQ1BCAAOAQgAD4ESQRDBEkENQQ9BDgENQQgAD4EMQRABDAENwQwBCwAIABBBD4E PgRCBDIENQRCBEEEQgQyBEMETgRJBDUEMwQ+BCAANAQ1BDkEQQRCBDIEOARCBDUEOwRMBD0EPgRB BEIEOAQoADoEMARCBDAEOwQ1BD8EQgQ4BEcENQRBBDoEMARPBCAARAQwBD0EQgQwBDcEOARPBCkA IAA/BDAEQAQwBDQEPgQ6BEEEMAQ7BEwEPQQ+BDMEPgQgAD0ENQQ/BD4EQQRCBDgENgQ4BDwEPgQz BD4EIAA8BDgEQAQwBCwAIAA6BDAEOgQgAEQEQAQwBDoEQgQwBDsETAQ9BD4EOQQgAEcEMARBBEIE OAQgAEYENQQ7BD4EQQRCBD0EPgQzBD4EIABEBEAEMAQ6BEIEMAQ7BEwEPQQ+BDMEPgQgADwEOARA BDAELAAgAD0ENQRBBEMESQQ1BDkEIAAyBCAAQQQ1BDEENQQgAD8EQAQ+BEIEOAQyBD4EQAQ1BEcE OARPBCAAOARBBEIEOAQ9BD0EPgRBBEIEOAQuACAAHgQxBEAEMAQ3BDAELAAgAEAEMAQ3BEAENQRI BDAETgRJBDUEMwQ+BCAAMgQgADwENQQ0BDgEQgQwBEIEOAQyBD0EPgQ8BCAAQQQ+BEEEQgQ+BE8E PQQ4BDgEIAA/BEAEPgRCBDgEMgQ+BEAENQRHBDgETwQgAEAEMARGBDgEPgQ9BDAEOwRMBD0EPgQz BD4EIAA4BCAANAQ+BC0AIAA4BDsEOAQgAD8EQAQ1BDQELQAgAEAEMARGBDgEPgQ9BDAEOwRMBD0E PgQzBD4ELAAgADQEPgQ/BD4EOwQ9BE8ETgRJBDUEMwQ+BCAAMAQxBEEEQgRABDAEOgRCBD0EQwRO BCAAOAQ9BEQEPgRABDwEMARGBDgETgQgAEEEPgQ3BD0EMAQ9BDgETwQgAD8EQAQ+BEIEOAQyBD4E PwQ+BDsEPgQ2BD0EPgRBBEIETAROBCgAQgQ+BCAANQRBBEIETAQgADgEPQRCBEMEOARGBDgENQQ5 BCkALgAgACEEPgQyBDUEQQRCBEwEIABNBEIEPgQgAD0ENQQgAD8EQAQ+BEEEQgQ+BCAAPQQwBEgE NQQgAD0EMAQ6BDAENwQwBD0EOAQ1BCAAMgQgADIEOAQ0BDUEIABBBEIESwQ0BDAEIAA4BCAAQQRC BEAEMARFBDAELgAgACEEQgRLBDQEIAA4BCAAQQRCBEAEMARFBCAATQRCBD4EIAAyBEEENQQzBD4E IAA7BDgESARMBCAANAQ+BDwEOAQ9BDAEPQRCBD0ESwQ1BCAAOgQ+BDwEPwQ+BD0ENQQ9BEIESwQg AEAEMAQxBEEEOgQ+BDkEIAA/BEEEOARFBDgEOgQ4BCAAMgQgAEEEPwQ1BDoEQgRABDUEIABNBDwE PgRGBDgEOQQoAD0ENQQgAEEERwQ4BEIEMARPBCAAMQQ+BDsEOAQpACwAIAA9BDUEQQRDBEkEOARF BCAAOARABEAEMARGBDgEPgQ9BDAEOwRMBD0EPgQ1BCAANwQ9BDAEPQQ4BDUELgANACAAIQQ+BDIE NQRBBEIETAQgAE0EQgQ+BCAAQgQwBDoEMARPBCAANgQ1BCAARARDBD0EOgRGBDgETwQgAEEEOARB BEIENQQ8BEsEIAA/BD4EOwRDBEcENQQ9BDgETwQgADcEPQQwBD0EOAQ5BCAAQQQ1BEAENARGBDAE LAAgADoEMAQ6BCAAOAQgAD8EPgRABE8ENAQ+BEcEPQQ+BEEEQgRMBCAANAQ7BE8EIABDBDwEMAQs ACAAOAQgADUEUQQgAEIEPgRHBD0EPgQgAEIEMAQ6BDYENQQgADoEMAQ6BCAAOAQgAD8EPgRABE8E NAQ+BDoEIAA9BEMENgQ9BD4EIAA9BDAEQQRCBEAEMAQ4BDIEMARCBEwEIAA9BDAEIAA/BD4EOwRD BEcENQQ9BDgENQQgADgEIABBBDgEPQRCBDUENwQgADcEPQQwBD0EOARPBCwAIAA/BEAEPgQyBDUE QARPBEIETAQgADgEIABDBDsEQwRHBEgEMARCBEwELgAgABgEIAA+BEIEIAA1BFEEIAA6BDAERwQ1 BEEEQgQyBDAEIAA4BCAAOgQwBEcENQRBBEIEMgQwBCAANQRRBCAAQQQyBE8ENwQ4BCAAQQQgAEEE PgQ3BD0EMAQ9BDgENQQ8BCAANwQwBDIEOARBBDgEQgQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1 BCwAIABBBDgEPQQ1BEAEMwQ4BE8ELQAgAEIEPgQgAD0EMARBBDoEPgQ7BEwEOgQ+BCAAPwQ+BDsE PQQ+BCAARwRDBDIEQQRCBDIEQwQ1BEIEIABHBDUEOwQ+BDIENQQ6BCAAPwRABD4ENARDBDoEQgQg AEMEPARBBEIEMgQ1BD0EPQQ+BDMEPgQgAEIEQARDBDQEMAQgADgEIAA9BDAEPgQxBD4EQAQ+BEIE IAA/BD4EPQQ4BDwEMAQ1BEIEIABDBDwEPgQ8BCAAQQQyBD4EOAQgAEcEQwQyBEEEQgQyBDAEIAA4 BCAATQQ8BD4ERgQ4BDgELgAgACIEPgQgADUEQQRCBEwEIAA+BEIEIABBBD4EMgQ1BEEEQgQ4BCAA NwQwBDIEOARBBDgEQgQgAD0EMARBBDoEPgQ7BEwEOgQ+BCAAPwQ+BDsEPQQ+BCAARwQ1BDsEPgQy BDUEOgQgADwEPgQ2BDUEQgQgAD4ENAQ9BD4EMgRABDUEPAQ1BD0EPQQ+BCAAPQQ1BCAAQgQ+BDsE TAQ6BD4EIAA/BD4EPQRPBEIETAQgADgEOwQ4BCAAPwQ+BEcEQwQyBEEEQgQyBD4EMgQwBEIETAQs ACAAPQQ+BCAAPwQ+BDcEPQQwBEIETAQgADwEOARABCAAMgQgAEYENQQ7BD4EPAQuACAAEgQgAD4E QgQ7BDgERwQ4BDUEIAA+BEIEIABABDAERgQ4BD4EPQQwBDsETAQ9BD4EMwQ+BCAAPwQ+BEAETwQ0 BDoEMAQsACAATQRCBDAEIABBBEIEQARDBDoEQgRDBEAEMAQgADcEMAQ0BDAENQRCBCAARAQ+BEAE PAQwBEIEIAA3BD0EMAQ9BDgEOQQgADIEIAAyBDgENAQ1BCAATQQ8BD4ERgQ4BDkELAAgAD0ENQQg AEEEMgQ+BDQEOAQ8BEsERQQgADoEIAA+BEEEPARLBEEEOwQ1BD0EPQQ+BDwEQwQgADcEPQQwBD0E OAROBC4AIAAhBEIEQAQwBEUEIAA4BCAAQQRCBEsENAQgAD8EQAQ1BD4ENAQ+BDsENQQyBDAETgRC BEEETwQgADAEPQQwBDsEOAQ3BD4EPAQgADEENQRBBEEEPgQ3BD0EMARCBDUEOwRMBD0EPgQzBD4E KABBBD0EPgQyBDgENAQ1BD0EOAQ5BCwAIABHBEMEMgRBBEIEMgQsACAAPAQ1BDQEOARCBDAEQgQ4 BDIEPQQ+BDMEPgQgAD4EPwRLBEIEMAQsACAAPgQzBD4EMgQ+BEAEPgQ6BCwAIAAxBEAENQQ0BDAE LAAgADMEMAQ7BDsETgRGBDgEPQQwBEYEOAQ5BCwAIAAzBEAEMAQ9BDgERwQ9BEsERQQgAEQEPgRA BDwEMARGBDgEOQQgAEEEPgQ3BD0EMARCBDUEOwRMBD0EPgQzBD4EKQAsACAAPgRBBD4ENwQ9BDAE PQQ4BDUEPAQgAEEEQgRABDAERQQ+BDIEIAA4BCAARAQ+BEAEPAQwBDsEOAQ3BDAERgQ4BDUEOQQg AEMEMwRABD4ENwQsACAAQAQwBEYEOAQ+BD0EMAQ7BEwEPQRLBDwEIAA/BD4EOARBBDoEPgQ8BCAA OAQgADsEOAQ6BDIEOAQ0BDAERgQ4BDUEOQQgADgERQQgADgEQQRCBD4ERwQ9BDgEOgQ+BDIELgAg AB0ENQQgAEQEPgRABDwEMAQ7BDgENwRDBDUEPAQwBE8EIAA2BDUEIABHBDAEQQRCBEwEIAA4BD0E RAQ+BEAEPAQwBEYEOAQ4BCAAOAQ3BCAAPwQ+BDQEQQQ+BDcEPQQwBD0EOARPBCAAPgRBBEIEMAQ1 BEIEQQRPBCAAIgA9BDAEIABBBD4EMgQ1BEEEQgQ4BCIAIABBBD4EMgQ1BEEEQgQ4BC4AIAAiAB8E PgQ9BE8EQgRMBCIAIABHBEMEMgRBBEIEMgQwBCAAPAQ+BDYEPQQ+BCAAPwRABDUENARBBEIEMAQy BDgEMgQgAEEENQQxBE8EIABABDUEMQQ1BD0EOgQ+BDwELAAgAEMEPAQ4BEAEMAROBEkEOAQ8BCAA NgQ1BEEEQgQ+BDoEPgQ5BCAAQQQ8BDUEQARCBEwETgQgADgEOwQ4BCAAPQQwBD4EMQQ+BEAEPgRC BCAANgQ4BDIEQwRJBDUEMwQ+BCAAQQRHBDAEQQRCBDsEOAQyBD4EOQQgADYEOAQ3BD0ETAROBCAA PwQ+BDQEQAQ+BEEEQgQ6BDAELAAgAD8EPgQ3BD0EMAQyBEgENQQzBD4EIABBBDgEOwRDBCAAOAQg AD8EPgQ0BDQENQRABDYEOgRDBCAAPQQwBEEEQgQ+BE8ESQQ1BDkEIAA6BEAENQQ/BDoEPgQ5BCAA OwROBDEEMgQ4BC4AIAAdBD4EIAAwBDEEQQRCBEAEMAQ6BEIEPQRLBDUEIAA2BDAEOwQ+BEEEQgRM BCAAOAQgAEAEMAQ0BD4EQQRCBEwEIAA9BDUEIAA0BDAETgRCBCAAQgQ+BEcEPQQ+BDMEPgQgAD8E PgQ9BDgEPAQwBD0EOARPBCwAIABBBCAARwQ1BDwEIAA6BD4EPQQ6BEAENQRCBD0EPgQgAD4EPQQ4 BCAAQQQyBE8ENwQwBD0ESwQsACAAQgQwBDoEIAA6BDAEOgQgAE0EPAQ/BDAEQgQ4BE8EIAA4BCAA QQQ+BEcEQwQyBEEEQgQyBDgENQQgAEcEMARBBEIEOARHBD0EPgQgADgEQARABDAERgQ4BD4EPQQw BDsETAQ9BEsELAAgADAEQARFBDUEQgQ4BD8EOARHBD0EPgQgADcEMARIBDgEQgRLBCAAMgQgAD8E QQQ4BEUEOAQ6BEMEIAA4BCAAMgQgAD8EQAQ+BEYENQRBBEEENQQgAEMEPARBBEIEMgQ1BD0EPQQ+ BDMEPgQgAEEEPgQ3BDUEQARGBDAEPQQ4BE8EIAAyBDgENAQ9BEsEIAA6BDAEOgQgADMEPgQ7BD4E MwRABDAEPAQ8BDAEIAA+BDoEQARDBDYEMAROBEkENQQzBD4EIAA2BDgEMgQ+BDMEPgQgADwEOARA BDAEIAAyBCAAPQQwBEgENQQ8BCAAQQQ1BEAENARGBDUELgAgAB0EMARBBCAAPgQ6BEAEQwQ2BDAE TgRCBCAAPgQzBEAEPgQ8BD0ESwQ1BCAAPAQ9BD4ENgQ1BEEEQgQyBDAEIAA7BE4ENAQ1BDkEIAA4 BCAARwRDBDIEQQRCBDIEPgQgADoEMAQ2BDQEPgQzBD4EIAA0BEAEQwQzBD4EMwQ+BCAARwQ1BDsE PgQyBDUEOgQwBCgATQQ8BD8EMARCBDgETwQpACAAPwQ+BEAEPgQ2BDQEMAQ1BEIEIABBBDsEPgQ2 BD0EQwROBCAAMwQwBDwEPARDBCAATQQ8BD4ERgQ4BDkELAAgADoEPgRCBD4EQARLBDUEIAA9BDAE OgQ7BDAENARLBDIEMAROBEIEQQRPBCAANARABEMEMwQgAD0EMAQgADQEQARDBDMEMAQgADgEIAA9 BDAEIABNBDwEPgRGBDgEOAQgAD4EQgQgADQEQARDBDMEOARFBCAAOARBBEIEPgRHBD0EOAQ6BD4E MgQsACAAQQQ+BDEEQQRCBDIENQQ9BD0EPgQzBD4EIABBBDAEPAQ+BEcEQwQyBEEEQgQyBDgETwQg ADgELAAgAEcENQRABDUENwQgAD8EQAQ4BDcEPARDBCAAQQQ+BDIENQRBBEIEOAQsACAATQRCBDgE IAAyBEEENQQgAE0EQgQ4BCAATQQ8BD4ERgQ4BDgEIABABDAEQQQ/BD4ENwQ9BDAETgRCBEEETwQg ADIEIAAyBDgENAQ1BCAAPgQ/BEAENQQ0BDUEOwRRBD0EPQQ+BDkEIAA6BDAEQARCBDgEPQRLBC4A IAAaBDAEQARCBDgEPQRDBCAANAQwBDsETARIBDUEIAA8BD4ENgQ9BD4EIAA+BDEEQAQwBDEEPgRC BDAEQgRMBDoAIABEBDgEOwRMBEIEQAQsACAAPQQwBEEEQgRABD4EOQQ6BDAEIABHBDUEQgQ6BD4E QQRCBDgEIAA4BCAAPwQ+BDgEQQQ6BCAAPgQxBEkENQQzBD4EIABBBCAAMAQxBEEEQgRABDAEOgRC BD0EPgQtADsEPgQzBDgERwQ1BEEEOgQ4BDwEIAA3BD0EMAQ9BDgENQQ8BC4AIAAtBDwEPgRGBDgE OAQsACAAQQQ+BD8EQAQ+BDIEPgQ2BDQEMAROBEkEOAQ1BCAANwQ9BDAEPQQ4BDUELAAgADwENQQ0 BDgEQgQwBEIEOAQyBD0EPgQgAEEEPgRHBDUEQgQwBE4EQgRBBE8EIABBBD4EIABBBEIEQARDBDoE QgRDBEAEPgQ5BCAAPAQ4BEAEMAQgADIEIABBBDIEPgQ1BDwEIAA8BD0EPgQzBD4EPgQxBEAEMAQ3 BDgEOAQgADgEIAA0BDAETgRCBCAAQQQ+BEEEQgQ+BE8EPQQ4BDUEIAAxBDsEOAQ3BD4EQQRCBDgE IAA4BCAANQQ0BDgEPQRBBEIEMgQwBCAARwRDBDIEQQRCBDIEMAQsACAAPARLBEEEOwQ4BCAAOAQg ADgEQQRCBDgEPQRLBCwAIAAzBDAEQAQ8BD4EPQQ4BEcEPQQ+BEEEQgRMBE4ELAAgADcEMAQyBDgE QQRPBEkENQQ5BCAAPgRCBCAANARDBEUEMAQsACAANQQzBD4EIAA+BDEESQQ1BDkEIABBBDgEOwQ+ BDkEIAA4BCAAQQQwBDwESwQ8BDgEIABBBDsEMAQxBEsEPAQ4BCAANQQzBD4EIAA6BD4EPAQ/BD4E PQQ1BD0EQgQwBDwEOAQsACAAQgQwBDoEOAQ8BDgEIAA6BDAEOgQsACAAPQQwBD8EQAQ4BDwENQRA BCwAIAA0BDAEMgQ7BDUEPQQ4BDUEIABBBD4EIABBBEIEPgRABD4EPQRLBCAAQQQ7BDAEMQQ+BDME PgQgAEIENQQ7BDAELAAgAD4EQgRBBEMEQgRBBEIEMgQ4BDUEIAA/BD4ENwQ9BDAEPQQ4BE8EIAA6 BDAEOgQgADEEMAQ3BEsEIAA0BDsETwQgAEAEMAQ3BDIEOARCBDgETwQgADgEIAAxBDUEQQQ/BD4E OgQ+BDkEQQRCBDIEPgQgAD4EMQRKBDUEOgRCBDgEMgQ9BD4ENQQgADgEOwQ4BCAAMQQ+BDsENQQ3 BD0ENQQ9BD0EPgQ1BC4AIAAhBEIEQAQwBEUEIAA4BCAAQQRCBEsENAQgADIESwRABDAESQQ1BD0E SwQgAEEEPwQ1BEYEOAQwBDsETAQ9BD4EIAA0BDsETwQgAEAEMAQxBDAELAAgAEcEQgQ+BDEESwQg ADcEMAQzBDsEQwRIBDgEQgRMBCAAMQQ+BDsETAQuACAAGARFBCAAMgQgAEEEMgQ+BE4EIAA+BEcE NQRABDUENARMBCAAMwQ7BEMESAQ4BEIEIAA7BD4ENgRMBC4AIAAhBDIEPgQxBD4ENAQ9BEsEOQQg AEcENQQ7BD4EMgQ1BDoEIAA9BDUEIABHBEMEMgRBBEIEMgRDBDUEQgQgAEIEMAQ6BDgENQQgAE0E PAQ+BEYEOAQ4BCwAIABBBDsEQwRHBDAEOQQ9BD4EIAAyBEEEQgRABDUEQgQ4BDIESAQ4BEEETAQg AEEEIAA4BEUEIAA/BEAEPgQyBD4EOgQwBEYEOAQ1BDkELAAgADAEIAAyBEEENQQzBDQEMAQgAEcE QwQyBEEEQgQyBEMENQRCBCwAIAA1BEEEQgRMBCAAOwQ4BCAARwRCBD4ELQBCBD4ELAAgAEcEQgQ+ BCAAPAQ+BDYENQRCBCAAPwRABDgERwQ4BD0EOARCBEwEIABBBEIEQAQwBEUEIAA4BCAAQQRCBEsE NAQgADgELAAgADUEQQQ7BDgEIAA1BEEEQgRMBCwAIAA8BDUEPQRPBDUEQgQgADwEOARABCAAMgQg AD0EMAQ/BEAEMAQyBDsENQQ9BDgEOAQsACAAMwQ0BDUEIAA4BEUEIAA9BDUEQgQgADgEOwQ4BCAA RQQ+BEIETwQgADEESwQgAD0ENQQgADIEQQQ1BCAAPgQ0BD0EPgQ3BD0EMARHBD0EPgQuACAAIgQw BDoEIABNBDwEPgRGBDgEOAQgAD0EMAQzBEAEQwQ2BDAETgRCBCAANwQ0BD4EQAQ+BDIEPgQzBD4E IABHBDUEOwQ+BDIENQQ6BDAEIAA9BDAEPAQ9BD4EMwQ+BCAAPAQ1BD0ETARIBDUELAAgAEcENQQ8 BCAAMQQ+BDsETAQ9BD4EMwQ+BCwAIAA3BDAEIABBBEcENQRCBCAAPwRABDAEMgQ4BDsETAQ9BEsE RQQgADEEMAQ7BDAEPQRBBDAEIAAcIE8EQAQ6BD4EQQRCBDgEHSAgADIESwRBBD4EOgQ+BDgEPQRE BD4EQAQ8BDAEQgQ4BDIEPQQ+BDMEPgQgADcEPQQwBD0EOARPBCwAIAAyBEsEQQQ+BDoEPgQzBD4E IAAcIEAEMAQ3BEAENQRIBDUEPQQ4BE8EHSAgADgEIAA/BD4EOwQ9BD4ERgQ1BD0EPQQ+BDMEPgQg ADIEPgRBBD8EQAQ4BE8EQgQ4BE8EIAA4BEEEQgQ4BD0ESwQuACAAIgQwBDoEIAA2BDUEIAA6BDAE OgQgAEMEPAQgAEEEOAQ9BEIENQQ3BDgEQARDBDUEQgQgAEAEMARGBDgEPgQ9BDAEOwRMBD0EPgQ1 BCAANwQ9BDAEPQQ4BDUEIABHBDUEQAQ1BDcEIAA/BEAEOAQ3BDwEQwQgADIEPQRDBEIEQAQ1BD0E PQQ1BDMEPgQgAD8EPgRABE8ENAQ6BDAELAAgAEEEPgQyBDUEQQRCBEwELAAgADoEMAQ6BCAAQQRC BEAEQwQ6BEIEQwRABDAELAAgADMENQQ9BDUEQgQ4BEcENQRBBDoEOAQgADgEIAA4BEEEQgQ+BEAE OARHBDUEQQQ6BDgEIAA+BDEEQwRBBDsEPgQyBDsENQQ9BD0EMARPBCAAOAQgADIEOgQ7BE4ERwRR BD0EPQQwBE8EIAAyBCAAQQQ+BDcEPQQwBD0EOAQ1BCwAIAA6BDAEOgQgAEEEOwQ+BDYEPQQwBE8E IAA/BEAEOAQ3BDwEMAQsACAANwQwBDQEMARRBEIEIABEBD4EQAQ8BDAEQgQgAD8EPgQ7BEMERwQ1 BD0EOARPBCAAOAQ9BEQEPgRABDwEMARGBDgEOAQgAEEENQRABDQERgQwBCAAOAQgAD8EPgQ0BDAE NQRCBCAATQRCBEMEIAA4BD0ERAQ+BEAEPAQwBEYEOAROBCAAMgQgAEEEPgQ3BD0EMAQ9BDgENQQg ADIEIAAyBDgENAQ1BCAAQQQ7BD4ENgQ9BEsERQQgAEcEQwQyBEEEQgQyBCAAOAQgAE0EPAQ+BEYE OAQ5BC4AIAAiBDAEOgQwBE8EIABBBDsEPgQ2BD0EPgRBBEIETAQgAD8EPgQ3BD0EMAQ9BDgETwQg ADUEQQRCBEwEIABBBDsENQQ0BEEEQgQyBDgENQQgAEEEOwQ+BDYEPQQ+BEEEQgQ4BCAAPAQ4BEAE PgRDBEEEQgRABD4EOQRBBEIEMgQwBCAAOAQgAD0EMAQ7BDgERwQ4BE8EIAA3BD0EMAQ9BDgETwQs ACAAOgQ+BEIEPgRABD4ENQQgAEEEOwQ+BDYEPQQ+BCAAOAQ7BDgEIAA9BDUEMgQ+BDcEPAQ+BDYE PQQ+BCAAPwQ+BDsEQwRHBDgEQgRMBCAAQAQwBEYEOAQ+BD0EMAQ7BEwEPQRLBDwEIAA7BD4EMwQ4 BEcENQRBBDoEOAQ8BCAAMgRLBDIEPgQ0BD4EPAQoADoEMAQ6BCAAMQQwBDcEPgQyBEsENQQgAD8E MARABDAENAQ4BDMEPARLBCwAIAA3BDAEOgQ+BD0ESwQsACAAMAQ6BEEEOAQ+BDwESwQgADgEIAA9 BDUEPgQ/BEAENQQ0BDUEOwQ4BDwESwQ1BCAATQQ7BDUEPAQ1BD0EQgRLBCAAQgQ1BD4EQAQ4BDkE IAA4BCAAPwQwBEAEMAQ0BD4EOgRBBEsELAAgAEEEIAA9BDgEPAQ4BCAAQQQyBE8ENwQwBD0EPQRL BDUEKQAsACAAPQQ+BCAANQRRBCwAIABBBDsEPgQ2BD0EPgRBBEIEOAQsACAAPwRABDUEPgQ0BD4E OwQ1BD0EOAQ1BC0AIAA9BDUEPgQxBEUEPgQ0BDgEPAQ+BDUEIABDBEEEOwQ+BDIEOAQ1BCAAPAQw BDoEQQQ4BDwEMAQ7BEwEPQQ+BDMEPgQgAEEEMQQ7BDgENgQ1BD0EOARPBCAAQQQgAD0ENQRDBDsE PgQyBDgEPAQ+BDkELAAgAD0EPgQgADcEMARCBD4EIAA4BDwENQQ9BD0EPgQgAEIEPgQ5BCAAQQQw BDwEPgQ5BCAAPQQwBEEEQgQ+BE8ESQQ1BDkEIAAwBDEEQQQ+BDsETgRCBD0EPgQ5BCAAOARBBEIE OAQ9BD4EOQQuACAALQRCBD4EIABBBD4ERwQ1BEIEMAQ1BEIEQQRPBCAAQQQgADIEPgQ3BDcEQAQ1 BD0EOARPBDwEOAQgADwEPQQ+BDMEOARFBCAAQAQ1BDsEOAQzBDgEOQQgADIEIABHBDAEQQRCBDgE IAAyBDAENgQ9BD4EQQRCBDgEIAA+BDEEQAQwBEkENQQ9BDgETwQgADoEIAA4BD0EQgQ1BDsEOwQ1 BDoEQgRDBCwAIABBBD4EMgQ1BEEEQgQ4BCwAIAA8BDUENAQ4BEIEMARGBDgETwQ8BCAAOAQsACAA OgQ+BD0ENQRHBD0EPgQgADYENQQsACAAOgQgAEEEMgQ+BDgEPAQgADQEQwRFBD4EMgQ9BEsEPAQg AEEEOAQ7BDAEPAQgADQEOwRPBCAAPwQ+BDcEPQQwBD0EOARPBCAAEQQ+BDMEMAQgADgEIAA4BEEE QgQ4BD0ESwQuACAAHQQ1BCAAPQRDBDYEPQQ+BCAAPAQ9BD4EMwQ+BCAANAQ+BDoEMAQ3BEsEMgQw BEIETAQgAEEEOwQ+BDIEMAQ8BDgEIAA4BCAAQwRCBDIENQRABDYENAQ1BD0EOARPBDwEOAQgAEIE PgQsACAARwRCBD4EIAAyBDgENAQ9BD4EIAA4BCAAPwQ+BD0ETwRCBD0EPgQgADgEPQRCBEMEOARC BDgEMgQ9BD4ELAAgAEcEQgQ+BCAAPQQwBDcESwQyBDAENQRCBEEETwQsACAAIgA/BD4EIABBBD4E MgQ1BEEEQgQ4BCIALgAgABoEMAQ6BCAAOAQgADwEPQQ+BDMEPgQgAD0ENQQgAD8EQAQ4BEUEPgQ0 BDgEQgRBBE8EIAAiAEMEQQQ/BD4EOgQwBDgEMgQwBEIETAQiACAAQQQ+BDIENQRBBEIETAQsACAA NQRBBDsEOAQgAEMEPAQ+BDwEIAA4BCAAPwQ+BDwESwRBBDsEMAQ8BDgEIAAyBEEENQQgAEcEOARB BEIEPgQuACAAHQQ+BCAAQgQ+BDsETAQ6BD4EIAAxBD4EOwRMBD0EPgQ5BCAAOAQgADgEQQQ6BDAE OwQ1BEcENQQ9BD0ESwQ5BCAAPwRABDgEQAQ+BDQEPgQ5BCAAPAQ+BDYENQRCBCAAPwQ+BDQEMAQy BDgEQgRMBCAAQQQyBD4ETgQgAEEEPgQyBDUEQQRCBEwELAAgAD8EQAQ4BD0EOAQ8BDAETwQgAEAE NQRIBDUEPQQ4BDUELAAgAD4EMQQgAD4ERwQ1BEAENQQ0BD0EPgQ5BCAANgQ1BEAEQgQyBDUEIABA BDAENAQ4BCAAMgQ7BDAEQQRCBDgELgAgABcENAQ+BEAEPgQyBEwENQQgADgEIAA/BD4EOwQ9BD4E RgQ1BD0EPQQ+BDUEIABEBEMEPQQ6BEYEOAQ+BD0EOARABD4EMgQwBD0EOAQ1BCAAPwQ7BD4EQgQ9 BD4EMwQ+BCwAIAA8BDAEQgQ1BEAEOAQwBDsETAQ9BD4EMwQ+BCwAIAA3BDUEPAQ9BD4EMwQ+BCAA QwQ8BDAEIAA4BCAAQgQ+BD0EOgQ+BDMEPgQsACAAMARBBEIEQAQwBDsETAQ9BD4EMwQ+BCAAQQQ1 BEAENARGBDAEIAA0BD4EPwQ+BDsEPQRPBE4EQgRBBE8EIAAiADEEOwQwBDMEPgQ5BCAATwRABD4E QQRCBEwETgQiACAAMgRBBDUEPwRABD4EPQQ4BDoEMAROBEkENQQzBD4EIAAiADQEQwRFBDAEIgAs ACAAOgQ+BD0ERgQ1BD0EQgRABDAEQgQwBCAAPQQ1BDIEOAQ0BDgEPAQ+BDkEIABNBD0ENQRABDME OAQ4BCwAIAA+BDMEPQRRBDwEIABBBDgEOwQgACAEPgQ0BDAEIABABDAEQQQ/BDAEOwRPBE4ESQQ1 BDMEPgQgADgENARDBEkEOARFBCwAIAA+BDEENgQ4BDMEMAROBEkENQQzBD4EIAA/BDAENARIBDgE RQQsACAAQQQyBDUEQgQ+BDwEIAAyBCAAOgQ+BD0ERgQ1BCAAQgQ+BD0EPQQ1BDsETwQgADIENQQ0 BEMESQQ1BDMEPgQgAEcENQQ7BD4EMgQ1BDoEMAQgADoEIAA4BEEEQgQ4BD0ENQQsACAAQQQyBD4E OAQ8BDgEIAAiAEEEOAQ7BDAEPAQ4BCIAOgAgADIEPQQ4BDwEMAQ9BDgENQQ8BCAAOAQgAEEEOAQ7 BD4EOQQgADIEPgQ7BDgELAAgAEEEPAQ4BEAENQQ9BDgENQQ8BCAAOAQgADwEOAQ7BD4EQQQ1BEAE NAQ4BDUEPAQsACAAPgRBBEIEQAQ+BEIEPgQ5BCAAQQQ+BDcEPQQwBD0EOARPBCwAIAA+BEEEPgQ3 BD0EMAQ9BD0EPgRBBEIETAROBCAAOAQgAEEEPgRBBEIEQAQwBDQEMAQ9BDgENQQ8BCwAIABCBDUE QAQ/BDUEPQQ4BDUEPAQgADgEIAAyBEsEPQQ+BEEEOwQ4BDIEPgRBBEIETAROBCwAIABBBD8EPgQ6 BD4EOQRBBEIEMgQ4BDUEPAQgADgEIAA/BDAERgQ4BEQEOAQ3BDwEPgQ8BCAAPwQ+BCAAPgRCBD0E PgRIBDUEPQQ4BE4EIAA6BCAAPgQxBDwEMAQ9BEMEQgRLBDwEIAA9BDUEPQQwBDIEOARBBEIETARO BCwAIABHBEMEMgRBBEIEMgQ+BDwEIAA/BEAEMAQyBDgEOwRMBD0EPgRBBEIEOAQsACAAQwQyBDUE QAQ1BD0EPQQ+BEEEQgQ4BCwAIAAzBDAEQAQ8BD4EPQQ4BEcEPQQ+BEEEQgQ4BCAAOAQgAD8EPgQ7 BD0EPgRCBEsEIABBBD4EPgRCBDIENQRCBEEEQgQyBDgETwQgADwEOARABEMELgAgABoEQAQwBEEE PgRCBDAEIAA4BCAAMwQwBEAEPAQ+BD0EOARPBCAAPQQwBEEEQgQ+BE8ESQQ1BDMEPgQgACcENQQ7 BD4EMgQ1BDoEMAQsACAAMgQgADIESwRBBEgENQQ5BCAAQQRCBDUEPwQ1BD0EOAQgAD0EQAQwBDIE QQRCBDIENQQ9BD0EPgQzBD4ELAAgAEEEOAQ7BEwEPQQ+BDMEPgQgADQEQwRFBD4EPAQgADgEIABB BEIEQAQ1BDwEOwQ1BD0EOAQ1BCAAOgQgADEENQRBBDoEPgQ9BDUERwQ9BD4EIABDBEEEOwQ+BDIE PQQ+BDwEQwQgADgENAQ1BDAEOwRDBCAAQgQwBDoEPgQ5BCAAOgRABDAEQQQ+BEIESwQsACAAOgQw BDoEIAA/BDAEQAQwBDQEPgQ6BEEEMAQ7BEwEPQQ+BDUEIAA/BEAENQQ+BDQEPgQ7BDUEPQQ4BDUE IAA0BEAEQwQzBD4EMwQ+BCwAIAAxBD4EOwQ1BDUEIAAzBEAEPgQ3BD0EPgQzBD4ELAAgAD8EMARA BDAENAQ+BDoEQQQwBCAAOARBBEIEOAQ9BD0EPgRBBEIEOAQsACAANQRBBEIETAQgAD4ERwQ1BEAE NQQ0BD0EPgQ1BCAAPwRABDgEMQQ7BDgENgQ1BD0EPQQ+BDUEIABABDUESAQ1BD0EOAQ1BCAANwQw BDQEMARHBDgEIAA/BD4EOARBBDoEMAQgADAEMQRBBD4EOwROBEIEPQQ+BDkEIAA4BEEEQgQ4BD0E SwQgAEcENQQ7BD4EMgQ1BDoEPgQ8BCwAIABABDAEQQQ6BEAESwRCBDgETgQgADUEUQQgADMEOwRD BDEEOAQ9BD0EPgQ5BCAAMwQwBEAEPAQ+BD0EOAQ4BC4AIAAnBDUEOwQ+BDIENQRHBDUEQQQ6BDAE TwQgADYENQQgAD8EQAQ+BEIEOAQyBD4EQAQ1BEcEOAQyBD4EQQRCBEwELAAgADIEIABBBDIEPgRO BCAAPgRHBDUEQAQ1BDQETAQsACAAPwRBBDgERQQ+BDsEPgQzBDgERwQ1BEEEOgQ4BCAAPwQ+BDQE MAQyBDsETwQ1BEIEIAAnBDUEOwQ+BDIENQQ6BDAEIAAyBCAAQQQwBDwEPgQ8BCAAQQQ1BDEENQQg ADgEIAAxBDsEPgQ6BDgEQARDBDUEQgQgADUEMwQ+BCAARwRDBDIEQQRCBDIEPgQgAD8EQAQ1BDoE QAQwBEEEPQQ+BDMEPgQsACAARwRCBD4EIAA1BEkENQQgADQEMAQ7BEwESAQ1BCAAMgQ1BDQENQRC BCAAPgQ0BD0EPgQyBEAENQQ8BDUEPQQ9BD4EIAA6BCAAMgQ+BDkEPQQ1BCAAQQQgAEEEMAQ8BDgE PAQgAEEEPgQxBD4EOQQsACAAQAQwBDEEQQQ6BD4EPARDBCAAPwQ+BDoEOwQ+BD0ENQQ9BDgETgQg AEEEMgQ+BDUEOQQgADsEOARHBD0EPgRBBEIEOAQsACAAQAQwBEYEOAQ+BD0EMAQ7BEwEPQQ+BCAA PgRCBEAEOARGBDAETgRJBDUEOQQgADgEQQRCBDgEPQRDBCAAOAQgADYENQRABEIEMgQwBDwEIABB BDIEPgQ1BE4EIAA/BEAEOARABD4ENAQ+BE4EIAAyBCAANQRRBCwAIAA7BDgERwQ9BD4EQQRCBDgE LAAgAEcENQRBBEIETAQuACAAEwRABDAEPQQ4BCAAOAQgAD8ENQRABDUERQQ+BDQELAAgAD4EQgRA BDAENgQwBE4ESQQ4BDUEIABABDAENwQ0BDUEOwQ1BD0EOAQ1BCAAOARBBEIEOAQ9BEsEIAA4BCAA RwQ1BDsEPgQyBDUEOgQwBCwAIABNBEIEPgQgAEcEQwQyBEEEQgQyBD4EIAA8BDgEQAQwBCwAIABA BD4ENAQ9BD4EMwQ+BCAAPQQwBDwEIAAyBEEENQQ8BDgEIABBBDIEPgQ4BDwEOAQgAEcEMARBBEIE TwQ8BDgELAAgAD0ENQQgADIEOAQ0BDgEPAQ+BDMEPgQgADcEMAQ8BEMEQgQ9BDUEPQQ9BD4EPARD BCAAMgQ3BD4EQARDBCAAOAQgADIEPQRDBEIEQAQ1BD0EPQRPBE8EIAAzBDAEQAQ8BD4EPQQ4BE8E IABHBDUEOwQ+BDIENQQ6BDAELgAgABIEIABGBDUEOwQ+BDwELAAgAE0EQgQwBCAAMwRABDAEPQRM BCAAPAQ1BDYENARDBCAAJwQ1BDsEPgQyBDUEOgQ+BDwEIABBBCAAMQQ+BDsETARIBD4EOQQgADEE QwQ6BDIESwQgADgEIAA4BEEEQgQ4BD0EPgQ5BCwAIAA+BEIEQAQwBDYEMAQ1BEIEIAA/BDUEQAQ1 BEUEPgQ0BCAAPgRCBCAAOwQ2BDgELAAgAD4EMQQ8BDAEPQQwBCAAOAQgADEEPgQ7BDUENwQ9BDUE OQQgADoEIAA/BD4EOARBBDoEQwQgAD8EQAQwBDIENARLBCAAOAQgAEEEPwQwBEEENQQ9BDgETgQu ACAAHgQ9BDAEIAAyBCAAPAQwBEEESARCBDAEMQQwBEUEIAAyBEEENQQzBD4EIAA9BDAESAQ1BDME PgQgAD4EMQRJBDUEQQRCBDIEMAQsACAAOgQwBDoEIABEBEMEPQQ6BEYEOARPBCAAPwQ1BEAENQRF BD4ENAQwBCAAPgRCBCAARwQ1BEAEPQQ+BDMEPgQgADoEIAAxBDUEOwQ+BDwEQwQsACAANwQwBDoE OwROBEcEMAQ1BEIEQQRPBCAAMgQgADMEMARABDwEPgQ9BDgENwQwBEYEOAQ4BCAAQQQyBD4ENQQz BD4EIAA+BEIEPQQ+BEgENQQ9BDgETwQgADoEIAA8BDgEQARDBCAAOAQgADoEIABBBDUEMQQ1BCAA QQQwBDwEPgQ8BEMELAAgAEAEMAQ3BEAESwQyBDAENQRCBCAAPwQ+BEAEPgRHBD0ESwQ5BCAAOgRA BEMEMwQgAD4EMQRJBDUEQQRCBDIEMAQgADwEPgQ9BD4EPwQ+BDsEOAQ5BCwAIAA0BDAEMgQwBE8E IABCBD4EOwQ/BDUEIABABDUEMAQ7BEwEPQRDBE4EIAA6BDAEQARCBDgEPQRDBCAAQgQ+BDMEPgQs ACAARwRCBD4EIAA0BDUEOwQwBDUEQgQgAE0EOwQ4BEIEMAQsACAAPwQ+BDQERwQ4BD0ETwQ1BEIE IAA8BD4EPQQ+BD8EPgQ7BDgEOAQgADgEIAA+BDEESgQ1BDQEOAQ9BE8ENQRCBCAAQgQ+BDsEPwRD BCAAOAQgAE0EOwQ4BEIEQwQgADIEIAA8BD4EPQQ+BDsEOARCBDUEIABGBDUEOwQ+BDMEPgQgAD4E MQRJBDUEQQRCBDIEMAQuAA0AIAAfBD4ENwQ9BDAEQgRMBCAAOARBBEIEOAQ9BEMEIAA8BD4ENgQ9 BD4ELAAgAD4EMQRKBDUENAQ4BD0EOAQyBEgEOARBBEwEIABBBCAAPAQ4BEAEPgQ8BCwAIAA4BCAA NAQ7BE8EIABNBEIEPgQzBD4EIAA9BEMENgQ9BD4EIAA1BDMEPgQgAD8EPgQ7BE4EMQQ4BEIETAQt ACAAMgQ+BDkEQgQ4BCAAMgQgAEEEPgRBBEIEPgRPBD0EOAQ1BCAAMQQ1BEEEOgQ+BD0ENQRHBD0E PgQzBD4EIAAzBDAEQAQ8BD4EPQQ4BEcEPQQ+BDMEPgQgADEESwRCBDgETwQgAEEEIAA9BDgEPAQg ADgEIABBBCAAQQQwBDwEOAQ8BCAAQQQ+BDEEPgQ5BC4AIAASBCAAOgQwBDoEPgQ8BC0AQgQ+BCAA QQQ8BEsEQQQ7BDUEIABNBEIEPgQgADcEPQQwBEcEOARCBCAAPgQxBEoENQQ0BDgEPQQ1BD0EOAQ1 BCAAQQQgAD0EOAQ8BCAANARDBEgEMAQ8BDgELAAgADIENwQwBDgEPAQ9BEsEOQQgADoEMARCBDAE OwQ1BD8EQQQ4BEEEIAA8BDgEQAQwBCAAOAQgAEcENQQ7BD4EMgQ1BDoEMAQgAD0EMAQgADIEQQQ1 BEUEIABDBEAEPgQyBD0ETwRFBCAAMgQ+BEEEPwRABDgETwRCBDgETwQgADgEIABDBD8EQAQwBDIE OwQ1BD0EOARPBC4AIAARBDUENwQ0BEMESAQ9BEsENQQgADgEIABFBD4EOwQ+BDQEPQRLBDUEIAA7 BE4ENAQ4BCwAIABABDAEMgQ9BD4EIAA6BDAEOgQgADgEIABBBDgEOwRMBD0ESwQ1BCAANARDBEUE PgQ8BCwAIAA9BD4EIAAxBDUENwQ9BEAEMAQyBEEEQgQyBDUEPQQ9BEsENQQsACAAOARBBEIEOAQ9 BEMEIAA9BDUEIAAyBDgENARPBEIEIAA4BCAAPgRBBEIEMAROBEIEQQRPBCAAPgQxBDwEMAQ9BEME QgRLBCAAMQQ1BEEEOgQ+BD0ENQRHBD0ESwQ8BDgEIAA+BEIEQAQwBDYENQQ9BDgETwQ8BDgEIAA1 BFEEIABCBDUEPQQ1BDkEIAAyBCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQsACAAMgRLBDEESwQyBDAE TwQgADgENwQgADoEMARABEIEOAQ9BEsEIAA2BDgENwQ9BDgELgAgAB4EPQQ4BCAAQQRCBDAEPQQ+ BDIETwRCBEEETwQgAEcEMARBBEIETAROBCAAPgQxBEkENQRBBEIEMgQwBCwAIAA/BD4EQAQwBDEE PgRCBDgEMgRIBDUEMwQ+BCAAQQQwBDwEPgQzBD4EIABBBDUEMQRPBC4AIAAfBEAEOAQgAE0EQgQ+ BDwEIAA6BDAEOgQgADgEIABABDAEMQRLBCAAQQQgACIAPwQ+BDEENQQ2BDQENQQ9BD0EPgQ5BCAA PwRABDgEQAQ+BDQEPgQ5BCIALAAgAE0EOwQ4BEIEMAQgADgEQQRCBDgEPQRLBCAAPQQ1BCAANAQ+ BEEEQgQ4BDMEMAQ1BEIELAAgAEIEMAQ6BCAAOgQwBDoEIAA/BD4EQAQwBDEEPgRJBDAETwQgADQE QARDBDMEOARFBCwAIABCBDUEQARPBDUEQgQgAEEEPgQyBDUEQQRCBEwEIAA4BCwAIAAyBCAAOgQ+ BD0ENQRHBD0EPgQ8BCAAOARCBD4EMwQ1BCwAIABDBDwEIAA4BCAAQQQ4BDsESwQgADQEQwRFBDAE LAAgAEEEMgQ+BE4EIAAxBDUEQQRBBDwENQRABEIEPQRDBE4EIAAfBCAEGAQgBB4EFAQjBC4AIAAh BD4EMQRBBEIEMgQ1BD0EPQQwBE8EIAA/BD4EQAQwBDEEPgRJBDUEPQQ9BD4EQQRCBEwEIABHBDUE OwQ+BDIENQRHBDUEQQQ6BD4EMwQ+BCAAPgQxBEkENQRBBEIEMgQwBCAAMgRLBEUEPgQ0BDgEQgQs ACAAQgQwBDoEOAQ8BCAAPgQxBEAEMAQ3BD4EPAQsACAAPQQwBCAAPwQ1BEAEMgRLBDkEIAA/BDsE MAQ9BCAAMgQgADoEMARABEIEOAQ9BDUEIAAxBEsEQgQ4BE8EIAA2BDgEMgQ+BDkEIAA/BEAEOARA BD4ENARLBCAAOAQgADwEOARABDAELgAgAB4EPQQwBCAAQQRCBDAEMgQ4BEIEIAAyBD4EPwRABD4E QQQgAD4EIAAyBD4ENwQ8BD4ENgQ9BD4EQQRCBDgEIABBBEMESQQ1BEEEQgQyBD4EMgQwBD0EOARP BCAAOAQgAEAEPgQ0BEEEQgQyBDAEIABBBCAAMQQ1BEEEOgQ+BD0ENQRHBD0EPgRBBEIETAROBCAA OARBBEIEOAQ9BEsEIAA4BDsEOAQgAEMENAQwBDsENQQ9BDgEOAQgAD4EQgQgAD0ENQRRBCAAOAQg ADEESwRCBDgETwQgADoEMAQ6BCAAQgQwBDoEPgQyBD4EMwQ+BC4AIAAiBD4EIAA1BEEEQgRMBCwA IAAyBEsENgQ4BDIEMAQ9BDgENQQgADgEIAA/BEAEOARABD4ENAQwBCAAOARBBEIEOAQ9BEsELAAg ADAEIAAyBDwENQRBBEIENQQgAEEEIABCBDUEPAQgADgEIAA4BEEEQgQ4BD0EPQQ+BDUEIABDBEEE QgRABD4EOQRBBEIEMgQ+BCAAPwRABDgEQAQ+BDQESwQgADcEMAQyBDgEQQRPBEIEIABCBD4EOwRM BDoEPgQgAD4EQgQgAEcENQQ7BD4EMgQ1BDoEMAQgADgEIAA/BD4EQgQ1BEAETwQgADgEPAQgAEEE MgQ+BDUEOQQgAD4EMQRKBDUEOgRCBDgEMgQ9BD4EOQQsACAAOARBBEIEOAQ9BD0EPgQ5BCAAOAQg AEEEMgQ+BDEEPgQ0BD0EPgQ5BCAAPwRABDgEQAQ+BDQESwQgADIENQQ0BFEEQgQgADoEIAAyBEsE PwQwBDQENQQ9BDgETgQgADgENwQgADEESwRCBDgETwQgADgEIAA6BCAAQQQ8BDUEQARCBDgELAAg AD4EMQRABDAEQgQ9BD4EIABCBD4EPARDBCwAIAA6BDAEOgQgAD4EMQRKBDUEOgRCBDgEMgQ9BD4E QQRCBEwEIAA4BEEEQgQ4BD0ESwQgADIEIAA/BEAEOARABD4ENAQ1BCAAPwRABD4ETwQyBDgEOwQw BEEETAQgADIEIAAyBDgENAQ1BCAANQQzBD4ELAAgAEcENQQ7BD4EMgQ1BDoEMAQsACAAQAQ+BDYE NAQ1BD0EOAQ4BC4AIAASBCAAPgRCBDsEOARHBDgENQQgAD4EQgQgADYEOAQyBD4EQgQ9BD4EMwQ+ BCwAIAA/BEAEOARABD4ENAQwBCAAOgQ+BEIEPgRABD4EMwQ+BCAAPQQ1BCAAPwRABDUENARDBEEE PAQwBEIEQAQ4BDIEMAQ1BEIEIABBBDAEPAQ+BEEEPgRFBEAEMAQ9BDUEPQQ4BDUEIAA+BEIEIAA6 BDAEQgQwBEEEQgRABD4ERAQgADgEIABHBEwETwQgADYEOAQ3BD0ETAQgADcEMAQyBDgEQQQ4BEIE IAA+BEIEIABBBEIENQQ/BDUEPQQ4BCAAPgRCBEAEMAQ2BDUEPQQ4BE8EIAAyBCAAPQQ1BDkEIAA4 BEEEQgQ4BD0ESwQsACAARwQ1BDsEPgQyBDUEOgQgADIEQgQ+BEAEOARHBD0EPgQgAD4EQgRABDAE NgQwBDUEQgQgADgEQQRCBDgEPQRDBCwAIAA/BD4EPQRPBEIEQwROBCAAQwQ8BD4EPAQgADgEIABB BDUEQAQ0BEYENQQ8BCAAOAQgAD8EQAQ+BDQEOwQ1BDIEMAQ1BEIEIABBBDIEPgROBCAANgQ4BDcE PQRMBCwAIAAxBDUEQQQ6BD4EPQQ1BEcEPQQ+BCAAPwQ+BDQENAQ1BEAENgQ4BDIEMARPBCAAQQQy BD4ETgQgAD8EQAQ4BEAEPgQ0BEMEIAA3BDAEIABBBEcENQRCBCAAOARBBEIEOAQ9BD0EPgQzBD4E IAA3BD0EMAQ9BDgETwQgADgEIAA/BD4ENAQwBDIEOwRPBE8EIAA+BEEEQgQwBDIESARDBE4EQQRP BCAAPAQ4BD0EOAQ8BDAEOwRMBD0EQwROBCAAPQQ1BDgEQQRCBDgEPQQ9BD4EQQRCBEwEIABBBEME MQRKBDUEOgRCBDgEMgQ9BD4EMwQ+BCAANwQ9BDAEPQQ4BE8EIAA/BD4EQQRCBD4ETwQ9BD0ESwQ8 BCAAQgRABEMENAQ+BDwELgAgACIEMAQ6BCwAIAA9BDAEOgQwBD8EOwQ4BDIEMARPBCAAOARBBEIE OAQ9BD0EPgQ1BCAANwQ9BDAEPQQ4BDUEIAA4BCAAPwRABDgEMQQ7BDgENgQwBE8EQQRMBCAAOgQg ADgEQQRCBDgEPQQ1BCwAIAA+BD0EIAA/BEAEOAQxBDsEOAQ2BDAENQRCBEEETwQgADoEIABBBDIE PgQ1BDkEIAA4BEEEQgQ4BD0EPQQ+BDkEIAAxBDUEQQRBBDwENQRABEIEPQQ+BDkEIAA/BEAEOARA BD4ENAQ1BC4AIAAtBEIEPgRCBCAAPwRABD4ERgQ1BEEEQQQgADQEPgQ7BDYENQQ9BCAAMQRLBEIE TAQgAEEEMgQ+BDEEPgQ0BD0ESwQ8BCwAIABCBDAEOgQgADoEMAQ6BCAAOAQ9BDAERwQ1BCAAPwQ+ BDsEQwRHBDUEPQQ4BDUEIAA4BCAAQQQ4BD0EQgQ1BDcEIAA3BD0EMAQ9BDgETwQgADQENQQzBEAE MAQ0BDgEQARDBE4EQgQgADgEIABHBDUEOwQ+BDIENQQ6BCAAPAQ1BD0ETwQ1BEIEIABBBDIEPgRO BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgRDBE4EIAA/BEAEOARABD4ENARDBCwAIAA/BEAENQQyBEAE MARJBDAETwRBBEwEIAAyBCAAQAQwBDEEMAQsACAAOAQgAD4EMQRABDUEQgQwBDUEQgQgADIEIAA4 BEIEPgQzBDUEIABBBDwENQRABEIETAQuACAAHgRCBDIENQRCBCAAPQQwBCAAMgQ+BD8EQAQ+BEEE IAA0BD4EQQRCBDgENgQ1BD0EOARPBCAARwQ1BDsEPgQyBDUEOgQ+BDwEIAA4BEEEQgQ4BD0ESwQg AD8EQAQ4BDIEPgQ0BDgEQgQgADoEIAA9BDUEPgQxBEUEPgQ0BDgEPAQ+BEEEQgQ4BCAANwQwBEkE OARCBEsEIAA4BCAAQQQ+BEUEQAQwBD0ENQQ9BDgETwQgADgEPAQgAEEEMgQ+BDUEOQQgAEcENQQ7 BD4EMgQ1BEcENQRBBDoEPgQ5BCAAPwRABDgEQAQ+BDQESwQgADgEIAA+BEEEMgQ+BDEEPgQ2BDQE NQQ9BDgETwQgAEEEMgQ+BDUEMwQ+BCAAPgQxBEkENQRBBEIEMgQwBCAAPgRCBCAAMQQ+BDsENQQ3 BD0ENQRCBDIEPgRABD0EPgQzBD4EIABABDAEMQRBBEIEMgQwBCwAIABCBD4EIAA1BEEEQgRMBCAA NwQwBEkEOARCBEsEIAA4BCAAQQQ+BEUEQAQwBD0ENQQ9BDgETwQgAEEEMgQ+BDUEOQQgAD8EQAQ4 BEAEPgQ0BEsEIAAyBCAASAQ4BEAEPgQ6BD4EPAQgAEEEPARLBEEEOwQ1BCwAIAA4BDsEOAQgAD8E QAQ+BEkENQQtACAANwQwBEkEOARCBEsEIABBBDIEPgQ1BDMEPgQgADMEOwQ+BDEEMAQ7BEwEPQQ+ BDMEPgQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQzBD4EIAA3BDQEPgRABD4EMgRMBE8ELgAgAB4E QgQsACAAQQQ+BD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BCwAIAAzBDsEPgQxBDAEOwRMBD0EPgQ5 BCAAMQQ+BDsENQQ3BD0EOAQgADgEOwQ4BCAAMwQ7BD4EMQQwBDsETAQ9BD4EMwQ+BCAAPwQwBEAE MAQ3BDgEQgQwBCwAIABCBDAEOgQgADoEMAQ6BCAAMQQ+BDsENQQ3BD0ETAQgAEEEOwQ+BDYEPQQw BE8ELAAgAEcENQQ7BD4EMgQ1BEcENQRBBDoEMARPBCAAOAQgAD4EMQQ7BDAENAQwBDUEQgQgADIE QQQ1BDwEOAQgAD8EQAQ4BDcEPQQwBDoEMAQ8BDgEIABHBDUEOwQ+BDIENQQ6BDAELAAgADIEIABC BD4EPAQgAEcEOARBBDsENQQgADsEOARHBD0EPgRBBEIETAROBCwAIAA4BD0EQgQ1BDsEOwQ1BDoE QgQ+BDwELAAgAEAEPgRBBEIEPgQ8BCwAIABABDAENwQ8BD0EPgQ2BDUEPQQ4BDUEPAQgADgEIAA/ BEAEPgRHBDgEPAQsACAAPwQwBEAEMAQ3BDgEQgQ4BEAEQwQ1BEIEIAA9BDAEIABHBDUEOwQ+BDIE NQQ6BDUELAAgADQENQQ7BDAETwQgADUEMwQ+BCAAQQQyBD4EOAQ8BCAAQAQwBDEEPgQ8BCwAIAA/ BD4ENgQ4BEAEMARPBCAAQgQ1BDsEPgQgADgEIAA0BEMESARDBC4AIAARBD4EOwQ1BDcEPQRMBCAA PAQ+BDYENQRCBCAAPgRBBD4EMQQ+BCAAQQQ+BDMEOwQwBEEEPgQyBDAEQgRMBEEETwQgAEEEIAA6 BDAEOgQ4BDwEOAQtADsEOAQxBD4EIABBBDIEPgQ5BEEEQgQyBDAEPAQ4BCAAPQQwBEgENQQzBD4E IAA8BDgEQAQwBCwAIABCBDAEOgQ4BDwEOAQgADoEMAQ6BCAAMQQ+BDsETAQsACAAQAQwBEEEPwQw BDQELAAgAEAEMAQ3BEAEQwRIBDUEPQQ4BDUEIAA4BCAAPwRABD4ERwQ4BDUELgAgAB8EQAQ+BEYE NQRBBEEEIAA0BD4EQQRCBDgENgQ1BD0EOARPBCAAOARBBEIEOAQ9BEsEIAAyBD4EIAAyBEAENQQ8 BDUEPQQ4BCAANwQwBDoEOwROBEcEMAQ1BEIEQQRPBCAAMgQgADEEPgRABEwEMQQ1BCAANwQ0BD4E QAQ+BDIEPgQzBD4EIABHBDUEOwQ+BDIENQRHBDUEQQRCBDIEMAQgAD8EQAQ+BEIEOAQyBCAAQQQy BD4ENQQzBD4EIABBBDwENQRABEIEPQQ+BDMEPgQgAEAEMAQxBEEEOgQ+BDMEPgQgAD0EMARHBDAE OwQwBCwAIAA/BEAEPgRCBDgEMgQgADMEPgRABDQESwQ9BDgEIAA4BCAAPgQxBDwEMAQ9BDAELAAg ADYEMAQ0BD0EPgRBBEIEOAQsACAAPQQ1BD0EMAQyBDgEQQRCBDgELAAgAEMEPQRLBD0EOARPBCwA IAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBDgEIAA4BCAAPQQwBEAEOgQ+BEIEOAQ3BDAERgQ4BDgELAAg AEEEOgQ7BD4EPQQ9BD4EQQRCBDgEIAA6BCAAQQRDBDgERgQ4BDQEQwQsACAAQwQxBDgEOQRBBEIE MgQwBDwEIAAxBDUENwQ3BDAESQQ4BEIEPQRLBEUEIAA4BCAANARABEMEMwQ4BEUEIABBBDsEMAQx BD4EQQRCBDUEOQQuACAAFQQ0BDgEPQQwBE8EIAA/BD4EMQQ1BDQEMAQgADIEIABCBDAEOgQ+BDkE IAAxBD4EQARMBDEENQQgADcEMAQ6BDsETgRHBDAENQRCBEEETwQgADIEIABABD4ENgQ0BDUEPQQ4 BDgEIABABDUEMAQ7BEwEPQRLBEUEIABBBDIEPgQxBD4ENAQgADQEOwRPBCAANwQ0BD4EQAQ+BDIE SwRFBCAAOAQgAD4EMwRABDAEPQQ4BEcENQQ9BDgEOQQgADQEOwRPBCAAMQQ+BDsETAQ9BEsERQQs ACAAQgQ+BCAANQRBBEIETAQgADgERQQgACIAPwQ+BEAEMAQxBD4ESQQ1BD0EOAQ4BCIAKAAyBCAA PgQxBDwEMAQ9BD0EPgQ8BCAAPwQ+BD0EOAQ8BDAEPQQ4BDgEKQAsACAAPQQ+BCwAIAAyBCAAOgQ+ BD0ENQRHBD0EPgQ8BCAAOARCBD4EMwQ1BCwAIAAyBCAAOAQ3BDsENQRHBDUEPQQ4BDgELAAgAD8E QAQ4BD4EMQRJBDUEPQQ4BDgEIAA6BCAAOARBBEIEOAQ9BDUEIAA4BCAAMwQwBEAEPAQ+BD0EOAQ3 BDAERgQ4BDgELAAgAEEEPwQwBEEENQQ9BDgEOAQgADgEIAA/BEAEPgRBBDIENQRCBDsENQQ9BDgE OAQgADIEQQQ1BDMEPgQgAD4EMQRJBDUEQQRCBDIEMAQuAA0ADQAgACAAIAAgACAAIAAgAEkAMQQp ACAAHAQ4BEQESwQgADgEIAA4BEEEQgQ+BEAEOARPBA0AIAAhBDsEPgQ2BD0EPgQgAD8ENQRABDUE PgRGBDUEPQQ4BEIETAQgADgEQQRCBD4EQAQ4BEcENQRBBDoEOAQ1BCAANwQ9BDAEPQQ4BE8ELAAg ADoEMAQ6BCAAPwQ+BDQEQQQ/BD4EQARMBDUEIAA0BDsETwQgAD8EPgQ9BDgEPAQwBD0EOARPBCAA QgQ+BDMEPgQsACAAOgQwBDoEIAA8BEsEIAAiAD8EQAQ4BEgEOwQ4BCAAOgQgAEIEMAQ6BD4EOQQg ADYEOAQ3BD0EOAQiACwAIAA6BDAEOgQ4BDUEIAA3BDAEOgQ+BD0ESwQgAEMEPwRABDAEMgQ7BE8E TgRCBCAAPQQwBEgEOAQ8BCAAQAQwBDcEMgQ4BEIEOAQ1BDwEIAA4BCAAOgQwBDoEIAA9BDAEIAA9 BDUEMwQ+BCAAPwQ+BDIEOwQ4BE8EQgRMBCAAMgQgADoEPgQ9BDoEQAQ1BEIEPQQ+BDkEIABBBDgE QgRDBDAERgQ4BDgELgAgAB0EPgQgAE0EQgQ4BCAANwQ9BDAEPQQ4BE8EIAA+BDEEOwQwBDQEMARO BEIEIAA0BDIEQwQ8BE8EIAAxBD4EOwRMBEgEOAQ8BDgEIAA8BDgEPQRDBEEEMAQ8BDgELgAgABIE PgQtAD8ENQRABDIESwRFBCwAIAA+BD0EOAQgAEcEMARBBEIEPgQgAD0ENQQgAD4ERwQ1BD0ETAQt AEIEPgQgADQEPgRBBEIEPgQyBDUEQAQ9BEsELAAgADAELAAgADIEPgQtADIEQgQ+BEAESwRFBCwA IAA7BE4ENAQ4BCAAPwQ1BEAENQQ/BDgEQQRLBDIEMAROBEIEIAA4BEEEQgQ+BEAEOAROBCAANAQ7 BE8EIABCBD4EMwQ+BCwAIABHBEIEPgQxBEsEIAAxBEsEOwQ+BCAAPwRABD4ESQQ1BCAAQwQ/BEAE MAQyBDsETwRCBEwEIAA/BD4EOgQ+BEAEUQQ9BD0ESwQ8BDgEIAA9BDAEQAQ+BDQEMAQ8BDgEKABA BDAEMQRLBCwAIAA9BDUEIAA3BD0EMAROBEkEOAQ1BCAAQgQ+BDMEPgQsACAARwRCBD4EIAA6BD4E MwQ0BDAELQBCBD4EIAA+BD0EOAQgADEESwQ7BDgEIABBBDIEPgQxBD4ENAQ9BEsEPAQ4BCwAIAA9 BDAEPAQ9BD4EMwQ+BCAAPAQ1BD0ENQQ1BCAAMgQ1BEAEPgRPBEIEPQQ+BCAAPwQ+BDQEPQQ4BDwE QwRCBCAAMQRDBD0EQgQsACAAPwQ+BDsEMAQzBDAETwQsACAARwRCBD4EIAA9BDUEQQQyBD4EMQQ+ BDQEMAQgAE0EQgQ+BCAANAQwBD0EPQQ+BEEEQgRMBCAAQQQyBEsESAQ1BCwAIAAwBCAAQgQ+BCAA OAQgADIEPgQ+BDEESQQ1BCAAPQQ1BCAAPwQ+BD0EOAQ8BDAETwQgAEcEQgQ+BCAAPwRABD4EOARB BEUEPgQ0BDgEQgQpAC4AIAAeBEcENQQ9BEwEIABHBDAEQQRCBD4ELAAgADgEPAQ1BE8EIAA+BDEE QARLBDIEPgRHBD0ESwQ1BCAAQQQyBDgENAQ1BEIENQQ7BEwEQQRCBDIEMAQgAEIENQRFBCAAOAQ7 BDgEIAA4BD0ESwRFBCAAOARBBEIEPgRABDgERwQ1BEEEOgQ4BEUEIABBBD4EMQRLBEIEOAQ5BCgA PQQwBD8EQAQ4BDwENQRABCwAIAAyBCAAMgQ4BDQENQQgADQEPgRIBDUENARIBDgERQQgAEEEOgQw BDcEMAQ9BDgEOQQgADgEOwQ4BCAAQQQ6BDAENwQ+BDoEIAA4BDsEOAQgADoEMAQ6BDgERQQtAD0E OAQxBEMENARMBCAAPAQ1BDMEMAQ7BDgEQgQ+BDIEIAA9BDUEPwQ+BD0ETwRCBD0EPgQsACAAOgQ1 BDwELAAgADoEPgQzBDQEMAQsACAAOgQwBDoEIAA4BCAANwQwBEcENQQ8BCAAPwQ+BEEEQgRABD4E NQQ9BD0ESwRFBCkALAAgADwESwQgAEEEOgQ7BD4EPQQ9BEsEIAA+BEIEPQQ+BEEEOARCBEwEIAA4 BEUEIAA6BCAAOgQwBEIENQQzBD4EQAQ4BDgEIAA8BDgERAQ+BDIELAAgAEIEPgQgADUEQQRCBEwE IAA3BD0EMAQ9BDgEOQQsACAAOgQwBDoEIAAxBEsEIAA9BDUEIAA4BDwENQROBEkEOARFBCAANwQ9 BDAERwQ1BD0EOARPBCAAOAQgAEEEPARLBEEEOwQwBCAAMgQ+BD4EMQRJBDUELgAgABwEPgQ2BD0E PgQgADMEPgQyBD4EQAQ4BEIETAQgAD4EIAA0BD4EQQRCBD4EMgQ1BEAEPQQ+BEEEQgQ4BCwAIAA9 BD4EIAA+BD0EMAQsACAAOgQwBDoEIAA/BEAEMAQyBDgEOwQ+BCwAIAA4BDwENQQ1BEIEIABBBEME MQRKBDUEOgRCBDgEMgQ9BEMETgQgAD8EQAQ4BEAEPgQ0BEMEKABCBDAEOgQgADoEMAQ6BCAAPgQx BEsERwQ9BD4EIAA4BCAAPgRGBDUEPQQ4BEIETAQgADQEPgRBBEIEPgQyBDUEQAQ9BD4EQQRCBEwE IAA9BDUEOwRMBDcETwQgADAEMQRBBD4EOwROBEIEPQQ+BCAAQgQ+BEcEPQQ+BC0AIAA1BEEEQgRM BCAAQARPBDQEIAA/BD4ENARFBD4ENAQ+BDIEIAA4BCAAOgQwBDYENARLBDkEIAA8BD4ENgQ1BEIE IAAyBEsEMQRABDAEQgRMBCAAQQQ1BDEENQQgAD8EPgQgADIEOgRDBEEEQwQgAD0ENQRBBDoEPgQ7 BEwEOgQ+BCkALgAgAB8EPgQ0BDUEOwQ4BDIEIAA8BDgEQAQgAD0EMAQgAEcENQRABD0EPgQ1BCAA OAQgADEENQQ7BD4ENQQsACAAPARLBCAAPgQ0BD0EQwQgAEcEMARBBEIETAQgADcEPQQwBD0EOAQ5 BCAAPgRCBEEENQQ6BDAENQQ8BCAAPgRCBCAANARABEMEMwQ+BDkELAAgAD4EQQRCBDAEMgQ7BE8E NQQ8BCAAQQQ1BDEENQQgAEMEQAQ1BDcEMAQ9BD0ESwQ5BCAAMgQwBEAEOAQwBD0EQgQsACAANAQw BCAAOAQgADIEIAA9BFEEPAQgAD0ENQQgAD4ERwQ1BD0ETAQtAEIEPgQgAEMEMgQ1BEAENQQ9BEsE LgANACAAIQQgAEIEPgRHBDoEOAQgADcEQAQ1BD0EOARPBCAARARABDAEOgRCBDAEOwRMBD0EPgQz BD4EIAA8BDgEQAQ+BD8EPgQ9BDgEPAQwBD0EOARPBCwAIAA8BEsEIAA8BD4ENgQ1BDwEIAA9BDUE IAA+BEIENAQ1BDsETwRCBEwEIAAiAEIEPgRHBD0EPgQ1BCIAIAA3BD0EMAQ9BDgENQQgAD4EQgQg AD4EMQRABEsEMgQ+BEcEPQQ+BDMEPgQsACAAPwQ+BEIEPgQ8BEMEIABHBEIEPgQgABIEIQQvBCAA PwRABDgEQAQ+BDQEMAQgADgEIAA8BDgEQAQwBCAAOAQgADcEPQQwBD0EOAQ5BCAARARABDAEOgRC BDAEOwRMBD0EMARPBC4AIAAtBEIEPgQgAD8EQAQ4BD0ERgQ4BD8EOAQwBDsETAQ9BD4ENQQgAEEE MgQ+BDkEQQRCBDIEPgQgAD8EQAQ4BEAEPgQ0BEsEIABDBDoEMAQ3BEsEMgQwBDUEQgQgAD0EMAQ8 BCAAPQQwBCAAQgQ+BCwAIABHBEIEPgQgADwEPgQ2BD0EPgQgADgEIAA9BEMENgQ9BD4EIAA/BD4E OwRMBDcEPgQyBDAEQgRMBEEETwQgADsETgQxBEsEPAQ4BCAANwQ9BDAEPQQ4BE8EPAQ4BCwAIABD BDoEOwQwBDQESwQyBDAETwQgADgERQQgADIEIAA9BDUEPwRABD4EQgQ4BDIEPgRABDUERwQ4BDIE PgQ1BCAAQARDBEEEOwQ+BCAAMgQgAEIEPgQ5BCAAPAQ1BEAENQQsACAAMgQgADoEMAQ6BD4EOQQg AE0EQgQ+BCAAMgQ+BDcEPAQ+BDYEPQQ+BC4AIAAYBCAAQgQ+BDMENAQwBCwAIABCBDUEIAA8BDgE RARLBCwAIABHBEIEPgQgAD4EQgQxBEAEPgRIBDUEPQRLBCAAOARBBEIEPgRABDgEOgQwBDwEOAQs ACAAPAQ+BDMEQwRCBCAAMQRLBEIETAQgADgEQQQ/BD4EOwRMBDcEPgQyBDAEPQRLBCAAMgQgAD0E MARFBD4ENgQ0BDUEPQQ4BDgEIABABEMEQQQ7BDAELAAgADoEPgRCBD4EQAQ+BDUEIAAxBEMENAQ1 BEIEIABBBDsEPgQ2BD0EPgQgAEMEMgQ4BDQENQRCBEwELAAgAD8EPgQ7BEwENwRDBE8EQQRMBCAA OwQ4BEgETAQgAEIEPgRHBD0ESwQ8BDgEIAA0BDAEPQQ9BEsEPAQ4BC4AIAAdBD4ELAAgADEEPgQ7 BEwESAQwBE8EIAA/BEAEPgQxBDsENQQ8BDAEIABCBDAEOgQ+BDMEPgQgAD8EPgQ0BEUEPgQ0BDAE IAAyBCAAQgQ+BDwELAAgAEcEQgQ+BCAAPQQwBCAAPgRBBD0EPgQyBDUEIAA+BDQEPQQ4BEUEIAA4 BCAAQgQ1BEUEIAA2BDUEIAA0BDAEPQQ9BEsERQQgADwEPgQ2BD0EPgQgAD8EPgRBBEIEQAQ+BDgE QgRMBCAAQAQwBDcEOwQ4BEcEPQRLBDUEIABABEMEQQQ7BDAEIAA4BDsEOAQgAEAEQwRBBDsEPgQg AD0EMARBBEIEPgQ7BEwEOgQ+BCAASAQ4BEAEPgQ6BD4ENQQsACAARwRCBD4EIAA+BD0EPgQgAD0E NQQgADEEQwQ0BDUEQgQgAD4EMQQ7BDAENAQwBEIETAQgADEEPgQ7BEwESAQ+BDkEIABGBDUEPQQ9 BD4EQQRCBEwETgQuACAAHQQwBD8EQAQ4BDwENQRABCwAIABBBD4EMwQ7BDAEQQQ9BD4EIAA4BEEE QQQ7BDUENAQ+BDIEMAQ9BDgETwQ8BCAAFAQdBBoELQAzBDUEPQQ1BDAEOwQ+BDMEOAQ4BCwAIAA8 BEsEIAA8BD4ENgQ1BDwEIAAxBD4EOwQ1BDUELQA8BDUEPQQ1BDUEIABCBD4ERwQ9BD4EIABBBDoE MAQ3BDAEQgRMBCwAIABHBEIEPgQgAD0EMARIBDgEIAA/BEAENQQ0BDoEOAQoAD8EQAQwBEEEOwQw BDIETwQ9BDUELAAgADMEMAQ/BDsEPgQzBEAEQwQ/BD8EMAQgAFIAMQBhACkALAAgAEEEOgQ+BEAE NQQ1BCAAMgRBBDUEMwQ+BCAAPgQxBDgEQgQwBDsEOAQgADEAMAAtADEAMgBCBEsEQQQuACAAOwQ1 BEIEIAA9BDAENwQwBDQEKAA/BD4EQQQ7BDUEIAA/BD4EQgQ+BD8EMAQpACAAPwRABDgEPAQ1BEAE PQQ+BCAAPQQwBCAAQgQ1BEAEQAQ4BEIEPgRABDgEOAQgACAEQwRBBEEEOgQ+BDkEIABABDAEMgQ9 BDgEPQRLBCwAIAA/BD4EQgQ+BDwEIAA/BDUEQAQ1BDEEQAQwBDsEOARBBEwEIAA9BDAEIAARBDAE OwQ6BDAEPQRLBCAAOAQgAD4EOgQ+BDsEPgQgADUAQgRLBEEELgAgADsENQRCBCAAPQQwBDcEMAQ0 BCwAIAA+BDEEQAQwBDcEPgQyBDAEOwQ4BCAAIAQ+BDQEIAAwBEAEOAQ1BDIEIAA4BCAAPwQ1BEAE NQQ8BDUEQQRCBDgEOwQ4BEEETAQgAD4EMQRABDAEQgQ9BD4EKAAwBCAANwQwBEIENQQ8BCAAPwRA BD4EQQQ7BDAEMgQ4BDsEOARBBEwEIAA9BDAEIAAyBDUEQQRMBCAAPAQ4BEAEIABBBDIEPgQ1BDkE IABBBDgEOwQ+BDkEKQAuACAAHQQ+BCAARwRCBD4EIAA2BDUEIAAxBEsEOwQ+BCAANAQ+BCAAPwQ+ BEIEPgQ/BDAEPwAgABIENQQ0BEwEIAAyBDAENgQ9BD4EIAAyBD4EQQRBBEIEMAQ9BD4EMgQ4BEIE TAQgAE0EQgRDBCAAOARBBEIEPgRABDgETgQsACAAPgRCBDIENQRCBDgEQgRMBCAAPQQwBCAAMgQ+ BD8EQAQ+BEEEIAAiACcEQgQ+BCAAQgQwBDoEPgQ1BCAAEwQ4BD8ENQRABDEEPgRABDUETwQgADgE IAAQBEIEOwQwBD0EQgQ4BDQEMAQ/ACIALgAgABwEOAREBCAAOwQ4BCgAMgQgAEEEPARLBEEEOwQ1 BCAAQQQwBDwEPgQ+BDEEPAQwBD0EKQAgAD0EMARIBDUEIAA9BDAEQQQ7BDUENAQ4BDUEIAA+BEIE IABBBDIENQRABEUEOwROBDQENQQ5BCAANARABDUEMgQ9BD4EQQRCBDgEIAA4BDsEOAQgADwESwQg AD0EMAQgAEEEMAQ8BD4EPAQgADQENQQ7BDUEIAA4BEUEIAA/BD4EQgQ+BDwEOgQ4BCAAOAQgACIA RQQ+BDcETwQ1BDIEMAQgADwEOARABDAEIgAgAD8EPgQgAD8EQAQwBDIEQwQgACAEPgQ0BDAEPwAN AA0AIAAgACAAIAAgACAAIABJADIEKQAgABwENQRCBD4ENAQgAD8EPgQ4BEEEOgQwBC4AIAAjBDwE QQRCBDIENQQ9BD0EPgQ1BCAAQQQ+BDcENQRABEYEMAQ9BDgENQQgADgEIAA8BDAEQgQ1BDwEMARC BDgERwQ1BEEEOgQwBE8EIAAyBDUEQAQ4BEQEOAQ6BDAERgQ4BE8ELgANACAAGARCBDAEOgQsACAA PQQ1BEEEPAQ+BEIEQARPBCAAPQQwBCAAQQQ4BDsETAQ9BD4ENQQgAD4EQgQ7BDgERwQ4BDUEIAAy BCAANAQ+BEEEQgQ+BDIENQRABD0EPgRBBEIEOAQgAEQEMAQ6BEIEPgQyBCAARAQ4BDcEOAQ6BDgE LwA8BDAEQgQ1BDwEMARCBDgEOgQ4BCAAOAQgAEQEMAQ6BEIEPgQyBCAAOARBBEIEPgRABDgEOAQs ACAAQQQ7BDUENARDBE8EIAA7BD4EMwQ4BDoENQQgAEQEQAQwBDoEQgQwBDsETAQ9BD4EMwQ+BCAA PAQ4BEAEPgRDBEEEQgRABD4EOQRBBEIEMgQwBCwAIABNBEIEOAQgAD4EMQQ7BDAEQQRCBDgEIAA8 BD4ENgQ9BD4EIAA+BDEESgQ1BDQEOAQ9BDgEQgRMBCAAMgQgAD4ENAQ9BEMELQAgADUENAQ4BD0E SwQ5BCAAMgRBBDUEOwQ1BD0EQQQ6BDgEOQQgAEQEQAQwBDoEQgQwBDsELAAgADMENAQ1BCAAPAQ1 BEEEQgQ+BCAANQRBBEIETAQgADgEIAA+BDEESgQ1BDoEQgQwBDwEIAA8BDAEQgQ1BDwEMARCBDgE OgQ4BCAAOAQgADEEPgQ3BD4EPQRDBCAAJQQ4BDMEMwRBBDAEIAA4BCAAEwQ4BD8ENQRABDEEPgRA BDUEOAQgAEEEIAAQBEIEOwQwBD0EQgQ4BDQEPgQ5BCwAIAA9BD4EIAA/BEAEOAQgAE0EQgQ+BDwE IAA6BDAENgQ0BEsEOQQgADgENwQgAD0EOARFBCAANwQwBD0EOAQ8BDAENQRCBCAAPgQ/BEAENQQ0 BDUEOwQ1BD0EPQQ+BDUEIABEBEAEMAQ6BEIEMAQ7BEwEPQQ+BDUEIABABEMEQQQ7BD4ELAAgAEIE NQRBBD0EPgQgAEEEMgRPBDcEMAQ9BD0EPgQ1BCAAOAQgAD8ENQRABDUEPwQ7BDUEQgQ1BD0EPQQ+ BDUEKAA6BDAEOgQgAE0EQgQ+BCAAMQRLBDIEMAQ1BEIEIABBBCAARARABDAEOgRCBDAEOwQwBDwE OAQpACAAQQQgADQEQARDBDMEOAQ8BDgELgAgAB4ENAQ9BDAEOgQ+BCwAIAA6BDAEOgQgADIESwQ5 BEIEOAQgADgEPAQ1BD0EPQQ+BCAAPQQwBCAAQgQ+BCAAQARDBEEEOwQ+BCwAIAA6BD4EQgQ+BEAE PgQ1BCAAMgQgAD0EMAQ4BDEEPgQ7BEwESAQ1BDkEIAA8BDUEQAQ1BCAAPgRCBDIENQRHBDAENQRC BCAAPQQwBEgENQQ5BCAANAQ1BDkEQQRCBDIEOARCBDUEOwRMBD0EPgRBBEIEOAQ/ACAAEgRBBDUE IAA/BEAEPgRBBEIEPgQsACAANQRBBDsEOAQgAD8EPgQ9BDgEPAQwBEIETAQsACAARwRCBD4EIABA BDAENwQ9BEsENQQgAD4EMQQ7BDAEQQRCBDgEIAA3BD0EMAQ9BDgETwQgAEIENQRBBD0EPgQgAEEE MgRPBDcEMAQ9BEsELgAgABMEQARDBDEEPgQgADMEPgQyBD4EQARPBCwAIAA8BDgERARLBCAAOAQg ADgEQQRCBD4EQAQ4BEcENQRBBDoEOAQ1BCAAQQQ+BDEESwRCBDgETwQgADQEPgQ7BDYEPQRLBCAA MQRLBEIETAQgAD8EPgQ0BEIEMgQ1BEAENgQ0BDUEPQRLBCAANwQwBDoEPgQ9BDAEPAQ4BCAARAQ4 BDcEOAQ6BDgELAAgADwEMARCBDUEPAQwBEIEOAQ6BDgEIAA4BCAANwQwBDoEPgQ9BD4EPAQ1BEAE PQQ+BEEEQgRPBDwEIABABDAENwQyBDgEQgQ4BE8EIAA9BDAESAQ1BDkEIAA/BDsEMAQ9BDUEQgRL BCwAIAAxBDgEPgRBBEQENQRABEsEIAA4BCAARwQ1BDsEPgQyBDUERwQ1BEEEQgQyBDAELgAgAB0E MAQ/BEAEOAQ8BDUEQAQsACAAOAQ8BDUETwQgACIAPAQ4BEQEIgAgAD4EIAAhBD4EOwQ9BEYENQQs ACAAMgQ+BDoEQARDBDMEIAA6BD4EQgQ+BEAEPgQzBD4EIAA0BDIEOAQ2BDUEQgRBBE8EIAA9BDAE SAQwBCAAPwQ7BDAEPQQ1BEIEMAQsACAAPARLBCAAPAQ+BDYENQQ8BCAAOAQ9BEIENQQzBEAEOARA BD4EMgQwBEIETAQgADUEMwQ+BCAAMgQgAEAEQwRBBDsEPgQgADcEPQQwBD0EOARPBCwAIAA/BEAE PgQwBD0EMAQ7BDgENwQ4BEAEPgQyBDAEMgQgADcEMAQ6BD4EPQQgADMEQAQwBDIEOARCBDAERgQ4 BDgEIAAdBEwETgRCBD4EPQQwBCAAOAQgAD0EMAQ5BDQETwQgAEAENQRIBDUEPQQ4BE8EKAAyBCAA MgQ4BDQENQQgADoEQARDBDMEPgQyBCAAOAQgAE0EOwQ7BDgEPwRBBD4EMgQpACAANAQ7BE8EIAA+ BDEESgQ1BDoEQgQ+BDIELAAgADQEMgQ4BDYEQwRJBDgERQRBBE8EIAAyBCAAHQRMBE4EQgQ+BD0E PgQyBEEEOgQ+BDwEIAA/BD4EOwQ1BCAAQgRPBDMEPgRCBDUEPQQ4BE8ELgAgACEEPgQyBDwENQRB BEIEOAQyBCAAPAQ4BEQEOARHBDUEQQQ6BEMETgQgADIEOAQ0BDgEPAQ+BEEEQgRMBCAAQQQgAEQE OAQ3BDgERwQ1BEEEOgQ+BDkEIAA3BDAEOgQ+BD0EPgQ8BDUEQAQ9BD4EQQRCBEwETgQsACAAPARL BCAAPAQ+BDYENQQ8BCAAPwQ+BEEEQgRABD4EOARCBEwEIABABEMEQQQ7BD4EIAA3BD0EMAQ9BDgE TwQsACAAMgQgADoEPgRCBD4EQAQ+BDwEIAAXBDUEPAQ7BE8EIABBBDoEPgRABDUENQQgADIEQQQ1 BDMEPgQgAD8EQAQ4BDwENQRABD0EPgQgADQEMgQ4BDYENQRCBEEETwQgADIEPgQ6BEAEQwQzBCAA IQQ+BDsEPQRGBDAELAAgADgEIAA9BDUEIAA4BEEEOgQwBEIETAQgADEEPgQ7BDUENQQgADAEMQRB BD4EOwROBEIEPQQ+BDkEIAA4BEEEQgQ4BD0ESwQsACAAPwQ+BDoEMAQgAD0ENQQgAD8EPgQ9BDAE NAQ+BDEEOARCBEEETwQgAE0EQgQ+BCAANwQ9BDAEPQQ4BDUEIABDBEIEPgRHBD0EOARCBEwELgAg AC0EQgQ+BEIEIAA8BDUEQgQ+BDQELAAgAD4EPwQ4BEEEMAQ9BD0ESwQ5BCAAMgRLBEgENQQgADoE MAQ6BCAAIgA8BDUEQgQ+BDQEIABABEMEQQQ7BDAEIgAsACAAMgQgADQEMAQ9BD0EPgQ8BCAAQQQ7 BEMERwQwBDUEIABBBD4ERwQ1BEIEMAQ1BEIEIABBBD4ENwQ1BEAERgQwBDUEPARDBE4EIAA9BDAE PAQ4BCAAMgQ4BDQEOAQ8BD4EQQRCBEwEKAA8BDgERAQ4BEcENQRBBDoEQwROBCwAIAA4BEEEQgQ+ BEAEOARHBDUEQQQ6BEMETgQsACAAMARBBEIEQAQ+BD0EPgQ8BDgERwQ1BEEEOgRDBE4EIAA4BDsE OAQgAD8EQAQ+BEEEQgQ+BCAAIgBBBDIEPgQ4BDwEOAQgADMEOwQwBDcEMAQ8BDgEIgApACAAOAQg ADcEMAQ6BD4EPQQ+BDwENQRABD0EPgRBBEIEOAQgACIAQgQ+BEcEPQRLBEUEIgAgAD0EMARDBDoE LgANAA0AIAAgACAAIAAgACAAIABJADMEKQAgABMEOAQ/BDUEQAQxBD4EQAQ1BE8EIAA4BCAAEARC BDsEMAQ9BEIEOAQ0BDAEDQAgACcEQgQ+BCAANgQ1BCAANAQwBDUEQgQgADwENQRCBD4ENAQgAEAE QwRBBDsEMAQgAD8EQAQ4BDwENQQ9BDgEQgQ1BDsETAQ9BD4EIAA6BCAAMgQwBDYEPQQ1BDkESAQ1 BDwEQwQgADIEPgQ/BEAEPgRBBEMEIAAyBD4EQQRBBEIEMAQ9BD4EMgQ7BDUEPQQ4BE8EIAA4BEEE QgQ+BEAEOAQ4BCAAPQQwBEgENQQzBD4EIABABD4ENAQwBCAAOAQgAD4EQQQ9BD4EMgRLBCwAIAA6 BD4EQgQ+BEAEQwROBCAAPAQ+BDYEPQQ+BCAAMQRLBDsEPgQgADEESwQgADgEQQQ/BD4EOwRMBDcE PgQyBDAEQgRMBCAANAQ7BE8EIAA+BDEESQQ1BDMEPgQgADEEOwQwBDMEMAQgADgEIAAyBEsENgQ4 BDIEMAQ9BDgETwQ/ACAAIQQ+BDMEOwQwBEEEPQQ+BCAAOARBBEIEPgRABDgERwQ1BEEEOgQ4BDwE IAA4BCAAMwQ1BD4EOwQ+BDMEOARHBDUEQQQ6BDgEPAQgADgENwRLBEEEOgQwBD0EOARPBDwELAAg AD8EQAQ4BDwENQRABD0EPgQgADEAMAAtADEAMgBCBEsEQQQuACAAOwQ1BEIEIAA9BDAENwQwBDQE IAA/BEAEPgQ4BDcEPgRIBDUEOwQgADMEOwQ+BDEEMAQ7BEwEPQRLBDkEIAA6BDAEQgQwBDoEOwQ4 BDcEPAQsACAAPwQ+BEEEOwQ1BCAAOgQ+BEIEPgRABD4EMwQ+BCAAQwRABD4EMgQ1BD0ETAQgAD4E OgQ1BDAEPQQwBCAAPwQ+BDQEPQRPBDsEQQRPBCAAPQQwBCAAMwAwADAALQA0ADAAMAA8BC4AIAAc BDgERARLBCAAPAQ9BD4EMwQ4BEUELAAgAEAEMAQ3BDQENQQ7BFEEPQQ9BEsERQQgAEIESwRBBE8E RwQwBDwEOAQgADoEOAQ7BD4EPAQ1BEIEQAQ+BDIELAAgAD0EMARABD4ENAQ+BDIEIAA/BD4ERQQ+ BDYEOAQ8BCAAPgQxBEAEMAQ3BD4EPAQgADMEPgQyBD4EQARPBEIEIAA+BCAAOgQwBEIEMARBBEIE QAQ+BEQENQQsACAAPwQ+BDMEOwQ+BEIEOAQyBEgENQQ5BCAAMgRBBE4EIAA3BDUEPAQ7BE4ELQAg AD4EPQQwBCAAPgQ/BEMEQQRCBDgEOwQwBEEETAQgADIEIAA8BEAEMAQ6BCwAIAA/BEAEPgRIBDsE OAQgADMEOAQzBDAEPQRCBEEEOgQ4BDUEIABGBEMEPQQwBDwEOAQsACAAQQQ8BEsEMgRIBDgENQQg ADsETgQ0BDUEOQQsACAANgQ4BDIEQwRJBDgERQQgAD0EMAQgADcENQQ8BDsENQQsACAAPQQ1BCAA QQQ4BDsETAQ9BD4EIAAyBD4ENwQyBEsESAQ1BD0EPQQ+BDkEIAA9BDAENAQgAEMEQAQ+BDIEPQQ1 BDwEIAA8BD4EQARPBC0AIABBBD8EMARBBDsEOARBBEwEIAA7BDgESARMBCAAOAQ3BDEEQAQwBD0E PQRLBDUEKAAyBEAEPgQ0BDUEIAAdBD4ETwQgAEEEPgQgAEEEMgQ+BDgEPAQgADoEPgQyBEcENQQz BD4EPAQpACAAMwQ+BEAERgRLBC4AIAAaBD4EMwQ0BDAEIABCBEwEPAQwBCAAQAQwBEEEQQQ1BE8E OwQwBEEETAQsACAARwQ1BDsEPgQyBDUEOgQgAD8EQAQ+BDQEPgQ7BDYEOAQ7BCAANgQ4BEIETAQg ADIEIAA9BD4EMgQ+BDwEIAA8BDgEQAQ1BCwAIAA/BEAEPgQ5BDQETwQgAEcENQRABDUENwQgAD4E RwQ1BEAENQQ0BD0EPgQ1BCAAIgAxBEMEQgRLBDsEPgRHBD0EPgQ1BCAAMwQ+BEAEOwRLBEgEOgQ+ BCIALgAgACIEMAQ6BDYENQQgADUEQQRCBEwEIAA8BDgERARLBCAANARABDUEMgQ9BDUEOQQgABME QAQ1BEYEOAQ4BCgAEwQ1BEAEPgQ0BD4EQgQsACAAHwQ7BDAEQgQ+BD0EIAA4BCAAPwRABC4AKQAs ACAAMwQ+BDIEPgRABE8ESQQ4BDUEIAA+BCAANgQ4BDcEPQQ4BCAANAQ+BCAAPwQ+BEIEPgQ/BDAE LQAgAE8EOgQ+BDEESwQgAEEEQwRJBDUEQQRCBDIEPgQyBDAEOwQ4BCAAMgAgAEYENQQ9BEIEQAQw BCAAMwQ7BD4EMQQwBDsETAQ9BD4EOQQgADIEOwQwBEEEQgQ4BCwAIAATBDgEPwQ1BEAEMQQ+BEAE NQRPBCAAOAQgABAEQgQ7BDAEPQRCBDgENAQwBCwAIAA6BD4EQgQ+BEAESwQ1BCAAMgRBBEIEQwQ/ BDgEOwQ4BCAAMgQgADEEPgRABEwEMQRDBCAAOAQgAD8EQAQ1BDoEQAQwBEIEOAQ7BDgEIABBBDIE PgRRBCAAQQRDBEkENQRBBEIEMgQ+BDIEMAQ9BDgENQQgADIEIABBBDIETwQ3BDgEIABBBCAAPwQ+ BEIEPgQ/BD4EPAQuACAAHAQ4BEQESwQgAD4EIAATBDgEPwQ1BEAEMQQ+BEAENQQ1BCAAQQQ+BEcE NQRCBDAETgRCBEEETwQgAEEEIAA8BDgERAQwBDwEOAQgADQEQAQ1BDIEPQQ1BDkEIAAYBD0ENAQ4 BDgEIAA4BCAANARABEMEMwQ4BEUEIABBBEIEQAQwBD0EIAA+BCAAPQQwBEAEPgQ0BDUEIABBBDIE NQRABEUEOwROBDQENQQ5BCAAOAQgADgERQQgADMEPgRABDUEIAAcBDUEQARDBC4AIAAWBDgEOwQ4 BCAAPgQ9BDgEIAA9BDAEIAAxBD4EOwRMBEgEPgQ8BCAAPAQwBEIENQRABDgEOgQ1BCAAPQQwBCAA QQQ1BDIENQRABD0EPgQ8BCAAPwQ+BDsETgRBBDUELAAgADEESwQ7BDgEIAA+BEcENQQ9BEwEIABB BDgEOwRMBD0ESwQsACAAMgRLBEEEPgQ6BDgELAAgAEMEPAQ1BDsEOAQgADsENQRCBDAEQgRMBCAA PQQwBCAAOwQ1BEIEMARCBDUEOwRMBD0ESwRFBCAAMAQ/BD8EMARABDAEQgQwBEUEIAA4BCAAMgQ+ BD4EMQRJBDUEIAA/BEAEMAQyBDgEOwQ4BCAAMgRBBDUEOQQgAD8EOwQwBD0ENQRCBD4EOQQuACAA GgQwBDoEOAQ1BCAARARDBD0ENAQwBDwENQQ9BEIEMAQ7BEwEPQRLBDUEIAA3BDAEOgQ+BD0EPgQ8 BDUEQAQ9BD4EQQRCBDgEIAA8BD4EMwRDBEIEIABBBDIEOAQ0BDUEQgQ1BDsETARBBEIEMgQ+BDIE MARCBEwEIAAyBCAAPwQ+BDsETAQ3BEMEIAA0BD4EQQRCBD4EMgQ1BEAEPQQ+BEEEQgQ4BCAATQRC BD4EOQQgADgEPQREBD4EQAQ8BDAERgQ4BDgEPwAgAB8ENQRABDIEPgQ1BC0AIAA/BEAEPgQwBD0E MAQ7BDgENwQ4BEAEPgQyBDAEMgQgADMEOwRDBDEEOAQ9BEMEIAAhBDUEMgQ1BEAEPQQ+BDMEPgQg ABsENQQ0BD4EMgQ4BEIEPgQzBD4EIAA+BDoENQQwBD0EMAQsACAAPAQ+BDYEPQQ+BCAAPwQ+BD0E TwRCBEwELAAgAEcEQgQ+BCAANAQ+BCAAPwQ+BEIEPgQ/BDAEIABHBDAEQQRCBEwEIAA1BDMEPgQg ADQEPQQwBCAAMQRLBDsEMAQgAEEEQwRIBDUEOQQoAE0EQgQ+BCAAPAQ+BEAETwQtACAAEQQwBEAE NQQ9BEYENQQyBD4ELAAgABoEMARABEEEOgQ+BDUELAAgADwEPgRABDUEIAAbBDAEPwRCBDUEMgRL BEUELAAgABIEPgRBBEIEPgRHBD0EPgQtACEEOAQxBDgEQARBBDoEPgQ1BCAAPAQ+BEAENQQsACAA JwRDBDoEPgRCBEEEOgQ+BDUEIAA8BD4EQAQ1BCwAIAA+BDEEOwQwBEEEQgQ4BCAAOgQgAEEENQQy BDUEQARDBCAAPgRCBCAAGgQwBD0EMAQ0BEsEIAA4BCAAEwRABDUEPQQ7BDAEPQQ0BDgEOAQpAC4A IAASBEIEPgRABD4ENQQtACAAMgRLBEUEPgQ0BEsEIAA6BCAAPAQ+BEAETwQ8BCAAOAQgAD4EOgQ1 BDAEPQQwBDwEIAA4BDwENQROBEIEIAAxBD4EOwRMBEgEIwROBCAARgQ1BD0EPQQ+BEEEQgRMBCAA OAQgADoEPgQ9BEIEQAQ+BDsEOARABEMETgRCBEEETwQgAEEEOAQ7BEwEPQRLBDwEOAQgAD0EMARA BD4ENAQwBDwEOAQuACAAIgRABDUEQgRMBDUELQAgAD4EQgQgAEEENQQyBDUEQAQwBCAAOgQgAE4E MwRDBCAAPQQwBDEEOwROBDQEMAQ1BEIEQQRPBCAAQwQ8BDUEPQRMBEgENQQ9BDgENQQgAEYEOAQy BDgEOwQ4BDcEPgQyBDAEPQQ9BD4EQQRCBDgEKABABDAENwQyBDgEQgQ+BEEEQgQ4BCAAOgRDBDsE TARCBEMEQARLBCwAIAA/BDgEQQRMBDwENQQ9BD0EPgRBBEIEOAQsACAAQgQ1BEUEPQQ+BDsEPgQz BDgEOQQsACAAPgQxBEoENQQ8BDAEIABABDUEQQRDBEAEQQQ+BDIEIAA4BCAAPwRABD4ERwQ4BEUE IAA/BD4EOgQwBDcEMARCBDUEOwQ1BDkEIABGBDgEMgQ4BDsEOAQ3BDAERgQ4BDgEKQAuACAALQRC BD4ELAAgADIENQRABD4ETwRCBD0EPgQsACAANwQwBDIEOARBBDgEQgQgAD4EQgQgAEEEQAQ1BDQE PQQ1BDkEIABCBDUEPAQ/BDUEQAQwBEIEQwRABEsELgAgACcENQQ8BCAAPgQ9BDAEIAAyBEsESAQ1 BCwAIABCBDUEPAQgADwENQQ9BDUENQQgADIENQRABD4ETwRCBD0EPgQgAD8EPgRPBDIEOwQ1BD0E OAQ1BCAANAQ+BDsEMwQ+BDYEOAQyBEMESQQ4BEUEIABDBEEEQgQ+BDkERwQ4BDIESwRFBCAAQQRC BEAEQwQ6BEIEQwRABCwAIAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA4BCAAMgQgADwEPgQ3BDME MARFBCAAPwQ+BEEEQgQ+BE8EPQQ9BD4EIAA/BEAEPgQ2BDgEMgQwBE4ESQQ1BDMEPgQgAD0EMAQg ADoEPgQ9BDoEQAQ1BEIEPQQ+BDkEIABCBDUEQARABDgEQgQ+BEAEOAQ4BCAAPQQwBEEENQQ7BDUE PQQ4BE8ELAAgADIEIAA+BEEEPgQxBDUEPQQ9BD4EQQRCBDgEIABCBDUERQQsACAARwRCBD4EIAA+ BEIEMgQ1BEcEMAROBEIEIAA3BDAEIAA/BD4EOwRDBEcENQQ9BDgENQQgAEEEOwQ+BDYEPQRLBEUE IABABDUESAQ1BD0EOAQ5BCAAOAQgADIESwRABDAEMQQ+BEIEOgRDBCAAQQQ7BD4ENgQ9BEsERQQg ADoEQwQ7BEwEQgRDBEAEPQRLBEUEIAA/BEAEPgQzBEAEMAQ8BDwEIAAyBCAAPgQxBEkENQRBBEIE MgQ1BC4AIAAYBCwAIAA9BDAEOgQ+BD0ENQRGBCwAIABHBDUEQgQyBDUEQARCBD4ENQQtACAAQwQ2 BDUEIABBBDUEOQRHBDAEQQQgADgENwQyBDUEQQRCBD0ESwQgADwENQQzBDAEOwQ4BEIEOARHBDUE QQQ6BDgENQQgAD8EMAQ8BE8EQgQ9BDgEOgQ4BCAAPwRABD4ESAQ7BD4EMwQ+BCwAIAA9BDAEOQQ0 BDUEPQQ9BEsENQQgADEEOwQ4BDcEOgQ+BCAAOgQgAD4EPwQ4BEEESwQyBDAENQQ8BEsEPAQgAEIE NQRABEAEOARCBD4EQAQ4BE8EPAQgADgEIABBBDIEOAQ0BDUEQgQ1BDsETARBBEIEMgRDBE4ESQQ4 BDUEIAA+BCAAPQQ1BDIENQRABD4ETwRCBD0EPgQ8BCAAQwRABD4EMgQ9BDUEIABABDAENwQyBDgE QgQ4BE8EIAA4BEUEIABBBD4ENwQ0BDAEQgQ1BDsENQQ5BC4AIAAiBD4EIAA1BEEEQgRMBCAANAQ+ BCAAPwQ+BEIEPgQ/BDAEIAA9BDAEIABCBDUEQARABDgEQgQ+BEAEOARPBEUEIABBBD4EMgRABDUE PAQ1BD0EPQQ+BDMEPgQgACEENQQyBDUEQAQ9BD4EMwQ+BCAAGwQ1BDQEPgQyBDgEQgQ+BDMEPgQg AD4EOgQ1BDAEPQQwBCAANAQ+BDsENgQ1BD0EIAAxBEsEOwQgAD8EQAQ+BDYEOAQyBDAEQgRMBCAA PQQwBEAEPgQ0BCAAOAQ7BDgEIAA9BDAEQAQ+BDQESwQsACAAQQQgADoEPgQ9BEYENQQ9BEIEQAQ4 BEAEPgQyBDAEPQQ9BD4EOQQgAEEEOAQ7BD4EOQQgADgEIABGBDgEMgQ4BDsEOAQ3BD4EMgQwBD0E PQQ+BEEEQgRMBE4ELAAgAEEEPwQwBEEEQgQ4BEEETAQgAD4EPQQgADwEPgQzBCAAQgQ+BDsETAQ6 BD4EIAA9BDAEIABOBDMENQQsACAAMgQgADMEPgRABDAERQQsACAANwQwBEEENQQ7BDgEMgQgACAE QwRBBEEEOgRDBE4EIAAgBDAEMgQ9BDgEPQRDBCAAQQQyBD4EOAQ8BDgEIAA/BEAENQQ6BEAEMARB BD0ESwQ8BDgEIAA2BDUEPQRJBDgEPQQwBDwEOAQgADgEIAA9BDUEMgQ1BEAEPgRPBEIEPQRLBDwE OAQgADEEPgQzBDAEQgRLBEAETwQ8BDgELgAgACEEPgQzBDsEMARBBD0EPgQgADwENQRCBD4ENARD BCAAQARDBEEEOwQwBCwAIAA4BDwENQRPBCAAPAQ4BEQESwQvAEEEOwRDBEUEOAQgADgEIAA+BDQE PQQ+BDIEQAQ1BDwENQQ9BD0EPgQgAEQEQwQ9BDQEMAQ8BDUEPQRCBDAEOwRMBD0ESwQ1BCAAQQQy BD4EOQRBBEIEMgQwBCAAPQQwBEAEPgQ0BD4EMgQsACAAPARLBCAANAQ1BDsEMAQ1BDwEIAAyBEsE MgQ+BDQELAAgAEcEQgQ+BCAAEwQ4BD8ENQRABDEEPgRABDUETwQgAEEEQwRJBDUEQQRCBDIEPgQy BDAEOwQwBCgAQQQgAEIEPgRHBD0EPgRBBEIETAROBCAANAQ+BCAAPQQwBDcEMgQwBD0EOARPBCkA IAA4BCAATQRCBD4EIABEBDAEOgRCBCwAIAA9BDgERwQ1BDwEIAA9BDUEIAA+BEIEOwQ4BEcEMARO BEkEOAQ5BEEETwQgAD4EQgQgADsETgQxBD4EMwQ+BCAANARABEMEMwQ+BDMEPgQgAD0EMARDBEcE PQQ+BDMEPgQgADcEPQQwBD0EOARPBC4AIAANACAAGgQwBDoEOAQ1BCAARARDBD0ENAQwBDwENQQ9 BEIEMAQ7BEwEPQRLBDUEIAA+BEEEPgQxBDUEPQQ9BD4EQQRCBDgEIAA8BD4EMwRDBEIEIAA/BD4E NARCBDIENQRABDQEOARCBEwEIABBBEMESQQ1BEEEQgQyBD4EMgQwBD0EOAQ1BCAAEARCBDsEMAQ9 BEIEOAQ0BEsEPwAgABIEPgQtAD8ENQRABDIESwRFBCwAIAA9BDAEIAA0BD0ENQQgABAEQgQ7BDAE PQRCBDgERwQ1BEEEOgQ+BDMEPgQgAD4EOgQ1BDAEPQQwBCAAQgQ+BDYENQQgAEEEQwRJBDUEQQRC BDIEQwQ1BEIEIAA+BDEEOwQwBEEEQgRMBCAAMgQgAEAEMAQ5BD4EPQQ1BCAAEAQ3BD4EQARBBDoE OARFBCAAPgRBBEIEQAQ+BDIEPgQyBCwAIAA/BD4EIABABDAENwQ8BDUEQAQwBDwEIABBBEAEMAQy BD0EOAQ8BDAETwQgAEEEIAAcBDAEOwQ+BDkEIAAQBDcEOAQ1BDkELgAgABIEPgQtADIEQgQ+BEAE SwRFBCwAIABABE8ENAQgAD8EPgQ0BDIEPgQ0BD0ESwRFBCAARQRABDUEMQRCBD4EMgQsACAAQAQw BDcEMQQ1BDMEMAROBEkEOAQ1BEEETwQgAD0EMAQgAEIESwRBBE8ERwQ4BCAAOgQ4BDsEPgQ8BDUE QgRABD4EMgQgAD4EQgQgAD4EQQRCBEAEPgQyBDAEIAAhBDAEPQQgABwEOAQzBDUEOwRMBCwAIAA4 BCAAQQQwBDwEIAA+BEEEQgRABD4EMgQsACAAQQQ+BEEEQgQ+BE8ESQQ4BDkEIAA4BDcEIAA8BDAE MwQ8BEsEIAA4BCAAMgRDBDsEOgQwBD0EPgQyBCwAIAA9BDAEMgQ+BDQETwRCBCAAPQQwBCAAPARL BEEEOwRMBCAAPgQgADwENQRCBDUEPgRABDgEQgQ1BCwAIAA/BEAEOAQ7BDUEQgQ1BDIESAQ1BDwE IABBBCAAQQQ1BDIENQRABD4ELQAyBD4EQQRCBD4EOgQwBCAAOAQgAEMEPwQwBDIESAQ1BDwEIAA/ BEAEOAQ8BDUEQAQ9BD4EIAAyBCAAQAQwBDkEPgQ9BDUEIABGBDUEPQRCBEAEMAQgAD4EQQRCBEAE PgQyBDAELgAgAB4EMQRKBDUENAQ4BD0ETwRPBCAATQRCBD4EIAAyBEEENQQgAEEEIAA8BDgERAQw BDwEOAQgAB8EOwQwBEIEPgQ9BDAEKAA6BD4EQgQ+BEAESwQ5BCAAQwRCBDIENQRABDYENAQwBDsE LAAgAEcEQgQ+BCAAEARCBDsEMAQ9BEIEOAQ0BDAEIAA9BDAERQQ+BDQEOARCBEEETwQgAD0EMAQg ADcEMAQ/BDAENAQ1BCAAPgRCBCAAGARBBD8EMAQ9BDgEOAQoAEIEPgQgADUEQQRCBEwEIAATBDUE QAQ6BEMEOwQ1BEEEPgQyBEsERQQgACEEQgQ+BDsEPwQpACwAIAA/BD4EIABABDAENwQ8BDUEQAQw BDwEIAA/BEAEOAQ8BDUEQAQ9BD4EIABBBCAAHAQwBDsEQwROBCAAEAQ3BDgETgQgADgEIAAxBEsE OwQwBCAAQwQ9BDgERwRCBD4ENgQ1BD0EMAQgADwENQRCBDUEPgRABDgEQgQ+BDwEKQAsACAANAQ1 BDsEMAQ1BDwEIAAyBEsEMgQ+BDQELAAgAEcEQgQ+BCAAOAQgABAEQgQ7BDAEPQRCBDgENAQwBCAA PwQ+BCAAMgRBBDUEOQQgADIEOAQ0BDgEPAQ+BEEEQgQ4BCAAQQRDBEkENQRBBEIEMgQ+BDIEMAQ7 BDAELAAgAEUEPgRCBE8EIABNBEIEPgQgADgEIAA8BDUEPQQ1BDUEIAA0BD4EQQRCBD4EMgQ1BEAE PQQ+BDUEIAA3BD0EMAQ9BDgENQQsACAARwQ1BDwEIAAyBCAAQQQ7BEMERwQwBDUEIAATBDgEPwQ1 BEAEMQQ+BEAENQQ4BC4AIAAcBDUEQgQ+BDQEIABABEMEQQQ7BDAELAAgADoEMAQ6BCAAOARCBD4E MwQsACAANAQwBDUEQgQgADoEMARABEIEOAQ9BEMEIABBBEMESQQ1BEEEQgQyBD4EMgQwBD0EOARP BCAATQRCBDgERQQgADwEOAREBDgERwQ1BEEEOgQ4BEUEIABGBDgEMgQ4BDsEOAQ3BDAERgQ4BDkE LAAgADgERQQgADMEOAQxBDUEOwRMBCwAIAA4BCAAMwQ7BDAEMgQ9BD4ENQQtACAAOARFBCAAQAQ+ BDQEQQRCBDIEPgQgAEEEIAA9BDAEPAQ4BCEAIAAgBD4ENARBBEIEMgQ+BCAAEwQ4BD8ENQRABDEE PgRABDUEOAQgAEEEIABABD4ENAQ+BDwELwAzBDAEPwQ7BD4EMwRABEMEPwQ/BD4EOQQgAFIAKAA6 BDAEOgQgADUENAQ4BD0EQQRCBDIENQQ9BD0ESwQ8BCAAQAQ+BDQEPgQ8BCAAQQQ1BDIENQRABD0E SwRFBCwAIAAxBDUEOwRLBEUELAAgAEEEOAQ7BEwEPQRLBEUEIABDBDwEPgQ8BCAAOAQgAEIENQQ7 BD4EPAQgADsETgQ0BDUEOQQpACAAOAQgAFIAMQBhAC0AIAAwBEAEOARPBDwEOAQsACAAQQQ7BDAE MgRPBD0EMAQ8BDgEIAA4BCAAQARDBEEEQQQ6BDgEPAQ4BCAAOwROBDQETAQ8BDgELgANAA0ADQBJ AEkAIAAgACAAKARDBDwENQRABEsELAAgAEEEOwQwBDIETwQ9BDUEIAA4BCAAMAQ7BEQEMAQyBDgE QgQNAA0AIAAgACAAIAAgACAAIABJAEkAMAQpACAAIQQ7BD4EMwQ+BDIEMARPBCAAPwQ4BEEETAQ8 BDUEPQQ9BD4EQQRCBEwEDQAgABIEOgRABDAEQgRGBDUEIAA+BEEEQgQwBD0EPgQyBDgEPARBBE8E IAA9BDAEIAAoBEMEPAQ1BEAEMARFBCAAOgQwBDoEIAA0BEAENQQyBD0ENQQ5BEgENQQ5BCAARgQ4 BDIEOAQ7BDgENwQwBEYEOAQ4BCAAQQQ+BDMEOwQwBEEEPQQ+BCAAPgREBDgERgQ4BDAEOwRMBD0E PgQ5BCAAOARBBEIEPgRABDgEOAQuACAAIQQ+BDMEOwQwBEEEPQQ+BCAAQQQyBD4EOAQ8BCAAOARB BEEEOwQ1BDQEPgQyBDAEQgQ1BDsETwQ8BCwAIAAoBEMEPAQ1BEAESwQgADgENwQ+BDEEQAQ1BDsE OAQgADcENQQ8BDsENQQ0BDUEOwQ4BDUELAAgAD8EOARBBEwEPAQ1BD0EPQQ+BEEEQgRMBCAAOAQg ADoEMAQ7BDUEPQQ0BDAEQARMBC0AIAA8BD4ESQQ9BEsENQQgAD0ENQQ+BDEERQQ+BDQEOAQ8BEsE NQQgADQEOwRPBCAAQAQwBDcEMgQ4BEIEOARPBCAAOwROBDEEPgQ5BCAARgQ4BDIEOAQ7BDgENwQw BEYEOAQ4BCAAQgQ1BEUEPQQ+BDsEPgQzBDgEOAQuACAAHwQ4BEEETAQ8BDUEPQQ9BD4EQQRCBEwE IAA4BDcEIABPBDcESwQ6BDAEIAA/BEAENQQ0BDwENQRCBD4EMgQgADgEIAA4BDUEQAQ+BDMEOwQ4 BEQEOARHBDUEQQQ6BDgERQQgAEEEOAQ8BDIEPgQ7BD4EMgQgAEIEQAQwBD0EQQREBD4EQAQ8BDgE QAQ+BDIEMAQ7BDAEQQRMBCAAMgQgADoEOwQ4BD0EPgQ/BDgEQQRMBCwAIAA6BD4EQgQ+BEAEMARP BCAAQgRABDAEPQRBBDsEOARCBDUEQAQ4BEAEQwQ1BEIEQQRPBCAAOgQgAEEEPgQyBEAENQQ8BDUE PQQ9BD4EOQQgADsEMARCBDgEPQQ4BEYENQQuACAAIgQ+BCAANQRBBEIETAQgAD8EOARBBEwEPAQ1 BD0EPQQ+BEEEQgRMBCAAMQRLBDsEMAQgAEIEMAQ6BDAETwQgADYENQQsACAAOgQwBDoEIABBBDUE OQRHBDAEQQQgAEMEIAA9BDAEQQQsACAAPQQ+BCAAQQQgAD4EQgQ7BDgERwQ9BEsEPAQgAD4EQgQg AEEEPgQyBEAENQQ8BDUEPQQ9BEsERQQgAE8ENwRLBDoEPgQyBCAAPQQwBDEEPgRABD4EPAQgADEE QwQ6BDIELAAgADoEPgRCBD4EQARLBDUEIAA4BDcEPgQxBEAEMAQ2BDAEOwQ4BEEETAQgADIENAQw BDIEOwQ4BDIEMAQ9BDgENQQ8BCAAOgQ7BDgEPQRMBDUEMgQoADoEMAQ2BDQEMARPBCAAMQRDBDoE MgQwBC0AOAQ1BEAEPgQzBDsEOAREBCAALQAgAD0ENQRBBDoEPgQ7BEwEOgQ+BCAARwQ1BEAEQgQ+ BEcENQQ6BCkALgAgAB8EQAQ4BEcENQQ8BCwAIABEBD4EPQQ1BDwESwQoADcEMgRDBDoEOAQpACAA MQRLBDsEOAQgADoEMAQ6BCAAQwQgAEEEPgQyBEAENQQ8BDUEPQQ9BEsERQQgADEEQwQ6BDIELgAg ABEEPgQ7BEwESAQwBE8EIABHBDAEQQRCBEwEIABBBDsEPgQyBCAAMQRLBDsEMAQgAEEEPgRBBEIE MAQyBDsENQQ9BDAEIAA4BDcEIAAyAC0ARQQoAEAENQQ2BDUEIAA+BDQEPQQ+BC0AIAA4BCAAMwAt AEUEKQAxBEMEOgQyBDUEPQQ9BEsERQQgAEEEOwQ+BDMEPgQyBC4ADQAgAEEALQAgAD8EPgRCBD4E OgQsACAAPwQ+BEIEPgQ8BD4EOgQsACAAQQQ/BDUEQAQ8BDAELAAgAEEEOwQ1BDcESwQsACAAMgQ+ BDQEMAQNAEEATgAtACAAPQQ1BDEEPgQsACAAEwQ1BD0ENQRABDAEOwRMBD0ESwQ5BCAAMQQ+BDME IAA9BDAESAQ1BDMEPgQoADcENQQ8BD0EPgQzBD4EKQAgADwEOARABDAEDQBBAEIALQAgAD4EQgQ1 BEYELAAgAEAEMARBBEIEOAQsACAAMgQ+BDcEMgRLBEgEMARCBEwEQQRPBCwAIAA+BDoEPQQ+BCwA IAA+BEIEOgRABEsEQgQ4BDUELAAgADwEPgRABDUELAAgADQESwRABDAEDQBBAEQALQAgAD4EQgQ1 BEYELAAgADoEQAQ4BDoELAAgAD8ENQRBBD0ETwQsACAAQgRDBEgEMAQsACAAQgRABEMEPwQsACAA QQQ6BDUEOwQ1BEIEDQBBAEcALQAgADQENQQ7BDAEQgRMBCwAIAA0BDUEOQRBBEIEMgQ+BDIEMARC BEwELAAgAD8EQAQ1BDIEQAQwBEkEMARCBEwELAAgAD8ENQRABDUENAQ1BDsESwQyBDAEQgRMBA0A QQBSAC0AIABPBDIEOwQ1BD0EOAQ1BCwAIAAyBDgENAQsACAAQQQ4BE8EQgRMBCwAIABBBDIENQRC BCwAIABBBDoEOwQwBDQELAAgADgENwQzBD0EMARCBEwELAAgADIESwRCBD4EOwQ6BD0EQwRCBEwE DQBBAFMAfgAtACAAPwQ1BEAEMgRLBDkELAAgAD0EMARHBDAEOwRMBD0ESwQ5BA0AQQBLAC0AIAA0 BDUEOwQwBEIETAQsACAANAQ1BDkEQQRCBDIEPgQyBDAEQgRMBA0AQQBMAC0AIAA0BDgEQQRCBDAE PQRGBDgETwQNAEEATQAtACAAMQRLBEIETAQNAEIAQQAtACAANAQ1BDsEOARCBEwELAAgADQEMAQy BDAEQgRMBCwAIABABDAEQQQ/BEAEPgRBBEIEQAQwBD0ETwRCBEwELAAgADQEPgQ7BE8ELAAgAD8E PgRABEYEOARPBCwAIABABDAERgQ4BD4EPQQNAEQAQQAtACAAQQRCBD4EQAQ+BD0EMAQsACAAMQQ7 BDgENwQ+BEEEQgRMBA0ASABBAC0AIAA0BDAEIAAxBEMENAQ1BEIEIQANAEgAQQAnAC0AIAA8BD0E PgQ2BDUEQQRCBDIEPgQsACAAPAQ9BD4EMwQ+BD4EMQRABDAENwQ4BDUELAAgADgENwQ+BDEEOAQ7 BDgENQQNAEsAQQAtACAAOAQ3BD4EMQQ4BDsEOAQ1BCwAIABABD4EQgQNAE0AQQAtACAANgQ4BDcE PQRMBCwAIAA4BDQEQgQ4BCwAIABDBEUEPgQ0BDgEQgRMBCwAIABBBDIETwQ3BEsEMgQwBEIETAQs ACAAOwQ+BDQEOgQwBA0ATgBBAC0AIABHBDUEOwQ+BDIENQQ6BCwAIAA7BDAENAQwBD0ELAAgADoE MAQ8BDUEPQRMBA0ARwBBAC0AIAAxBEsEQgRMBCAAMQQ1BEAENQQ8BDUEPQQ9BEsEPAQsACAAMgRL BD0EMARIBDgEMgQwBEIETAQsACAAPAQ+BDsEPgQ6BD4EDQBSAEEALQAgADcEOwQ+BCwAIABBBDwE NQRABEIETAQsACAAPQQwBD8EOwRLBDIELAAgAD0EMAQyBD4ENAQ9BDUEPQQ4BDUEDQBTAEEALQAg ADMEPgQ7BD4EMgQwBCwAIAA7BDgENAQ1BEAELAAgAEAEMAQxBCwAIAA4BD0ENAQ4BDIEOAQ0BEME QwQ8BCwAIAA+BDEEQAQwBDEEMARCBEsEMgQwBEIETAQsACAAMgQ+BDcENAQ1BDsESwQyBDAEQgRM BCwAIAA2BDgEOwQwBCwAIAA8BEsESARGBDAELAAgAEEEQwRFBD4ENgQ4BDsEOAQ1BCwAIABBBDUE QgRMBCwAIABBBEIEQARDBD0EMAQNAFMAQQB+AC0AIABBBEMEQgRMBA0AUABBAC0AIAA+BEIENQRG BCwAIABABD4EMgQsACAAOgQwBD0EMAQ7BA0AVQBSAC0AIABFBDgESQQ9BEsEOQQgADcEMgQ1BEAE TAQsACAAQQQ+BDEEMAQ6BDAELAAgAEEEOwRDBDMEMAQsACAANgQwBEIETAQsACAAOwRDBEcELAAg ADoEQAQ4BEcEMARCBEwELAAgADQEQAQ+BDEEOARCBEwEIAA4BCAANQRJBDUEIAAzADcAIABBBDwE SwRBBDsEPgQyBA0AVQBTAH4ALQAgAD8ENQQ9BDgEQQQsACAATwQ0BCwAIAA3BDwENQQ5BA0AUgBV AC0AIAAxBDsEMAQzBD4ELAAgAD8EQAQ+BDgENwQyBDUENAQ1BD0EOAQ1BCAAMQQ+BDYENQRBBEIE MgQ1BD0EPQQ+BDMEPgQgADgEQQQ6BEMEQQRBBEIEMgQwBCwAIABCBDAEOwQwBD0EQgQsACAANAQw BEAELAAgADQEMAQyBDAEQgRMBA0ATQBVAC0AIAA4BDwETwQsACAAPAQ4BEAELAAgADMEPgRABD4E NAQsACAAPgRCBEEENQQ6BDAEQgRMBCwAIAA9BDAEMwQ+BEIEMAQsACAAMQRLBEIETAQgADIEIAA/ BDUEOgQ7BDUEDQBOAFUALQAgAD0ENQRCBA0ARABVAC0AIAA4BDQEQgQ4BCwAIABABDAEMQQ+BEIE MARCBEwELAAgAEEEQgRABD4EOARCBEwEDQBEAFUAJwAtACAAMgRLBD0EMARIBDgEMgQwBEIETAQs ACAAQAQ+BDYEMARCBEwEDQBEAFUAMQAxAC0AIAAzBD4EMgQ+BEAEOARCBEwEDQBMAFUALQAgAEcE NQQ7BD4EMgQ1BDoELAAgADwEQwQ2BEcEOAQ9BDAEDQBUAFUALQAgAD8EQAQ+BD0EOAQ6BDAEQgRM BCwAIAA0BD4EMQRABD4ELAAgAD8EPgQ6BEAEPgQyBCwAIAA+BD8ENQQ6BDAEDQBHAFUALQAgADEE SwQ6BA0ARwBVACcALQAgADoEQAQ4BEcEMARCBEwEDQBTAFUALQAgADsEPgQzBD4EMgQ+BCAANwQy BDUEQARPBA0AWgBVAC0AIAA8BEMENARABD4EQQRCBEwELAAgADcEPQQwBEIETAQsACAAPwQ+BD0E OAQ8BDAEQgRMBCwAIAA4BD0ERAQ+BEAEPAQ4BEAEPgQyBDAEQgRMBCwAIAA/BD4EQQRCBDgEMwQw BEIETAQNAEkATgAtACAAPwRABD4EPQQ4BDoEMAROBEkEOAQ5BCwAIAA/BEAEPgRHBD0ESwQ5BCwA IAA9BDAENAQ1BDYEPQRLBDkELAAgAD8EPgRBBEIEPgRPBD0EPQRLBDkEDQBJAE0ALQAgAD4EMQQ7 BDAEOgQ+BCwAIAAzBDsEOAQ9BE8EPQQwBE8EIABCBDAEMQQ7BDgERwQ6BDAELAAgADwEPQQ4BDwE PgRBBEIETAQNAEsASQAtACAANwQ1BDwEOwRPBCwAIABBBEIEQAQwBD0EMAQNAFQASQAtACAANgQ4 BDcEPQRMBCwAIABABDUEMQRABD4EDQBHAEkALQAgAE4EPQQ+BEgEMAQsACAARwQ1BDsEPgQyBDUE OgQgADEEOwQwBDMEPgRABD4ENAQ9BD4EMwQ+BCAAPwRABD4EOARBBEUEPgQ2BDQENQQ9BDgETwQs ACAAPAQ1BEAEMAQgADQEOwQ4BD0ESwQNAEQASQAtACAAQQRDBDQELAAgADIENQRABDQEOAQ6BEIE DQBTAEkALQAgADsEQwRHBCwAIABBBEsEPQQgABEEPgQ2BDgEOQQsACAAOwQ4BD0EOARPBCwAIAAw BD0EQgQ1BD0EPQQwBCwAIABABD4EMwQNAEUATgAtACAARQQ+BDcETwQ4BD0ELAAgADMEPgRBBD8E PgQ0BDgEPQQsACAAEwQ+BEEEPwQ+BDQETAQsACAAMgQ7BDAENARLBDoEMAQsACAAPwQ1BEAEMgQ+ BEEEMgRPBEkENQQ9BD0EOAQ6BCwAIAA/BEAEPgRABDgERgQwBEIENQQ7BEwEDQBCAEUALQAgAEME PAQ1BD0ETARIBDAEQgRMBCwAIAA+BEIENAQ1BDsETwRCBEwELAAgAD4EQgRFBD4ENAQ4BEIETAQs ACAAMwQ+BDIEPgRABDgEQgRMBA0ARwBFAC0AIAA0BDUEMgRDBEgEOgQwBA0ATQBFAC0AIAAxBD4E NgQ1BEEEQgQyBDUEPQQ9BD4EQQRCBEwELAAgADwESwRBBDsETAQsACAAQQQ8BEsEQQQ7BCwAIAA3 BDAEOgQ+BD0EIAA4BCAAPwQ+BEAETwQ0BD4EOgQsACAAOgRDBDsETARCBCwAIABDBD8EQAQwBDIE OwQ1BD0EOAQ1BCwAIABCBDIEPgRABDUEPQQ4BDUEDQAgACAAIAArACsAKwANACAAIgQ+BCAANgQ1 BCAAQQQwBDwEPgQ1BCAAPwRABDgEQQRDBEIEQQRCBDIEQwQ1BEIEIAA4BCAAMgQgADQEQAQ1BDIE PQQ1BEAEQwRBBEEEOgQ+BDwEIABPBDcESwQ6BDUELgAgACIEPgRCBCAARAQwBDoEQgQsACAARwRC BD4ELAAgAD0EMARABDAEMgQ9BDUEIABBBCAANARABEMEMwQ4BDwEOAQgAD0EMARABD4ENAQwBDwE OAQsACAAQwQgAEEEOwQwBDIETwQ9BCAAOARBBD8EPgQ7BEwENwQ+BDIEMAQ7BD4EQQRMBCAAQQQ7 BD4EMwQ+BDIEPgQ1BCAAQQQ7BD4EMgQ+BD4EMQRABDAENwQ+BDIEMAQ9BDgENQQsACAAMAQgAEEE OwQ+BDMEOAQgAD8EQAQ1BDgEPARDBEkENQRBBEIEMgQ1BD0EPQQ+BCAAPwRABDUENARBBEIEMAQy BDsETwQ7BDgEIABBBD4ERwQ1BEIEMAQ9BDgENQQgADMEOwQwBEEEPQQ+BDkEIAA4BCAAQQQ+BDME OwQwBEEEPQQ+BDkELAAgAD8EPgQ0BEIEMgQ1BEAENgQ0BDAETgRCBCAAQQQ+BD4EQgQyBDUEQgRB BEIEMgRDBE4ESQQ4BDUEIABBBDsEPgQyBDAEIAA0BEAENQQyBD0ENQRABEMEQQRBBDoEPgQzBD4E IABPBDcESwQ6BDAEOgANABAEIQQtACAAPwQ+BEIEPgQ8BD4EOgQgABEEPgQzBD4EMgQsACAAMgQ1 BDsEOAQ6BDgEOQQgADwEMARBBEIENQRABA0AEAQSBC0AIAA4BDcEPQQwBEcEMAQ7BEwEPQRLBDUE LAAgADMEOwRDBDEEOAQ9BD0ESwQ1BCAANwQ9BDAEPQQ4BE8EDQAQBBcELQAgAC8ELAAgABcENQQ8 BD0EPgQ5BCAAEQQ+BDMEDQBBACAELQAgADcENQQ8BDsETwQNABAEEwQtACAAQgQ+BCwAIABHBEIE PgQgAD0EOAQ2BDUEIAA9BDAERwQwBDsEMAQNABAEGwQtACAAMgQ8BDUEQQRCBDgEOwQ4BEkENQQg ADwEPQQ+BDYENQRBBEIEMgQwBCwAIAA/BDsEPgRCBD0EPgRBBEIETAQsACAAOgQwBDwENQQ9BEwE DQAQBBwELQAgAEEEQgRABDAENgQNABEEEAQtACAAQQQyBDUEQARFBCwAIAAxBD4ENgQ1BEEEQgQy BDUEPQQ9BEsEOQQgADgEQQRCBD4EOgQgADEEPgQzBD4EMgQNABMEEAQtACAAPwRDBEIETAQNABQE EAQtACAAQwRCBDIENQRABDYENAQ1BD0EOAQ1BCwAIABDBDwEPQQ+BDYENQQ9BDgENQQvADQENQQ7 BDUEPQQ4BDUEIAA0BD4EMQRABDAEDQAgBEEALQAgAEEEMgQ1BEIEDQAlBBAELQAgAEEEMgRPBDcE TAQgADcENQQ8BD0EPgQzBD4EIAA4BCAAPQQ1BDEENQRBBD0EPgQzBD4EDQAoBBAELQAgADIESwRF BD4ENARPBEkENQQ1BCAANwQwBCAAMwRABDAEPQQ4BCAAPARLBEgEOwQ1BD0EOARPBA0AHgQdBC0A IAA+BD0EDQAeBCAELQAgAEEEOAQ7BDAEDQAeBBwELQAgADwEQwQ0BEAEPgRBBEIETAQNAB8EHgQt ACAAPwRABDUENAQ7BD4EMwQgAB8EHgQsACAAMgQ0BD4EOwRMBCAARwQ1BDMEPgQtAEIEPgQsACAA MgQgAEEEPgQ+BEIEMgQ1BEIEQQRCBDIEOAQ4BCAAQQQgAEcENQQ8BC0AOwQ4BDEEPgQNACEEHgQt ACAAQQQgAEcENQQ8BC0AOwQ4BDEEPgQNACMEIAQtACAANwQ1BDwEOwRPBCwAIABCBDUEQARABDgE QgQ+BEAEOARPBA0AIwQcBC0AIABCBD4ELAAgAEcEQgQ+BCAANAQwBFEEQgQgADwESwRIBDsENQQ9 BDgENQQNABQEIwQtACAAQQQyBE8ENwQwBD0EPQQ+BDUEIABBBCAANAQ+BDEEQAQ+BDwEDQAgBCME LQAgADAEOgRCBDgEMgQ9BD4ENQQvADEEOwQwBDMEPgQ1BCAAPQQwBEcEMAQ7BD4EDQAYBB0ELQAg ADQEQwRFBCAARwQ1BDsEPgQyBDUEOgQwBA0AFQQWBC0AIAA8BD0EPgQ2BDUEQQRCBDIENQQ9BD0E PgRBBEIETAQgADYEOAQ3BD0EOAQNACEEFQQtACAAMgQ+BEIEDQAdBBAELQAgAD8EQAQ1BDQEOwQ+ BDMEIAAdBBAEDQAdBBUELQAgAD4EQgRABDgERgQwBD0EOAQ1BCwAIABHBDAEQQRCBDgERgQwBCAA HQQVBA0AIgQQBCwAIAAiBB4ELAAgACIEIwQsACAAIgQVBC0AIABDBDoEMAQ3BDAEQgQ1BDsETAQ9 BEsENQQNABwEEAQdBC0AIABHBDUEOwQ+BDIENQQ6BA0AIAQQBBcELQAgAEIEPgRCBCwAIAA6BEIE PgQgAD8ENQRABDIESwQ5BA0AIAAYBCAAQgQ1BD8ENQRABEwEIABBBDAEPAQ+BDUEIAA4BD0EQgQ1 BEAENQRBBD0EPgQ1BCEAIAAhBEAEMAQyBD0EOAQyBDAENQQ8BCAAPgQxBEAEMAQ3BEsEIABBBD4E PgRCBDIENQRCBEEEQgQyBEMETgRJBDgERQQgAD8ENQRABDIESwRFBCAAPwRPBEIEOAQgADMEOwQw BEEEPQRLBEUEKABBBDsEPgQyBCwAIAAyBCAAOgQ+BEIEPgRABEsENQQgAD4EPQQ4BCAAMgRFBD4E NARPBEIEKQAgADgEIAA+BDQEOAQ9BDAEOgQ+BDIESwRFBCAARAQ+BD0ENQRCBDgERwQ1BEEEOgQ4 BCAANAQyBEMERQQxBEMEOgQyBDUEPQQ9BEsERQQgAEEEOwQ+BDIELQBBBDsEPgQzBD4EMgQgAEME IAAoBEMEPAQ1BEAEIAA4BCAAIARDBEEEOAQ6AA0AMAAuACAAEwQ7BDAEMgQ9BD4ENQQgAE0EQgQ4 BDwEPgQ7BD4EMwQ4BEcENQRBBDoEPgQ1BCAAQAQ+BDQEQQRCBDIEPgQgADcEMAQ7BD4ENgQ1BD0E PgQgADIEIAA/BE8EQgQ4BCAAMwQ7BDAEQQQ9BEsERQQgAEEALAAgAE8ALAAgAFUALAAgAEkALAAg AEUALAAgAD0EPgQgAD4EPQQ+BCAAPwQ+BDoEMAQgAD8EOwQ+BEUEPgQgAD8EQAQ+BEEEPAQwBEIE QAQ4BDIEMAQ1BEIEQQRPBCwAIAA9BDUEIABBBEcEOARCBDAETwQgADEEQwQ6BDIESwQgAEEALAAg ADoEPgRCBD4EQAQwBE8EIAA+BDcEPQQwBEcEMAQ1BEIEIAAyBCAAQQRDBDwEPAQ1BCAAQQRCBDgE RQQ4BE4EIAA9BDAERwQwBDsEMAQgADgEIAAwBDEEQQQ+BDsETgRCBDAELAAgAD8EQAQwBEAEPgQ0 BDgEQgQ1BDsETwQgADIEQQQ1BDMEPgQgADAEOwREBDAEMgQ4BEIEMAQuAA0AMQAuACAAIARDBEEE QQQ6BDgEOQQgABAEFwQgAE0EQgQ+BCAATQRCBDgEPAQ+BDsEPgQzBDgERwQ1BEEEOgQ4BCAAOAQg ADMEQAQwBEQEOARHBDUEQQQ6BDgEIAAoBEMEPAQ1BEAEQQQ6BDgEOQQgAEEATgAoAEIEMAQ6BCAA OgQwBDoEIAAyBCAANARABDUEMgQ9BDUEQARDBEEEQQQ6BD4EPAQgACIAFwQiACAAPwQ4BEEEMAQ7 BD4EQQRMBCAAOgQwBDoEIAAiAFoAIgAtACAAPwQ+BDIEUQRABD0EQwRCBDAETwQgACIATgAiACkA LgAgABcENQQ8BD0EPgQ5BCAAEQQ+BDMEIAA4BCAANwQ1BDwEPQQwBE8EIAA7BDgERwQ9BD4EQQRC BEwELgAgABoEPgQ7BDsENQQ6BEIEOAQyBD0EPgQ1BCAALwQuACAAIQQ7BDAEMgRPBD0EQQQ6BDAE TwQgADEEQwQ6BDIEOARGBDAEIAAiABcEIgAtABcENQQ8BDsETwQuACAAKARDBDwENQRABEEEOgQ+ BDUEIAAiAE4AQQAiAC0AIABHBDUEOwQ+BDIENQQ6BCwAIAA3BDUEPAQ9BD4ENQQgAD0EMARHBDAE OwQ+BC4ALgAuACAAIgQwBDoENgQ1BCAARAQ+BD0ENQRCBDgERwQ1BEEEOgQ4BCAAPAQ+BDYENQRC BCAAMQRLBEIETAQgADEEOwQ4BDcEOgQ+BCAAOgQgAEAEQwRBBEEEOgQ+BDwEQwQgAB4EHQQsACAA MgQgAEEEPARLBEEEOwQ1BCAAEQQ+BDMELgANADIALgAgACAEQwRBBEEEOgQ4BDUEIAAQBCAEIAA4 BCAAIAQQBCwAIAA6BDAEOgQgADcENQQ8BDsETwQgADgEIABBBDIENQRCBCAAPwQ+BEUEPgQ2BDgE IAA9BDAEIABIBEMEPAQ1BEAEQQQ6BDgENQQgAEEAUgAgADgEIABSAEEALQAgAEEEMgQ1BEIELAAg AE8EMgQ7BDUEPQQ4BDUELAAgADgENwQzBD0EMAQ9BDgENQQsACAANwQ1BDwEPQRLBDUEIABBBDwE NQRABEIETAQgADgEIABABDAEQQQ/BDAENAQuAA0AMwAuACAAIARDBEEEQQQ6BD4ENQQgABAEGwQs ACAAOgQwBDoEIAAyBDwENQRBBEIEOAQ7BDgESQQ1BCAATQQ6BDIEOAQyBDAEOwQ1BD0EQgQ9BD4E IABIBEMEPAQ1BEAEQQQ6BD4EPARDBCAAQQBMAC0AIAA0BDsEOAQ9BDAELAAgADoEMAQ6BCAAMgQ8 BDUEQQRCBDgEOwQ4BEkENQQgAD8EQAQ+BEEEQgRABDAEPQRBBEIEMgQwBC4ADQA0AC4AIAAUBBAE LAAgACUEEAQoAEMEQgQyBDUEQAQ2BDQENQQ9BDgENQQsACAAQQQyBE8ENwRMBCAAQQQgAD0ENQQx BDUEQQQ9BEsEPAQpACAAMQQ7BDgENwQ6BD4EIAA6BCAASARDBDwENQRABEEEOgQ4BDwEIABEAEEA IAA4BCAASABBAC0AIABBBEIEPgRABD4EPQQwBCwAIAAxBDsEOAQ3BD4EQQRCBEwELAAgADQEMAQu AA0ANQAuACAAKARDBDwENQRABEEEOgQ+BDUEIABTAEEAIAA6BDAEOgQgADMEPgQ7BD4EMgQwBCAA OAQgADsEOAQ0BDUEQAQgAD8EPgRFBD4ENgQ1BCAAPQQwBCAAQARDBEEEQQQ6BD4ENQQgACYEEARA BEwELgANADYALgAgACgEQwQ8BDUEQARBBDoEPgQ1BCAAUABBACAATQRCBD4EIAA4BCAAQARDBEEE QQQ6BDgEOQQgAD4EQgQ1BEYELQAgAB8EEAQfBBAEIQANADcALgAgACgEQwQ8BDUEQARBBDoEOAQ5 BCAARwQ1BDsEPgQyBDUEOgQgAEwAVQAgAE0EQgQ+BCAAQARDBEEEQQQ6BDgEOQQgABsELgQ0BC4A DQA4AC4AIAAQBCAAUgBVACAAOAQgACAEIwQgAC0EIgQeBCAAHAQrBCAAIQQgABIEEAQcBBgEIQAg ABwESwQsACAAMQQ7BDAEMwQ4BDUELAAgADEEOwQwBDMEPgQ1BCAAPQQwBEcEMAQ7BD4ELAAgADEE OwQwBDMEPgQ5BCAAIAQjBCEEIQQaBBgEGQQgAEAEPgQ0BC4AIAAtBEIEPgQgADcEPQQwBDsEOAQg AEgEQwQ8BDUEQARLBCAAOAQsACAAOgQ+BD0ENQRHBD0EPgQsACAANwQ9BDAEOwQ4BCAAPQQ1BCAA PwRABD4EQQRCBD4EIABCBDAEOgQuACAAHARLBCAAPQQ1BCAANwQ9BDAENQQ8BCAAOAQgAD8EQAQ+ BDcEQAQ1BD0EOARPBCAAPQQ1BDoEPgRCBD4EQARLBEUEIABABDUENAQ6BD4EIAA+BEIEOgRABEsE MgQwBE4EQgQgAEEEOwQ1BD8EPgQ8BEMEIAA+BDEESQQ1BEEEQgQyBEMEIAAyBEEETgQgAD8EQAQw BDIENARDBC4ADQA5AC4AIAAgBEMEQQRBBDoEPgQ1BCAAFAQjBCwAIABBBDIETwQ3BDAEPQQ9BD4E NQQgAEEEIAA0BD4EMQRABD4EPAQsACAAQAQwBEEEOgRABEsEMgQwBDUEQgRBBE8EIAA/BD4EOwQ9 BD4ERgQ1BD0EPQQ+BCAAMgQgADoEMARBBDoEMAQ0BDUEIABBBDwESwRBBDsEPgQyBCAASARDBDwE NQRABEEEOgQ+BDMEPgQgAEQAVQAgADgEIABEAFUAbgAoAEgEQwQ8BDUEQARBBDoEMARPBCAAMgQw BEAEOAQwBEYEOARPBCAAVQApAC4ADQAxADAALgAgAB8EQAQ+BD0EOAQ6BDAETgRJBDUENQQgAD8E PgRBBEIEPgRPBD0EQQRCBDIEPgQgAEgEQwQ8BDUEQARBBDoEPgQzBD4EIABJAE4AIAA/BD4ERQQ+ BDYENQQgAD0EMAQgAEAEQwRBBEEEOgQ4BDkEIAA0BEMERQQgAEcENQQ7BD4EMgQ1BDoEMAQtACAA GAQdBC4ADQAgACIEMAQ6BDYENQQgADoEMAQ6BCAAOAQgAEgEQwQ8BDUEQARLBCwAIABBBDsEMAQy BE8EPQQ1BCAAMgQgAD4ENAQ9BD4ELQAgADgEIAA0BDIEQwRFBDEEQwQ6BDIENQQ9BD0ESwQ1BCAA QQQ7BD4EMgQwBCAANwQwBDoEOwQwBDQESwQyBDAEOwQ4BCAAOgQ4BEAEPwQ4BEcEOAQ6BDgEIABB BDwESwRBBDsEMAQsACAAMQQ7BDAEMwQ+BDQEMARABE8EIAA6BD4EQgQ+BEAESwQ8BCAAMgQgADQE MAQ7BEwEPQQ1BDkESAQ1BDwEIABBBD4EQQRCBDAEMgQ7BE8EOwQ4BEEETAQgAEEEOwQ+BDYEPQRL BDUEIAA/BD4EPQRPBEIEOARPBCAAOAQgAEEEOwQ+BDIEMAQuACAALQRCBDgEIAA6BDgEQAQ/BDgE RwQ4BDoEOAQgADgEMwRABDAEOwQ4BCAAMgQwBDYEPQRDBE4EIABABD4EOwRMBCAAMgQgADoEQwQ7 BEwEQgRDBEAENQQsACAAPwRABDUENAQ6BDUEIABBBD4EMgRABDUEPAQ1BD0EPQRLBEUEIAA6BEME OwRMBEIEQwRABCAAMgRBBDUEMwQ+BCAAPAQ4BEAEMAQgADgEIABPBDcESwQ6BDUEIABNBEIEPgQz BD4EIAA/BEAENQQ0BDoEMAQsACAAMQQwBDcESwQgAEAEMAQ3BDIEOARCBDgETwQgAEEEPgQyBEAE NQQ8BDUEPQQ9BEsERQQgAE8ENwRLBDoEPgQyBC4AIAAhBD4EMwQ7BDAEQQQ9BEsENQQgADEEQwQ6 BDIESwQgAEgEQwQ8BDUEQAQgAE0EQgQ4BDwEPgQ7BD4EMwQ4BEcENQRBBDoEOAQgAE0EOgQyBDgE MgQwBDsENQQ9BEIEPQRLBCAAQARDBEEEQQQ6BD4EPARDBCAAMAQ7BEQEMAQyBDgEQgRDBC4AIAAa BD4EPQQ1BEcEPQQ+BCwAIABBBCAAQgQ+BEcEPQQ+BEEEQgRMBE4EIAA0BD4EIABCBEsEQQRPBEcE IAA7BDUEQgQgADgEIAA6BDgEOwQ+BDwENQRCBEAEPgQyBCwAIABABDAENwQ0BDUEOwRPBE4ESQQ4 BEUEIAA6BEMEOwRMBEIEQwRABEMEIABIBEMEPAQ1BEAEIAA4BCAAQQQ7BDAEMgRPBD0EIAA9BDAE SAQ1BDkEIABNBEAESwQuACAAGgQwBDoEIAA2BDUEIABCBDAEOgQgAD8EPgQ7BEMERwQ4BDsEPgRB BEwEPwAgABwEPgQ2BD0EPgQgAD8EQAQ1BDQEPwQ+BDsEPgQ2BDgEQgRMBCwAIABHBEIEPgQgAEgE QwQ8BDUEQARBBDoEOAQ5BCAATwQ3BEsEOgQgAD8EQAQ4BEgEUQQ7BCAAOgQgAD0EMAQ8BCAARwQ1 BEAENQQ3BCAAGgQwBDIEOgQwBDcELgAgABQENQQ5BEEEQgQyBDgEQgQ1BDsETAQ9BD4ELAAgADUE QQRCBEwEIABABE8ENAQgADAEPQQwBDsEPgQzBDgERwQ9BEsERQQgAE0EQgQ4BDwEPgQ7BD4EMwQ4 BEcENQRBBDoEOARFBCAAQQQyBE8ENwQ1BDkEIAA8BDUENgQ0BEMEIABPBDcESwQ6BDAEPAQ4BCAA PQQwBEAEPgQ0BD4EMgQsACAAQgQwBDoEOARFBCAAOgQwBDoEIAA0BEAENQQyBD0ENQQ1BDIEQAQ1 BDkEQQQ6BDgEOQQsACAANARABDUEMgQ9BDUEMARABDwETwQ9BEEEOgQ4BDkELAAgAEEEOARABDgE OQRBBDoEOAQ5BCAAOAQgAD8EQAQ+BEcEOAQ8BDgELgAgAB0EHgQgAEAENQQwBDsETAQ9BD4EQQRC BEwEIABCBDAEOgQ+BDIEMAQsACAARwRCBD4EIABBBDIETwQ3BDgEIAA+BEIEPQROBDQETAQgAD0E NQQgAEEEOwRDBEcEMAQ5BD0ESwQuACAAGAQgAD0EOAQ6BEIEPgQgAD0EMAQ8BCAARwQ1BEAENQQ3 BCAAGgQwBDIEOgQwBDcEIAA6BEMEOwRMBEIEQwRABEMELAAgADoEPgQ9BDUERwQ9BD4ELAAgAD0E NQQgADcEMAQ9BD4EQQQ4BDsELAAgADIEQQRRBCAAPwRABD4EOAQ3BD4ESAQ7BD4EIABBBCAAQgQ+ BEcEPQQ+BEEEQgRMBE4EIAA0BD4EIAA9BDAEPgQxBD4EQAQ+BEIELgANACAAGgRDBDsETARCBEME QAQwBCAAEwQ4BD8ENQRABDEEPgRABDUEOAQgAE8EMgQ4BDsEMAQgAEEENQQxBE8EIAAyBCAAPgQx BEkEOARFBCAAPwRABDAEMgQ4BDsEMARFBCAAQAQwBDcEMgQ4BEIEOARPBCAATwQ3BEsEOgQwBCAA OAQgAD8EOARBBEwEPAQ1BD0EPQQ+BEEEQgQ4BC4AIAAaBEAEPgQ8BDUEIAAxBDAENwQ+BDIESwRF BCAAMQRDBDoEMgQgADgEIABBBDsEPgQzBD4EMgQgAEgEQwQ8BDUEQARLBCAAPgQxBEAEMAQ3BD4E MgRLBDIEMAQ7BDgEIABBBDsEPgQyBDAEIAA4BCAAOARFBCAAQQQ8BEsEQQQ7BCAAPwQ+BCAAQgQ1 BDwEIAA2BDUEIAA/BEAEMAQyBDgEOwQwBDwELAAgAEcEQgQ+BCAAOAQgADIEIABABEMEQQRBBDoE PgQ8BCAATwQ3BEsEOgQ1BCwAIAA6BDAEOgQgAD8EPgQ6BDAENwQwBD0EPgQgADQEMAQ7BDUENQQu ACAAEwQ7BDAEMgQ9BDAETwQgAD8EQAQ4BEcEOAQ9BDAEIABNBEIEPgQzBD4ELAAgADoEMAQ6BCAA OAQgAE0EQgQ4BDwEPgQ7BD4EMwQ4BEcENQRBBDoEPgQzBD4EIABABD4ENARBBEIEMgQwBCwAIAA4 BCAAMgRBBE8EIABBBEMEQgRMBCAAPQQ1BE8EMgQ9BD4EOQQgAD8EQAQwBDIENARLBCAAMgQgAEYE NQQ7BD4EPAQgADcEMAQ6BDsETgRHBDAENQRCBEEETwQgADIEIABCBD4EPAQsACAARwRCBD4EIABP BDcESwQ6BCAAKARDBDwENQRABCwAIAA0BDAEPQQ9BEsEOQQgADgEPAQgAD8EPgQgAD8EQAQ1BDQE MAQ9BDgETgQgABEEPgQzBDAEPAQ4BCwAIAAxBEsEOwQgAEAEQwRBBEEEOgQ4BDwEIABPBDcESwQ6 BD4EPAQhAA0ADQAgACAAIAAgACAAIAAgAEkASQAxBCkAIAAhBDsEPgQzBDgEIAA4BCAAQQQ8BEsE QQQ7BD4EPgQxBEAEMAQ3BD4EMgQwBD0EOAQ1BA0AIAAiBDUEPwQ1BEAETAQgAEEEQAQwBDIEPQQ4 BDwEIAA/BEAEMAQyBDgEOwQwBCAAQQQ7BD4EMgQ+BD4EMQRABDAENwQ+BDIEMAQ9BDgETwQuACAA IwQgACgEQwQ8BDUEQAQsACAAOgQwBDoEIAA4BCAAMgQgAEAEQwRBBEEEOgQ+BDwEIABPBDcESwQ6 BDUELAAgAD4EMQRABDAENwQ+BDIEMAQ9BDgENQQgAEEEOwQ+BDIEMAQgAD8EPgRFBD4ENgQ1BCAA PQQwBCAAPgQxBEAEMARJBDUEPQQ4BDUEIAA6BCAAPgQxBEoENQQ6BEIEMAQ8BCAAMgQgAD4EMQRK BDUEOgRCBD0EPgQtAD4EQAQ4BDUEPQRCBDgEQAQ+BDIEMAQ9BD0ESwRFBCAATwQ3BEsEOgQwBEUE IAA/BEAEPgQzBEAEMAQ8BDwEOARABD4EMgQwBD0EOARPBDoAIAA1BEEEOwQ4BCAANQRBBEIETAQg ADIAIAA+BEEEPARLBEEEOwQ1BD0EPQRLBEUEIABBBDsEPgQzBDAELwBBBDsEPgQyBDAEIABYACAA OAQgAFkALAAgAEIEPgQgAEEEOwQ+BDIEPgQgAFoALAAgAEAEMAQyBD0EPgQ1BCAAWABZACAAOAQ8 BDUENQRCBCAAQQQ8BEsEQQQ7BCAAIgBHBDAEQQRCBEwEIABYACwAIABBBD4ENAQ1BEAENgQwBEkE MARPBCAAWQAiACAAOAQ7BDgEIAAiADIEQQQ1BCAATQQ7BDUEPAQ1BD0EQgRLBCAAWQAgAEEEIAA6 BDAERwQ1BEEEQgQyBD4EPAQgAFgAIgAuACAAIgQ+BCAANQRBBEIETAQgADIEPAQ1BEEEQgQ1BCAA QQQ+BCAAQQQ7BD4EMgQ+BDwEIAA+BDEEQAQwBDcEQwQ1BEIEQQRPBCAAOAQgAD0EPgQyBEsEOQQg AEEEPARLBEEEOwQtACAAPwRABD4EOARBBEUEPgQ0BDgEQgQgACIAQQQ8BEsEQQQ7BD4EPgQxBEAE MAQ3BD4EMgQwBD0EOAQ1BCIALgANACIEMAQ6BCwAIAA9BDAEPwRABDgEPAQ1BEAEOgANACAAQQAo ACIAPQQwBEcEMAQ7BD4ELwA9BDUEMQQ+BC8AYwA1BDwETwQiACkAKwBNAEEAKAAiADYEOAQ3BD0E TAQiACkAPQBBAE0AQQAoACIAPAQwBDwEMAQiACkAIAAtAC0APgAgACcEMARBBEIETAQgACgAPwQ1 BEAEMgQ+BC0AKQA9BDAERwQwBDsEMAQsACAAQQQ+BDQENQRABDYEMARJBDAETwQgADIEIABBBDUE MQQ1BCAANgQ4BDcEPQRMBA0AIABSAEEAKAAiAD8EPgRCBD4EPwQvAEEEPAQ1BEAEQgRMBCIAKQAr AFIAQQA9AFIAQQBSAEEAKAAiADcEOwQ+BCIAKQAgAC0ALQA+ACAAIgQwBCAAQQQ8BDUEQARCBEwE LAAgADIEIAA6BD4EQgQ+BEAEPgQ5BCAANQRBBEIETAQgAEIEPgQ7BEwEOgQ+BCAAQQQ8BDUEQARC BEwEDQAgAFUAUgAoACIANwQyBDUEQARMBCIAKQArAEIAVQBSAFUAKAAiAEMEQAQ+BDYEMAQ5BCwA IAAyBEsEQAQ1BDcEMARCBEwEIgApAD0AVQBSAEIAVQBSAFUAKAAiACMEQAQ+BDEEPgRABD4EQQQi AC0AIAA6BDsETgRHBDUEMgQ+BDUEIAA/BD4EPQRPBEIEOAQ1BCAAQAQ1BDsEOAQzBDgEOAQgAEgE QwQ8BDUEQAQ+BDIELQAgADcEPAQ1BDkELAAgADoEPgRCBD4EQARLBDkEIAA1BEEEQgQgAEEEMgQ+ BDkEIABFBDIEPgRBBEIEKQAgAC0ALQA+ACAAFwQyBDUEQARMBCwAIABBBD4ENAQ1BEAENgQwBEkE OAQ5BCAAMgQgAEEENQQxBDUEIABDBEAEPgQ2BDAEOQQNACAAGAQgAEIEMAQ6BCAANAQwBDsENQQ1 BC4ALgAgABIEIABIBEMEPAQ1BEAEQQQ6BD4EPAQgAD8EQAQwBDoEQgQ4BEcENQRBBDoEOAQgAD4E QgRBBEMEQgRBBEIEMgRDBE4EQgQgADgEOwQ4BCAAOAQ8BDUETgRCBCAAPAQ9BD4ENgQ1BEEEQgQy BDUEPQQ9BEsENQQgADgEIAA9BDUEPgQ/BEAENQQ0BDUEOwQ1BD0EPQRLBDUEIABCBD4EOwQ6BD4E MgQwBD0EOARPBCAAQQQ7BD4EMgQwBCwAIABBBD4EPgRCBDIENQRCBEEEQgQyBEMETgRJBDgENQQg AD4ENAQ9BD4EOQQgAEQEPgQ9BDUEPAQ1BCgAPQQ1BCAAQQRHBDgEQgQwBE8EIAAiABAEIgApACwA IAAwBCAAQgQwBDoENgQ1BCAAMgRLBEEEPgQ6BDAEIAAyBDAEQAQ4BDAEQgQ4BDIEPQQ+BEEEQgRM BCAAPgQxBEAEMAQ3BD4EMgQwBD0EOAQ5BCAAQQQ8BEsEQQQ7BDAEIABDBCAAPAQ9BD4EMwQ+BDEE QwQ6BDIENQQ9BD0ESwRFBCAAQQQ7BD4EMgQuACAAHwQ+BE0EQgQ+BDwEQwQsACAAPQQ1BDIEPgQ3 BDwEPgQ2BD0EPgQgAE0EQgQ4BDwEIABBBD8EPgRBBD4EMQQ+BDwEIAA/BD4EPQRPBEIETAQgAEEE PARLBEEEOwQ+BD4EMQRABDAENwQ+BDIEMAQ9BDgENQQgADwEPQQ+BDMEOARFBCAAMwBFBC0AMQRD BDoEMgQ1BD0EPQRLBEUEIABBBDsEPgQyBCwAIAAwBCAAPAQ9BD4EMwQ+BDEEQwQ6BDIENQQ9BD0E SwQ1BCAAOAQ8BDUETgRCBCAARgQ1BDsESwQ1BCAAMgQ1BEAENQQ9BDgERgRLBCAAQQQ8BEsEQQQ7 BD4EMgQuAA0AIAAiBD4EIAA2BDUEIABBBDAEPAQ+BDUEIAA/BEAEPgRBBDsENQQ2BDgEMgQwBDUE QgRBBE8EIAA4BCAAQwQgADQEQAQ1BDIEPQQ4BEUEIABBBDsEMAQyBE8EPQQuACAAHAQ9BD4EMwQ4 BDUEIABBBDsEPgQyBDAEIAA+BDEEQAQwBDcEPgQyBDAEPQRLBCAAOAQ3BCAAMgBFBC0AMQRDBDoE MgQ1BD0EPQRLBEUEIABBBDsEPgQzBD4EMgQ6AA0AIARBAE0AKAAnAGgAKQBBACgAYwAgACIASARD BDwENQRABEEEOgQ+BDMEPgQiAC0AIABBBDwENQRABEIETAQsACAAQQQ+BDQENQRABDYEMARJBDAE TwQgADYEOAQ3BD0ETAQvAEEEPAQ1BEAEQgRMBCwAIAA0BDAETgRJBDAETwQgADYEOAQ3BD0ETAQp AC0AIAAzBDsEMAQyBD0ESwQ5BCAAQARDBEEEQQQ6BDgEOQQgADEEPgQzBCwAIAA0BDAEMgRIBDgE OQQgADYEOAQ3BD0ETAQgADIEQQQ1BDwEIAAxBD4EMwQwBDwEIAA4BCAAPAQ4BEAEPgQ3BDQEMAQ9 BDgETgQuAA0ATQBBAC4AIARBACgAIgA2BDgENwQ9BEwELAAgAEEEPgQ0BDUEQAQ2BDAESQQwBE8E IABBBDwENQRABEIETAQiACkALQAgADwEMARCBDUEQAQ4BD0EQQQ6BDgEOQQgAEEEMgQ1BEIELAAg ADEEPgQzBDgEPQRPBCAAQQQ8BDUEQARCBDgELgANAE0AQQAuAE0AQQAoACIANgQ4BDcEPQRMBCwA IABBBD4ENAQ1BEAENgQwBEkEMARPBCAAMgQgAEEENQQxBDUEIAA2BDgENwQ9BEwEIgApAC0AIAA8 BDAEPAQwBCwAIAAwBD0EMAQ7BD4EMwQgAEgEQwQ8BDUEQARBBDoEPgQzBD4EIAAiADAEPAQwBCIA LQAgACIAMQQ+BDMEOAQ9BE8EIAA2BDgENwQ9BDgEIgAgAA0AIQQeBC4AEgQVBCEEIgQsBC0AIABC BD4EIABHBEIEPgQgACgALwAyBDwENQRBBEIENQQvAEEEMgRPBDcEMAQ9BD4EKQAgACEEIAASBBUE IQQiBCwETgQNABgEFAQVBC4AEAQbBC0AIAAyBDwENQRBBEIEOAQ7BDgESQQ1BCAAPAQ9BD4ENgQ1 BEEEQgQyBDAEIAA4BDQENQQ5BA0AKAQQBC4AHAQQBB0ELQAgAEcENQQ7BD4EMgQ1BDoELAAgADIE SwRIBDUENARIBDgEOQQgADcEMAQgAEAEMAQ8BDoEOAQgAD4EMQRLBEcEPQQ+BDMEPgQgADwESwRI BDsENQQ9BDgETwQNACEEHwQQBCEEGAQuABEEHgQtACAAIgAhBB8EEAQhBDAETgRJBDgEOQQgABEE PgQzBCIALgAgACMEQgQyBDUEQAQ2BDQENQQ9BDgENQQgAD0ENQQ6BDgEPAQgADEEOwQwBDMEPgQ0 BDAEQAQ9BEsEPAQgAEEEQwQxBEoENQQ6BEIEPgQ8BCAANARABEMEMwQ+BDMEPgQgAEcENQQ7BD4E MgQ1BDoEMAQgABEEHgQzBD4EPAQgADIEIAA+BEIEMgQ1BEIEIAA9BDAEIAA1BDMEPgQsACAARwQ1 BDsEPgQyBDUEOgQwBCwAIAA0BDUEOQRBBEIEMgQ4BE8ELAAgADIEIABBBDIETwQ3BDgEIABBBCAA QgQ1BDwELAAgAEcEQgQ+BCAAPgQ9BCwAIABHBDUEOwQ+BDIENQQ6BCwAIAAhBB8EEAQhBDAENQRC BEEETwQgADQENQQ7BDAETwQgAE0EQgQ+BCwAIABHBEIEPgQtAEIEPgQgAEUEPgRABD4ESAQ1BDUE IAA0BDsETwQgAEEEQwQxBEoENQQ6BEIEMAQuACAAEQQ7BDAEMwQ+BDQEMARABE8ESQQ4BDkELAAg AEIEPgRCBCAAOgRCBD4EIAAzBD4EMgQ+BEAEOARCBCAANQQ8BEMEIAAiACEEHwQQBCEEGAQRBB4E IgAsACAAQgQwBDoEOAQ8BCAAPgQxBEAEMAQ3BD4EPAQsACAAQQQ+BDIENQRABEgEMAQ1BEIEIAA8 BD4EOwQ4BEIEMgRDBCAAEQQeBDMEQwQgAD4EIAAhBB8EEAQhBDUEPQQ4BDgEIABHBDUEOwQ+BDIE NQQ6BDAELgANABEEGwQQBBMEHgQuABQEEAQgBC4ELQAgABQEEAQgBC4EIAARBBsEEAQTBB4ELgAg ACIEQwRCBCAAMgRBBFEEIAA/BEAENQQ0BDUEOwRMBD0EPgQgAE8EQQQ9BD4EIQANACAAIAAgACsA KwArAA0AIAQQBC4AFAQjBC4AEwQQBC0AIAATBBAEIABBBD4EIABBBDIENQRCBD4EMgQ+BDkEIAAi ABQEIwQwBDsETAQ9BD4EQQRCBEwETgQiACgAQAQwBDcENAQ1BDsENQQ9BDgENQQ8BCAAEwQQBC0A IgA/BEMEQgQ4BCIAIAAyBCAAMgQ4BDQENQQgABQEIwQTBDgEIAA9BDAEIAAyACAAOAQgADEEPgQ7 BDUENQQgAEAEMAQ3BD0EPgRGBDIENQRCBD0ESwRFBCAAPwQ+BEIEPgQ6BD4EMgQgAEEEMgQ1BEIE MAQpAC4AIAAtBEIEPgQgACAEEAQ3BD0EPgRGBDIENQRCBD0EMARPBCAAFAQjBBMEEAQuAA0AIAAg ACAAKwArACsADQAgABwEPQQ+BDYENQRBBEIEMgQ+BCAAQQQ7BD4ENgQ9BEsERQQgAEAEQwRBBEEE OgQ4BEUEIABBBDsEPgQyBCwAIABBBD4EQQRCBDAEMgQ7BDUEPQQ9BEsERQQgAD8EPgQgAD8EQAQw BDIEOAQ7BDAEPAQgAEEEOwQ+BDIEPgQ+BDEEQAQwBDcEPgQyBDAEPQQ4BE8EIAA9BDAESAQ1BDME PgQgAE8ENwRLBDoEMAQgAEcENQRABDUENwQgACIAPgQiACwAIABCBDAEOgQ2BDUEIAA/BD4ENARC BDIENQRABDYENAQwBE4EQgQgAD4EMQRJBDUENQQgADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BD4E NQQgAD8EQAQwBDIEOAQ7BD4EIABBBDwESwRBBDsEPgQ+BDEEQAQwBDcEPgQyBDAEPQQ4BE8ELgAg AC0EQgQ+BCAAQgQwBDoEOAQ1BCAAQQQ7BD4EMgQwBCAAOgQwBDoEIAAzBD4EQAQ+BDQEPgQyBD4E OQQoACIAMgQ+BDkEIgAgAE0EQgQ+BCAAMgQ+BDgEPQQpACwAIAAzBEAEMAQ0BD4EPQQwBEcEMAQ7 BEwEPQQ4BDoELAAgAEEENQRABD4EMQRDBEAEPgQ8BDAEOwQ4BD0EPgQyBEsEOQQgADgEIAA8BD0E PgQ2BDUEQQRCBDIEPgQgADQEQARDBDMEOARFBCAAQQQ7BD4ENgQ9BEsERQQgAEEEOwQ+BDIELgAg AB4EMwRABD4EPAQ9BD4ENQQgADoEPgQ7BDgERwQ1BEEEQgQyBD4EIABBBDsEPgQ2BD0ESwRFBCAA RwQ1BDsEPgQyBDUERwQ1BEEEOgQ4BEUEIAA4BDwENQQ9BCwAIAA6BDAEOgQgAD8EQAQwBDIEOAQ7 BD4EIABBBD4ENAQ1BEAENgQwBEkEOAQ1BCAANAQ+BDEEQAQ+BDUEIAA+BEIEPQQ+BEgENQQ9BDgE NQQgADoEIABCBDUEPAQgADgEOwQ4BCAAOAQ9BEsEPAQgADAEQQQ/BDUEOgRCBDAEPAQgAEAENQQw BDsETAQ9BD4EQQRCBDgELQAgADEEPgQzBDAEPAQsACAANgQ4BDIEPgRCBD0ESwQ8BCwAIAA8BD4E QARPBDwELAAgAD8EPgQ7BE8EPAQgADgEIAA+BDcENQRABDAEPAQsACAAQgQwBDoENgQ1BCAAQQQ+ BDcENAQwBD0ESwQgAEEEIAA4BEEEPwQ+BDsETAQ3BD4EMgQwBD0EOAQ1BDwEIAAyBD4ENwQ8BD4E NgQ9BD4EQQRCBDgEIAA6BD4EPAQxBDgEPQQ4BEAEPgQyBDAEPQQ4BE8EIABBBDwESwRBBDsEPgQy BCgALwRABD4EQQQ7BDAEMgQsACAAIQQyBE8EQgQ+BEEEOwQwBDIEIAA4BCAAQgQwBDoEIAA0BDAE OwQ1BDUEKQAuAA0AIAAaBEAEPgQ8BDUEIABCBD4EMwQ+BCwAIABBBDUEOQRHBDAEQQQgAD8EPgQg ADIEQQQ1BDkEIAAVBDIEQAQwBDcEOAQ4BCwAIAA+BEEEPgQxBDUEPQQ9BD4EIAAyBCAAQQQ1BDIE NQRABD0ESwRFBCAARwQwBEEEQgRPBEUELAAgAD0EMAQ5BDQENQQ9BD4EIAA8BD0EPgQ2BDUEQQRC BDIEPgQgAD8EMAQ8BE8EQgQ9BDgEOgQ+BDIEIAA0BD4EPwQ+BEIEPgQ/BD0ESwRFBCAAOgRDBDsE TARCBEMEQAQsACAAOARBBD8EPgQ7BEwENwQ+BDIEMAQyBEgEOARFBCAAPQQwBDQEPwQ4BEEEOAQg AD0EMAQgAEAEQwQ9BDgEOgQ1BCwAIAAwBD0EMAQ7BD4EMwQ4BEcEPQQ+BDkEIAAwBEAEOAQ5BEEE OgQ+BDkELgANACAAHgQxBEkEOAQ1BCAAMQRDBDoEMgRLBCwAIABBBDgEPAQyBD4EOwRLBCAAOAQg AEEEPARLBEEEOwRLBCAAOAQgAD8EQAQwBDIEOAQ7BDAEIAA+BDEEQAQwBDcEPgQyBDAEPQQ4BE8E IABBBDsEPgQyBCAANAQyBEMERQQgADoEQwQ7BEwEQgRDBEAELAAgADwENQQ2BDQEQwQgADoEPgRC BD4EQARLBDwEOAQsACAAPwQ+BCAAPwRABDUENARBBEIEMAQyBDsENQQ9BDgETwQ8BCAAQQQ+BDIE QAQ1BDwENQQ9BD0EPgQ5BCAAPgREBDgERgQ4BDAEOwRMBD0EPgQ5BCAAOARBBEIEPgRABDgEOAQg AEIESwRBBE8ERwQ4BCAAOwQ1BEIEIAA4BCAAOgQ4BDsEPgQ8BDUEQgRABD4EMgQsACAAMgQgAEEE QwQ8BDwENQQgAEEEIAA/BD4ERQQ+BDQEPgQ8BCAAMARABDgENQQyBCAAOAQ3BCAAEQQwBDsEOgQw BD0EIAAyBCAAGgQ4BEIEMAQ5BCAAPgQ6BD4EOwQ+BCAANQAgAEIESwRBBE8ERwQgADsENQRCBCAA PQQwBDcEMAQ0BCAAPQQ1BCAAPgRBBEIEMAQyBDsETwROBEIEIABBBD4EPAQ9BDUEPQQ4BE8EIAAy BCAAQgQ+BDwELAAgAEcEQgQ+BCAAPwQ+BEUEPgQ0BCAAMQRLBDsEIAA9BDUEIABCBD4EOwRMBDoE PgQgADIEIAAaBDgEQgQwBDkELAAgAD0EPgQgADAEQAQ4BDkERgRLBCAAQwRIBDsEOAQgAEcEMARB BEIEOARHBD0EPgQgADIEIAAoBEMEPAQ1BEAEIAA4BCAAFQQzBDgEPwQ1BEIELAAgAD8EQAQ4BD0E NQRBBE8EIABCBEMENAQwBCAAQQQyBD4EOQQgAD8EQAQwBD0EPgRBBEIEQAQwBEIEOARHBDUEQQQ6 BDgEOQQsACAAMwQ4BD8ENQRABDEEPgRABDUEOQRBBDoEOAQ5BCwAIAAwBEAEOAQ5BEEEOgQ4BDkE LAAgAD8EQAQwBEAEQwRBBEEEOgQ4BDkEIAA4BDsEOAQgAD8EQAQ+BEEEQgQ+BCAAIAQjBCEEIQQa BBgEGQQgAC8EFwQrBBoELgANAA0AIAAgACAAIAAgACAAIABJAEkAMgQpACAAEQRDBDoEMgQ4BEYE MAQNACAAEgQgADQEPgQ/BD4EQgQ+BD8EPQQ+BDwEIABPBDcESwQ6BDUEIAA4BDcEPQQwBEcEMAQ7 BEwEPQQ+BCAAPQQ1BEEEOgQ+BDsETAQ6BD4EIAAxBEMEOgQyBCAAPgQxBD4ENwQ9BDAERwQwBDsE OAQgADMEOwQwBDIEPQRLBDUEIABBBEIEOARFBDgEOAQgADwEOARABDAELAAgADoEPgRCBD4EQARL BDUEIAA8BD4EMwQ7BDgEIAA4BEEEPwQ+BDsETAQ3BD4EMgQwBEIETARBBE8EIAA6BDAEOgQgAEEE OwQ+BDIEMAQgAEEEMAQ8BDgEIAA/BD4EIABBBDUEMQQ1BCAAOAQgADgENwQgADoEPgRCBD4EQARL BEUEIAA6BD4EPQRBBEIEQARDBDgEQAQ+BDIEMAQ7BDgEIAAyAC0ARQQgADEEQwQ6BDIENQQ9BD0E SwQ1BCAAQQQ7BD4EMgQwBC0AQQQ7BD4EMwQwBCAAOAQgADEEPgQ7BDUENQQgAEEEOwQ+BDYEPQRL BDUEKAAyBEAEPgQ0BDUEIAAiAE0AQQBNAEEAIgAgADgEIAA/BEAELgApAC4AIAAXBD0EMARPBCAA OAQgAD8EPgQ9BDgEPAQwBE8EIABNBEIEPgRCBCAATwQ3BEsEOgQsACAAPAQ+BDYEPQQ+BCAAOwQ1 BDMEOgQ+BCAAMgQ+BEEEQQRCBDAEPQQ+BDIEOARCBEwEIAA/BEAEMAQyBDgEOwQwBCAAQQQ8BEsE QQQ7BD4EPgQxBEAEMAQ3BD4EMgQwBD0EOARPBCAAMgQgAEgEQwQ8BDUEQARBBDoEPgQ8BCwAIABA BEMEQQRBBDoEPgQ8BCAAOAQgADQEQARDBDMEOARFBCAATwQ3BEsEOgQwBEUELQAgAD0EMARBBDsE NQQ0BD0EOAQ6BDAERQQgADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BD4EMwQ+BC4ADQAgACAAIAAS BCAAQgQwBDEEOwQ4BEYENQQoADEAKQAgAD4EQQQ9BD4EMgQ9BEsENQQgADEEQwQ6BDIESwQvAEAE QwQ9BEsELwBBBEIEOARFBDgEOAQvADoEMARCBDUEMwQ+BEAEOAQ4BCgAIgBPBDcESwQ6BCAAEwQ4 BD8ENQRABDEEPgRABDUEOAQiACkAIAAyBCAARAQ+BEAEPAQwBEIENQQgAHsAQARDBD0EMAQ7ACAA MAQxBEEEQgRABDAEOgRCBD0EPgQtADsEPgQzBDgERwQ1BEEEOgQwBE8EIAA6BDAEQgQ1BDMEPgRA BDgETwQgADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BD4EOQQgAD4EQQQ9BD4EMgRLBDsAIAA/BD4E NAQ+BDEEQAQwBD0EPQRLBDUEIAA+BEIEQAQwBDYENQQ9BDgETwQgADIEIAA4BDcEMgQ1BEEEQgQ9 BEsERQQgAEAENQQ7BDgEMwQ4BE8ERQQsACAAQQQ+BDIEQAQ1BDwENQQ9BD0ESwRFBCAARAQ4BDsE PgRBBD4ERAQ4BDgELAAgAEQEOAQ3BDgEOgQ1BCAAOAQgAD8EQQQ4BEUEPgQ7BD4EMwQ4BDgEfQA6 AA0ALgAHABAEMQRBBEIEQAQwBDoEQgQvADsEPgQzBD4EQQQgABMELQAQBAcAIAQ1BDsEOAQzBDgE OAQtAB4EBwAkBDgEOwQ+BEEEPgREBDgETwQtACMEBwAkBDgENwQ4BDoEMAQtABgEBwAHAB8EQQQ4 BEUEPgQ7BD4EMwQ4BE8ELQBFAAcABwAQBAcAMAQxBEEEPgQ7BE4EQgQsACAANQQ0BDgEPQRBBEIE MgQ+BCAAOAQgADwEPQQ+BDYENQRBBEIEMgQ1BD0EPQQ+BEEEQgRMBCAAPAQ9BD4EMwQ+BD4EMQRA BDAENwQ4BDkELAAgAD0EMARHBDAEOwQ+BCAAOAQgADoEPgQ9BDUERgQHABIEQQQ1BDEEPgQzBCwA IAAgBDAEKAAnADwEKQBFBDAELAAgABEEQAQwBEUEPAQwBCwAIAAQBDsEMARCBEsEQARMBCwAIAAQ BDMEPQQ4BCwAIAAQBD0ELAAgABAEPQQ9BEMEPQQwBAcAEQQ+BDMELAAgADAEOgRCBCwAIABCBDIE PgRABDUEPQQ4BDUELAAgADIENQRBBEwEIAA8BDgEQAQsACAANAQ1BDkEQQRCBDIEOARCBDUEOwRM BD0EPgRBBEIETAQsACAARAQ4BDcEOARHBDUEQQQ6BD4ENQQgAD8EQAQ+BEEEQgRABDAEPQRBBEIE MgQ+BAcAPAQ4BEAELAAgADIEQQQ1BDsENQQ9BD0ESwQ1BCwAIAAwBDEEQQQ+BDsETgRCBD0EMARP BCAAPgQxBEoENQQ6BEIEOAQyBD0EMARPBCAAQAQ1BDAEOwRMBD0EPgRBBEIETAQHADAEQARFBDUE QgQ4BD8EIAARBD4EMwQwBCwAIAA/BEAEMAQ8BEMENgRBBDoEPgQ1BC8APwRABDAEQQQ1BDwENQQ9 BD0EPgQ1BCAAPQQwBEcEMAQ7BD4ELAAgADwEPgRJBEwEBwAHAB4EBwA+BEIEPQQ+BEgENQQ9BDgE NQQsACAAPwRABD4ENAQ+BDsENgQ1BD0EOAQ1BAcAIAQ+BDQELAAgACIEPgRABCwAIAAeBDEELAAg AB4EPAQHAEEEPgQ3BDQEMAQ9BDgENQQsACAAPwRABDgEQAQ+BDQEMAQHAEIEPgQ6BCwAIAA/BD4E QgQ+BDoEIABABD4ENgQ0BDUEPQQ4BE8EIAA2BDgEMgQ+BDkEIAA4BCAAPQQ1BDYEOAQyBD4EOQQg AD8EQAQ4BEAEPgQ0BEsELAAgAD4EQgQ9BD4EQQQ4BEIENQQ7BEwEPQQ+BEEEQgRMBAcAIAQ+BDQE OARHBDgELAAgAD8EQAQwBDYENQQ9BEEEOgQ+BDUELwA0BD4EQAQ+BDQEPgQyBD4ENQQgAD0EMARH BDAEOwQ+BCwAIABABD4ENgQ0BDUEPQQ4BDUELAAgAEEEPgQ9BAcABwAjBAcAPgQxBEoENQQ0BDgE PQQ1BD0EOAQ1BCwAIAA/BD4ENAQ+BDEEOAQ1BAcAIwQ0BEAENwQ1BEYELAAgACMEQAQ+BDEEPgRA BD4EQQQsACAAIwQ9BDgEMgQ1BEAEQQRDBDwELAAgACEEMgRPBEIEPgQ5BCAAFARDBEUEBwBDBD0E OARPBCwAIABDBD0EOAQyBDUEQARBBDAEOwRMBD0EPgRBBEIETAQHAEEEMgRPBDcETAQsACAAPwQw BEAEMAQ0BDgEMwQ8BDAEBwA9BDUEPgRCBDQENQQ7BDgEPAQ+BEEEQgRMBCAAPgRCBCAAMgRBBDUE RQQsACAAOwROBDEEPgQyBEwEIAA6BCAAQAQ+BDQEPQRLBDwEBwAHABgEBwBBBDwESwRBBDsELAAg AEEEOAQ8BDIEPgQ7BCwAIABBBD4ENQQ0BDgEPQQ1BD0EOAQ1BAcAGAQdBCwAIAAYBD0EMwQ7BCwA IAA+BDMEPgQ9BEwEIABCBDIEPgRABDUEPQQ4BE8EBwAwBDEEQQRCBEAEMAQ6BEIEPQRLBDkEIAA8 BDgEQAQsACAAOAQ9BEQEPgRABDwEMARGBDgETwQHAD4EQgRABDAENgQ1BD0EOAQ1BCwAIAA/BEAE PgRPBDIEOwQ1BD0EOAQ1BCwAIAA/BEAEOAQ9BEYEOAQ/BAcAQQRCBEAENQQ8BDsENQQ9BDgENQQg ADoEIAA/BEAEPgQ0BDsENQQ9BDgETgQgADgEIAA6BCAAPgRBBDwESwRBBDsENQQ9BDgETgQsACAA MwQwBEAEPAQ+BD0EOAQ4BAcABwAVBAcAPAQ9BD4ENgQ1BEEEQgQyBDAELAAgAEEEQwRJBDUEQQRC BDIEPgQyBDAEPQQ4BDUELAAgAD8EQAQ4BD0EMAQ0BDsENQQ2BD0EPgRBBEIETAQHABUEHQQsACAA FQQwBCwAIAATBDUETwQsACAAFQQyBDAELAAgADIEPgQ0BDAEIABCBDIEPgRABDUEPQQ4BE8EBwA8 BD0EPgQzBD4EPgQxBEAEMAQ3BDgETwQsACAAMQRLBEIEOAQ1BAcAQQRDBEkENQRBBEIEMgQ+BDIE MAQ9BDgENQQsACAAQQRCBEAEQwQ6BEIEQwRABDAELAAgAD8EPgRABE8ENAQ+BDoEIAA4BCAATQQy BD4EOwROBEYEOARPBAcAQQRCBEAENQQ8BDsENQQ9BDgENQQgADoEIABABDAENAQ+BEEEQgQ4BCAA OAQgAEAEPgQ2BDQENQQ9BDgETgQHAAcAJwQHAEEEQwQxBEoENQQ6BEIEBwAHACcENQQ7BD4EMgQ1 BDoELAAgACEESwQ9BCAAEQQ+BDMEPgQyBAcARwQ1BDsEPgQyBDUEOgQHAAcAQQRDBDEESgQ1BDoE QgQ4BDIEPQQ+BDUELAAgAD8EQQQ4BEUEPgQ7BD4EMwQ4BE8EBwAnBDUEOwQ+BDIENQRHBD0EPgRB BEIETAQsACAAMQQ+BEAETAQxBDAELAAgADwEOARABCAAOAQgADsETgQxBD4EMgRMBAcABwAmBAcA RgQ1BDsETAQsACAAPAQ4BEEEQQQ4BE8ELAAgADcEMAQ0BDAERwQwBAcAJgQ4BCwAIAAfBEMEQgRM BAcAQQQ8BEsEQQQ7BCwAIABGBDUEPQQ9BD4EQQRCBDgELAAgAEYENQQ7BDUEPwQ+BDsEMAQzBDAE PQQ4BDUEBwA4BEEEQQQ7BDUENAQ+BDIEMAQ9BDgENQQHAD4EQQQ8BEsEQQQ7BDUEPQQ9BD4EQQRC BEwELAAgAD8EPgQ9BDgEPAQwBD0EOAQ1BCAAQQQyBD4EOARFBCAANAQ1BDkEQQRCBDIEOAQ5BAcA BwBSAAcAMwRABDAEPQRMBCwAIABABDAEMgQ1BD0EQQRCBDIEPgQsACAAPgQxBEAEMAQ3BAcAIAQw BCwAIAAgBD4ENAQsACAAIAQ+BDoEBwA6BDAEQgQ1BDMEPgRABDgEOAQgADwESwRIBDsENQQ9BDgE TwQsACAAQQQyBDUEQgQgAD8EQAQ+BEEEMgQ1BEkENQQ9BDgETwQHAEIENQQ+BEAEOARPBAcAPQQw BDQENQQ2BDQEMAQsACAAMwQ+BEAENARLBD0ETwQsACAAQQRCBEAEMARFBCwAIAAxBD4EOwRMBAcA BwAfBAcAPgRBBD0EPgQyBDAEPQQ4BDUELAAgAD8EQAQ4BEcEOAQ9BDAELAAgADAEOgRBBDgEPgQ8 BDAEBwAfBEAEMAQyBEwEBwA4BEEEQgQ4BD0EPQQ+BEEEQgRMBCwAIAA3BDAEOgQ+BD0ESwQgAD8E QAQ4BEAEPgQ0BEsELAAgAD8EPgQ3BD0EMAQ9BDgENQQsACAAPwRABDgERwQ4BD0EPQQ+BEEEQgRM BAcANwQwBDoEPgQ9BCwAIABEBEMEPQQ0BDAEPAQ1BD0EQgQHAD8EQAQwBDIEPgQsACAAMwQwBEAE PAQ+BD0EOARPBCwAIAAfBEAENQQ0BD4EOgQHAAcATgAHAD0ENQRPBDIEPQQ+BDUELAAgAD0ENQRC BAcAHQQwBDIETAQHADQEQwRIBDAELAAgADcEMAQ6BD4EPQRLBCAAPgRCBEAEMAQ2BDUEPQQ4BE8E LAAgAD4EQgRABDgERgQwBD0EOARPBAcAOAQ9BEQEPgRABDwEMARGBDgETwQHAEEEQgRABDAERQQg ADgEIAA9BDAENAQ1BDYENAQwBCwAIAA9BDUEOAQ3BDIENQQ0BDAEPQQ9BD4ENQQHAAcAGQQHADQE PgQ/BD4EOwQ9BDUEPQQ4BDUELAAgADQEMgQ4BDYENQQ9BDgENQQHAC8EMgRMBAcAMgQ4BDQEOAQ8 BEsEOQQgADwEOARABCwAIABCBDUEOwQwBAcATwQyBDsENQQ9BDgENQQsACAAQQQyBDUEQgQHADoE MARBBDAEPQQ4BDUEBwAHACEEBwBBBDIETwQ3BEwELAAgAEEEQwRCBEwELAAgAEEEPARLBEEEOwQH ACEEOwQwBDIETAQsACAAIQQyBDAEQAQ+BDMELAAgACEEQwQ0BCwAIAAhBEMENARMBDEEMAQHAEAE NQRHBEwELAAgAD8EOARBBEwEPAQ+BAcANwQ9BDAEPQQ4BDUEBwAHAD8EQAQ4BDEEOwQ4BDYENQQ9 BDgENQQgADoEIAAQBAcABwAcBAcAPAQ9BD4ENgQ1BEEEQgQyBDAELAAgADwENQRABDAEBwAcBDAE OgQ+BEgETAQsACAAHAQ1BEAEQwQHADwESwRBBDsETAQsACAAPAQwBEIENQRABDgETwQHADwEMARC BDUEQAQ4BE8ELAAgAEMEPAQ9BD4ENgQ1BD0EOAQ1BAcAPARLBEEEOwRMBCwAIABHBDAEQQRCBEwE IAA8BD0EPgQ2BDUEQQRCBDIEMAQHAAcAEwQHADMEQAQwBDQEOAQ1BD0EQgQsACAAPwQ1BEAENQQ0 BDAERwQwBCwAIAA/BDUEQAQ1BD0EPgRBBAcAEwRABD4EPAQ+BDIEPQQ4BDoEBwAzBDsEMAQzBD4E OwQsACAAMwQ+BDIEPgRABCwAIABPBDcESwQ6BAcAPwQ1BEAENQQ9BD4EQQQgADgEPQREBD4EQAQ8 BDAERgQ4BDgEBwA/BEAEPgQ9BDgEOgQ9BD4EMgQ1BD0EOAQ1BCAAMgQ9BDUEBwAHAEwABwA9BDAE PwRABDAEMgQ7BDUEPQQ4BDUELAAgAEAENQRIBDUEPQQ4BDUEBwAbBDUEOwRPBCwAIAAbBDAENAQw BCwAIAAtBD0EOwQ4BDsETAQsACAAGwROBDEEPgQyBEwEBwA7BDgEOgQsACAAOwQ4BEcEPQQ+BEEE QgRMBCwAIAA7BE4ENAQ4BCwAIAA7BE4EMQQ+BDIETAQsACAAQQQwBDoEQAQwBDsETAQ9BD4ENQQg AD4EQgQ9BD4ESAQ1BD0EOAQ1BCAAPQQ1BDEEMAQgADgEIAA3BDUEPAQ7BDgEBwBNBDoEQQQ/BDUE QAQ4BDwENQQ9BEIELAAgADIESwRPBDIEOwQ1BD0EOAQ1BCwAIAA4BDQENQQ9BEIEOAREBDgEOgQw BEYEOARPBCwAIABEBDgENwQ4BD4EOwQ+BDMEOARPBAcAGwROBDQEOAQsACAAOwROBDEEPgQyBEwE LAAgAD8EQAQ1BDEESwQyBDAEPQQ4BDUELAAgAD8EQAQ4BDIETwQ3BDAEPQQ9BD4EQQRCBEwELAAg AD8EQAQ+BD0EOAQ6BD0EPgQyBDUEPQQ4BDUEIAAyBD0EQwRCBEAETAQHAAcASwAHAD4EMQRKBDUE OgRCBCwAIAA9BDAEPwRABDAEMgQ7BDUEPQQ4BDUEIAA6BCAAEAQHABoEQwQ/BDAEOwQwBCwAIAAa BEAENQRBBEIELAAgABoEPgQ9BCwAIAAaBD4EOwQ+BCAAIQQyBDAEQAQ+BDMEMAQsACAAGgQ4BCwA IAAtBD0EOgQ4BAcAOgRABEMEMwQsACAAPgQ6BEAEQwQ2BDUEPQQ4BDUELAAgAD4EMQRJBDUEQQRC BDIEPgQHAEEEOAQ9BEIENQQ3BCwAIAAyBDoEOwROBEcENQQ9BDgENQQsACAAQQQ+BEYEOARDBDwE BwBBBDAEPAQ+BEEEPgQ3BD0EMAQ9BDgENQQHAAcARAAHADQEMAQsACAANAQ1BDsENQQ9BDgENQQH ABgEIQQiBBgEHQQQBCwAIAAUBDAEPgQsACAAFAQwBDEEPgQzBCwAIAAUBDAENgQ0BEwEMQQ+BDME BwA4BEEEQgQ4BD0EMAQsACAAOwQ+BDMEOAQ6BDAELAAgAD8EQAQwBDIENAQwBC0AOwQ+BDYETAQs ACAANAQ+BDEEQAQ+BAcATQQ6BD4EPQQ+BDwEOAQ6BDAEBwA+BEIEPQQ+BEgENQQ9BDgETwQgADoE IABBBDsEPgQ2BD0EPgQ8BEMEBwAHAEcABwBDBEEEOwQ+BDYEPQQ1BD0EOAQ1BCwAIAA/BD4EOwQ9 BD4EQgQwBAcAFgQ4BDIEMAQHADYEOAQ3BD0ETAQsACAAPwQ+BDsEPQQ+BEIEMAQgADgEIAAzBDAE QAQ8BD4EPQQ4BE8EBwAHADEEOAQ+BEQEOAQ3BDgEOgQwBAcAQQQ+BEMERwQwBEEEQgQ4BDUEIAA4 BCAAQQQ+BEcEQwQyBEEEQgQyBDgENQQHAAcAQgAHADIESwRABDAENgQ1BD0EOAQ1BCwAIAAxBDUE QQQ6BD4EPQQ1BEcEPQQ+BEEEQgRMBAcAEgRLBEgENQQ9BEwELAAgABIEOARIBD0EQwQsACAAEgQ1 BDsENQRBBCwAIAASBDUEQQRCBDAEBwA/BD4ENAQ+BDEEOAQ1BCwAIAAyBEAENQQ8BE8ELAAgADIE QQQ1BDsENQQ9BD0ESwQ1BCwAIAAyBDUERwQ9BD4EQQRCBEwEBwBEBEAEMAQ6BEIEMAQ7BEwEPQQ+ BDUEIAA/BD4ENAQ+BDEEOAQ1BCwAIAAyBEEENQQ7BDUEPQQ9BEsENQQHABIEOAQ0BDUEPQQ4BDUE LAAgADIERQQ+BDQEBwAHABEEBwA+BDEESgQ1BDQEOAQ9BDUEPQQ4BDUELAAgADwENQRCBDAEPgQx BEoENQQ6BEIESwQHABEEPgQzBCwAIAARBD4EMwQ4BAcATQREBDgEQAQsACAAQQRCBDgERQQ4BDgE LAAgAD8EPgQ7BE8ELAAgADEEOwQwBDMEMAQsACAAMQRLBEIEOAQ1BAcAPwQ+BDsENQQsACAARwQw BEEEQgQ4BEYESwQsACAARQQ4BDwEOARPBAcAQQRCBDgERQQ4BDgELAAgADEEPgQ2BDUEQQRCBDIE NQQ9BD0EPgQ1BAcABwAkBAcARAQ+BEAEPAQwBCwAIABEBD4EQAQ8BDAEOwQ4BDcEPAQHACQEMARA BDAEPgQ9BAcAPwQ+BDIENQRABEUEPQQ+BEEEQgRMBCwAIABEBD4EQAQ8BDAEBwBBBDsEPgQ5BCwA IABEBEAEMAQ6BEIEMAQ7BCwAIAAyBDgENAQHAD4EMQRKBDUEPAQ9BD4ENQQgAD8EQAQ+BEEEQgRA BDAEPQRBBEIEMgQ1BD0EPQQ+BDUEIAAyBD4EQQQ/BEAEOARPBEIEOAQ1BAcABwBUAAcAQwRCBDIE NQRABDYENAQ1BD0EOAQ1BCwAIABBBDgEPQRCBDUENwQsACAAQgQyBD4EQAQ1BD0EOAQ1BAcAIgRA BDgEMwQ7BDAEMgQsACAAIgRABD4EOARGBDAEBwBCBEAEOAQsACAAQgQyBDUEQAQ0BEwEBwBCBDIE NQRABDQEPgQ1BCAAQgQ1BDsEPgQHAEEEMAQ8BD4EQwRCBDIENQRABDYENAQ1BD0EOAQ1BAcABwBI AAcANQQ0BDgEPQQ1BD0EOAQ1BCAAEAQgADgEIAAeBCAAKAAwBDEEQQQ+BDsETgRCBD0EPgQzBD4E IAA4BCAAPgRCBD0EPgRBBDgEQgQ1BDsETAQ9BD4EMwQ+BCkABwAUBEMERQQgABwEOARABDAEIAA4 BCAAFQQ0BDgEPQRBBEIEMgQwBAcAQQQyBE8ENwRMBCAARwQ1BDsEPgQyBDUEOgQwBCAAOAQgABEE PgQzBDAELAAgADIENQRABDAELAAgAEEEMgRPBEIEPgRBBEIETAQHAEEEMgRPBDcETAQgAE0EOgRB BD8ENQRABDgEPAQ1BD0EQgQwBCwAIAA3BDAEOgQ+BD0EMAQgADgEIAA/BEAEOARABD4ENARLBAcA PAQ+BDsEOARCBDIEMAQHAAcAWAAHAD8ENQRABDUEQQQ1BEcENQQ9BDgENQQHAC8EQAQ4BDsEPgQs ACAAHwQ1BEAENQRBBDUERwQ1BD0EOAQ1BCAAMQQ+BDMEPgQyBCwAIAAlBDAEPgRBBAcAQQQ4BD0E QgQ1BDcELAAgADIEPgQ3BDQENQQ5BEEEQgQyBDgENQQHADIENwQwBDgEPAQ+BDQENQQ5BEEEQgQy BDgETwQHADAEOgRCBCAAMgQ+BDcENAQ1BDkEQQRCBDIEOARPBCwAIABABDAENwQ8BD0EPgQ2BDUE PQQ4BE8EBwAHAFMABwBBBDgEPAQ8BDUEQgRABDgETwQHABoEPgQ7BD4EMgRABDAEQgQHACAEMARB BDAEBwAHADcEMAQ6BD4EPQRLBCAAPwQ+BDQEPgQxBDgETwQgADgEIABBBD4ERQRABDAEPQQ1BD0E OARPBAcAMgRABDAESQQ1BD0EOAQ1BCwAIAA/BEAENQQyBEAEMARJBDUEPQQ4BDUEIAA4BCAAOAQ3 BDIEQAQwBEkENQQ9BDgENQQHAAcAKAQHAD8EQAQ+BEEEQgRABDAEPQRBBEIEMgQwBAcAKARDBCwA IAAoBDAEPAQxBDAEOwQwBAcAHwRABD4EQQRCBEAEMAQ9BEEEQgQyBDAELAAgAEgEOARABEwEBwA4 BDcEPAQ1BEAENQQ9BDgETwQHADIEPAQ1BEEEQgQ4BDwEPgRBBEIETAQgADgEIAA+BDEESgQ1BDwE PQQ+BEEEQgRMBAcABwApBAcAPAQ9BD4EMwQ+BD4EMQRABDAENwQ4BE8EIAAyBCAAPwRABD4EQQRC BEAEMAQ9BEEEQgQyBDAERQQHAEIEOAQ/BEsEIAA+BDEESgQ1BDoEQgQ+BDIEIABABDUEMAQ7BEwE PQQ+BEEEQgQ4BAcAPgQxBEoENQQ6BEIESwQgAEQEOAQ3BDgERwQ1BEEEOgQ+BDMEPgQgADwEOARA BDAEBwA/BEAEOARHBDAEQQRCBD0EPgRBBEIETAQsACAAPgQ6BEAEQwQ2BDUEPQQ4BDUEBwAHACAA IAAgACAAIAAgACAAPgA+AD0APQA9AD0APQA9AD0APgANACAAIQQgAD8EPgQ8BD4ESQRMBE4EIABN BEIEPgQzBD4EIAA6BDsETgRHBDAELAAgADsENQQzBDoEPgQgADIEPgRBBEEEQgQwBD0EPgQyBDgE PAQgAEEEPARLBEEEOwQgAEgEQwQ8BDUEQARBBDoEOARFBCAAQQQ7BD4EMgQ6AA0AQQBSACgAIgA/ BEAEPgQ6BDsETwRCBDgENQQiACwAIgA/BEAENQQ0BD4EPwRABDUENAQ1BDsENQQ9BD0EPgRBBEIE TAQiACkALQAgAD0EMARHBDAEOwQ+BCwAIABBBD4ENAQ1BEAENgQwBEkENQQ1BCAAMwRABDAEPQRM BDsAIAA4BDcEPQQwBEcEMAQ7BEwEPQQwBE8EIAAzBEAEMAQ9BEwEDQBSAEEAKAAiAEEEPAQ1BEAE QgRMBCIAKQAtACAAMwRABDAEPQRMBCwAIABBBD4ENAQ1BEAENgQwBEkEMARPBCAAPQQwBEcEMAQ7 BD4EOwAgAD4EMwRABDAEPQQ4BEcENQQ9BD0EPgQ1BCAAPQQwBEcEMAQ7BD4EDQBBAE4AKAAzBDsE MAQyBD0ESwQ5BCAASARDBDwENQRABEEEOgQ4BDkEIAA3BDUEPAQ9BD4EOQQgADEEPgQzBC0AIAAi ADMENQQ9BDUEQAQwBDsETAQ9BEsEOQQgADQEOARABDUEOgRCBD4EQAQiACAAQAQ1BDAEOwRMBD0E PgRBBEIEOAQpAC0AIAA9BDAERwQwBDsEPgQsACAAQQQ+BDQENQRABDYEMARJBDUENQQgAD4EQgRA BDgERgQwBD0EOAQ1BC8ANwQ1BDwEPQQ+BDkELwA/BD4EQAQ+BDYENAQ1BD0EPQRLBDkEIAA8BDgE QAQ7ACAAQgQwBCAARwQwBEEEQgRMBCAAQQRDBD8ENQRABC0AQQRCBDgERQQ4BDgEIABBACwAIAA6 BD4EQgQ+BEAEMARPBCAAPgRCBD0EPgRBBDgEQgRBBE8EIAA6BCAARwQ1BDsEPgQyBDUERwQ1BEEE OgQ+BDkELAAgACIANwQ1BDwEPQQ+BDkEIgAgAEAENQQwBDsETAQ9BD4EQQRCBDgEDQBOAEEAKAAi AEcENQQ7BD4EMgQ1BDoEIgApAC0AIAA3BDUEPAQ7BE8ELwA+BEIEQAQ4BEYEMAQ9BDgENQQsACAA OgQ+BEIEPgRABD4ENQQgAEEEPgQ0BDUEQAQ2BDgEQgQgADIEIABBBDUEMQQ1BCAAPwQ1BEAEMgQ+ BD0EMARHBDAEOwQ+BDsAIAA3BDUEPAQ9BD4ENQQgAD0EMARHBDAEOwQ+BDsAIAAiAEEESwQ9BCIA IABBAA0AQQBNACgAIgAxBEsEQgRMBCIALAAiADEESwRCBDgENQQiACkALQAgAD0EMARHBDAEOwQ+ BCwAIABBBD4ENAQ1BEAENgQwBEkENQQ1BCAAPAQ9BD4ENgQ1BEEEQgQyBDAEOwAgAD8ENQRABDIE OARHBD0ESwQ1BCAAPAQ9BD4ENgQ1BEEEQgQyBDAEDQBNAEEAKAAiADYEOAQ3BD0ETAQiACkALQAg ADwEPQQ+BDYENQRBBEIEMgQ+BCwAIABBBD4ENAQ1BEAENgQwBEkENQQ1BCAAPQQwBEcEMAQ7BD4E OwAgADwEPQQ+BDYENQRBBEIEMgQ1BD0EPQQ+BDUEIAA1BDQEOAQ9BEEEQgQyBD4ELwA9BDAERwQw BDsEPgQNACAAIAAgACsAKwArAA0AIAAhBDsEPgQyBDAEIABABEMEQQRBBDoEPgQzBD4EIABPBDcE SwQ6BDAEIABABDAEQQRIBDgERARABD4EMgRLBDIEMAQ1BDwEIAAwBD0EMAQ7BD4EMwQ4BEcEPQQ+ BDoADQAQBFoALQAgAEEATgA7ACAAFwQ1BDwEPQQ+BDkEIAARBD4EMwQgAA0AEAQhBC0AIAAQBDEE QQQ+BDsETgRCBD0EMARPBCwAIAA9BDAERwQwBDsETAQ9BDAETwQgACEEQwRCBEwEDQAeBCEELQAg AD8EQAQeBDQEPgQ7BDYENQQ9BDgENQQgACEEQwRCBDgEDQAQBBsELQAgAD0EEARHBDAEOwRMBD0E SwQ1BCAAQQRDBDEESgQ1BDoEQgRLBCwAIAAbBE4ENAQ4BA0AIAQjBC0AIAAgBDAENwRABEsEMgQ9 BD4ENQQgACMENQQ0BDgEPQQ1BD0EOAQ1BA0AIwQgBC0AIAAjBDUENAQ4BD0ETwROBEkEMARPBCAA MwQgBDAEPQRMBCgAPwQ+BDQEPgQxBDgETwQpAA0AIwQcBC0AIAAjBDUENAQ4BD0EUQQ9BD0EMARP BCAAHARLBEEEOwRMBA0AGAQdBC0AIABBBDwESwRBBDsEKAAYBCkAIAA3BDUEPAQdBD4EMwQ+BCAA PAQ4BEAEMAQNABUEHQQtACAAPAQ9BD4ENgQVBEEEQgQyBDUEPQQ9BD4EQQRCBEwEIAA3BDUEPAQd BD4EMwQ+BCAAPAQ4BEAEMAQNAB0EFQQtACAAPwQ+BEAEPgQ2BDQEUQQdBD0EMARPBCAAPAQ9BD4E NgQVBEEEQgQyBDUEPQQ9BD4EQQRCBEwEDQAUBBAELQAgABQEQAQ+BDEEPQQ+BDUEIAA4BDsEOAQg ADQEMgQ+BDkEPQQ+BDUEIAA9BBAERwQwBDsEPgQoADQEMAQ8AD4APQQ1BEIEKQANABQEIwQtACAA NQQUBDgEPQQ1BD0EOAQ1BCAANAQyBCMERQQNACAAIAAgACsAKwArAA0AEQQeBBMELQAgABEEOwQw BDMEPgQ1BCgANAQ7BE8EIAA7BE4ENAQ1BDkEKQAgAD8EHgRBBDsENQQ0BEEEQgQyBDgENQQgABME OwQwBDMEPgQ7BDAEDQAcBBgEIAQtACAAHAQ9BD4ENgQ1BEEEQgQyBD4EIABBBDIETwQ3BDAEPQQ9 BCsERQQgADMEIAQwBD0ENQQ5BA0AIAQeBBQELQAgAD4EMwQgBDAEPQQ4BEcENQQ9BD0EPgQ1BCAA OAQgAB4EQgQ9BD4EQQQ4BEIENQQ7BEwEPQQ+BDUEIAAUBDUEOwQ1BD0EOAQ1BA0AIAQQBBQELQAg ADoEIAQwBEIEOgQ+BDUEIAAvBEAEOgQ+BDUEIABDBEIEMgQ1BEAENgQUBDUEPQQ4BDUEOwAgACAE EAQ3BDQENQQ7BFEEPQQ9BD4ENQQgAEMEQgQyBDUEQAQ2BBQENQQ9BDgENQQoAEAEMAQ3BDQENQQ7 BDUEPQQ4BDUEIAA0BDUEOwQ1BD0EOARPBCkADQAgBBAEFwQtACAAIAQwBDcENAQ1BDsEUQQ9BD0E SwQ5BCAAOAQ3BD0EEARHBDAEOwRMBD0ESwQ5BCAAFwQ1BDwEPQQ+BDkEIAA8BDgEQAQ7ACAAIAQQ BDcENAQ1BDsEIAAXBDUEPAQ7BDgEOwAgAA0AFAQSBBAELQAgABQENQQ7BDgEPAQ+BEEEQgRMBCAA EgQgAD0EEARHBDAEOwQ1BA0AHQQVBCIELQAgADIEIAAdBDUEMgQ4BDQEOAQ8BD4EPAQgADwEOARA BDUEIABBBEMESQQVBEEEQgQyBEMETgRJBDUENQQgAEMEIgQyBDUEQAQ2BDQENQQ9BDgENQQoAEME QgQyBDUEQAQ2BDQENQQ9BDgENQQ8AD4APgRCBEAEOARGBDAEPQQ4BDUEKQANABIEFQQhBCwELQAg AD4EQgRABDAENgQ1BD0EPQQ+BDUEIAASBCAAQQRDBEkEFQRBBEIEMgRDBE4ESQQ1BDwEIABBBCAA PgQ/BEAENQQ0BDUEOwRRBD0EPQQ+BDkEIAAhBEMEQgQsBE4EIABCBDIEPgRABDUEPQQ4BE8EDQAc BBAEHAQQBC0AIAAcBD0EPgQ2BDUEQQRCBDIEPgQsACAAQQQ+BDQENQRABDYEMARJBDUENQQgAD0E EARHBDAEOwQ+BCwAIAA6BD4EQgQ+BEAEPgQ1BCAAQQQwBDwEPgQgADUEQQRCBEwEIAAcBD0EPgQ2 BDUEQQRCBDIENQQ9BD0EPgQ1BCAAPQQQBEcEMAQ7BD4EKAA8BDAEQgQ6BDAEIAA0BDsETwQgAEAE NQQxBFEEPQQ6BDAEKQANABwEEAQgBBAELQAgABwEPQQ+BDYENQRBBEIEMgQQBCwAIAA9BDUEQQRD BEkEOAQ1BCAAPgQzBCAEMAQ9BDgERwQ1BD0EOAQ1BCAAPQQQBEcEMAQ7BDAEKABCBD4EIAA1BEEE QgRMBCAAQAQwBEEEPwQwBDQEIAA4BCAAQQQ8BDUEQARCBEwEKQANABwEFQQgBBAELQAgABwEPQQ+ BDYENQRBBEIEMgQ+BCAAQQRDBEkEFQRBBEIEMgRDBE4ESQQ1BDMEPgQgAD4EMwQgBDAEPQQ4BEcE NQQ9BDgETwQgAD0EEARHBDAEOwQwBCgAQgQ+BCwAIABHBEIEPgQgAEMEPwRABDAEMgQ7BE8ENQRC BCAAMwRABDAEPQRMBE4EIABBBEMESQQ1BDMEPgQpAA0AHAQeBCAEFQQtACAAHAQ9BD4ENgQ1BEEE QgQyBD4EIAA/BEAEHgQ0BD4EOwQ2BDUEPQQ4BDkEIAA+BDMEIAQwBD0EOARHBDUEPQQ9BD4EOQQg ADwEPQQ+BDYEFQRBBEIEMgQ1BD0EPQQ+BEEEQgQ4BCgAMgQ+BDQESwQpAA0AIAQjBCEELAQtACAA MwQgBDAEPQRMBCAAIwQgACEEQwRCBDgEIABCBDIEPgRABDUEPQQ4BE8EDQAgBB4EIQQQBC0AIAA+ BDMEIAQwBD0EOARHBDUEPQQ9BD4ENQQgAD8EQAQeBDQEPgQ7BDYENQQ9BDgENQQgACEEQwRCBDgE IAA9BBAERwQwBDsEMAQNACAEEAQhBBAELQAgACAEMAQ3BDQENQQ7BDUEPQQ4BDUEIAA9BBAERwQw BDsETAQ9BD4EOQQgACEEQwRCBDgEIABHBDUEOwQ+BDIENQQ6BBAEDQAgBBAEHQQeBC0AIAA/BCAE PgQ0BD4EOwQ2BDUEPQQ4BDUEIAA9BBAERwQwBDsETAQ9BD4EOQQgAD8EPgRABD4ENgQ0BFEEHQQ9 BD4EOQQgADMEQAQwBD0EOAQoAEIEPgQgADUEQQRCBEwEIABBBDAEPAQ+BDMEPgQgAD0EMARHBDAE OwQwBCAATQRCBDAEPwQwBC0AQwRCBEAEMAQpAA0AIAQQBB0EEAQtACAAIAQQBDcEQAQ1BDcEIAAd BBAEKAA6BD4ENgQ1BCkADQAUBBUEGwQeBC0AIAAUBEAEPgQxBD0EPgQ1BC8AQQQ7BD4ENgQ9BD4E NQQgAEEEQwRJBBUEQQRCBDIEQwROBEkENQQ1BCAAPQQwBD8EQAQwBDIEGwQ1BD0EPQQ+BDUEIAA/ BEAEHgQ0BD4EOwQ2BDUEPQQ4BDUEDQARBBsEEAQTBB4ELQAgADIEQQQ1BD4EEQRJBDUENQQgAD0E MAQ/BEAEMAQyBBsENQQ9BD0EPgQ1BCAAOAQ3BD0EEARHBDAEOwRMBD0EPgQgAD4EEwQ+BDIEPgRA BDUEPQQ9BD4ENQQgAD8EQAQeBDQEPgQ7BDYENQQ9BDgENQQoAEIELgA1BC4AIAA9BDUEIAAxBDsE MAQzBD4ELAAgADUEQQQ7BDgEIAA9BDUEIAA+BDMEPgQyBD4EQAQ1BD0EPgQpAA0AFAQeBBEEIAQe BC0AIAAUBEAEPgQxBD0EPgQ1BCAAHgRCBD0EPgRBBDgEQgQ1BDsETAQ9BD4EIAAyBEEENQQ+BBEE SQQ4BEUEIAAzBCAEMAQ9BDUEOQQgAD8EQAQeBDQEPgQ7BDYENQQ9BDgENQQoADQEPgQxBEAEMAQg AEIENQQ7BDUEMwQwBCkADQAXBBUEHAQbBC8ELQAgABcENQQ8BD0EMARPBCAAOAQgAEEEQwRJBBUE QQRCBDIEQwROBEkEMARPBCwAIAAcBEsEQQQ7BE8ESQQwBE8EIAA4BCAAGwROBDEETwRJBDAETwQg AEcEMARBBEIETAQgADwENQQ9BC8EDQAhBBsEEAQSBBAELQAgACEEIAAbBE4EMQQ+BDIETAROBCAA EAQxBEEEPgQ7BE4EQgQwBCAAEgQgADgENwQ9BBAERwQwBDsETAQ1BA0AIQQbBB4EEgQeBC0AIAAh BCAAGwROBDEEPgQyBEwETgQgAB4EQgQ9BDUEQQRRBD0EPQQ+BDUEIAASBCAAPwRABB4ENAQ+BDsE NgQ1BD0EOAQ1BA0AGAQhBCIEGAQdBBAELQAgAEEEGAQ8BDIEPgQ7BCAAIQQ+BDUENAQ4BD0ENQQ9 BDgETwQgAEMEIgQyBDUEQAQ2BDQEUQQ9BD0EPgQzBD4EIABBBDwEKwRBBDsEMAQgAB0EEAQgADcE NQQ8BDsENQQNACEEEgQeBBEEHgQUBBAELQAgACEEIAASBDUERwQ9BEsEPAQgAD8EQAQeBDQEOwQ1 BD0EOAQ1BDwEIAA+BBEESQQ1BDMEPgQgAD8EQAQeBDQEPgQ7BDYENQQ9BDgETwQgACAAFARABD4E MQQ9BD4EMwQ+BCAAPQQQBEcEMAQ7BDAEDQAnBBUEGwQeBBIEFQQaBC0AIAAnBDUEQAQ1BDcEIAAx BEsEQgQ4BBUEIAAbBE4ENARBBDoEPgQ1BCAAPwRABB4ENAQ+BDsENgQwBE4ESQQ4BDkEQQRPBCAA EgQgADwEPQQ+BDYEFQRBBEIEMgQwBEUEIAAaBEAEQwQzBCgAMARBBD8ENQQ6BEIEIABABDUEMAQ7 BEwEPQQ+BEEEQgQ4BCkADQATBBgEHwQVBCAEEQQeBCAEFQQvBC0AIAAWBDgEMgQ+BDUEIAA1BDQE GAQ9BD4ENQQgADgEIAAfBEAEMAQyBD4ENQQgADEESwRCBDgEFQQ8BCAAIAQwBDcENAQ1BDsEUQQ9 BD0EPgQ1BCAAPgQRBEkENQQ1BCAAPwRABB4ENAQ+BDsENgQ1BD0EOAQ1BCAAMwQgBDAEPQQ4BCAA QQRDBEkEFQQzBD4EIAA8BDUEPQQvBA0ADQBJAEkASQAgACAAIABBACAAOAQgAFIAQQANAA0AIAAg ACAAIAAgACAAIABJAEkASQAwBCkAIAAkBDgEOwQ+BEEEPgREBDgETwQgABMEOAQ/BDUEQAQxBD4E QAQ1BDgEDQAgACQEOAQ7BD4EQQQ+BEQEOARPBCAAPAQ4BEAEPgRDBEEEQgRABD4EOQRBBEIEMgQw BCAAEwQ4BD8ENQRABDEEPgRABDUEOAQgAEEEMgQ+BDQEOARCBEEETwQgAD8EQAQ4BDwENQRABD0E PgQgADoEIABBBDsENQQ0BEMETgRJBDUEOQQgAEIEQAQwBDoEQgQ+BDIEOgQ1BDoADQAgABUEQQRC BEwEIAAwBDEEQQQ+BDsETgRCBD0EPgQgAD8ENQRABDIEPgQ9BDAERwQwBDsETAQ9BDAETwQgACIA QQRCBDgERQQ4BE8EIAA/BDUEQAQyBD4EPQQwBEcEMAQ7BDAEIgAgAEEALAAgACIAPwQ+BEEEOwQ1 BCAAPQQ1BDUEIABBBEIEPgQ4BEIEIgAgACIAPwQ1BEAEMgQ+BDMEQAQwBD0ETAQiACAAUgAsACAA NAQwBDsETARIBDUELAAgADoEMAQ6BCAAPwRABD4ENAQ+BDsENgQ1BD0EOAQ1BCAAKABBBEIEOARF BDgETwQgAE8AKQAsACAAIgAyBDgENAQ4BDwESwQ5BCIAIABHBDUEOwQ+BDIENQQ6BD4EPAQoACcE KQAvADwEMARCBDUEQAQ4BDAEOwRMBD0ESwQ5BCAAPAQ4BEAEKAAcBCkALQAgAE4ALgAgABIEQQQ1 BCAATQRCBD4EIAA0BD4EPwQ+BDsEPQRPBDUEQgRBBE8EKABBBEIEOARFBDgETwQgADQEPgQ/BD4E OwQ9BDUEPQQ4BE8EIABVACkAIABABD4ENgQ0BDUEPQQ4BDUEPAQgACIAQQRCBDgERQQ4BDkEIgAg AD4EMwQ9BE8EIAA4BCAAMgQ+BDQESwQgAEkAIAA4BCAARQAoADoEMAQ6BCAAMgRLBEAEMAQ2BDUE PQQ4BDUEIAA0BDgEMAQ7BDUEOgRCBDgEOgQ4BCAAQQAgADgEIABPACkALgAgABQEMAQ7BEwESAQ1 BCwAIAAyBCAANwQ1BDwEPQQ+BDwELAAgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQ8BCAAPAQ4BEAE NQQgAD8EPgRABD4ENgQ0BDAENQRCBEEETwQgAEAETwQ0BCAAQQRCBDgERQQ4BDkELQAgABkELAAg ABMELAAgAEsALAAgAEIALAAgAEQALAAgAFMALAAgAFYALAAgAD8EQAQuACAAHAQ+BDYEPQQ+BCAA MgQgAD0ENQQ+BDMEQAQwBD0EOARHBDUEPQQ9BD4EPAQgADoEPgQ7BDgERwQ1BEEEQgQyBDUEIAA/ BD4EOwRDBEcEMARCBEwEIABBBEIEOARFBDgEOAQgAEEEIAA1BEkENQQgADEEPgQ7BDUENQQgAEEE OwQ+BDYEPQRLBDwEIABABD4ENARBBEIEMgQ+BDwEIABBBCAAPwQ1BEAEMgRLBDwEOAQgADMEOwQw BEEEPQRLBDwEOAQgADgEIABBBD4ENwQ0BDAEQgRMBCAAOwROBDEEPgQ5BCAATwQ3BEsEOgQuACAA GAQ8BDUENQQ8BCAAMgQgADgEQgQ+BDMENQQgADEENQRBBDoEPgQ9BDUERwQ9BEsEOQQgACAEPgQ0 BCAAOAQgAEAETwQ0BCAAQQRCBDgERQQ4BDkELwAxBD4EMwQ+BDIELwA0BEMERQQ+BDIELgAgACEE QgQ4BEUEOAQ5BD0EPgQ1BCAAQwRBBEIEQAQ+BDkEQQRCBDIEPgQgADwEOARABDAEIABFBDAEQAQw BDoEQgQ1BEAEPQQ+BCAANAQ7BE8EIABABE8ENAQwBCAAOgRDBDsETARCBEMEQAQgADgEIAAyBCAA QgQ+BDwEIABHBDgEQQQ7BDUEIAA0BDsETwQgADgEQwQ0BD4ELQBFBEAEOARBBEIEOAQwBD0EQQRC BDIEMAQuACAAHQQwBEcEMAQ7BD4EIABBBEIEMARABD4EMwQ+BCAANwQwBDIENQRCBDAEOgANACAA IAAgACoAKgAqAA0AIAAgACAAIAAiADEAIAASBCAAPQQwBEcEMAQ7BDUEIABBBD4EQgQyBD4EQAQ4 BDsEIAARBD4EMwQgAD0ENQQxBD4EIAA4BCAANwQ1BDwEOwROBC4AIgAgACgAPAAtAC0AIABBACgA PgQ0BD0EPgQyBEAENQQ8BDUEPQQ9BD4EIAA4BCAAIgA9BDAERwQwBDsEPgQiACAAOAQgACIAPQQ1 BDEEPgQiACkALAAgAE4AKAAiADcENQQ8BDsETgQiACkAIAA4BCAAQQQwBDwEQwQgAEEEQwRCBEwE IABABDAENwQ9BDgERgRLBC8APwQ1BEAEMgQ+BDMEQAQwBD0ETAQgADwENQQ2BDQEQwQgAD0EOAQ8 BDgELQAgAFIAKQANACAAIAAgACAAIgAyACAAFwQ1BDwEOwRPBCAANgQ1BCAAMQRLBDsEMAQgADEE NQQ3BDIEOAQ0BD0EMAQgADgEIAA/BEMEQQRCBDAELAAgADgEIABCBEwEPAQwBCAAPQQwBDQEIAAx BDUENwQ0BD0EPgROBCwAIAA4BCAAFARDBEUEDQARBD4ENgQ4BDkEIAA9BD4EQQQ4BDsEQQRPBCAA PQQwBDQEIAAyBD4ENAQ+BE4ELgAiACAAKAA8AC0ALQAgAEkAKAAUBEMERQQgABEEPgQ2BDgEOQQg ADoEMAQ6BCAAPgQzBD0ENQQ9BD0EMARPBCAAQQRCBDgERQQ4BE8EKQAgADgEIABFACgAMgQ+BDQE PQQwBE8EIABBBEIEOARFBDgETwQpACkADQAgACAAIAAqACoAKgANACAALQRCBDAEIABEBDgEOwQ+ BEEEPgREBDgETwQgAD4EQgRABDAENgQ1BD0EMAQgADIEIAA6BEMEOwRMBEIEQwRABDAERQQgADIE QQQ1BDkEIAAXBDUEPAQ7BDgELgAgABAEOwREBDAEMgQ4BEIEIAA4BCAAPwQ4BEEETAQ8BDUEPQQ9 BD4EQQRCBEwELAAgADoEMAQ6BCAAOgQ7BE4ERwQ1BDIESwQ1BCAATQQ7BDUEPAQ1BD0EQgRLBCAA OgRDBDsETARCBEMEQARLBCwAIAA/BD4ERQQ+BDYEOAQgAEMEIABABDAENwQ9BEsERQQgAD0EMARA BD4ENAQ+BDIEIAA4BCAAOARFBCAAPwQ+BE8EMgQ7BDUEPQQ4BDUELAAgAEMEQQRCBEAEPgQ5BEEE QgQyBD4EIAA4BCAATQQyBD4EOwROBEYEOARPBCAAPwRABDgEPAQ1BEAEPQQ+BCAAPgQ0BDgEPQQw BDoEPgQyBEsELgAgAC0EQgQ+BCAAMgQ4BDQEPQQ+BCwAIAA1BEEEOwQ4BCAANwQ9BDAEQgRMBCAA QQRDBEIETAQgADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BD4EMwQ+BCAAMAQ7BEQEMAQyBDgEQgQw BC4AIAAQBCAAQQRDBEIETAQgADIEIABCBD4EPAQsACAARwRCBD4EIAA+BD0EIAAxBEsEOwQgAD0E NQQgAD8EQAQ+BEEEQgQ+BCAAPQQwBDEEPgRABD4EPAQgADEEQwQ6BDIEIABPBDcESwQ6BDAELgAg AC0EQgQ+BCAAMQRLBDsEMAQgADEEPgQ2BDUEQQRCBDIENQQ9BD0EMARPBCAAOARBBEIEOAQ9BDAE LAAgADQEMAQ9BD0EMARPBCAAPwQ+BEEEMgRPBEkENQQ9BD0ESwQ8BCAANgRABDUERgQwBDwELAAg AEMEQQRCBDAEPQQwBDIEOwQ4BDIEMAROBEkEMARPBCAAQQRCBEAEQwQ6BEIEQwRABEMEIAA4BCAA NwQwBDoEPgQ9BCAAPAQ4BEAEPgQ3BDQEMAQ9BDgETwQgADgEIAA0BDAEMgQwBDIESAQwBE8EIAAy BDsEMAQ0BDUEOwRMBEYEQwQgAEYENQQ7BD4EQQRCBD0EPgQ1BCAANwQ9BDAEPQQ4BDUEIAA+BCAA PAQ4BEAENQQgADgEIAAyBDsEMARBBEIETAQgAD0EMAQ0BCAAPQQ4BDwELgAgAB8ENQRABDIESwQ1 BCAAOAQgAEEEMAQ8BEsENQQgADMEOwQwBDIEPQRLBDUEIABBBEIEOARFBDgEOAQgADcEMAQ0BDAE PQRLBCAAMgQgAEIENQRBBD0EPgQ8BCAAOAQgAD4ENAQ9BD4ENwQ9BDAERwQ9BD4EPAQgAEAEPgQ0 BEEEQgQyBDUEIAA0BEAEQwQzBCAAQQQgADQEQARDBDMEPgQ8BCAAOAQgADcEMARCBDUEPAQgAD4E QAQzBDAEPQQ4BDcEPgQyBDAEPQQ9BD4EIAA/BD4EQAQ+BDYENAQwBE4EQgQgADIEQQQ1BCAAPgRB BEIEMAQ7BEwEPQRLBDUELgAgAC0EQgQ+BCAAQAQ+BDQEQQRCBDIEPgQgADIEPQQ1BCAAMgRABDUE PAQ1BD0EOAQuACAAFAQwBDYENQQgAEEEMAQ8BCAAIAQ+BDQEIAA/BD4ETwQyBDgEOwRBBE8EIAA9 BDUEIAAyBCAAQQQwBDwEPgQ8BCAAPQQwBEcEMAQ7BDUELAAgADAEIABBBD4EMwQ7BDAEQQQ9BD4E IABBBDIEPgQ1BDkEIABABDAEQQRIBDgERARABD4EMgQ6BDUEIABCBD4EOwRMBDoEPgQgAD8EPgRB BDsENQQgAFIALAAgADAEIAA0BD4EIABNBEIEPgQzBD4EIAA9BEMENgQ9BD4EIAAzBD4EMgQ+BEAE OARCBEwEIAA+BCAAIgA/BEAEPgRCBD4EQAQ+BDQEQQRCBDIENQQiAC4ADQAgABgENAQ1BE8EIABA BD4ENARBBEIEMgQwBCAAPwQ1BEAEMgRLBEUEIAA/BE8EQgQ4BCAAMwQ7BDAEQQQ9BEsERQQgAEEE QgQ4BEUEOAQ5BCAAQAQwBEEEPwRABD4EQQRCBEAEMAQ9BE8EOwQwBEEETAQgAD0EMAQgAD4EMQRA BDAENwQ+BDIEMAQ9BDgENQQgADEEQwQ6BDIEIAAyBD4EPgQxBEkENQQsACAAOAQgAEAEMAQ3BD0E SwQ1BCAAPwQ4BEEETAQ8BDUEPQQ9BD4EQQRCBDgEIAAyBD4EPwQ7BD4EQgQ4BDsEOAQgADIEIABB BDUEMQQ1BCAAPgQ0BD0EOAQgADgEIABCBDUEIAA2BDUEIAA4BDQENQQ4BCwAIAA9BD4EIAAyBCAA QAQwBDcEPQRLBEUEIAAyBDAEQAQ4BDAERgQ4BE8ERQQuACAAEgRBBDUEIAA+BD0EOAQgAD8EPgRP BDIEOAQ7BDgEQQRMBCAAOAQ3BCAAQQAsACAAMAQgADEEQwQ6BDIESwQgADoEQAQ+BDwENQQgAD8E TwRCBDgEIAA+BEEEPQQ+BDIEPQRLBEUEIAAzBDsEMARBBD0ESwRFBCAATQRCBD4EIAA4BEUEIABB BD4EMgQ8BDUEQQRCBD0ESwQ1BCAAPwQ+BEIEPgQ8BDoEOAQuACAAGgRABD4EPAQ1BCAAQAQ+BDQE PgRBBDsEPgQyBD0EPgQ5BCAAOAQgADUEUQQgAEAEPgQ0BD4EMgQ+BDMEPgQgAEEEPARLBEEEOwQw BCAAQwQgAEEEPgQzBDsEMARBBD0EPgQ5BCAAOAQ7BDgEIABBBDsEPgQ2BD0EPgQ5BCAAMwQ7BDAE QQQ9BD4EOQQgADUEQQRCBEwEIAA6BD4EPQQ6BEAENQRCBD0ESwQ5BCAAQQQ4BDwEMgQ+BDsELAAg ADoEPgRCBD4EQARLBDkEIAA+BEIEQAQwBDYEMAQ1BEIEIABABD4ENAQ+BEEEOwQ+BDIEPQRDBE4E IAAyBCAAMgQ4BDQENQQgADoEPgQ9BDoEQAQ1BEIEPQQ+BDMEPgQgADMEQAQwBEQEOARHBDUEQQQ6 BD4EMwQ+BCAAPwRABDUEPgQxBEAEMAQ3BD4EMgQwBD0EOARPBCAAOAQgADgEPAQ1BDUEQgQgAEEE PARLBEEEOwQsACAANwQwBDIEOARBBE8ESQQ4BDkEIAA+BEIEIAA4BEEEPwQ+BDsETAQ3BEMENQQ8 BD4EOQQgAEQEOAQ7BD4EQQQ+BEQEOAQ4BC4AIAAhBCAAQgQ1BEcENQQ9BDgENQQ8BCAAMgRABDUE PAQ1BD0EOAQgAEEEPARLBEEEOwQgADwEPgQzBCAAPAQ1BD0ETwRCBEwEQQRPBCwAIAAyBD8EOwQ+ BEIETAQgADQEPgQgAD8EPgRCBDUEQAQ4BCAAQQQ+BDIEQAQ1BDwENQQ9BD0ESwQ8BDgEIABPBDcE SwQ6BDAEPAQ4BCAAQQQyBE8ENwQ4BCAAPAQ1BDYENARDBCAAQQQ8BEsEQQQ7BD4EPAQsACAAQQQ4 BDwEMgQ+BDsEPgQ8BCAAOAQgADcEMgRDBEcEMAQ9BDgENQQ8BCAAMgQ+BD4EMQRJBDUELgAgACEE OgQ+BDsETAQ6BD4EIAAxBEMEOgQyBCAAPAQ+BDMEQwRCBCAAPQQwBD8EOwQ+BDQEOARCBEwEIAA1 ACAAMwQ7BDAEQQQ9BEsERQQ/ACAANQB4ADUAPQAyADUAIABBBD4ERwQ1BEIEMAQ9BDgEOQQgADgE RQQgADQEQARDBDMEIABBBCAANARABEMEMwQ+BDwEKAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA4 BCAAQQQgAEEEMAQ8BDgEIABBBCAAQQQ+BDEEPgQ5BCkALAAgADoEMAQ6BCAAPgRCBEAEMAQ2BDUE PQQ4BDkEIAA+BDQEPQQ+BDMEPgQgADIEIAA0BEAEQwQzBD4EPAQsACAAPwQ+BCAAPwRABDAEMgQ4 BDsEQwQgAFgALgBZACAAQQQ8BEsEQQQ7BD4EPgQxBEAEMAQ3BD4EMgQwBD0EOARPBCAAQQQ7BD4E NgQ9BEsERQQgAEEEOwQ+BDIEKABBBDwEPgRCBEAEOARCBDUEIAAyBEsESAQ1BCkALgAgAB8EOwRO BEEEIAA/BD4EQAQ+BDYENAQ1BD0EPQRLBDUEIABCBDUEPAQ4BCAANgQ1BCAAMwQ7BDAEQQQ9BEsE PAQ4BCAAQQQ7BD4ENgQ9BEsENQQgADMEOwQwBEEEPQRLBDUEIABBBD4EIABBBDsEPgQ2BD0ESwQ8 BCAANwQyBEMERwQwBD0EOAQ1BDwEIAA4BCAAPwRABD4ERwQ4BDUELgAgAB8EPgRABD4ENgQ0BDUE PQQ9BEsERQQgADMEOwQwBEEEPQRLBEUEIAA+BDEESwRHBD0EPgQgADgEOwQ4BCAAPQQ1BCAAMQRL BDsEPgQgADgEOwQ4BCAAMQRLBDsEPgQgAD0ENQQgADwEPQQ+BDMEPgQsACAAPQQ1BCAAQQRHBDgE QgQwBE8EIABJACAAOAQgAEUAKAA+BDMEPgQ9BEwEIAA4BCAAMgQ+BDQEQwQpACwAIABDBCAAOgQ+ BEIEPgRABEsERQQgADwEPgQzBDsEPgQgADEESwRCBEwEIAA/BD4EIAA9BDUEQQQ6BD4EOwRMBDoE PgQgAD8EPgRCBD4EPAQ6BD4EMgQuACAAIgQ+BCAANgQ1BCAAQQQwBDwEPgQ1BCAAOgQwBEEEMAQ1 BEIEQQRPBCAAPwQ+BEAEPgQ2BDQENQQ9BD0ESwRFBCAAMwQ7BDAEQQQ9BEsEPAQ4BCAAOAQgAEEE PgQzBDsEMARBBD0ESwQ8BDgELAAgAD0ENQQgAEEERwQ4BEIEMARPBCAAOAQ1BEAEPgQzBDsEOARE BDgERwQ1BEEEOgQ+BDMEPgQgAD8EOARBBEwEPAQwBCwAIAA6BD4EQgQ+BEAESwQ5BCAAPwRABD4E NAQ+BDsENgQ4BDsEIABABEMEPQQ9BEsEOQQgAEAEPgQ0BCwAIABABDAENwQ8BD0EPgQ2BDgEMgQg ADMEOwQwBEEEPQRLBDUEIAAyBEEENQQ8BDgEIABBBD4EMwQ7BDAEQQQ9BEsEPAQ4BCAAOAQgAD8E PgQ7BEMERwQ4BDIEIAA1AHgANQB4ADUAPQAxADIANQAgADEEMAQ3BD4EMgRLBEUEIABBBDsEPgQz BD4EMgQtADgENQRABD4EMwQ7BDgERAQ+BDIEIAAoAD4ENAQ9BDAEIABBBD4EMwQ7BDAEQQQ9BDAE TwQgAD8EOwROBEEEIAA+BDQEPQQwBCAAMwQ7BDAEQQQ9BDAETwQpAC4AIAASBCAAPgRBBEIEMAQ7 BEwEPQRLBEUEIABPBDcESwQ6BDAERQQgAD4EMQRLBEcEPQQ+BDUEIAA6BD4EOwQ4BEcENQRBBEIE MgQ+BCAAQQQ4BDwEMgQ+BDsEPgQyBCAAMgQgADAEOwREBDAEMgQ4BEIENQQgAE0EQgQ+BCAANQAr ADIANQA9ADMAMAAgADEEQwQ6BDIELgAgAB4EQgQ7BDgERwQ9BD4ENQQgAD8EPgQ0BEIEMgQ1BEAE NgQ0BDUEPQQ4BDUEIABNBEIEPgQgAD0EMARFBD4ENAQ4BEIEIAAyBCAAQARDBEEEQQQ6BD4EPAQg AE8ENwRLBDoENQQsACAAPQQwBEcEOAQ9BDAETwQgAD4EQgQgADAEQAQ4BDkEQQQ6BD4EOQQgABoE MARABEMEPQRLBCwAIAA/BEAEMARABD4ENAQ4BEIENQQ7BEwEPQQ4BEYESwQgADAEOwREBDAEMgQ4 BEIEPgQyBCAAPQQwBEcEOAQ9BDAETwQgAEEEIAAzADMEPgQgAEIESwRBBC4AIAA7BDUEQgQgADQE PgQgAD0EMARIBDUEOQQgAE0EQARLBCwAIABBBCAAMQQ+BDsETARIBDgEPAQgADoEPgQ7BDgERwQ1 BEEEQgQyBD4EPAQgAEAEQwQ9BCgAPgRCBCAAMQA0ADQAKQAsACAAMwQ0BDUEIAA6BEAEPgQ8BDUE IAAzADAAIAAxBDAENwQ+BDIESwRFBCAAMQRDBDoEMgQgADUESQQ1BCAAMQRLBDsEPgQgADwEPQQ+ BDMEPgQgAD8EPgRCBD4EPAQ6BD4EMgQoADAEPQQwBDsEPgQzBDgERwQ9BD4EIAA4BDUEQAQ+BDME OwQ4BEQEOARHBDUEQQQ6BD4EPARDBCAAPwQ4BEEETAQ8BEMEIAAxADIANQArADMAMAA9ADEANQA1 AC0AIAA/BEAEOAQ8BDUEQAQ9BD4ENQQgADoEPgQ7BDgERwQ1BEEEQgQyBD4EIABABEMEPQQgADQE OwRPBCAAQgQwBDoEPgQzBD4EIABABDAENwQyBDgEQgQ4BE8EIAAwBDsERAQwBDIEOARCBDAEKQAu ACAAHQQ1BEEEPgQ8BD0ENQQ9BD0EPgQsACAAPgQ9BDAEIAAxBEsEOwQwBCAANQAgAEIESwRBBE8E RwQgADsENQRCBCAAPQQwBDcEMAQ0BCAAQwQ9BDgEOgQwBDsETAQ9BD4EOQQsACAAPQQ1BDIEPgQ+ BDEEQAQwBDcEOAQ8BD4EIAA8BD4ESQQ9BD4EOQQgAEIENQRFBD0EPgQ7BD4EMwQ4BDUEOQQgADoE QwQ7BEwEQgRDBEAEPQQ+BDMEPgQgAD4EMQQ8BDUEPQQwBC4AIAAdBDAEPwRABDgEPAQ1BEAELAAg ADoEIABBBEAENQQ0BD0EOAQ8BCAAMgQ1BDoEMAQ8BCwAIAA6BD4EOwQ4BEcENQRBBEIEMgQ+BCAA QARDBD0EIAA/BDAENAQwBDUEQgQgADQEPgQgADUANAAgAEAEQwQ9BCAAMwQ7BDAEMwQ+BDsEOARG BEsELAAgADQAOQAgADIEIAA0BEAENQQyBDsENQRBBDsEPgQyBDUEPQRBBDoEPgQ5BCAAMQRDBDoE MgQ4BEYENQQgADgEIABCBDAEOgQgADQEMAQ7BDUENQQuACAAHwQ+BEEEQgQ1BD8ENQQ9BD0EPgQg ADoEPgQ7BDgERwQ1BEEEQgQyBD4EIABABEMEPQQgAEMEPAQ1BD0ETARIBDAEOwQ+BEEETAQsACAA PwQ+BDsEPQQ+BEIEMAQgADoEMARABEIEOAQ9BEsELAAgAD8ENQRABDUENAQwBDIEMAQ1BDwEPgQ5 BCAAQARDBD0EMAQ8BDgELAAgAD8EMAQ0BDAEOwQwBCwAIAAwBCAATwQ3BEsEOgQgADQENQQzBEAE MAQ0BDgEQAQ+BDIEMAQ7BCAAMgQ/BDsEPgRCBEwEIAA0BD4EIABBBD4EMgRABDUEPAQ1BD0EPQQ+ BDMEPgQgAEAEQwRBBEEEOgQ+BDMEPgQgAEEEIAAzADMAIAAxBEMEOgQyBDAEPAQ4BCAAOAQgADUE SQQ1BCAAPAQ1BD0ETARIBDUEIAAyBCAATwQ3BEsEOgQwBEUEIAA9BDAEQAQ+BDQEPgQyBCAAQwQ0 BDAEOwQ1BD0EPQRLBEUEIAA+BEIEIAAgBD4EQQRBBDgEOAQsACAAMgRABD4ENAQ1BCAAPQQ1BDwE RgQ1BDIEIAA4BCAAMAQ9BDMEOwQ4BEcEMAQ9BCAAOAQ7BDgEIAA4BEUEIAA/BEAENQQ0BDoEPgQy BCAAPQQwBCAAQgQ1BEAEQAQ4BEIEPgRABDgEOAQgAEEEPgQyBEAENQQ8BDUEPQQ9BEsERQQgADME PgRBBEMENAQwBEAEQQRCBDIELgAgABIEIABBBD4EMgRABDUEPAQ1BD0EPQQ+BDwEIAAwBD0EMwQ7 BDgEOQRBBDoEPgQ8BCAAMgA2ACAAMQRDBDoEMgQsACAAPQQ1BDwENQRGBDoEPgQ8BC0AIAAzADAA LgANACAAIAAgACEEMwRABEMEPwQ/BDgEQARDBDUEPAQgADEEQwQ6BDIESwQgADoEMAQ6BCAAMgQg AEIEMAQxBDsEOARGBDUEKAAyACkAOgANAC4ABwAgAC0ALQAHACAAIAAgAC0ALQAtAHwABwAwAAcA MQAHADIABwAzAAcANAAHAAcAfAAHABAEBwB8AAcAHgQHACEEfAAHAFYABwAYBAcAFQQHAAcAfABf AAcAXwBfAAcAUQIeBAcAIAAtAC0ALQAHAD4AIAAsBAcAoAAHACgAEAQxBEEEKQAHAAcABwAwAAcA HgQHAKAAfAAHAB4EHgQgADwAPQA+ACAAEgQHACEEfAAeBCAAPAA+ACAAIAQHAFYAHgQgADwAPgAg ABMEBwAYBB4EIAA8AD4AIAAfBAcAFQQeBCAAPAA+ACAAWgAHAAcAMQAHAB4EfAAHAHwABwAeBB4E fAAgADwAPgAgAOgEBwAhBHwAHgR8ACAAPAAtAD4AIAAkBAcAVgAeBHwAIAA8AD4AIAAaBAcAGAQe BHwAIAA8AD4AIAAdBAcAFQQeBHwAIAA8AD4AIAApBAcABwAyAAcAVQAHAFYABwAeBFUAIAA8AD4A IAAhBAcAIQR8AFUAIAA8AD4AIAAnBAcAVgBVACAAPAAtAD4AIAAbBAcAGARVACAAPAA+ACAAIgQH ABUEVQAgADwAPgAgACYEBwAHADMABwBtAnwABwAqBAcAHgRtAnwAIAA8AD4AIAB0BAcAIQR8AG0C fAAgADwAPgAgAFMABwBWAG0CfAAgADwAPgAgACUEBwAYBG0CfAAgADwALQA+ACAAHAQHABUEbQJ8 ACAAPAA+ACAAFAQHAAcANAAHAPUDBwAoAB4EQgQ9BCkABwAeBPUDIAA8AD4AIAAXBAcAIQR8APUD IAA8AD4AIAAoBAcAVgD1AyAAPAA+ACAAWwQHABgE9QMgADwAPgAgABEEBwAVBPUDIAA8AC0APgAg ABYEBwAHACAAFwQ0BDUEQQRMBCAAWwQtACAAEwQ1BEAEMgRMBCwAIABTAC0AIAAUBDcEOAQ1BDsE PgQsACAAdAQtACAAGAQ2BDgERgQwBCwAIADoBC0AIAAkBDgEQgQwBC4AIAASBCAAOgQwBDYENAQ+ BDkEIAA6BDsENQRCBDoENQQgADoEMgQwBDQEQAQwBEIEPQQ+BDkEIAA8BDAEQgRABDgERgRLBCgA NQAgAD0EMAQgADUAKQAgAEEEPgQzBDsEMARBBD0ESwRFBCAAQQQ7BDUEMgQwBCAAQQRCBD4EOARC BCAAQQQ4BDwEMgQ+BDsETAQ9BD4ELQBNBDsENQQ8BDUEPQRCBD0ESwQ5BCAAPQQwBDEEPgRABCwA IAA6BDAEOgQgAEEEQwQ8BDwEMAQgADMEQAQwBEQEOARHBDUEQQQ6BDgERQQgAE0EOwQ1BDwENQQ9 BEIEPgQyBCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgRDBE4ESQQ4BEUEIABBBEIEMARABEgEOARFBCAA QQRCBDgERQQ4BDkELAAgADAEIABBBD8EQAQwBDIEMAQtACAAQQQ+BD4EQgQyBDUEQgRBBEIEMgRD BE4ESQQwBE8EIABBBD4EMwQ7BDAEQQQ9BDAETwQuACAAIQQyBDUEQgQ7BD4ELQBBBDUEQARLBDwE IAA+BEIEPAQ1BEcENQQ9BEsEIABBBD4EMwQ7BDAEQQQ9BEsENQQsACAAMgQgAD8EQAQ+BEYENQRB BEEENQQgAEAEPgQ2BDQENQQ9BDgETwQgAD4EQgQxBEAEPgRBBDgEMgRIBDgENQQgACIAPQRDBDsE TAQiACgAIgAeBCIAIAA4BDsEOAQgACIAIQQiACkAIAA4BDcEIAA9BDAEMQQ+BEAEMAQgAEEEOAQ8 BDIEPgQ7BEwEPQRLBEUEIABNBDsENQQ8BDUEPQRCBD4EMgQgAEEEQgQwBEAESAQ4BEUEIABBBEIE OARFBDgEOQQuAA0AIAAgBD4ENAQgABAEIAA4BCAAHgQsACAAMwQ7BBAEQQQ9BEsERQQgADgEIABB BB4EMwQ7BDAEQQQ9BEsERQQsACAANAQwBFEEQgQgADIAIAA8BDgEQAQwBC0AIAA8BE8EMwQ6BDgE OQQoACwEKQAgADgEIABCBDIEUQRABDQESwQ5BCgAKgQpACAAOAQgAD8EPgQgADQAIABCBDgEPwQw BCAAMwQ7BDAEQQQ9BEsERQQgACgAMAQ+BEMEOAQ1BCkAXwB4AHkALAAgADMENAQ1BCAAeAA9AHsA LAQ8BE8EMwQ6BDAETwQsACoEQgQyBFEEQAQ0BDAETwR9ADsAeQA9AHsAMwQ7BBAEQQQ9BDAETwQs AEEEHgQzBDsEMARBBD0EMARPBH0ALgAgABgEQgQ+BDMEPgQgADgEPAQ1BDUEPAQgADIAKgAyACoA NQArADIAPQAyADIAIAA9BD4EMgRLBDUEIAAzBDsEMARBBD0ESwQ1BCAAQQRCBDgERQQ4BDgELAAg ADoEPgRCBD4EQARLBDUEIAA9BDAENwQ+BDIEUQQ8BCgAQQQ+BDIEQQQ1BDwEIABBBDsEQwRHBDAE OQQ9BD4EIAA4BCAAMQQ1BDcEIAA3BDAENAQ9BDUEOQQgADwESwRBBDsEOAQpACAAIQRCBDAEQARI BDgEPAQ4BCAAEARABDoEMAQ9BDAEPAQ4BC4AIAASBCAAQgQwBDEEOwQ4BEYENQQgAD8EQAQ4BDIE NQQ0BDUEPQRLBCAAMwQ7BDAEQQQ9BEsENQQgADgEIABBBD4EMwQ7BDAEQQQ9BEsENQQgAD8EPgRC BD4EPAQ6BDgEKAAzBDsEMARBBD0ESwQ1BCAAMgQgADIEOAQ0BDUEIAA9BDAEMQQ+BEAEMAQgAEEE OAQ8BDIEPgQ7BD4EMgQpAC4AIAAfBEAEOAQgAE0EQgQ+BDwELAAgAEAETwQ0BCAAOAQgAEEEQgQ+ BDsEMQQ1BEYELAAgAD8EQAQ+BEUEPgQ0BE8ESQQ4BDUEIAA9BDAEIABCBDAEMQQ7BDgERgQ1BCgA MgApACAARwQ1BEAENQQ3BCAAEAQsACAAPQQ1BCAAQQRHBDgEQgQwBE8EIABBBDAEPAQ+BDMEPgQg ABAELAAgAD4EQgRABDAENgQwBDUEQgQgADMEQAQwBEQEOAQ6BD4ELQBBBDgEPAQyBD4EOwRMBD0E SwQ1BCAATQQ7BDUEPAQ1BD0EQgRLBCAAPwQ1BEAEMgRLBEUEIAAzBDsEMARBBD0ESwRFBCwAIABD BEcEMARBBEIEMgRDBE4ESQQ4BDUEIAAyBCAAMwRABDAERAQ4BEcENQRBBDoEPgQ8BCAAPgREBD4E QAQ8BDsENQQ9BDgEOAQgAD8EPgRCBD4EPAQ6BDAEIAA4BCAAOAQ0BDUEPQRCBDgERAQ4BEYEOARA BEMENQRCBCAAMgAgAEEEOAQ8BDwENQRCBEAEOARHBD0ESwRFBCAAPwQwBEAESwQgAD8ETwRCBFEE QAQ+BDoEIAAhBEIEMARABEgEOARFBCAAEARABDoEMAQ9BD4EMgQuACAAGgQwBDoEIAA9BDUEQQQ7 BD4ENgQ9BD4EIAA/BD4EQQRHBDgEQgQwBEIETAQsACAAPgQxBEkENQQ1BCAAOgQ+BDsEOARHBDUE QQRCBDIEPgQgADwEOwQwBDQESAQ4BEUEIAA/BD4EQgQ+BDwEOgQ+BDIEIAAyBCAANAQyBDAEIABA BDAENwQwBCAAMQQ+BDsETARIBDUEIAA/BDUEQAQyBEsERQQgAEEEPgQzBDsEMARBBD0ESwRFBCwA IABCBD4EIAA1BEEEQgRMBCAAQAQwBDIEPQQ+BCAANQAqADUAKgAyAD0ANQAwACAASARCBEMEOgQu ACAAGARFBCAAMAQ9BDAEOwQ+BDMEOARHBD0EPgQgAD0EMAQ3BEsEMgQwBDUEPAQgABwEOwQwBDQE SAQ4BDwEOAQgABAEQAQ6BDAEPQQwBDwEOAQuACAAGAQ8BDUENQQ8BCAAOAQ1BEAEMARABEUEOARO BCAAIAQ+BDQEMAQgACAEQwQ9BDoADQAwAF8AIAAgACAAIAAgACAAIAAQBCAAIAAgAC0ALQAtAC0A PgQtAD4ADQAxAF8AHwQ1BEAEMgRLBDUEIAA1ACAALQAtAD4ELQA+AA0AMgBfACEEQgQwBEAESAQ4 BDUEIAAQBEAEOgQwBD0ESwQgAC0ALQA+BC0APgANADMAXwAcBDsEMAQ0BEgEOAQ1BCAAEARABDoE MAQ9BEsEIAAtAC0APgQtAD4ADQA0AF8AHQQ4BDcESAQ4BDUEIAAfBD4EQgQ+BDwEOgQ4BCgAGwQc BBYEKQANACAAGARCBD4EMwQ+BDoAIAAxACsANQArADIAMgArADUAMAArADEENQRBBDoEPgQ9BDUE RwQ9BD4EQQRCBEwEPQA3ADgAKwAeIiAAQARDBD0ELAAgAD8EPgQ7BD0EPgRBBEIETAROBCAAPgQ/ BDgEQQRLBDIEMAROBEkEOARFBCAAIAQ+BDQEIAAgBEMEPQQgADgEIAAQBC4AIAAdBDAEOAQxBD4E OwQ1BDUEIAA9BDAEQQRLBEkENQQ9BD0EMARPBCAAQQQ8BEsEQQQ7BD4EPAQgADoEMARABEIEOAQ9 BDAEIAA8BDgEQAQwBCAANwQwBDoEOwROBEcEMAQ1BEIEQQRPBCAAMgQgAEIEMAQxBDsEOARGBDUE KAAyACkALAAgAEIEMAQ6BCAAOgQwBDoEIAA+BD0EMAQgAEEEPgQ0BDUEQAQ2BDgEQgQgADIEQQQ1 BCAAEARABDoEMAQ9BEsELgAgAB4EPQQwBCAAQgRABDUERQQ8BDUEQAQ9BDAETwQsACAAPQQ+BCAA NQRBBDsEOAQgAD4EQgQyBDsENQRHBEwEQQRPBCAAPgRCBCAAPAQ7BDAENARIBDgERQQgADMEOwQw BEEEPQRLBEUELAAgADwESwQgADgEPAQ1BDUEPAQgAD8EOwQ+BEEEOgRDBE4EIAA8BDAEQgRABDgE RgRDBCwAIAAyBCAAOgQ+BEIEPgRABEMETgQgADIEPwQ4BEEEMAQ9BCAAMgQ1BEEETAQgAEAEQwRB BEEEOgQ4BDkEIAAwBDsERAQwBDIEOARCBC4AIAAYBDsEOAQgAD0EMAQ+BDEEPgRABD4EQgQsACAA PARLBCAAOAQ8BDUENQQ8BCAAMAQ7BEQEMAQyBDgEQgQsACAAMgQgADoEPgRCBD4EQARLBDkEIAAy BD8EOARBBDAEPQQgADwEOARABC4ALgAuACAAEgQgADsETgQxBD4EPAQgAEEEOwRDBEcEMAQ1BCwA IAA8BDgEQQRCBDgEOgQwBCAAQARDBD0EIAA/BD4ENwQyBD4EOwRPBDUEQgQgAD8EPgQ0BD4EMQQ9 BD4ENQQgADUENAQ4BD0EQQRCBDIEPgQgAEEEPgQgAEEEMgQ+BDgEPAQgAD8EQAQwBD4EQgRGBDUE PAQgABAELgANACAAGgQwBEAEQgQ4BD0EMAQgADwEOARABDAEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4 BCAATwRABDoEMARPBCAAOAQgAD4ERwQ1BD0ETAQgADoEQAQwBEEEOAQyBDAETwQuACAAFAQ1BDkE QQRCBDIEOARCBDUEOwRMBD0EPgQsACAAPQQ1BCAAQQRHBDgEQgQwBE8EIABBBDgEPAQ8BDUEQgRA BDgEOQQgAEEEQgQwBEAESAQ4BEUEIABBBEIEOARFBDgEOQQsACAAHAQ7BDAENARIBDgENQQgABAE QAQ6BDAEPQRLBCAAMgQgADIESwRBBEgENQQ5BCAAQQRCBDUEPwQ1BD0EOAQgAEEEOAQ8BDwENQRC BEAEOARHBD0ESwQgAD4EQgQ9BD4EQQQ4BEIENQQ7BEwEPQQ+BCAAQQRCBDAEQARIBDgERQQgAEEE OAQ8BDwENQRCBEAEOAQ5BCAAOAQgADIEPQQ+BEEETwRCBCAAPQQ+BDIESwQ1BC4AIAAhBD4EMwQ7 BDAEQQQ9BEsENQQgAEEEOAQ8BDwENQRCBEAEOARHBD0ESwQgAD4EQgQ9BD4EQQQ4BEIENQQ7BEwE PQQ+BCAARwQ1BEIESwRABDUERQQgADsEOAQ9BDgEOQQgAEEEOAQ8BDwENQRCBEAEOAQ5BCAAOAQg AD4ENAQ9BD4EMwQ+BCAARgQ1BD0EQgRABDAEIAAbBC4AIAAbBDgEPQQ4BDgEIABBBDgEPAQ8BDUE QgRABDgEOQQgAD8EQAQ1BDQEQQRCBDAEMgQ7BE8ETgRCBCAAQQQ+BDEEPgQ5BCAANAQyBDAEIAA6 BEAENQRBBEIEMAQoABMEGgQbBCUEWwQnBCEEIgQmBCAAOAQgABIEJAQbBBwEFgQXBFMAHQRaACkA IABCBDgEPwQwBCAAIgArACIAIAA4BCAAIgBYACIALAAgADoEPgRCBD4EQARLBDUEIAA/BDUEQAQ1 BEEENQQ6BDAETgRCBEEETwQgADIEIABGBDUEPQRCBEAENQQgABsEIABBBDIEPgQ1BDkEIABBBDgE PAQ8BDUEQgRABDgEOAQuACAAHwQ+BDsEQwRHBDAENQRCBEEETwQsACAARwRCBD4EIAA8BD4ENgQ9 BD4EIAA8BEsEQQQ7BDUEPQQ9BD4EIABBBDIENQRABD0EQwRCBEwEIABCBDAEMQQ7BDgERgRDBCAA MgQgAEEEOAQ8BDwENQRCBEAEOARHBD0ESwQ5BCAAQgQ+BEAELAAgAEIEMAQ6BCAAOgQwBDoEIABN BDsENQQ8BDUEPQRCBEsEIAA/BEAEPgRCBDgEMgQ+BD8EPgQ7BD4ENgQ9BEsERQQgADMEQAQwBD0E NQQ5BCAAMQQ7BDgENwQ6BDgEIAA0BEAEQwQzBCAAOgQgADQEQARDBDMEQwQgADgENwQtADcEMAQg AEEEOAQ8BDwENQRCBEAEOAQ5BC4ADQAgABwEPgQ2BD0EPgQgAD4EPwQ4BEEEMARCBEwEIABNBEIE QwQgADoEMARABEIEOAQ9BEMEIAA4BCAAQwQxBDUENAQ4BEIETARBBE8ELAAgAEcEQgQ+BCAAMgRB BDUEIABBBEIEOARFBDgEOAQgAD0EMARFBD4ENARPBEIEQQRPBCAAMgQgAEEEQgRABD4EMwQ+BDwE IABBBDwESwRBBDsEPgQyBD4EPAQgAEEEPgQzBDsEMARBBDgEOAQuACAALQRCBDgEPAQ+BDsEPgQz BDgERwQ1BEEEOgQ+BDUEIABABD4ENARBBEIEMgQ+BCAAQgQ1BDwEIAAxBD4EOwQ1BDUEIABPBDIE PQQ+BCwAIAA6BD4EMwQ0BDAEIAA/BD4EPQRPBEIEPQQwBCAAMwQ7BDAEMgQ9BDAETwQgADwESwRB BDsETAQgADwEMARCBEAEOARGBEsELgAgAB0ENQQgAEEERwQ4BEIEMARPBCAANAQ1BDsENQQ9BDgE TwQgAD0EMAQgADQEMgQwBCAAPAQ4BEAEMAQsACAAPAQ+BEkEPQRLBDkEIAA6BD4EPQRGBDUEPQRC BEAEMARCBCAAQQQ8BEsEQQQ7BDAEIAA/BEAENQQ0BEEEQgQwBDIEOwRPBDUEQgQgADsEOAQ9BDgE TwQgAEEEOAQ8BDwENQRCBEAEOAQ4BCAAEgQkBBsEHAQWBCwAIABCBDAEOgQgADoEMAQ6BCAAQAQw BDcENAQ1BDsETwQ1BEIEIABBBDgEPAQ8BDUEQgRABDgERwQ9BD4EIABABDAEQQQ/BD4EOwQ+BDYE NQQ9BD0ESwQ1BCAAQQQ+BDMEOwQwBEEEPQRLBDUELAAgAEEEPgQ3BDQEMAQ9BD0ESwQ1BCAAOAQ3 BCAAPwQ+BEUEPgQ2BDgERQQgAE0EOwQ1BDwENQQ9BEIEPgQyBCwAIABBBD4EPgRCBDIENQRCBEEE QgQyBEMETgRJBDgENQQgADwETwQzBDoEPgQ8BEMEIAA4BCAAQgQyBFEEQAQ0BD4EPARDBCAAPAQ4 BEAEMAQ8BC4AIAAeBD0EMAQgAD4EQgQ0BDUEOwRPBDUEQgQgADwETwQzBDoEPgQ1BCAAPgRCBCAA QgQyBFEEQAQ0BD4EMwQ+BCAAOAQgAD4ENAQ9BD4EMgRABDUEPAQ1BD0EPQQ+BCAAQAQwBDcEQARL BDIEPQQ+BDUEIAA+BEIEIAAzBDsEMAQ0BDoEPgQzBD4ELAAgADgENAQ1BDAEOwRMBD0EPgQ1BCAA PgRCBCAAQAQ1BDAEOwRMBD0EPgQzBD4EIAA4BCAAMAQxBEEEPgQ7BE4EQgQ9BD4ENQQgAD4EQgQg AD4EQgQ9BD4EQQQ4BEIENQQ7BEwEPQQ+BDMEPgQsACAAQgQ+BCAANQRBBEIETAQgAE0EQgQ4BCAA MgAgADwEOARABDAEIAA3BDAENAQwBE4EQgQgAD4EQQQ9BD4EMgQ9BEMETgQgADoEMARCBDUEMwQ+ BEAEOAROBCwAIAA/BD4EIAA6BD4EQgQ+BEAEPgQ5BCAANAQ1BDsETwRCBEEETwQgAEAEQwQ9BEsE LgAgAC0EQgQ+BCAAOgQgAEIEPgQ8BEMEIAA2BDUEIAA7BDgEPQQ4BE8EIABBBDAEPAQ+BEEEPgQz BDsEMARBBD4EMgQwBD0EOARPBCAAEAQeBCMEGAQVBC4AIAAkBD4EQAQ8BEMEOwQ4BEAEQwQ1BDwE IABNBEIEQwQgADgENAQ1BE4EIAA9BDAEIAAzBDgEPwQ1BEAEMQQ+BEAENQQ5BEEEOgQ+BDwELwBA BEMEQQRBBDoEPgQ8BDoADQASBCQEGwQcBBYELQAgACIAEgRLBEAEMAQ2BDAETgRJBDgENQQgACQE PgRABDwEQwQgABsETgQ0BDgEIAAcBD0EPgQ2BDAEQgQgABYEOAQ3BD0ETAQiACwAIABCBD4EIAA1 BEEEQgRMBCAATQRCBD4EIAA/BEAEPgRBBEIEPgQgAD4EPwRABDUENAQ1BDsENQQ9BDgENQQgADsE TgQ0BDUEOQQsACAAOgQwBDoEIAAyBEsEQAQwBDcEOARCBDUEOwQ1BDkEIAAkBD4EQAQ8BEsEIAAQ BDEEQQQ+BDsETgRCBDAEIAA4BCAAPwQ1BEAEMgQ+BD0EMARHBDAEOwQwBCAAEAQsACAAPARLBEEE OwRPBEkEOARFBCAAOAQgADwEPQQ+BDYEMARJBDgERQQgADYEOAQ3BD0ETAQuACAALQRCBD4EIAA6 BD4EPwRMBDUEIAAgBD4ENAQwBC4AIAAaBCAARAQ+BEAEPARDBDsENQQgADUEQQRCBEwEIAA/BE8E QgRMBCAANAQ+BD8EPgQ7BD0ENQQ9BDgEOQQgADIEIABBBD4EPgRCBDIENQRCBEEEQgQyBDgEOAQg AEEEIAA/BEAEOAQ7BDUEMwQwBE4ESQQ4BDwEOAQgAEEEOAQ8BDwENQRCBEAEOARHBD0ESwQ8BDgE IABBBEIEOARFBDgETwQ8BDgEOgANADEALgAgAB4EQgQgABIEIAA0BD4EIAAkBCAAPwRABD4EOARB BEUEPgQ0BDgEQgQgAEEEOwQ4BE8EPQQ4BDUEKADoBCkAIAA4BCAAQAQwBDcENAQ1BDsENQQ9BDgE NQQoACAEKQAuAA0AMgAuACAAGwROBDQEOAQgADIESwRABDAENgQwBE4EQgQgAEQEPgRABDwEQwQs ACAAEwQ7BDAEMwQ+BDsETwQgACEEOwQ+BDIEPgQgADgEIAA0BDAEOwQ1BDUEIAA8BDUENgQgAB8E QAQwBDIETAROBCAAOAQgAC8EKAB0BDAEKQAyBEwETgQgADgENARDBEIEIAAaBCAAJwQ1BDsEPgQy BDUEOgRDBC4ADQAzAC4AIAAYBEIEPgQzBCAAPgREBD4EQAQ8BDsENQQ9BDgETwQgADcEMAQ6BDsE TgRHBDAENQRCBEEETwQgADIEIABPBDIEOwQ1BD0EOAQ4BCAAGwROBDQENQQ5BCAAMgQgADQEMgRD BEUEIAA8BDgEQAQwBEUELQAgACwEIAA4BCAAKgQgADgEOwQ4BCAAPARPBDMEOgQ+BDkEIAA3BDUE PAQ7BDgELAAgAB0EMAQyBDgEKABaACkALAAgADgEIAA3BDUEPAQ7BDgEIABCBDIEUQRABDQEPgQ5 BCwAIAAvBDIEOAQoABcEKQAsACAAOAQ8BDUETwQgADcEPQQwBD0EOARPBCgAHQQpACAAOAQgAD0E NQQ3BD0EMAQ9BDgENQQsACAANwQ7BD4EKABTACkALgAgAC0EQgQ+BCAAMgRCBD4EQAQwBE8EIAA0 BDgEMAQzBD4EPQQwBDsETAQgADwEMARCBEAEOARGBEsELAAgADoEPgRCBD4EQAQwBE8EIABPBDIE OwRPBDUEQgRBBE8EIAA7BDgEPQQ4BDUEOQQgAEEEOAQ8BDwENQRCBEAEOAQ4BCgAQgQwBDEELgAy ACkAIAAXBFMAGwQdBFoALAAgAEAEMAQ3BDQENQQ7BE8ETgRJBDAETwQgADwEOARABEsEIAA2BDgE MgQ+BDkEIAA4BCAAPQQ1BDYEOAQyBD4EOQQgAD8EQAQ4BEAEPgQ0BEsELgANADQALgAgABQEMAQ7 BEwESAQ1BCAAOwROBDQEOAQgADgENARDBEIEIAA6BCAAQAQwBDcEPAQ9BD4ENgQ1BD0EOAROBCwA IABBBDgEPQRCBDUENwQ4BEAEQwRPBCgAWAApACAAOAQgAEMEQgQyBDUEQAQ2BDQEMARPBCgAIgQp ACAAQAQwBDcEOwQ4BEcEPQRLBDUEIAA/BEAEPgRBBEIEQAQwBD0EQQRCBDIEMAQoACgEKQAgADgE IAA8BD0EPgQzBD4EPgQxBEAEMAQ3BDgETwQoACkEKQAuAA0ANQAuACAAHQQwBDoEPgQ9BDUERgQs ACAAOAQ8BDUETwQgAD8EQAQ1BDoEQAQwBEEEPQRDBE4EKABbBCkAIAAmBDUEOwRMBCAAOAQgADQE PgRBBEIEOAQzBDAETwQgADUEUQQsACAAPgQ9BDgEIAAUBDUEOwQ1BD0EOAQ1BDwEIAA4BCAAPgQR BEoENQQ0BDgEPQQ1BD0EOAQ1BDwEIAA8BD0EPgQ2BDAEQgQgABYEOAQ3BD0ETAQuAA0AIAAfBEAE PgQyBDUEQAQ4BDwELAAgADgENwQgAEcENQQzBD4EIABBBD4EQQRCBD4EOARCBCAAIgBIBDgEPwRP BEkEOAQ5BCIAIAA6BEAENQRBBEIEIAA7BE4ENAQ1BDkEIAATBBoEGwQlBFsEJwQhBCIEJgQ6AA0A JgQhBCcEIgQ9ACAAJgQ1BDsETAQgACEEQgQwBDIETwQgADgEIAAnBDUEOwQ+BDIENQQ6BDAEIABD BCIEMgQ1BEAENgQ0BDAETwQNABMEGgQlBFsEPQAgABMEOwQwBDMEPgQ7BD4EPAQgABoEIABBBDgE PQRCBDUENwRDBCAAOAQ3BCAAJQQwBD4EQQQwBCAAWwQwBEAEPQQ+BDMEPgQoACIAPwRABDUEOgRA BDAEQQQ9BD4EMwQ+BCIAIAA/BD4ELQBDBDoEQAQwBDgEPQRBBDoEOAQpAA0AIAAXBD0EMARHBDgE QgQgAD8EPgQgADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BDgEPAQgAD8EPgQ9BE8EQgQ4BE8EPAQg ADsETgQ0BDgEIABNBEIEPgQgAEIENQQsACAAOgRCBD4EIABDBEIEMgQ1BEAENgQ0BDAETgRCBEEE TwQsACAAOgQwBDoEIABHBDUEOwQ+BDIENQQ6BCwAIAA6BD4EQgQ+BEAESwQ5BCAAQQRCBDAEMgQ4 BEIEIAA/BDUEQAQ1BDQEIABBBD4EMQQ+BDkEIAA+BEEEPARLBEEEOwQ1BD0EPQRDBE4EIABGBDUE OwRMBCAAPwQ+BDsEQwRHBDgEQgRMBCAARwRCBD4ELQBCBD4EIAA/BEAENQQ6BEAEMARBBD0EPgQ1 BCwAIAA2BDgENwQ9BDUEQwRCBDIENQRABDYENAQwBE4ESQQ1BDUELAAgAE8EMgQ7BE8ETgRJBDUE NQQgAD8EQwRCBEwEIAAyBCAAHQQ+BDIESwQ5BCAAHAQ4BEAELgANACAAGgRABD4EPAQ1BCAANAQ1 BDsENQQ9BDgETwQgAEEEPgQzBDsEMARBBD0ESwRFBCAAPQQwBCAAPARPBDMEOgQ4BDUEIAA4BCAA QgQyBFEEQAQ0BEsENQQsACAAPgQ9BDgEIAA0BDUEOwRPBEIEQQRPBCAAPQQwBCAANwQyBD4EPQQ6 BDgENQQgADgEIABIBDgEPwRPBEkEOAQ1BCwAIABCBDAEOgQ2BDUEIABABDAEQQQ/BD4EOwQ+BDYE NQQ9BD0ESwQ1BCAAOAQ0BDUEMAQ7BEwEPQQ+BCAAQQQ4BDwEPAQ1BEIEQAQ4BEcEPQQ+BC4AIAAU BDUEQQRPBEIETAQgAEgEOAQ/BE8ESQQ4BEUEIAA+BDEEQAQwBDcEQwROBEIEIAA9BDAEIABCBD4E QAQ1BCAAOAQ3BCAAQQRCBDgERQQ4BDkEIABCBEAEOAQgAD8ENQRCBDsEOAQsACAAOgQwBEEEMARO BEkEOARFBEEETwQgADQEQARDBDMEIAA0BEAEQwQzBDAEIAAyBCAAQgRABFEERQQgADwENQRBBEIE MARFBCgAMgQgADwENQRBBEIENQQgAEEEQgQ4BEUEOAQ5BCAAJwQlBCwAIAAaBCIEIAA4BCAAMQQ7 BDgENwQ6BDgERQQgAEgEOAQ/BE8ESQQ4BEUEIAAmBCAAOAQgACEEKQAuACAAKAQ4BD8ETwRJBDgE NQQgAD4EMQQyBDgEMgQwBE4EQgQgAEYENQQ9BEIEQAQwBDsETAQ9BEsENQQgAEEEQgQ4BEUEOAQ4 BCAAQQQ+BDMEOwQwBEEEPQQ+BDMEPgQgAEEEPARLBEEEOwQ+BD4EMQRABDAENwQwBCAAMwQ4BD8E NQRABDEEPgRABDUEOQRBBDoEPgQzBD4EIABPBDcESwQ6BDAELAAgAFMAGwQdBC0AIAAbBE4ENAQ1 BDkEIAA8BDUENgQ0BEMEIABBBDIEPgQ4BDwEIAA3BD0EMAQ9BDgENQQ8BCAAOAQgAD0ENQQ3BD0E MAQ9BDgENQQ8BC4AIAAfBD4ERQQ+BDYEOAQ1BCAAPwQ+BCAANwQyBEMERwQwBD0EOAROBCAAMQQ7 BDgENwQ7BDUENgQwBEkEOAQ1BCAAOAQgAEEEOAQ8BDwENQRCBEAEOARHBD0ESwQ1BCAANwQyBD4E PQQ6BDgENQQgADgEIABIBDgEPwRPBEkEOAQ1BCAANwQyBEMEOgQ4BCAAQwQ6BDAENwRLBDIEMARO BEIEIAA9BDAEIAA3BDAEPAQ1BEcEMARCBDUEOwRMBD0EQwROBCAARAQ+BD0ENQRCBDgERwQ1BEEE OgRDBE4EIAAzBDAEQAQ8BD4EPQQ4BE4EIAA8BDAEQgRABDgERgRLBCAAOAQgADIEQQQ1BDMEPgQg AEAEQwRBBEEEOgQ+BDMEPgQgAEAEPgQ0BDAEIABABEMEQQRBBDoEOARFBCAAQARDBD0ELgANACAA EgRBBDUEIABBBEIEOARFBDgEOAQgAD8EPgQ0BD4EMQQ9BEsEIAA0BEAEQwQzBCAANARABEMEMwRD BCAAOAQgAEYENQQ7BD4EPARDBCwAIAA/BDUEQAQyBD4EOQQgAEAEQwQ9BDUEIABBAC4AIAAtBEIE PgQgAD4EPwRABDUENAQ1BDsENQQ9BDgENQQgAEQEQAQwBDoEQgQwBDsEMAQgAD8EPgQgADMEOAQ/ BDUEQAQxBD4EQAQ1BDkEQQQ6BDgELgAgABQEQAQ1BDIEPQQ4BDUEIAA3BD0EMAQ7BDgELAAgADoE MAQ6BCAAQwRBBEIEQAQ+BDUEPQQgADwEOARABCAAOAQgAEcEQgQ+BCAAPgQ9BCAAPgQ/BDgEQQRL BDIEMAQ1BEIEQQRPBCAAQgQ1BD4EQAQ4BDUEOQQgAEQEQAQwBDoEQgQwBDsEPgQyBCAAOAQgADQE OwRPBCAANQQzBD4EIAA/BD4EQQRCBDgENgQ1BD0EOARPBCAAOARBBD8EPgQ7BEwENwQ+BDIEMAQ7 BDgEIAA9BDUEIAA9BDAEQwQ6BEMELAAgADAEIABEBDgEOwQ+BEEEPgREBDgETgQgADgEIAA+BD0E MAQgADYENQQgADEESwQ7BDAEIABABDUEOwQ4BDMEOAQ1BDkELgAgABwEMARCBEAEOARGBDAEIAA+ BEIEQAQwBDYEMAQ1BEIEIAAzBDsEQwQxBDgEPQQ9BEMETgQgADMEMARABDwEPgQ9BDgETgQgAEAE QwQ9BCwAIAA1BDQEOAQ9BEEEQgQyBDAEIAA4BEUEIABBBDgEPAQyBD4EOwRMBD0EPgQzBD4ELAAg AEQEPgQ9BDUEQgQ4BEcENQRBBDoEPgQzBD4EIAA4BCAAQQQ8BEsEQQQ7BD4EMgQ+BDMEPgQgADAE QQQ/BDUEOgRCBD4EMgQsACAAOARFBCAAQQQwBDwEPgQ/BD4ENAQ+BDEEOAQ1BCAAOAQgAD8EPgQ0 BD4EMQQ4BDUEIAAyBEEENQQ8BEMEIAA8BDgEQARDBC4AIAAeBEcENQQyBDgENAQ9BD4ELAAgADQE QAQ1BDIEPQQ4BDUEIABABEMEPQRLBCAAPwRABDUENARBBEIEMAQyBDsETwQ7BDgEIAA0BDsETwQg AEEEMgQ+BDgERQQgAEUEPgQ3BE8ENQQyBCAAPQQ1BEEEQAQwBDIEPQQ4BDwEPgQgADEEHgQ7BEwE SARDBE4EIABGBDUEPQQ9BD4EQQRCBEwELAAgAEcENQQ8BCAAQQQ+BDIEQAQ1BDwENQQ9BD0ESwQ1 BCAAMQRDBDoEMgRLBCAANAQ7BE8EIAA9BDAEQQQuACAAIARDBD0ESwQgADEESwQ7BDgEIAA9BD4E QQQ4BEIENQQ7BDUEPAQgAEEEMAQ6BEAEMAQ7BEwEPQQ+BDMEPgQgADoEPgQ9BEYENQQ/BEIEQwQw BDsETAQ9BD4EMwQ+BCAANwQ9BDAEPQQ4BE8EIAA+BCAAPwRABDgEQAQ+BDQENQQgADgEIABHBDUE OwQ+BDIENQQ6BDUELAAgAEAENQQ7BDgEMwQ4BDgELAAgAEQEOAQ7BD4EQQQ+BEQEOAQ4BCAAOAQg AEIENQQ+BEAEOAQ4BCAAPwQ+BDcEPQQwBD0EOARPBCwAIAA8BDAEQgQ1BDwEMARCBDgEOgQ4BCwA IAA9BDAEQwQ6BDgEIAA4BCAATwQ3BEsEOgQwBCAAQQQyBD4ENQQ5BCAAOgRDBDsETARCBEMEQARL BC4AIAAeBD0EOAQgADYENQQgADgEQQQ/BD4EOwRMBDcEPgQyBDAEOwQ4BEEETAQgADQEOwRPBCAA PgQxBDwENQQ9BDAEIAA4BD0ERAQ+BEAEPAQwBEYEOAQ1BDkELAAgAD8EOARBBEwEPAQwBCwAIAA4 BEEEOgRDBEEEQQRCBDIEMAQsACAANwQwBDoEOwROBEcENQQ9BDgETwQgADQEPgQzBD4EMgQ+BEAE PgQyBCAAOAQsACAAOgQ+BD0ENQRHBD0EPgQsACAAMgQgADMEMAQ0BDAEPQQ4BDgELAAgADwEMAQz BDgEOAQsACAAMgQ+BDsESAQ1BDEEQQRCBDIENQQsACAAOgQ+BDsENAQ+BDIEQQRCBDIENQQgADgE IABHBDAEQAQ+BDQENQQ5BEEEQgQyBDUELgANACAAFAQwBDsETARIBDUELAAgADcEPQQwBE8EIAA4 BEEEQgQ+BEAEOAROBCAAPQQwBEgENQQzBD4EIABABD4ENAQwBCAAOAQgADgEQQQ/BD4EOwRMBDcE QwRPBCAAPAQ1BEIEPgQ0BCAAQARDBEEEOwQwBCgARAQwBDoEQgRLBCAAQwRBBEIEQAQ+BDkEQQRC BDIEMAQgADgEIABABDAENwQyBDgEQgQ4BE8EIABPBDcESwQ6BD4EMgQgACsAQgQ1BD4EQAQ1BEIE OARHBDUEQQQ6BDgENQQgAD4EQQQ9BD4EMgRLBCwAIAA6BDAEOgQgABMEOAQ/BDUEQAQxBD4EQAQ1 BDkEQQQ6BDAETwQgAEQEOAQ7BD4EQQQ+BEQEOARPBCAAIgBBBEIEOARFBDgEOQQiACkALAAgAD8E PgQ7BEMERwQwBDUEPAQgAEEEOwQ1BDQEQwROBEkEOAQ5BCAAMgRLBDIEPgQ0BDoAIAAgBEMEQQRB BDoEOAQ1BCAAOwROBDQEOAQsACAAPQQwBEgEOAQgAD8EQAQ1BDQEOgQ4BCAAQQQ7BDAEMgRPBD0E NQQsACAAMARABDgEOAQgADgEIAAgBD4ENAQgAFIAIAA9BDAEQQQ7BDUENARDBE4EQgQgADQEQAQ1 BDIEPQROBE4EIAA4BD0ERAQ+BEAEPAQwBEYEOAQ+BD0EPQRDBE4EIABCBDUERQQ9BD4EOwQ+BDME OAROBCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQgADwEOARABD4EPAQsACAAPgRCBEAEMAQ2BDUEPQQ9 BEMETgQgADIEIABBBDsEMAQyBE8EPQRBBDoEPgQ5BCAAMQRDBDoEMgQ4BEYENQQgADgELAAgADIE IABDBEAENQQ3BDAEPQQ9BD4EPAQgADIEOAQ0BDUELAAgADIEIABBBD4EMgRABDUEPAQ1BD0EPQRL BEUEIAAwBDsERAQwBDIEOARCBDAERQQuACAAHgRCBDIENQRCBCAAQQQ+BCAAQQRCBD4EQAQ+BD0E SwQgAE0EOwQ4BEIEIABBBD4ENwRABDUEMgRIBDgERQQgADoEQwQ7BEwEQgRDBEAEIAA/BDUEQAQ4 BEQENQRABDgEOAQgAEYEOAQyBDgEOwQ4BDcEMARGBDgEOAQgADIEIAA+BEIEPQQ+BEgENQQ9BDgE OAQgAEEEMgQ+BDgERQQgAEEEPgQ3BDQEMARCBDUEOwQ1BDkELAAgAB4EIQQ+BDIELAAgAEEEPwRD BEEEQgRPBCAAQgRLBEEETwRHBDgEIAA7BDUEQgQgAD8EQAQ4BDIEUQQ7BCAAOgQgADwEPgQ9BD4E PwQ+BDsEOAQ3BDAERgQ4BDgEIABCBDUERQQ9BD4EOwQ+BDMEOAQ4BCAAQwQ/BEAEMAQyBDsENQQ9 BDgETwQsACAAMwQ7BD4EMQQwBDsETAQ9BD4EOQQgADQENQQzBEAEMAQ0BDAERgQ4BDgEIAA4BCAA PgRCBDoEQARLBEIEPgQ5BCAAMARCBDAEOgQ1BCAAPQQwBCAAIARDBEEEQQQ6BDgEOQQgABwEOARA BC4AIAAQBEIEOwQwBD0EQgQ4BDQEMAQgADIEPgQ3BEAEPgQ2BDQENQQ9BDAEIAA6BEAEPgQyBEwE TgQgABMEOAQ/BDUEQAQxBD4EQAQ1BDgELAAgADgEIAA1BFEEIAAyBD4EOQQ9BDAEIAAzBEAEPgQ3 BDgEQgQgADIEPQQ+BDIETAQgAD8EPgQzBEMEMQQ4BEIETAQgADIEQQRRBC4ADQAgABwEOARABD4E MgQ+BDcENwRABDUEPQQ4BDUELAAgADcEMAQ7BD4ENgQ1BD0EPQQ+BDUEIAAyBCAANAQwBD0EPQQ+ BDkEIABEBDgEOwQ+BEEEPgREBDgEOAQgADIEIAA9BDAESAQ1BCAAMgRABDUEPARPBCAAQwRCBDUE QARPBD0EPgQtACAAPAQwBDsEPgQgADoEQgQ+BCAAPwQ+BD0EOAQ8BDAENQRCBCAANwQ9BDAERwQ1 BD0EOAQ1BCAAOAQgAEEEPARLBEEEOwQgAEAEQwRBBEEEOgQ4BEUEIABBBDsEPgQyBCwAIAAwBCAA RwQwBEkENQQgADIEQQQ1BDMEPgQgADQEMAQ2BDUEIAA9BDUEIAA3BD0EMAQ1BEIELAAgAEcEQgQ+ BCAANQRBBEIETAQgADIEPwQ+BDsEPQQ1BCAAPgQ/BEAENQQ0BDUEOwQ1BD0EPQRLBDkEIABBBDwE SwRBBDsELAAgADgEQQQ6BDsETgRHBDAETgRJBDgEOQQgADMEMAQ0BDAEPQQ4BDUEIAA4BCAAMAQy BEIEPgQ8BDAEQgQ4BEcENQRBBDoEOAQgADQEMAROBEkEOAQ5BCAAMgRBBDUEIAA+BEIEMgQ1BEIE SwQgAD0EMAQgADIEPgQ/BEAEPgRBBEsEIABDBEEEQgRABD4EOQRBBEIEMgQwBCAAPAQ4BEAEMAQu ACAAFARABDUEMgQ9BE8ETwQgAEQEOAQ7BD4EQQQ+BEQEOARPBCwAIAA6BD4EPQQ1BEcEPQQ+BCwA IAA9BDUEIAA8BD4ENgQ1BEIEIAA1BDQEOAQ9BEEEQgQyBDUEPQQ9BD4EIAA/BEAEMAQyBDgEOwRM BD0EPgQgADgEOwQ4BCAAMAQxBEEEPgQ7BE4EQgQ9BD4EIABCBD4ERwQ9BD4EIAA+BD8EOARBBDAE QgRMBCAAMgRBBFEELAAgAD0EPgQgAD4EPQQwBCAAMgQwBDYEPQQwBCAANAQ7BE8EIAA/BD4EPQQ4 BDwEMAQ9BDgETwQgAEIEPgQzBD4ELAAgADoEMAQ6BCAAQwRBBEIEQAQ+BDUEPQQwBCAAQQQ+BDIE QAQ1BDwENQQ9BD0EMARPBCAAOgRDBDsETARCBEMEQAQwBCwAIABCBDAEOgQgADoEMAQ6BCAAPgQ9 BDAEIAAyBCAAMQQ+BDsETARIBD4EOQQgADwENQRABDUEIAA1BEEEQgRMBCAAQQQ7BDUENARBBEIE MgQ4BDUEIAA+BDEESQQ4BEUEIAA/BEAEPgRGBDUEQQRBBD4EMgQgADgEIAA3BDAEOgQ+BD0EPgQy BCAANARABDUEMgQ9BD4EQQRCBDgEIAA4BCAANARABDUEMgQ9BDUEMwQ+BCAAPAQ4BEAEPgQyBD4E NwQ3BEAENQQ9BDgETwQsACAATQQ/BD4ERQQwBDsETAQ9BEsERQQgADIEPgQ5BD0EIAA8BDAEMwQ+ BDIEIAA0BDUEQQRPBEIEOgQ+BDIEIAA4BCAAQQQ+BEIENQQ9BCAAQgRLBEEETwRHBCAAOwQ1BEIE IAA0BD4EPwQ+BEIEPgQ/BD0EPgQ5BCAAOARBBEIEPgRABDgEOAQuACAAHAQ4BEAEIABDBEEEQgRA BD4ENQQ9BCAAPgRHBDUEPQRMBCAAQQQ7BD4ENgQ9BD4EIAA4BCAAPwRABD4EQgQ4BDIEPgRABDUE RwQ4BDIEPgQsACAAPQQ1BCAAPgQ/BDgEQQRLBDIEMAQ1BEIEQQRPBCAAQgQ+BDsETAQ6BD4EIAA1 AC0ATgQgADgEOwQ4BCAANQAwAC0ATgQgAEAEQwQ9BDAEPAQ4BCwAIAA9BD4EIABCBDAEOgQ+BDUE IAA+BD8EOARBBDAEPQQ4BDUELAAgADoEIABBBD4ENgQwBDsENQQ9BDgETgQsACAAMAQ6BEIEQwQw BDsETAQ9BD4EIAAyBD8EOwQ+BEIETAQgADQEPgQgAD0EMARIBDUEMwQ+BCAAMgRABDUEPAQ1BD0E OAQsACAAQgQwBDoEIAA6BDAEOgQgADcEPQQwBD0EOARPBCwAIABBBD4ENAQ1BEAENgQwBEkEOAQ1 BEEETwQgADIEIAA9BDgERQQsACAANwQwBDQEMAROBEIEIAA1BDQEOAQ9BD4ENQQgAD4EPwQ4BEEE MAQ9BDgENQQgADgEIAAyBDcEMAQ4BDwEPgQ0BDUEOQRBBEIEMgQ4BDUEIAA1BDMEPgQgAEcEMARB BEIENQQ5BCAAMgQgAEAEQwRBBDsENQQgAEQEOAQ7BD4EQQQ+BEQEOAQ4BCwAIAA6BDAERwQ1BEEE QgQyBDUEPQQ9BD4EIAA+BEIEQAQwBDYEMAROBEkENQQ5BCAAQQQ+BDIEQAQ1BDwENQQ9BD0EPgRB BEIETAQsACAAMgQ6BDsETgRHBDAETwQgADoEOwROBEcENQQyBEsENQQgADoEMARCBDUEMwQ+BEAE OAQ4BCwAIAA6BDAEOgQgAEcENQQ7BD4EMgQ1BDoELAAgADwEOARABCAAOAQgAD8EPgQ3BD0EMAQ9 BDgENQQsACAAOARFBCAAQQQyBD4EOQRBBEIEMgQwBCAAOAQgAEEEOwQ+BDYEPQQ+BEEEQgQ4BCAA QQQgAEEEPgQzBDsEMARBBD4EMgQwBD0EOAQ1BDwEIAA4BEUEIAA/BEAEPgRCBDgEMgQ+BEAENQRH BDgEOQQuACAAIgAaBCAAQQQ+BDYEMAQ7BDUEPQQ4BE4EIgAsACAAPwQ+BEIEPgQ8BEMEIABHBEIE PgQgADcEMARBBEIEPgQ5BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ+BDkEIAA8BEsEQQQ7BDgEIAA/ BEAEPgQyBD4ERgQ4BEAEQwQ1BEIEIAA0BDUEMwRABDAENAQwBEYEOAROBCwAIABEBDAEPQQwBEIE OAQ3BDwEIAA4BCAAMQQ1BDcEQwQ8BD0EPgQ1BCAAQQQ7BDUENAQ+BDIEMAQ9BDgENQQgAD0ENQQ0 BD4EMQRABD4EQQQ+BDIENQRBBEIEPQRLBDwEIAA7BDgENAQ1BEAEMAQ8BCwAIAA/BEAEPgRJBDUE IAAzBD4EMgQ+BEAETwQsACAAPwQ+BEAEMAQxBD4ESQQ1BD0EOAQ1BC4ALgAuAA0ADQAgACAAIAAg ACAAIAAgAEkASQBJADEEKQAgABIEOwQ4BE8EPQQ4BDUEIAA9BDAEIABBBD4EMgRABDUEPAQ1BD0E PQRLBDkEIAA8BDgEQAQNACAAHARLBCAANgQ4BDIENQQ8BCAAPwQ+BDQEIAAyBDsEOARPBD0EOAQ1 BDwEIABEBDgEOwQ+BEEEPgREBDgEOAQgAD8EQAQ1BDQEOgQ+BDIELgAgABgENAQ1BE8EIAA+BEIE QAQwBDYENQQ9BDgETwQgAD4EMQRABDAENwQ+BDIEIABIBDgEQAQ+BDoEOARFBCAAMARBBD8ENQQ6 BEIEPgQyBCAAMQRLBEIEOARPBCAAMgQgAEEEOAQ8BDIEPgQ7BDAERQQgADgELAAgADIEIAA4BEIE PgQzBDUELAAgAD4EQgRABDAENgQ1BD0EOAQ1BCAAMgRBBDUEMwQ+BCAAPAQ4BEAEMAQgADIEIABA BEMEPQQwBEUEIABBBEMESQQ1BEEEQgQyBD4EMgQwBDsEMAQsACAAPQQwBEcEOAQ9BDAETwQgAEEE IAAyBD4ENwQ9BDgEOgQ9BD4EMgQ1BD0EOARPBCAAMwQ4BD8ENQRABDEEPgRABDUEOQRBBDoEPgQz BD4EIAAwBDsERAQwBDIEOARCBDAELAAgAEIEPgQgADUEQQRCBEwEIAA0BD4EIAA/BD4EQgQ+BD8E MAQuACAAIAQwBDcEMgQ4BEIEOAQ1BCAANQRRBCAAOAQgAEAENQQwBDsEOAQ3BDAERgQ4BE8EIAAy BCAAMgQ4BDQENQQgAD8EPgQ7BD0EPgRGBDUEPQQ9BD4EMwQ+BCAAPQQwBDEEPgRABDAEIABBBDgE PAQyBD4EOwQ4BEcENQRBBDoEPgQzBD4EIAA+BD8EOARBBDAEPQQ4BE8EIAA8BDgEQAQwBCAAPwRA BDgEMgQ1BDsEPgQgADoEIAA/BD4ETwQyBDsENQQ9BDgETgQgADwEPQQ+BDYENQRBBEIEMgQwBCAA TwQ3BEsEOgQ+BDIEIAA+BDQEPQQ+BDkEIABPBDcESwQ6BD4EMgQ+BDkEIABBBDUEPARMBDgELgAg ABgEIAA+BDQEPQQ+BDIEQAQ1BDwENQQ9BD0EPgQtACAAOgQgADgEQQQ/BD4EOwRMBDcEPgQyBDAE PQQ4BE4EIAAyBEsEQQRIBDUEOQQgADIEOwQwBEEEQgRMBE4ELAAgADYEQAQ1BEcENQRBBEIEMgQ+ BDwELAAgADIEIABABDgEQgRDBDAEOwQwBEUELAAgADMEMAQ0BDAEPQQ4BDgELAAgADoEPgQ7BDQE PgQyBEEEQgQyBDUEIAA4BCAAPwRABD4ERwQ1BDwELgANACAAIQQwBDwEPgQgAD8EPgQgAEEENQQx BDUEIAA+BEIEQAQwBDYENQQ9BDgENQQgADQEQAQ1BDIEPQQ+BEEEQgQ4BCAAMgQgAEEEPgQyBEAE NQQ8BDUEPQQ9BD4EOQQgADoEQwQ7BEwEQgRDBEAENQQgADoEQAQ4BEIEOARHBDUEQQQ6BDgEIAAy BDAENgQ9BD4ELgAgABMEOAQ/BDUEQAQxBD4EQAQ1BE8EKABBBCAANARDBEUEPgQ8BCAAQQApACAA QQRCBDAEOwQwBCAAPwRABD4EQgQ+BEIEOAQ/BD4EPAQgADEEOAQxBDsENQQ5BEEEOgQ+BDMEPgQg AEAEMARPBCwAIAA4BDcEIAA6BD4EQgQ+BEAEPgQzBD4EIAAxBEsEOwQgADgENwQzBD0EMAQ9BCAA RwQ1BDsEPgQyBDUEOgQoAE4AQQApACwAIABHBEIEPgQgAD8EPgRABD4ENAQ4BDsEPgQgAEAEMAQ3 BDQENQQ7BDUEPQQ4BDUEKABSAEEAKQAsACAAPwQ+BDoEOwQ+BD0ENQQ9BDgENQQgADEEPgQzBDAE PAQgAFIAQQAsACAATgBBACAAOAQgAEEATgAnAEMEIAAwBEIEOwQwBD0EQgQwBDwEOAQoACIAEAQ9 BD0EQwQ9BDAEOgQwBDwEIgAgADIEIAAoBEMEPAQ1BEAENQQsACAAMQQ+BDMEQwQgAEEEPgQ7BD0E RgQwBCAAOAQgAEEEPAQ1BEAEQgQ4BCAAUgBBAC0AIAA1BDMEOAQ/BDUEQgRBBDoEOAQ8BDgEIAA2 BEAENQRGBDAEPAQ4BCkAIAA4BCAAQwQ/BEAEMAQyBDsENQQ9BDgENQQgADMEOwQ+BDEEMAQ7BEwE PQRLBDwEOAQgAD8EQAQ+BEYENQRBBEEEMAQ8BDgEIABBBCAAQgQwBDoEPgQ5BCAAPwQ+BDcEOARG BDgEOAQtACAAQAQwBDcENAQ1BDsENQQ9BDgETwQgADgEIABBBDsEQwQ2BDUEPQQ4BE8EIAA4BD0E QgQ1BEAENQRBBDAEPAQgADgENwQxBEAEMAQ9BD0ESwRFBC0ANgRABDUERgQ+BDIELwA6BD4EOwQ0 BEMEPQQ+BDIELwA8BDAEMwQ+BDIEIAA3BDAEIABBBEcEUQRCBCAAQgQ+BDsEPwRLBCwAIAAwBCAA PQQ1BCAAQQQyBDUENAQ1BD0EOARPBCAAQAQwBDcEPQRLBEUEIAA9BDAEQAQ+BDQEPgQyBCAAOgQg ADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BD4EPARDBCAANQQ0BDgEPQQ+BD0EMARHBDAEOwQ4BE4E KABBACkAIAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0EOARPBCAAOAQgAEMEPwRABDAEMgQ7BDUEPQQ4 BE8EIABBBDgEOwRMBD0ESwQ8BDgEIAAyBCAAQQQ+BE4ENwQ1BCAANARABEMEMwQgAEEEIAA0BEAE QwQzBD4EPAQgADgEIAA4BEEEOgQ7BE4ERwQ4BEIENQQ7BEwEPQQ+BCAANwQwBCAAQQQyBD4EOQQg AEEERwRRBEIELAAgADQEMAQyBDAETwQgAEEEMgQ+BDEEPgQ0BEMEIAA0BEAEQwQzBDgEPAQgAD0E MARABD4ENAQwBDwELAAgADIEIABCBD4EPAQgAEcEOARBBDsENQQgADgEIAA+BEIEIABBBDAEPAQ4 BEUEIABBBDUEMQRPBC4AIAAfBD4EQQQ7BDUEIAA6BDAEQgQwBEEEQgRABD4ERARLBCAAOAQgAD8E PgRCBD4EPwQwBCwAIAA+BEIEOgQ7BE4ERwQ1BD0EOARPBCAAPgQxBD4EOARFBCAARgQ1BD0EQgRA BD4EMgQgADIEOwQwBEEEQgQ4BCAAPAQ4BEAEIABBBEIEMAQ7BCAAPgRHBDUEPQRMBCAANgQ1BEEE QgQ+BDoEIAA6BCAAQgQ1BDwEIAA6BEIEPgQgADIESwQ2BDgEOwQsACAAMAQgAD4EQQRCBDAEMgRI BDgENQRBBE8EIAA9BD4EQQQ4BEIENQQ7BDgEIAA3BD0EMAQ9BDgETwQgAEEEIAA+BDEENQQ4BEUE IABBBEIEPgRABD4EPQQgAD4EOgQwBDcEMAQ7BDgEQQRMBCAAPwQ1BEAENQQ0BCAANwQwBDQEMARH BDUEOQQgADIEPgRBBEEEQgQwBD0EPgQyBDsENQQ9BDgETwQgADYEOAQ3BD0EOAQgADgEIAA/BD4E TQRCBD4EPARDBCAAQQQ+BDIEQAQ1BDwENQQ9BD0ESwQ5BCAAPAQ4BEAEPgQyBD4EOQQgAD8EPgRA BE8ENAQ+BDoELAAgADIEOwQwBEEEQgRMBCAAOAQgAEMEPwRABDAEMgQ7BDUEPQQ4BDUEIAA1BEEE QgRMBCAAQgQ+BCwAIABHBEIEPgQgAD4EPQQ4BCAAPwQ+BEEEQgRABD4EOAQ7BDgEKAAyBCAAQgQ+ BDwEIABHBDgEQQQ7BDUEIAAyBCAAPwRABD4ERgQ1BEEEQQQ1BCAAIgA6BEMEOwRMBEIEQwRABD0E PgQzBD4EIABBBD4EQgRABEMENAQ9BDgERwQ1BEEEQgQyBDAEIgApAC0AIAA0BDIENQQgADoEQwQ7 BEwEQgRDBEAESwQtAD0EMARBBDsENQQ0BD0EOARGBEsEIABBACAAOAQgAFIAQQAsACAAQAQwBDcE NAQ1BDsENQQ9BD0ESwQ1BCAAPAQ4BEAEPgQyBD4ENwQ3BEAENQQ9BDgENQQ8BCAAOAQgAEAEMAQ3 BD0EPgQ5BCAAOARBBEIEPgRABDgENQQ5BCwAIAAyBEAEMAQ2BDQENQQxBD0ESwQ1BCAANARABEME MwQgADQEQARDBDMEQwQgAD0EMAQgAEQEOAQ7BD4EQQQ+BEQEQQQ6BD4ELQBABDUEOwQ4BDMEOAQ+ BDcEPQQ+BDwEIABDBEAEPgQyBD0ENQQuACAAEQQ7BDAEMwQ+BDQEMARABE8EIAAwBEAEOARPBDwE IAA8BEsEIAA+BDoEQARDBDYENQQ9BEsEIAA0BEAEQwQzBDgEPAQ4BCAARgQ4BDIEOAQ7BDgENwQw BEYEOARPBDwEOAQuACAAHQQwBDsEOARHBDgENQQgADoEQwQ7BEwEQgRDBEAESwQgADgEIAA3BD0E MAQ9BDgETwQgAEMEIAA9BDAEQAQ+BDQEPgQyBCAAPwQ+BDQEMAQyBDgEOwQ+BCAAMgQ7BDAEQQRC BEwEIABSAEEAIAA9BDAENAQgAD0EOAQ8BDgELAAgAD0EPgQgAD4ENAQ9BD4EMgRABDUEPAQ1BD0E PQQ+BCAAQQRCBDAEOwQ+BCAARARDBD0ENAQwBDwENQQ9BEIEPgQ8BCAAPAQ+BEkEOAQgADgERQQg AEEEMAQ8BDgERQQgADgELAAgADoEMAQ6BCAAQQQ7BDUENARBBEIEMgQ4BDUELQAgAEEEOAQ7BCAA QQQwBDwEPgQ5BCAAQQRCBDgERQQ4BDgEIABSAEEALAAgAEIEPgQgADUEQQRCBEwEIAA9BD4EQQQ4 BEIENQQ7BDUEOQQgADIEOwQwBEEEQgQ4BCwAIAA/BEAEMAQyBE8ESQQ4BEUEIABBBEAENQQ0BEEE QgQyBDAEPAQ4BCAAQAQwBDcEQARDBEgENQQ9BDgETwQgADgEIAA/BD4EQAQwBDEEPgRJBDUEPQQ4 BE8EIABBBDsEMAQxBEsERQQuAA0AIAAeBDEESQQ4BDUEIAAxBEMEOgQyBEsELQBBBDgEPAQyBD4E OwRLBC0AQQRCBDgERQQ4BDgEIABDBCAAKARDBDwENQRABCAAOAQgADAEQAQ4BDUEMgQtAEEEOwQw BDIETwQ9BC0AIAQwBEEEPgQyBC8AIARDBEEEPgQyBCAAOAQgADEEQwQ6BDIEOARGBDAEIAA+BDEE TwQ3BDAEPQRLBCAAQQRDBEkENQRBBEIEMgQ+BDIEMAQ9BDgENQQ8BCAANARABDUEMgQ9BDUEMwQ+ BCAAPAQ+BD0EPgRPBDcESwQ6BDAELAAgAD0EMAQgADoEPgRCBD4EQAQ+BDwEIAAzBD4EMgQ+BEAE OAQ7BCAAPAQ4BEAEIAA0BD4EIAA/BD4EQgQ+BD8EMAQsACAAQgQwBDoEIAA9BDAENwRLBDIEMAQ1 BDwEPgQzBD4EIAA/BEAEMAQ9BD4EQQRCBEAEMARCBDgERwQ1BEEEOgQ+BDMEPgQgAE8ENwRLBDoE MAQuACAAIwQgADwEPQQ+BDMEOARFBCAANARABEMEMwQ4BEUEIAA9BDAEQAQ+BDQEPgQyBCwAIAA/ BEAEPgQ2BDgEMgQwBE4ESQQ4BEUEIAA/BD4EQQQ7BDUENAQ9BDgENQQgAD0ENQRBBDoEPgQ7BEwE OgQ+BCAAQgRLBEEETwRHBCAAOwQ1BEIEIAA9BDAEIABCBDUEQARABDgEQgQ+BEAEOARPBEUEIABB BDUEMgQ1BEAEPQQ+BDkEIABHBDAEQQRCBDgEIAA3BDUEPAQ9BD4EMwQ+BCAASAQwBEAEMAQgADgE IAAyBCAAQQREBDUEQAQ1BCAAMgQ7BDgETwQ9BDgETwQgABAEQgQ7BDAEPQRCBDgENARLBCgAQgQ1 BEAEQAQ4BEIEPgRABDgEOAQgAD4EQgQgABAEPAQ1BEAEOAQ6BCAANAQ+BCAAGgQ4BEIEMARPBCwA IAA3BDAEPQQ4BDwEMAROBEkENQQzBD4EIAA8BDUEQQRCBD4EIABDBD0EOAQ6BDAEOwRMBD0EPgQ5 BCAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ4BCkAIAAwBDsERAQwBDIEOARCBCAAOAQ8BDUENQRCBCAA QQRFBD4ENgQ4BDUEIABHBDUEQARCBEsEKAAxBEMEOgQyBEsELAAgAEEEOwQ+BDIEMAQsACAAQQQ8 BEsEQQQ7BEsEKQAgAEEEPgQgAEEEOwQwBDIETwQ9BEEEOgQ+BDkELAAgAD8EQAQwBEgEQwQ8BDUE QARBBDoEPgQ5BCAAOAQgAEEEIAATBDgEPwQ1BEAEMQQ+BEAENQQ5BEEEOgQ+BDkEIAAxBEMEOgQy BDgERgQ1BDkELgAgAB8EPgRBBDsENQQgAD8EPgRCBD4EPwQwBCAANAQ1BEIEOAQgABMEOAQ/BDUE QAQxBD4EQAQ1BDgELAAgACAEPgQ0BCAAUgAxAGEALAAgAEEERAQ+BEAEPAQ4BEAEPgQyBDAEOwQ4 BCAAPQQwBCAAIARDBEEEQQQ6BD4EOQQgAEAEMAQyBD0EOAQ9BDUEIAA6BEMEOwRMBEIEQwRABEME LAAgAD0EMARBBDsENQQ0BD0EOARGBEMEIABBBDIEPgQ1BDMEPgQgAEEEOwQwBDIEPQQ+BDMEPgQg AD8EQAQ1BDQEOgQwBCwAIABBBDsENQQ0BEsEIAA6BD4EQgQ+BEAEPgQ5BCAAPgQxBD0EMARABEME NgQ4BDIEMAROBEIEQQRPBCAAMgQgAD0EMARIBDUEIAAyBEAENQQ8BE8EIAAyBCAAMgQ4BDQENQQg AEIEMAQ6BCAAPQQwBDcESwQyBDAENQQ8BEsERQQgADgEPQQ0BD4ENQQyBEAEPgQ/BDUEOQRBBDoE OARFBCAAMARABEUENQQ+BDsEPgQzBDgERwQ1BEEEOgQ4BEUEIAA6BEMEOwRMBEIEQwRABCAAPQQ1 BD4EOwQ4BEIEMAQsACAAPQQwBD8EQAQ4BDwENQRABCwAIAAVBDsESAQwBD0EQQQ6BDAETwQsACAA IQQwBDwEMARABEEEOgQwBE8EIAA4BCAANARABEMEMwQ4BDUELgAgABIESwQ5BDQETwQgAD4EOgQ+ BDsEPgQgADUAIABCBEsEQQRPBEcEIAA7BDUEQgQgAD0EMAQ3BDAENAQgADgENwQgABEEMAQ7BDoE MAQ9BCwAIAA+BD0EOAQsACAAOgQwBDoEIABBBD8ENQRGBD0EMAQ3BCAAPgRCBCAAQQQyBD4ENQQz BD4EIABABD4ENAQwBCwAIABABDAEQQQ/BEAEPgRBBEIEQAQwBD0EOAQ7BDgEIAA1BDMEPgQgADoE QwQ7BEwEQgRDBEAEQwQgAD8EPgQgADIEQQQ1BDwEQwQgADwEOARABEMELAAgAD8EQAQ4BDwENQRA BD0EPgQgADIEIAA+BDQEPQQ+BCAAMgRABDUEPARPBCAAPwQ+BEAEPgQ0BDgEMgQgADQEQAQ1BDIE PQQ4BDUEIABGBDUEPQRCBEAESwQgAEAEMAQ3BDIEOARCBDgETwQgAE8ENwRLBDoEMAQgADgEIAA/ BDgEQQRMBDwENQQ9BD0EPgRBBEIEOAQtACAAIAAhBDoEMAQ9BDQEOAQ9BDAEMgRBBDoEOAQ5BCgA QARDBD0ESwQpACwAIAA4BD0ENAQ+BDUEMgRABD4EPwQ1BDkEQQQ6BDgEOQQoABgEPQQ0BDgETwQp ACwAIAAoBEMEPAQ1BEAEIAA4BCAAFQQzBDgEPwQ1BEIEIAA4BCwAIAA0BD4EOQQ0BE8EIAA+BDoE PgQ7BD4EIAAzACAAQgRLBEEETwRHBCAAOwQ1BEIEIAA9BDAENwQwBDQEIAA0BD4EIABBBD4EMgRA BDUEPAQ1BD0EPQQ+BDMEPgQgABoEOARCBDAETwQsACAAOAQ9BDgERgQ4BDgEQAQ+BDIEMAQ7BDgE IAA9BDAEIAA1BDMEPgQgAEIENQRABEAEOARCBD4EQAQ4BDgEIAA4BDUEQAQ+BDMEOwQ4BEQEOARH BDUEQQQ6BEMETgQgAE0EMgQ+BDsETgRGBDgETgQgAD8EQAQwBE8ENwRLBDoEMAQuAA0AIAAhBD4E MgRABDUEPAQ1BD0EPQQ+BDUEIAA0BDUEOwQ1BD0EOAQ1BCAAPAQ4BEAEMAQgAD0EMAQgADIEPgRB BEIEPgQ6BCAAOAQgADcEMAQ/BDAENAQgADUEQQRCBEwEIABBBDsENQQ0BEEEQgQyBDgENQQgADQE QAQ1BDIEPQQ1BDMEPgQgADQENQQ7BDUEPQQ4BE8EIAA9BDAEIABBBDUEMgQ1BEAEIAA4BCAATgQz BCwAIAAwBCAANQRJBDUEIAAzBDsEQwQxBDYENQQtACAAPQQwBCAAQQAgADgEIABSAEEALAAgADUE NAQ4BD0EPgQ9BDAERwQwBDsEOAQ1BCAAOAQgAEAEMAQ3BDQENQQ7BDUEPQQ4BDUELgAgAB0ENQQg ADgEPAQ1BE8EIAA6BD4EPQRGBDUEPwRCBEMEMAQ7BEwEPQQ+BDkEIAAyBD4ENwQ8BD4ENgQ9BD4E QQRCBDgEIAA+BDEESgQ1BDQEOAQ9BDgEQgRMBEEETwQsACAATQRCBDgEIAA0BDIENQQgADoEMARC BDUEMwQ+BEAEOAQ4BCAAPQQwBEUEPgQ0BE8EQgRBBE8EIAAyBCAAQQQ+BEEEQgQ+BE8EPQQ4BDgE IAA/BD4EQQRCBD4ETwQ9BD0EPgQ5BCAAOgQ+BD0ERgQ1BD8EQgRDBDAEOwRMBD0EPgQ5BCAAMgQ+ BDkEPQRLBCwAIABBBEMEQgRMBCAAOgQ+BEIEPgRABD4EOQQgAE0EOgQ3BDgEQQRCBDUEPQRGBDgE MAQ7BEwEPQQwBE8ELAAgAEIEPgQgADUEQQRCBEwEIAA+BD0EOAQgAEEEQwRJBDUEQQRCBDIEQwRO BEIEIAAyBCAAQQRDBEkENQRBBEIEMgRDBE4ESQQ1BDwEIAA8BDgEQAQ1BCAAOAQgADIEIAA4BEEE QgQ+BEAEOAQ4BCAAQgQ+BDsETAQ6BD4EIAAyBCAAQQQ+BEEEQgQ+BE8EPQQ4BDgEIAA/BEAEPgRC BDgEMgQ+BEEEQgQ+BE8EPQQ4BE8ELgAgACUEPgRCBE8EIAA+BD0EOAQgAD0ENQQgAE8EMgQ7BE8E TgRCBEEETwQgAD8EPgQ7BD0ESwQ8BDgEIAA0BDgEMAQ7BDUEOgRCBDgERwQ1BEEEOgQ4BDwEOAQg ADAEPQRCBDAEMwQ+BD0EOARBBEIEMAQ8BDgELAAgAEIEMAQ6BCAAOgQwBDoEIABEBD4EQAQ8BDAE OwRMBD0EPgQgAD0ENQQgAD4EQgRABDgERgQwBE4EQgQgADQEQARDBDMEIAA0BEAEQwQzBDAELgAg ABQEMAQgADgEIAAyBD4EPgQxBEkENQQsACAAMwQ7BDAEMgQ9BDAETwQgAD8EQAQ+BDEEOwQ1BDwE MAQsACAAOgQwBDoEIAA/BD4ENARHBFEEQAQ6BDgEMgQwBDsEPgRBBEwEIAAyBCAAIgBJADAEKQAi ACAATQRCBD4EIAA+BDEESQQ4BDUEIAAxBD4EOwQ1BDcEPQQ4BCAAOAQgAD8EPgRCBDUEQARPBCAA PwRABDgEQAQ+BDQESwQuACAALQRCBDgEIAA0BDIENQQgAEEEQgQ4BEUEOAQ4BCAAMgRBBEIEQwQ/ BDAETgRCBCAAMgQgADEEPgQ5BCwAIAA6BD4EMwQ0BDAEIAA4BDwEPARDBD0EOARCBDUEQgQgAEcE NQQ7BD4EMgQ1BDoEMAQgAD0ENQQgADIEIABBBD4EQQRCBD4ETwQ9BDgEOAQgAEEEMAQ8BCAAQAQ1 BEgEOARCBEwEIAAyBD4EPwRABD4EQQQgADgENwQ7BDUERwQ1BD0EOARPBC4AIAAVBDQEOAQ9BDUE PQQ4BDUEIAAQBCAAQQQ+BCAAQQQyBD4EOAQ8BDgEIAA0BDUEQgRMBDwEOAQgADEEPgRABDUEQgRB BE8EIAA/BEAEPgRCBDgEMgQgAEAEMAQ3BEoENQQ0BDgEPQQ1BD0EOARPBCAAQQQgAD8EPgRBBDsE NQQ0BEMETgRJBDgEPAQgAEAEMARBBD8EMAQ0BD4EPAQsACAAMAQgAEIEMAQ6BDYENQQgAD8EQAQ+ BEIEOAQyBCAAQQRCBDgERQQ4BDgEIAAeBCwAIABCBDAEOgQgADoEMAQ6BCAAIAQQBCgAQAQwBDcE MgQ4BEIEOAQ1BCwAIABABDAENwQ0BDUEOwQ1BD0EOAQ1BCwAIABABDAEQQQ/BDAENAQpACAAPwRA BD4EQgQ4BDIEPgQ/BD4EQQRCBDAEMgQ7BE8ENQRCBCAAQQQ1BDEETwQgACAEHgQoACAEPgQ0BEME LAAgAEAEPgQ0BDgERwQwBDwEIAA4BCAAQAQ+BEEEQgRDBCkAIAAyBCAAQAQwBDwEOgQwBEUEIAAg BC4AIAAQBCAAQwRCBDIENQRABDYENAQwBDUEQgRBBE8EIAAyBD4EIAAyBDsEMARBBEIEOAQgAD4E MQRKBDUENAQ4BD0ENQQ9BDgENQQ8BCAAQQRCBEAEMAQ9BCwAIABABD4ENAQ+BDIEIAA4BCAAPwQ7 BDUEPAQ1BD0EIAA4BCAANwQwBDoEOwROBEcENQQ9BDgENQQ8BCAAPAQ1BDYENARDBCAAPQQ4BDwE OAQgADIEQQQ1BD4EMQRKBDUEPAQ7BE4ESQQ4BEUEIAA0BD4EMwQ+BDIEPgRABDUEPQQ9BD4EQQRC BDUEOQQgAD8EPgQgADIEPgQ/BEAEPgRBBDAEPAQgAEYENQQ9BD0EPgRBBEIENQQ5BCwAIABBBD4E MwQ7BDAEQQQ+BDIEMAQ9BDgENQQ8BCAATQRCBDgERQQgAEYENQQ9BD0EPgRBBEIENQQ5BCgAOgQ+ BEIEPgRABEsENQQgAEEEQgQwBD0EPgQyBE8EQgRBBE8EIAA+BDEESQQ4BDwEOAQpACAAOAQgAEME PwRABDAEMgQ7BDUEPQQ4BDUEPAQgAD0EMAQgADgERQQgAD4EQQQ9BD4EMgQ1BDsAIAAgBBAEIAA9 BDAEMgRPBDcESwQyBDAENQRCBCAARgQ1BD0EPQQ+BEEEQgQ4BCAAQAQwBDcENAQ1BDsENQQ9BDgE NQQ8BCgAIgBABDAEMQQ+BDIEIgAgAD4EQgQgACIATQQ7BDgEQgRLBCIALAAgAD0EMARABD4ENAQ+ BDIELAAgADgENAQ1BD4EOwQ+BDMEOAQ5BCAAOAQgAEYENQQ9BD0EPgRBBEIENQQ5BCAAPwQ+BCAA MwRABDAEPQQ4BEYEMAQ8BCAAMwQ+BEEEQwQ0BDAEQARBBEIEMgQsACAAPAQwBEIENQRABDgEMAQ7 BEwEPQRLBEUEIAA4BCAAPQQ1BDwEMARCBDUEQAQ4BDAEOwRMBD0ESwRFBCAAMQQ7BDAEMwQgADwE NQQ2BDQEQwQgADEEPgQzBDAEQgRLBDwEOAQgADgEIAAxBDUENAQ9BEsEPAQ4BCkAIAA4BCwAIAA3 BDAEIABBBEcEUQRCBCAAQAQwBDEEMAQsACAAPwQ+BDsEQwRHBDAENQRCBCAAQQQyBDUEQARFBDIE SwQzBD4ENARDBCwAIAA8BDAEOgRBBDgEPAQwBDsETAQ9BD4EIAAyBD4ENwQ8BD4ENgQ9BEMETgQg ADIEIAA/BEAEPgRGBDUEQQRBBDUEIAA4BCAAPwRABDUENAQ1BDsEMARFBCAAQQQyBD4ENQQzBD4E IAA8BD4EPQQ+BD8EPgQ7BEwEPQQ+BDMEPgQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8EIAAoADIEQQQ1 BCAAPgRBBEIEMAQ7BEwEPQRLBDUELQAgAEAEMAQxBEsEIAA4BCAAPwQ+BDsEQwRHBDAETgRCBCAA MQQ7BDAEMwQwBCAAQgQ+BDsETAQ6BD4EIAA1BEEEOwQ4BCAAPgQ9BDgEIAA/BEAEPgRPBDIEOAQ7 BDgEIABBBDUEMQRPBCAAPwQ1BEAENQQ0BCAARQQ+BDcETwQ4BD0EPgQ8BCkALgAgABIEIAA6BEME OwRMBEIEQwRABDUEIAAyBDsEMARBBEIETAQgAEIEPgQ5BCAAOAQ7BDgEIAA4BD0EPgQ5BCAAOgQ+ BD0ERgQ1BD8ERgQ4BDgEIAA8BD4ENgQ9BD4EIAA+BEIEOwQ4BEcEOARCBEwEIAA/BEAEPgRBBEIE PgQgAD8EPgQgAD0EMAQ7BDgERwQ4BE4EIAA4BDsEOAQgAD4EQgRBBEMEQgRBBEIEMgQ4BE4EIAAy BCAAPgQxBEkENQRBBEIEMgQ1BCAAOAQ9BEEEQgQ4BEIEQwRCBDAEIABABDAEMQRBBEIEMgQwBCAA TwQyBD0EPgQzBD4EIAA4BDsEOAQgAEEEOgRABEsEQgQ+BDMEPgQuAA0AIAAtBEIEPgQgAD8EQAQ4 BDIEPgQ0BDgEQgQgADIEIAA0BD4EOwQzBD4EQQRABD4ERwQ9BD4EOQQgAD8ENQRABEEEPwQ1BDoE QgQ4BDIENQQgADoEIAA9BDUEPgQxBEUEPgQ0BDgEPAQ+BEEEQgQ4BCAAQAQ1BEgENQQ9BDgETwQg ADIEPgQ/BEAEPgRBBDAEIAA6BD4EPQRGBDUEPwRGBDgEOAQgADgERQQgAEEEQwRJBDUEQQRCBDIE PgQyBDAEPQQ4BE8EIAA4BDsEOAQgADgEQQRHBDUENwQ9BD4EMgQ1BD0EOARPBCAAMgQgAEEEMgRP BDcEOAQgAEEEIAAyBEAENQQ0BD4EPAQgAD4EQgQgADgERQQgAEEERQQyBDAEQgQ6BDgELAAgAD0E MAQ9BD4EQQQ4BDwESwQ8BCAARwQ1BDsEPgQyBDUERwQ1BEEEQgQyBEMEIAA4BCAAPgQ6BEAEQwQ2 BDAETgRJBDUEOQQgAEEEQAQ1BDQENQQuACAAHQQ+BCwAIABHBEIEPgQxBEsEIABABDUESAQ4BEIE TAQgAE0EQgQ+BEIEIAAyBD4EPwRABD4EQQQsACAAPQRDBDYEPQRLBCAANQQ0BDgEPQRLBDUEIAA9 BD4EQAQ8BEsEIAA+BEYENQQ9BDoEOAQgADoEMARHBDUEQQRCBDIEMAQgADgEIABNBEQERAQ1BDoE QgQ4BDIEPQQ+BEEEQgQ4BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQsACAAOgQ+BEIEPgRABEsEPAQ4 BCAAMgRLBEgENQQ+BD8EOARBBDAEPQQ9BEsENQQgAEEEPwQ+BEEEPgQxBEsEIAA+BEIEOwQ4BEcE MAROBEIEQQRPBCwAIAAwBCAATQRCBDgEIAA9BD4EQAQ8BEsEIAA3BDAEMgQ4BEEETwRCBCAAPgRC BCAAQQQwBDwEOARFBCAAOgQ+BD0ERgQ1BD8ERgQ4BDkEIABDBD8EQAQwBDIEOwQ1BD0EOARPBCAA OAQgADoEMAQ2BDQEMARPBCAAOAQ3BCAAPQQ4BEUEIAA6BDAERwQ1BEEEQgQyBDUEPQQ9BDAEIAA4 BCAATQREBEQENQQ6BEIEOAQyBD0EMAQgADIEIABBBDIEPgQ1BDkEIAAiAEEEOARBBEIENQQ8BDUE IAA6BD4EPgRABDQEOAQ9BDAEQgQiAC4AIAAfBD4ETQRCBD4EPARDBCAAQAQ1BEgENQQ9BDgENQQg AD4EIABBBDgEQQRCBDUEPAQ1BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQgADQEPgQ7BDYEPQQ+BCAA PwRABDgEPQQ4BDwEMARCBEwEQQRPBCAAMgRBBDUEPAQgAD4EMQRJBDUEQQRCBDIEPgQ8BCAAPwRA BDgEIABDBEEEOwQ+BDIEOAQ4BCAAQAQ1BDAEOwRMBD0EPgQ5BCAAQQQ/BD4EQQQ+BDEEPQQ+BEEE QgQ4BCAAMgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAGAAACCAAABAgAAAYIAAAICAAACggAAAwIAAAOCAAAEAgAABIIAAAc CAAAHggAACAIAAAiCAAAJAgAAO/ezbyrmol4mmdWeEU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAIBVoEi5eABZovGMeADUIgUIqB0NKJABhSiQAcGj/mQAAACAVaPlsPQAWaLxjHgA1CIFC KgZDSiQAYUokAHBo/2YAAAAgFWg1OVQAFmi8Yx4ANQiBQioGQ0okAGFKJABwaP8AAAAAIBVocwdU ABZovGMeADUIgUIqBkNKJABhSiQAcGj/ZgAAACAVaBIuXgAWaLxjHgA1CIFCKgZDSiQAYUokAHBo /wAAAAAgFWj5bD0AFmi8Yx4ANQiBQioGQ0okAGFKJABwaP4mJgAAIBVo+Ww9ABZovGMeADUIgUIq BkNKJABhSiQAcGj/MwAAACAVaJcsRwAWaLxjHgA1CIFCKgdDSiQAYUokAHBo/5kzAAAgFWh0Z7gA Fmi8Yx4ANQiBQioHQ0okAGFKJABwaP/MZgAAIBVodGe4ABZovGMeADUIgUIqB0NKKABhSigAcGj/ mQAAACAVaHhCSwAWaHE7fwA1CIFCKgRDSigAYUooAHBoAP8AAAAgFWh4QksAFmhQEaYANQiBQioE Q0ooAGFKKABwaAD/AAAOAAYAAAQIAABMCAAATggAAIwIAACOCAAAkAgAAKQIAACmCAAA6ggAAHAL AACeEAAAihcAAGQqAAAUNQAAqjkAAIA7AACCOwAAhDsAAIY7AACKOwAAkjsAAO47AADwOwAAoDwA AGg9AABaPgAA9wAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAA9wAAAAAAAAAA AAAAAPcAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAD3 AAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAA AAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAA AADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAADiAAAAAAAAAAAAAAAA4gAA AAAAAAAAAAAAAOIAAAAAAAAAAAAAAADiAAAAAAAAAAAAAAAA4gAAAAAAAAAAAAAAAOIAAAAAAAAA AAAAAAAAAAAAAAAABwAAAyQBYSQBZ2S8Yx4AAAcAAAMkAWEkAWdkulTWAAAEAABnZLxjHgAABwAA AyQBYSQBZ2Q+OZAAABoABgAANlkFAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAgEBASQIAAAmCAAAKAgAACoIAAAsCAAALggAADAIAAAyCAAANAgAADYIAAA4CAAA QAgAAEIIAABICAAASggAAEwIAABOCAAAUAgAAO/j0sHSsNKfjn1sW2xK40E2AAAAAAAAAAAAAAAA AAAAAAAAABUVaBMHqQAWaNokGQBCKg1waE0AAAARFmi8Yx4ANQiBQ0ocAGFKHAAgFWjlQlMAFmi8 Yx4ANQiBQioQQ0okAGFKJABwaMDAwAAAIBVolyxHABZovGMeADUIgUIqC0NKJABhSiQAcGgAMwAA ACAVaDU5VAAWaLxjHgA1CIFCKg9DSiQAYUokAHBoZmaZAAAgFWh0Z7gAFmi8Yx4ANQiBQioPQ0ok AGFKJABwaGZmmQAAIBVo5UJTABZovGMeADUIgUIqCkNKJABhSiQAcGgAM2YAACAVaHMHVAAWaLxj HgA1CIFCKg9DSiQAYUokAHBoMzOZAAAgFWgSLl4AFmi8Yx4ANQiBQioKQ0okAGFKJABwaAAzZgAA IBVodGe4ABZovGMeADUIgUIqC0NKJABhSiQAcGgAMwAAACAVaDU5VAAWaLxjHgA1CIFCKglDSiQA YUokAHBoAACAAAAXFWhDTjcAFmi8Yx4ANQiBQ0okAGFKJAAgFWh4QksAFmi8Yx4ANQiBQioEQ0ok AGFKJABwaAD/AAARUAgAAFIIAABUCAAAVggAAFgIAABaCAAAXAgAAF4IAABgCAAAYggAAGgIAABq CAAAeggAAHwIAACECAAAhggAAIoIAACMCAAAjggAAJAIAACSCAAAlAgAAKQIAACmCAAA5ggAAPTp 3trTyMS9sr2no72jmKPTj4NyY1hQRQAAAAAAAAAAAAAAAAAAFBVooi1iABZovGMeAENKGgBhShoA AA4WaLxjHgBDShwAYUocAAAUFWg+OZAAFmi8Yx4AQ0ogAGFKIAAAHRVoEwepABZovGMeAEIqC0NK IABhSiAAcGgALAAAIBVo+Ww9ABZovGMeADUIgUIqC0NKIABhSiAAcGgASAAAABcVaD45kAAWaNsh vgA1CIFDShwAYUocABEWaNokGQA1CIFDShwAYUocABUVaHhCSwAWaHhCSwBCKgtwaAAzAAAGFmh4 QksAABUVaPlsPQAWaHhCSwBCKgtwaACAAAAVFWj5bD0AFmhuEJQAQioLcGgAWAAADBVoQ043ABZo bhCUAAAGFmizeE8AABUVaPlsPQAWaLN4TwBCKgRwaDOZZgAMFWhDTjcAFmjaJBkAAAYWaDU5VAAA FRVo+i/cABZo2iQZAEIqCnBoADNmABUVaPov3AAWaNokGQBCKglwaAAAgAAVFWj5bD0AFmjaJBkA QioGcGj/ZgAAABjmCAAA6AgAAOoIAADsCAAA8AgAABwJAAAeCQAAIAkAACoJAAA4CQAAQAkAAFIJ AACCCQAAhAkAAKAJAACyCQAA0gkAANQJAADWCQAAGgoAABwKAAAeCgAAIAoAADYKAABCCgAATAoA AFoKAABqCgAAbAoAAHAKAAByCgAAeAoAAHwKAAB+CgAA0AoAANIKAADUCgAACgsAAAwLAAAOCwAA EAsAAB4LAABuCwAAcAsAAMILAADSCwAA8+jk4NnV2dHZ0dnV2dXZx7/Z1bvVu9W7t7u3u6uknNWU kIWUfJTVu9G7eNV0AAAABhZoGhhtAAAGFminErUAABAVaL8S3AAWaL8S3AAwSg8AABUCCIEDagAA AAAGCAEWaL8S3ABVCAEGFmi/EtwAAA8DagAAAAAWaL8S3ABVCAEOFmjvdgoAbUgJBHNICQQADBVo 73YKABZo73YKAAAXFWiXLEcAFmjvdgoAPioBbUgJBHNICQQGFmjvdgoAAAYWaG0qwQAADxVo9X2W ABZovGMeADUIgRIVaBIuXgAWaLxjHgA1CIE+KgEABhZo0wpcAAAGFmi8Yx4AAAwVaJUpdwAWaLxj HgAABhZo+C6ZAAAGFmg+OZAAABQVaKItYgAWaD45kABDShoAYUoaAAAXFWgISP8AFmi8Yx4ANQiB Q0oaAGFKGgAALdILAADiCwAA5AsAAMAMAADCDAAAxAwAANQMAAAqDQAANA0AADYNAABEDQAAeA0A AHoNAACSDQAAlA0AAK4NAAC6DQAAvA0AAPANAAAYDgAAGg4AACYOAAAoDgAAOA4AAD4OAABEDgAA XA4AAGQOAABmDgAAeg4AAHwOAACWDgAAmA4AAJoOAACyDgAAxg4AAMgOAAAWEAAAIBAAACIQAAAk EAAAVhAAAGgQAABqEAAAbBAAAG4QAACcEAAAnhAAANAQAADgEAAA4hAAAOYQAAD+EAAADBEAABAR AAAeEQAAIhEAADARAAA0EQAANhEAADgRAABMEQAAIBMAACgTAAAqEwAA/Pj88fzt/O3p7fzl3djd 2OX81ND81PzU/O381PzU/Mz8zPzM/Mj8yPzpwbnp/LXt/O387fzt/O387fyuqvym/AAAAAAAAAAA BhZoohQHAAAGFmgQAK4AAAwVaBAArgAWaBAArgAABhZopxK1AAAOFmgSLl4AbUgJBHNICQQADBVo Ei5eABZoEi5eAAAGFmiNADsAAAYWaBNp5gAABhZoNTlUAAAGFmizLYkAAAkWaEllgwA2CIEPFWhJ ZYMAFmhJZYMANgiBBhZoSWWDAAAGFmjHU+QAAAYWaBh/ZAAADBVoiBprABZovGMeAAAGFmhmT/AA AAYWaLxjHgBAKhMAAGQTAABmEwAAaBMAAGwTAAA8FAAAVBQAAGYUAABoFAAAfBQAAH4UAACOFAAA kBQAALYUAAC4FAAAAhUAAAQVAABqFQAAeBUAAFwWAABeFgAAahYAAHoWAAB8FgAAlhYAAJgWAACk FgAAqBYAAEgXAABcFwAAjBcAANYXAADYFwAAeBgAANAYAADcGQAA3hkAAOIZAADqGQAAGhoAACAa AAAmGgAAKBoAAJQaAACWGgAAmBoAAKIaAADMGgAA4BoAAOIaAADoGgAA6hoAAAYbAAA+GwAApBwA AKgcAADkHAAA9/Do4NzY3NTc1NzU3NTc0NzM3NDM0MzQzNDM3NDY3MjcxNy8tLzcrKSs3MSdmcTc ktyS3NDc0NwAAAAAAAAAAAwVaFpSwwAWaLxjHgAABhZo0lFvAAAMFWjSUW8AFmjSUW8AAA8VaKRm 1wAWaBJf8AA+KgEPFWikZtcAFmi8Yx4APioBDxVo73YKABZo2la3AD4qAQ8VaO92CgAWaLxjHgA+ KgEGFmi/NAIAAAYWaDdsGAAABhZocyg8AAAGFmheEIYAAAYWaBh/ZAAABhZobSrBAAAGFmi8Yx4A AA8VaBoYbQAWaPV9lgA1CIEPFWgaGG0AFmi8Yx4ANQiBDBVo9X2WABZovGMeAAAPFWheEIYAFmi8 Yx4APioBADjkHAAA5hwAAAAdAAAEHQAAKB0AAHYdAAB6HQAAhh0AALodAAD4HQAA+h0AAPwdAABo HgAAch4AAGofAABsHwAAch8AANAfAABmIAAAaCAAAIYgAACIIAAAKiEAAD4hAABGIQAAWiEAAPIh AAAMIgAALCIAAFYiAABiIgAAmiIAAJwiAACqIgAArCIAALAiAADMIgAAziIAAAwjAAAOIwAASCMA AEojAABMIwAAYiMAAGwjAABuIwAAcCMAAIIjAACWIwAArCMAAB4kAAAgJAAAKCQAACokAAAuJAAA MCQAADQkAABCJAAARCQAAEYkAABIJAAAVCQAAFYkAABiJAAAZCQAAGokAAD8+PT49Pjs+Ojk6Pjo +Pz44PjZ+Nn4z/jP+ODL+Mvgx+D4x/jD+L/4w/j8+MP4u/i7+LT4u/i0+K27+Lv4u/jo+AAAAAAA AAAAAAAAAAAAAAAADBVopGbXABZovGMeAAAMFWjUT8UAFmjUT8UAAAYWaKhX7wAABhZo9X2WAAAG FmikZtcAAAYWaCNfjwAABhZoBnJTAAASFWi/NAIAFmi8Yx4ANQiBPioBAAwVaLhRMQAWaLxjHgAA BhZokQQNAAAGFmi5fMEAAAYWaL80AgAADxVoI1+PABZovGMeAD4qAQYWaF4QhgAABhZovGMeAAAG FmgTaeYAQWokAABsJAAAmCQAAJokAADEJAAAxiQAAPYkAAD4JAAAACUAAAQlAABaJQAAgCUAAIIl AACaJQAAnCUAAPolAAD8JQAAtCYAALYmAADKJgAAzCYAAAInAABCJwAAeicAAHwnAACAJwAAnicA AKQnAACmJwAAqCcAALgnAADgKAAA4igAAOYoAADqKAAA7CgAAPYoAAAqKQAALCkAAGYpAAB+KQAA jCkAAJgpAAAMKgAADioAAEQqAABGKgAAYioAAGQqAACoKgAA1ioAANoqAADoKgAAICsAACIrAADs KwAA7isAAPwrAAAcLAAAYCwAAHYsAAB4LAAAeiwAAHwsAACqLAAA+fX59fH18fXx9e3p9eX18fXe 9d712vXT9drP2vXL9cf1x/XH9cP16fXx9b/1w/W79bezt/W3r6iv6a+3pLfDtwAAAAAGFmgiQeUA AAwVaLwAiwAWaLwAiwAABhZovACLAAAGFmgSX/AAAAYWaOUPFwAABhZojQA7AAAGFmizeE8AAAYW aDdsGAAABhZo2QthAAAGFmg+XmMAAAYWaLl8wQAADBVognA2ABZovGMeAAAGFmg8OCkAAAwVaBh7 lgAWaLxjHgAABhZowBDZAAAGFmjUT8UAAAYWaKoESAAABhZoE2nmAAAGFmi8Yx4AAAwVaMAQ2QAW aMAQ2QBAqiwAAKwsAABILQAASi0AAGAtAABiLQAAmC0AAJotAAC8LQAAvi0AAPAtAAD0LQAAEC4A ABIuAAAcLgAALi4AADAuAACOLgAAoi4AAOAuAADiLgAALC8AADYvAAA8LwAAQi8AANYvAADYLwAA 3i8AAOgvAACcMAAAsjAAABAxAAAaMQAAKDEAAP4xAAAQMgAAKDIAAL4yAADAMgAAwjIAAOIyAADs MgAAQjMAAE4zAACyMwAAuDMAALozAADGMwAA7DMAAO4zAAAeNAAAIDQAAGA0AACUNAAAuDQAABA1 AAASNQAAFDUAABY1AAAaNQAAJDUAACo1AABKNQAATDUAAHI1AAB0NQAA8jUAAAQ2AAAGNgAAHDYA APz48enx+OL44vji3uLe+Nf40/jT+M/4y/jT+M/4x/jPw/jHw8f4x/i/+Me/u/y/t/y/z7fHs8/H t/i3z7f4y/j8+K/8rwAGFmhmT/AAAAYWaNRPxQAABhZoI1+PAAAGFmhJZYMAAAYWaLwAiwAABhZo E2nmAAAGFmjAENkAAAYWaLN4TwAABhZo9X2WAAAGFmi3FwAAAAwVaOVvSgAWaLxjHgAABhZoPDgp AAAMFWg8OCkAFmg8OCkAAA8VaO92CgAWaLxjHgA+KgEMFWiCcDYAFmi8Yx4AAAYWaLxjHgAABhZo N2wYAEUcNgAAHjYAACg2AAA2NgAA+DYAAPw2AAAeNwAAIDcAADo3AABCNwAATDcAAE43AAB6NwAA jjcAAJI3AACkNwAApjcAAOI3AAAQOAAATjgAAHo4AAB8OAAAfjgAAIY4AACcOAAA6jgAAPo4AAA2 OQAAOjkAAFw5AABeOQAAbDkAAG45AACAOQAAhjkAAIg5AACKOQAApjkAAKg5AACqOQAAuDkAAPo5 AAAEOgAALjoAADI6AAA0OgAANjoAAFI6AABqOgAAdDsAAHo7AAB+OwAAgDsAAPz49Pjt6eLp3vTp 9On06fTp2unW6dbp1unW6dbp1unW6e3p9OnW6cvAy8CwpMCbpMCPwIgAAAAAAAAAAAwVaMdT5AAW aLxjHgAAFxVox1PkABZovGMeAD4qAUNKFABhShQAERZovGMeAD4qAUNKFABhShQAFxVoxHSFABZo vGMeAD4qAUNKFABhShQAHxVoxHSFABZovGMeAD4qAUNKFABhShQAbUgJBHNICQQUFWhmT/AAFmi8 Yx4AQ0oUAGFKFAAAFBVoZk/wABZo5Q8XAENKFABhShQAAAYWaNRPxQAABhZovACLAAAGFmj/CLQA AAwVaFpSwwAWaLxjHgAABhZovGMeAAAMFWgjX48AFmgjX48AAAYWaCNfjwAABhZoZk/wAAAGFmg3 bBgANIA7AACCOwAAhjsAAIg7AACKOwAAkDsAAJI7AACUOwAAoDsAAKI7AACkOwAA6DsAAOo7AADs OwAA7jsAAPA7AABAPAAATDwAAFA8AABwPAAAdDwAAHY8AAB6PAAA9u3h1dHNwresoZOhiIB1aV1p T2lGOgAAFxVopGbXABZobkg+ADUIgUNKEABhShAAERZoHjScADUIgUNKEgBhShIAGhVo73YKABZo vGMeADUIgT4qAUNKEgBhShIAABcVaO92CgAWaO92CgA1CIFDShIAYUoSABcVaC81UwAWaLxjHgA1 CIFDShIAYUoSABQVaC81UwAWaDU5VABDShIAYUoSAAAOFmi8Yx4AQ0oSAGFKEgAAFBVoLzVTABZo vGMeAENKEgBhShIAABoVaGZP8AAWaLxjHgA2CIE+KgFDShIAYUoSAAAUFWikZtcAFmi8Yx4AQ0oS AGFKEgAAFBVopGbXABZoyWcuAENKEgBhShIAABQVaKRm1wAWaLxjHgBDShQAYUoUAAAUFWikZtcA FmjvdgoAQ0oUAGFKFAAABhZovGMeAAAGFmg1OVQAABcVaO92CgAWaDU5VAA1CIFDShQAYUoUABcV aO92CgAWaLpU1gA1CIFDShQAYUoUABEWaKJJeAA+KgFDShQAYUoUABEWaLpU1gA+KgFDShQAYUoU AAAWejwAAJ48AACgPAAASD0AAFA9AABoPQAAsj0AALQ9AAA0PgAAVj4AAFg+AABaPgAAXj4AAHg+ AAB6PgAAfD4AAH4+AACCPgAAuD4AANo+AADcPgAA3j4AAOw+AADwPgAA8+rf1N/Jwcm2ya6mm5OL f3pzb2hhWUkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfFWjEdIUAFmi8Yx4APioBQ0oUAGFK FABtSAkEc0gJBA4WaLxjHgBDShQAYUoUAAAMFWioV+8AFmhPNTcAAAwVaKhX7wAWaLxjHgAABhZo qFfvAAAMFWjEdIUAFmi8Yx4AAAkWaCsX+AA1CIEXFWgrF/gAFmi8Yx4ANQiBbUgJBHNICQQOFmii SXgAQ0ocAGFKHAAADhZovGMeAENKHABhShwAABQVaLpU1gAWaDU5VABDShwAYUocAAAOFmiiSXgA Q0oQAGFKEAAADhZovGMeAENKEABhShAAABQVaDU5VAAWaOUPFwBDShAAYUoQAAAOFmg3bBgAQ0oQ AGFKEAAAFBVoNTlUABZovGMeAENKEABhShAAABQVaO92CgAWaJEEDQBDShIAYUoSAAAUFWjvdgoA Fmg2Nb4AQ0oSAGFKEgAAERZovGMeADUIgUNKEgBhShIAFxVopGbXABZoHjScADUIgUNKEABhShAA ABdaPgAAXD4AAF4+AAB6PgAAfD4AANw+AADePgAAKD8AAIZYAACgZAAAEHcAAGqCAADskAAAAL4A AJDWAACS1gAAxtYAADzgAAA+6gAAQOoAANrqAAAO9gAAEPYAAFT2AABqDAEAhhQBAIgUAQCKFAEA yBQBAPcAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAD3 AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAA AAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAA AADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAA AAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAA AAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA 8gAAAAAAAAAAAAAAAPcAAAAAAAAAAAAAAAAAAAAAAAQAAGdkvGMeAAAHAAADJAFhJAFnZLxjHgAA HPA+AADyPgAA9D4AABA/AAAmPwAAKD8AAGw/AABuPwAAnj8AAKA/AACmPwAAqD8AAMg/AADKPwAA UkAAAFRAAAByQAAAdEAAAHZAAAB4QAAAjkAAAJBAAACuQAAAsEAAALxAAADEQQAA1kEAAPhCAAD6 QgAAIkMAAHBDAADCQwAA0EMAAGxEAACURAAAokQAAEZFAABURQAACEcAABRHAADsRwAA8+jf1vPO w87DzsPOuM7DzsPOw87DzrCozrDOw86czrDOkIXOfc5yzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ABQVaGQ/qwAWaLxjHgBDShQAYUoUAAAOFmiLa9YAQ0oUAGFKFAAAFBVoy173ABZovGMeAENKFABh ShQAABcVaDFN2QAWaLxjHgA+KgFDShQAYUoUABcVaMte9wAWaLxjHgA+KgFDShQAYUoUAA4WaDYH ogBDShQAYUoUAAAOFmgXVu4AQ0oUAGFKFAAAFBVo7kdZABZovGMeAENKFABhShQAABQVaElC4AAW aLxjHgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAERZoqFfvAD4qAUNKFABhShQAERZovGMeAD4q AUNKFABhShQAFBVoqFfvABZovGMeAENKFABhShQAABcVaMR0hQAWaLxjHgA+KgFDShQAYUoUAAAo 7EcAAO5HAAA2SgAATkoAAG5KAABwSgAAfkoAAIpKAACMSgAApEsAAKZLAACgTAAArEwAANRMAADW TAAAAE0AAAJNAABWTQAAWE0AAM5NAADQTQAA7E0AAO5NAADyTQAA9E0AAAxOAAAOTgAAfE4AAH5O AACYTgAAmk4AAL5OAADATgAA+k8AAPxPAADkUQAA6FEAAEBSAABEUgAAHlMAADJTAADKUwAA4FMA AFRUAABWVAAAiFQAAIpUAACiVAAA9e3l7drt0trt5e3K7cLtuu2y7drt2u2q7art2u3a7drtn+2T 7artqu2L7YPteO0AFBVoFRJ8ABZovGMeAENKFABhShQAAA4WaEkceABDShQAYUoUAAAOFmgSX/AA Q0oUAGFKFAAAFhZovGMeAENKFABhShQAbUgJBHNICQQAFBVocCw7ABZovGMeAENKFABhShQAAA4W aFUIYQBDShQAYUoUAAAOFmgiQeUAQ0oUAGFKFAAADhZo+TKkAENKFABhShQAAA4WaItr1gBDShQA YUoUAAAOFmgYT+IAQ0oUAGFKFAAADhZoN0IEAENKFABhShQAABQVaORHJAAWaLxjHgBDShQAYUoU AAAOFmjlQlMAQ0oUAGFKFAAADhZovGMeAENKFABhShQAABQVaB0mMwAWaLxjHgBDShQAYUoUAC+i VAAApFQAAOBUAADiVAAAGlUAABxVAAAuVQAAMFUAAEJVAABEVQAAdlUAAHhVAAC+VQAAwFUAABxW AAAeVgAALFYAAC5WAAD2VgAA+FYAACRXAAA2VwAAPFcAAD5XAABMVwAAUFcAAMpXAADWVwAA9lcA APhXAAAOWAAAHFgAAPZYAAD4WAAACFkAAApZAADeWQAA5FkAAB5aAADQWwAA0lsAAOBbAADiWwAA 5FsAAOZbAAAqXAAARFwAAEZcAAB0XAAA9e3i7eLt2u3a7drtz+3i7eLtx+2/7b/tv+237cftx+2s 7aztoJTtie2J7Yntx37HAAAAAAAAAAAUFWidF+IAFmidF+IAQ0oUAGFKFAAAFBVoBi32ABZovGMe AENKFABhShQAABcVaDFN2QAWaLxjHgA+KgFDShQAYUoUABcVaJFpNgAWaLxjHgA+KgFDShQAYUoU ABQVaIgcjgAWaLxjHgBDShQAYUoUAAAOFmiLa9YAQ0oUAGFKFAAADhZoFX33AENKFABhShQAAA4W aJ0X4gBDShQAYUoUAAAUFWhkP6sAFmi8Yx4AQ0oUAGFKFAAADhZoVQhhAENKFABhShQAABQVaO8g BQAWaLxjHgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFBVoFRJ8ABZovGMeAENKFABhShQAMHRc AAB2XAAAeFwAAO5cAAAAXQAAjF0AAI5dAADOXQAA0F0AADxeAAA+XgAAFl8AACJfAAAMYAAADmAA ABxgAADIYAAA0mAAAABiAAAWYgAAkGIAAKJiAABYYwAAbGMAAHpjAACyYwAAwGMAANhjAAACZAAA CmQAAA5kAACiZAAApGQAADhlAAByZQAA9GUAAA5mAAAyZgAA+O3l3eXV5crlyuXC5cq65a7lpuWe 5ZKG5Xvl1eXV5XPluuVr5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOFmjZC2EAQ0oUAGFKFAAA DhZoSRx4AENKFABhShQAABQVaK4F3QAWaLxjHgBDShQAYUoUAAAXFWjzX40AFmi8Yx4ANgiBQ0oU AGFKFAAXFWjzX40AFmjzX40ANgiBQ0oUAGFKFAAOFmg3QgQAQ0oUAGFKFAAADhZo6miLAENKFABh ShQAABcVaOBK3wAWaLxjHgA1CIFDShQAYUoUAA4WaLs8mwBDShQAYUoUAAAOFmjqXkYAQ0oUAGFK FAAAFBVouzybABZouzybAENKFABhShQAAA4WaJ0X4gBDShQAYUoUAAAOFmj/CLQAQ0oUAGFKFAAA DhZovGMeAENKFABhShQAABQVaBJf8AAWaBJf8ABDShQAYUoUAAAOFmgSX/AAQ0oUAGFKFAAlMmYA ADRmAABKZgAATGYAAHZmAAB6ZgAAimYAAOhmAAAgZwAAXmcAAHBnAAByZwAALmgAAEJoAABiaAAA ZGgAAIRoAACGaAAApmgAAKhoAACyaAAAtGgAALZoAAC4aAAAzmgAANBoAAD0aAAAjmkAAK5pAAB+ agAAgmoAABBrAABQawAAIGwAADpsAABObAAAUGwAAGBsAABkbAAAimwAAKJsAAD17fXl9drO7cbt vu2+7bPts+2o7ai+s+2dle2N7b7the2NfY1x7b5pAAAAAAAADhZo9CTAAENKFABhShQAABcVaDFN 2QAWaLxjHgA+KgFDShQAYUoUAA4WaCwS8gBDShQAYUoUAAAOFmgeQtsAQ0oUAGFKFAAADhZoMU3Z AENKFABhShQAAA4WaOpeRgBDShQAYUoUAAAUFWjqXkYAFmjqXkYAQ0oUAGFKFAAAFBVonRfiABZo nRfiAENKFABhShQAABQVaLh9GwAWaLxjHgBDShQAYUoUAAAOFmidF+IAQ0oUAGFKFAAADhZouzyb AENKFABhShQAABcVaOpeRgAWaLxjHgA+KgFDShQAYUoUABQVaOpeRgAWaLxjHgBDShQAYUoUAAAO FmjZC2EAQ0oUAGFKFAAADhZovGMeAENKFABhShQAABQVaHM4wAAWaLxjHgBDShQAYUoUACiibAAA qmwAAOpsAADsbAAA/mwAAFZtAAB8bQAAgG0AAIxtAACabQAAnm0AAKBtAAC2bQAA8G0AALpuAADK bgAA3G4AAPpuAACAbwAAmm8AAE5wAABQcAAAUnAAAFxwAACscAAAsnAAAApyAAAMcgAAAnQAAAx0 AAAQdAAAEnQAACh0AAAqdAAALHQAADR0AAA2dAAAOnQAAEp0AABcdAAAXnQAAGB0AABsdAAAjHQA AI50AADwdAAA8nQAABp1AAAcdQAAJHUAACZ1AAD48Ojg2PjQ2Pjw2PDY8Pjw+PDY8NDwxPC88LTw vLS88LzwqZ7wvPC88LzwlvCL8IvwgAAAFBVoGX9pABZovGMeAENKFABhShQAABQVaLh9GwAWaLxj HgBDShQAYUoUAAAOFmi7PJsAQ0oUAGFKFAAAFBVo4ErfABZoPxCdAENKFABhShQAABQVaOBK3wAW aLxjHgBDShQAYUoUAAAOFmjqXkYAQ0oUAGFKFAAADhZoPxCdAENKFABhShQAABcVaOBK3wAWaLxj HgA1CIFDShQAYUoUAA4WaLtbpwBDShQAYUoUAAAOFmj0JMAAQ0oUAGFKFAAADhZo+37YAENKFABh ShQAAA4WaJ0X4gBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAADhZoaXQ9AENKFABhShQAMiZ1AAAy dQAANHUAADp1AAA8dQAARnUAAEh1AACCdQAAhHUAAA53AAAQdwAAEncAAJJ3AACYdwAAmncAAMB3 AADCdwAAVHgAAGh4AAAMeQAAKnkAADB5AAA8eQAAxnoAANJ6AADkegAA+HsAACh8AABwfAAAinwA AKR8AAC2fAAAvHwAAMp8AABofgAAfH4AABx/AABEfwAAUn8AAFZ/AACcfwAAon8AAPjt+O347fjl +NrP+Me8x7z45fi0+LT4x+X4rPihlo2Ejfh8+HT4dPhsAAAAAAAAAA4WaC8ElgBDShQAYUoUAAAO FmhJZYMAQ0oUAGFKFAAADhZo2QthAENKFABhShQAABEWaIUU/gA+KgFDShQAYUoUABEWaLtbpwA+ KgFDShQAYUoUABQVaLtbpwAWaLtbpwBDShQAYUoUAAAUFWi7W6cAFmi8Yx4AQ0oUAGFKFAAADhZo u1unAENKFABhShQAAA4WaJ5sDABDShQAYUoUAAAUFWi7PJsAFmi7PJsAQ0oUAGFKFAAADhZouzyb AENKFABhShQAABQVaAEBMQAWaLxjHgBDShQAYUoUAAAUFWhmDYIAFmi8Yx4AQ0oUAGFKFAAADhZo PxCdAENKFABhShQAABQVaBl/aQAWaLxjHgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAApon8AAMh/ AACqgAAA1IAAAPqAAAAEgQAAHoEAAD6BAABogQAAdoEAAL6BAADkgQAA5oEAAECCAABUggAAbIIA AOiCAADqggAAPoMAAECDAADahQAA3IUAAOCFAADihQAA6IUAAOqFAAD2hQAA+IUAABCGAAAShgAA KIYAACqGAACMhgAApIYAAB6HAAAuhwAA/ocAABaIAACciAAAoIgAAAyJAAAWiQAAOIkAAGyJAACI iQAAlokAAJiJAACeiQAAPIoAAEqKAAB4iwAAeosAAPPr4+vj6+Pr2+vj69Pj0+vL68DrwOvA68Dr wOu166rry+ui65bri+uD64PrluuD66LrogAAAA4WaIUU/gBDShQAYUoUAAAUFWhdSZwAFmi8Yx4A Q0oUAGFKFAAAFxVoohQHABZovGMeAD4qAUNKFABhShQADhZocFtEAENKFABhShQAABQVaKAKNgAW aLxjHgBDShQAYUoUAAAUFWiBbXoAFmi8Yx4AQ0oUAGFKFAAAFBVoykAkABZovGMeAENKFABhShQA AA4WaNFqlwBDShQAYUoUAAAOFmg/EJ0AQ0oUAGFKFAAADhZoSWWDAENKFABhShQAAA4WaC8ElgBD ShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFxVoLwSWABZoLwSWAD4qAUNKFABhShQAADN6iwAAfIsA AJKLAACWiwAAyIsAANqLAADciwAAOowAADyMAADwjQAAAo4AABaOAAAcjgAA0o4AANyOAABCjwAA aI8AAGyPAACCjwAAipAAAKqQAADqkAAA7JAAABiRAABYkQAAZpEAAGiRAACekQAAoJEAAOCRAABo kgAACJMAAAqTAAAMkwAA6JMAAO6TAACKlAAAoJQAAMaUAADslAAAGJYAAGSWAAB0lgAAdpYAAIKW AACclgAAoJYAALSWAADClgAA2pYAAN6WAADylgAAHpcAAPXt9e3l7d3V3eXd5d3l3eXd5d3V3c3d wd3l3eXdtd2t5d3l3dXdtd3tpe2dlZ2Nhe2drZ0AAA4WaJ1wIABDShQAYUoUAAAOFmi1dZIAQ0oU AGFKFAAADhZo3AAAAENKFABhShQAAA4WaNtnagBDShQAYUoUAAAOFmgiJoEAQ0oUAGFKFAAADhZo N0IEAENKFABhShQAABcVaKIUBwAWaLxjHgA+KgFDShQAYUoUABcVaHBbRAAWaLxjHgA+KgFDShQA YUoUAA4WaKIUBwBDShQAYUoUAAAOFmhRSDoAQ0oUAGFKFAAADhZovGMeAENKFABhShQAAA4WaIUU /gBDShQAYUoUAAAOFmhwW0QAQ0oUAGFKFAAAFBVocFtEABZocFtEAENKFABhShQANB6XAAAglwAA IpcAAJCXAADYlwAAVpgAAFiYAABsmAAAbpgAAICYAACEmAAAkJgAAJKYAACsmgAAupoAANSaAAAA mwAAApsAACibAAAqmwAAiJsAAJKbAADImwAA1psAAFKcAABgnAAAbJwAAJKcAACknAAAEJ0AADCd AABMnQAAbp0AAPSdAAAmngAAQJ4AAE6eAACQngAAkp4AAGSfAABmnwAAXqAAAGCgAABkoAAAaKAA APKgAAAKoQAADqEAACKhAAAkoQAAJqEAAPjw6PDo3ejd6N3o3ejRxei96L3oteit6L3ovaXo8Oit 6PCl8J2S6J3oreiH6PDo8H/wDhZoIkHlAENKFABhShQAABQVaNkLYQAWaLxjHgBDShQAYUoUAAAU FWhiQ4QAFmi8Yx4AQ0oUAGFKFAAADhZoqFfvAENKFABhShQAAA4WaNwAAABDShQAYUoUAAAOFmjZ C2EAQ0oUAGFKFAAADhZo/wi0AENKFABhShQAAA4WaOwU1wBDShQAYUoUAAAXFWiwUhsAFmjsFNcA PioBQ0oUAGFKFAAXFWiwUhsAFmi8Yx4APioBQ0oUAGFKFAAUFWjNQ8IAFmi8Yx4AQ0oUAGFKFAAA DhZovGMeAENKFABhShQAAA4WaNtnagBDShQAYUoUAAAOFmhwW0QAQ0oUAGFKFAAyJqEAADahAAA4 oQAAKqIAAKiiAAAupAAANqQAAMKkAADIpAAASqUAAEylAABcpQAAcqUAAISlAACGpQAAlKUAAJal AADkpQAA5qUAAPqlAAD8pQAAFKYAABqmAAAupgAAMKYAAJCnAACSpwAAuKcAALqnAAAgqAAAPqgA AHipAACIqQAAlKoAAJyqAACiqgAAuqoAANqtAADcrQAA8K0AAPKtAAAqrgAALK4AAEKuAABErgAA cq8AAHyvAAB8sAAAfrAAAJqwAACcsAAAvrAAAMCwAADIsAAAyrAAAMywAAD48Pjk+Nz41PjU+Mz4 wfjB+MH4wfjM+Mz4ufjU+Mz4zPjM+Mz4rviu+KP4o/ib+JD4kPiQ+JD4AAAAAAAAAAAAFBVo8iMk ABZovGMeAENKFABhShQAAA4WaFJZSQBDShQAYUoUAAAUFWjqXkYAFmjqXkYAQ0oUAGFKFAAAFBVo E2ooABZovGMeAENKFABhShQAAA4WaNtnagBDShQAYUoUAAAUFWjcAAAAFmjcAAAAQ0oUAGFKFAAA DhZo3AAAAENKFABhShQAAA4WaLMtiQBDShQAYUoUAAAOFmhCGoMAQ0oUAGFKFAAAFxVo6l5GABZo vGMeAD4qAUNKFABhShQADhZoIkHlAENKFABhShQAAA4WaLxjHgBDShQAYUoUADfMsAAAzrAAACCx AAAisQAA8LEAAPKxAAD+sQAAALIAAAKyAAAusgAAMLIAAOSzAAD0swAAtrgAALi4AAAauQAAHLkA AE65AABQuQAAhLsAAMi7AACkvAAA6LwAAPy8AAD8vQAA/r0AAAC+AAACvgAAKr4AACy+AABYvgAA Wr4AAIi+AACYvgAA/r4AACq/AACcvwAA4r8AAG7BAAD17eXt2u3az+3l7cft5e2/7b/tt+23r7ft p+2bkO2I7XztdO1o7QAAAAAAAAAAAAAAAAAAFxVoMRFBABZovGMeAD4qAUNKFABhShQADhZoS1V2 AENKFABhShQAABcVaFJZSQAWaLxjHgA+KgFDShQAYUoUAA4WaNkLYQBDShQAYUoUAAAUFWjZC2EA FmjZC2EAQ0oUAGFKFAAAFxVo1gjuABZovGMeADUIgUNKFABhShQADhZoPxCdAENKFABhShQAAA4W aJN+lwBDShQAYUoUAAAOFmjEC90AQ0oUAGFKFAAADhZosy2JAENKFABhShQAAA4WaM8XDABDShQA YUoUAAAUFWiTfpcAFmiTfpcAQ0oUAGFKFAAAFBVooXrkABZovGMeAENKFABhShQAAA4WaFJZSQBD ShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFBVoiSJFABZovGMeAENKFABhShQAJm7BAACIwQAAosEA AKTBAACmwQAASMIAAErCAABywgAAdMIAAEbDAABUwwAAesMAAJLEAACexAAAEsYAAEjGAABcxgAA YsYAAGzGAACGxgAAmMYAALDGAAD6xgAA/sYAAAzHAAAOxwAAEMcAAB7HAAAkxwAAKMcAACrHAAAs xwAAnMcAALLHAADCxwAAxMcAAOLJAAACygAA9MwAAATNAAAGzQAAps0AAKrNAAD48Ojd6N3o3ej4 0ejF6L3ovei96LXoveit6KWtpbWt6LXoteid6JGFeXAAAAAAAAAAAAAAERZoMRFBADUIgUNKFABh ShQAFxVoQC0mABZovGMeADUIgUNKFABhShQAFxVosFIbABZovGMeADUIgUNKFABhShQAFxVosFIb ABZosFIbADUIgUNKFABhShQADhZo4At3AENKFABhShQAAA4WaDERQQBDShQAYUoUAAAOFmjPFwwA Q0oUAGFKFAAADhZok36XAENKFABhShQAAA4WaGRuZQBDShQAYUoUAAAXFWgkIlcAFmi8Yx4ANQiB Q0oUAGFKFAAXFWhuYeMAFmhuYeMAPioBQ0oUAGFKFAAUFWjQSCMAFmi8Yx4AQ0oUAGFKFAAADhZo vGMeAENKFABhShQAAA4WaNkLYQBDShQAYUoUAAAOFmhuYeMAQ0oUAGFKFAAqqs0AAKzNAAAAzgAA DM4AAFTOAABozgAAqs4AANDOAAD0zgAAAM8AABjPAABIzwAATs8AAFDPAABuzwAAcM8AAHLPAACW zwAAuM8AAMjPAAB80AAAktAAAArRAAAa0QAAMNEAADzRAABM0QAAWtEAAGLRAABk0QAAatEAAHLR AAB00QAAHNIAACjSAABg0gAAYtIAAGTSAACs0gAAwtIAALDTAAD40wAA/NMAADrUAABQ1AAAetQA APbq4erWytbC1sLWurK6srqmup66srqeup66lrqWupa6joaOwp7CnsJ+wnaGwgAAAAAAAAAOFmiB dZoAQ0oUAGFKFAAADhZonmwMAENKFABhShQAAA4WaJJzjQBDShQAYUoUAAAOFmjPFwwAQ0oUAGFK FAAADhZo/wi0AENKFABhShQAAA4WaOALdwBDShQAYUoUAAAXFWjPFwwAFmg2B6IAPioBQ0oUAGFK FAAOFmiwUhsAQ0oUAGFKFAAADhZoNgeiAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWiiFAcA Fmi8Yx4APioBQ0oUAGFKFAAUFWj7HvAAFmi8Yx4AQ0oUAGFKFAAAERZoMRFBADUIgUNKFABhShQA FxVoQC0mABZovGMeADUIgUNKFABhShQAERZovGMeADUIgUNKFABhShQAAC161AAAhtQAAJTUAACW 1AAAmtQAALDUAACy1AAAtNQAAMLUAABo1QAAatUAAIDVAACC1QAA2tUAANzVAABO1gAAUNYAAFTW AABW1gAAbNYAAG7WAACO1gAAkNYAAKDWAACi1gAAptYAAKjWAADE1gAAxtYAAGrXAABs1wAAlNcA AJbXAACW2QAAmNkAAPPn39ff19/P38TfxN+837Tfqd+0357fjoJ3boLfY99j31gAABQVaEFDhwAW aEFDhwBDShQAYUoUAAAUFWgFe2QAFmi8Yx4AQ0oUAGFKFAAAERZosy2JAD4qAUNKFABhShQAFBVo y395ABZovGMeAENKFABhShQAABcVaKMETAAWaLxjHgA+KgFDShQAYUoUAB8VaKMETAAWaLxjHgA+ KgFDShQAYUoUAG1ICQRzSAkEFBVoCSWfABZovGMeAENKFABhShQAABQVaB0mMwAWaLxjHgBDShQA YUoUAAAOFmjgC3cAQ0oUAGFKFAAADhZozxcMAENKFABhShQAABQVaI5i/AAWaLxjHgBDShQAYUoU AAAOFmj/CLQAQ0oUAGFKFAAADhZosFIbAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWiwUhsA Fmi8Yx4APioBQ0oUAGFKFAAXFWiwUhsAFmiwUhsAPioBQ0oUAGFKFAAAIpjZAACu2QAActwAAHTc AACK3AAAjNwAAAzfAAAO3wAAJt8AACrfAACk4AAAquAAAL7gAADA4AAAzOAAAM7gAAAs4QAALuEA AODhAADq4QAA7OEAAPzhAAA04gAA7OIAAPLiAAA24wAATuMAADDmAAA05gAANuYAAETmAABI5gAA XuYAAGDmAABi5gAAZOYAAGbmAACq5wAA+PDl8OXw2vDS8Mrwv/C/8Mrws6ezp/Cf8Jfwi3+L8Ivw c2hz8AAAAAAAAAAAAAAAAAAAAAAAAAAUFWgFe2QAFmi8Yx4AQ0oUAGFKFAAAFhZovGMeAENKFABh ShQAbUgJBHNICQQAFxVoUBGmABZoN0IEAD4qAUNKFABhShQAFxVoUBGmABZovGMeAD4qAUNKFABh ShQADhZoHUDhAENKFABhShQAAA4WaItr1gBDShQAYUoUAAAXFWiSNFkAFmi8Yx4APioBQ0oUAGFK FAAXFWiSNFkAFmiSNFkAPioBQ0oUAGFKFAAUFWjcI/kAFmi8Yx4AQ0oUAGFKFAAADhZo2QthAENK FABhShQAAA4WaEkceABDShQAYUoUAAAUFWjaTGgAFmi8Yx4AQ0oUAGFKFAAAFBVoRTA8ABZovGMe AENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmhBQ4cAQ0oUAGFKFAAlqucAALTnAAC+5wAA8ugA APToAAA26QAAOOkAAJTpAACo6QAAAuoAAATqAAAc6gAAIOoAADLqAAA06gAAQuoAAE7qAABQ6gAA VOoAAFbqAABw6gAAcuoAAHTqAADa6gAAWusAAFzrAAC07gAAwO4AALDvAAC+7wAAzPAAANDwAADW 8AAA2PAAAIL0AACQ9AAAovQAAKb0AAC69AAAvPQAANL0AADU9AAAKvUAAPjs5Nnk2eTs5Nnk2eTR 5Ma2raKtlq2W5Ivkg+R75Ivki+TR5IPkcORw5AAAAAAAAAAAAAAUFWjuR1kAFmi8Yx4AQ0oUAGFK FAAADhZoSWWDAENKFABhShQAAA4WaHF0SgBDShQAYUoUAAAUFWj0FxQAFmi8Yx4AQ0oUAGFKFAAA FxVoowRMABZovGMeAD4qAUNKFABhShQAFBVoy395ABZoOWdsAENKFABhShQAABEWaDlnbAA+KgFD ShQAYUoUAB8VaKMETAAWaLxjHgA+KgFDShQAYUoUAG1ICQRzSAkEFBVoowRMABZovGMeAENKFABh ShQAAA4WaOxu3wBDShQAYUoUAAAUFWiGauIAFmi8Yx4AQ0oUAGFKFAAADhZovGMeAENKFABhShQA ABcVaFARpgAWaLxjHgA+KgFDShQAYUoUAA4WaPV9lgBDShQAYUoUACoq9QAALPUAAHD1AACS9QAA qvUAAKz1AADI9QAAzvUAAPD1AADy9QAA/vUAAAD2AAAM9gAAEPYAAB72AAAg9gAAJPYAACb2AABS 9gAAVPYAAGz3AACk9wAA3PgAAOj4AAAE+QAASPkAAFj5AAB4+QAAavsAAGz7AADm+wAA6PsAAA78 AAAQ/AAAYPwAAHD8AADS/QAA4P0AAG7+AAB6/gAAKP8AAGj/AAC+/wAA0v8AANwCAQAUAwEA+PD4 8OXw5fDl8OXw5drKvrOqvvCi8JrwovCi8JLwh/CH8HzwovCi8JLwdPCaAAAADhZo2QthAENKFABh ShQAABQVaG5jPQAWaLxjHgBDShQAYUoUAAAUFWjHYAgAFmi8Yx4AQ0oUAGFKFAAADhZogyjEAENK FABhShQAAA4WaE0MZwBDShQAYUoUAAAOFmhjY3IAQ0oUAGFKFAAAERZosy2JAD4qAUNKFABhShQA FBVoy395ABZovGMeAENKFABhShQAABcVaKMETAAWaLxjHgA+KgFDShQAYUoUAB8VaKMETAAWaLxj HgA+KgFDShQAYUoUAG1ICQRzSAkEFBVoowRMABZovGMeAENKFABhShQAABQVaO5HWQAWaLxjHgBD ShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAADhZokjRZAENKFABhShQALRQDAQDmAwEAAgQBAJ4EAQCy BAEA2AQBANoEAQCuCQEAngoBAOIKAQDkCgEAqgsBANwLAQDyCwEA9AsBAOwMAQDuDAEArBABAK4Q AQC+EAEA5BABAJoSAQCoEgEAUhMBAFQTAQCIEwEAoBMBAKITAQCmEwEA0hMBABAUAQAgFAEAKhQB ACwUAQAwFAEAMhQBADQUAQA2FAEAOBQBAIQUAQCGFAEAihQBAI4UAQCSFAEA+PD46Pjo+PD43fjS +Mr4yvjCusL4yviv+K+k+KSvyq/4r/iYjZj4jYJ6dQAAAAAAAAAAAAAAAAAAAAkWaCsX+AA1CIEP FWgrF/gAFmi8Yx4ANQiBFBVopSweABZovGMeAENKFABhShQAABQVaGFgCQAWaLxjHgBDShQAYUoU AAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAUFWj6TZUAFmi8Yx4AQ0oUAGFKFAAAFBVohB47ABZo vGMeAENKFABhShQAAA4WaHc4tABDShQAYUoUAAAOFmhNDGcAQ0oUAGFKFAAADhZoSWWDAENKFABh ShQAABQVaG5jPQAWaLxjHgBDShQAYUoUAAAUFWgXGXoAFmi8Yx4AQ0oUAGFKFAAADhZoZG5lAENK FABhShQAAA4WaN8OZwBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAArkhQBAJQUAQCgFAEAxhQBAMgU AQDKFAEA2BQBANwUAQDgFAEA4hQBAPYUAQAMFQEADhUBAFQVAQBqFQEAghUBALwVAQDAFQEA/hUB AAAWAQAKFgEAMhYBAGYWAQBqFgEAjhYBAJAWAQCWFgEAzBYBAM4WAQDiFgEABBcBAAYXAQD58u7n 4NXJvbKpvZ2SipKCkneCb3dnd193X3dfVHeCAAAAAAAAAAAAFBVovQAFABZoUBGmAENKFABhShQA AA4WaFARpgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAADhZowRqxAENKFABhShQAABQVaL0ABQAW aLxjHgBDShQAYUoUAAAOFmiaLVcAQ0oUAGFKFAAADhZo/wi0AENKFABhShQAABQVaCd0nQAWaLxj HgBDShQAYUoUAAAXFWiIUCkAFmi8Yx4APioBQ0oUAGFKFAARFmhBQ4cAPioBQ0oUAGFKFAAUFWia LVcAFmi8Yx4AQ0oUAGFKFAAAFxVoSz6GABZovGMeAD4qAUNKFABhShQAFxVoJ3SdABZovGMeAD4q AUNKFABhShQAFBVoSz6GABZovGMeAENKFABhShQAAAwVaPV9lgAWaE81NwAADBVo9X2WABZovGMe AAAGFmi8Yx4AAAwVaEs+hgAWaLxjHgAADBVoJ3SdABZovGMeAB/IFAEAyhQBAA4VAQB+GgEAzhoB ACwbAQCeGwEA8hsBAFYcAQDKHAEA+BwBACgdAQBEHQEAVh0BAMgdAQD0HQEAEB4BAF4eAQCCHgEA 2B4BAA4fAQBeHwEAph8BAG4gAQCCIAEArCABAEghAQD3AAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAA AO0AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAAAO0AAAAAAAAAAAAAAADtAAAA AAAAAAAAAAAA7QAAAAAAAAAAAAAAAO0AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA7QAAAAAAAAAA AAAAAO0AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAAAO0AAAAAAAAAAAAAAADo AAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA7QAAAAAA AAAAAAAAAO0AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAAAO0AAAAAAAAAAAAA AADtAAAAAAAAAAAAAAAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAGdky2KMAAAEAABnZLlC7QAA BAAAZ2TzAnwAAAQAAGdkvGMeAAAHAAADJAFhJAFnZLxjHgAAGgYXAQAkFwEAKBcBAEQXAQBaFwEA phcBAKoXAQDEFwEAzhcBADwZAQBOGQEAfhkBAI4ZAQCcGQEAphkBAOIZAQDkGQEAPhoBAHwaAQB+ GgEAgBoBAIIaAQCEGgEAwBoBAMIaAQDEGgEAzBoBAM4aAQDSGgEA1hoBAPjw5fjl8OXw5d3l3dLG 0r6zq6Obj4R8dGl0fF1SAAAAAAAAAAAAAAAAAAAAFBVofgCGABZovwGgAENKFABhShQAABYWaL8B oABDShQAYUoUAG1ICQRzSAkEABQVaFARpgAWaFARpgBDShQAYUoUAAAOFmhQEaYAQ0oUAGFKFAAA DhZoKCMkAENKFABhShQAABQVaCgjJAAWaCgjJABDShQAYUoUAAAWFmgoIyQAQ0oUAGFKFABtSAkE c0gJBAAOFmjHU+QAQ0oUAGFKFAAADhZom0hxAENKFABhShQAAA4WaDIbGgBDShQAYUoUAAAUFWhP QTsAFmjzAnwAQ0oUAGFKFAAADhZo8wJ8AENKFABhShQAABcVaFARpgAWaLxjHgA2CIFDShQAYUoU ABQVaIhQKQAWaLxjHgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFBVovQAFABZovGMeAENKFABh ShQAAA4WaJotVwBDShQAYUoUAAAOFmjrIuQAQ0oUAGFKFAAd1hoBAN4aAQAqGwEALBsBADAbAQA0 GwEAZBsBAGgbAQCQGwEAnBsBAJ4bAQCiGwEAphsBAK4bAQDwGwEA8hsBAPYbAQD6GwEAVBwBAFYc AQBaHAEAXhwBAIgcAQD48Pjk2dHGu7O7p5yUjJSAdW1iVktDAAAAAAAAAAAAAAAAAAAAAAAAAAAO FmjlTr8AQ0oUAGFKFAAAFBVofgCGABZomwQ4AENKFABhShQAABYWaJsEOABDShQAYUoUAG1ICQRz SAkEABQVaEgSFQAWaEgSFQBDShQAYUoUAAAOFmhIEhUAQ0oUAGFKFAAAFBVo+SgTABZoSBIVAENK FABhShQAABYWaEgSFQBDShQAYUoUAG1ICQRzSAkEAA4WaAl4hwBDShQAYUoUAAAOFmjGZ/sAQ0oU AGFKFAAAFBVotlhoABZoxmf7AENKFABhShQAABYWaMZn+wBDShQAYUoUAG1ICQRzSAkEAA4WaIFe qgBDShQAYUoUAAAUFWiBXqoAFmigH0UAQ0oUAGFKFAAAFBVogV6qABZoxAQnAENKFABhShQAAA4W aMQEJwBDShQAYUoUAAAUFWgJeIcAFmigH0UAQ0oUAGFKFAAAFhZooB9FAENKFABhShQAbUgJBHNI CQQADhZolB1gAENKFABhShQAAA4WaL8BoABDShQAYUoUABaIHAEAkBwBAJ4cAQDIHAEAyhwBAM4c AQDUHAEA+BwBAPwcAQAAHQEAJh0BACgdAQAsHQEAMB0BAEIdAQBEHQEASB0BAEwdAQBWHQEAWh0B AF4dAQD48Ojg1MnBtaqil4uAeG1hVk5CNwAAAAAAABQVaEUY+gAWaLlC7QBDShQAYUoUAAAWFmi5 Qu0AQ0oUAGFKFABtSAkEc0gJBAAOFmjtKn4AQ0oUAGFKFAAAFBVoFgRPABZo7Sp+AENKFABhShQA ABYWaO0qfgBDShQAYUoUAG1ICQRzSAkEABQVaLZYaAAWaLZYaABDShQAYUoUAAAOFmi2WGgAQ0oU AGFKFAAAFBVoFgRPABZotlhoAENKFABhShQAABYWaLZYaABDShQAYUoUAG1ICQRzSAkEABQVaBYE TwAWaBYETwBDShQAYUoUAAAOFmgWBE8AQ0oUAGFKFAAAFBVo9X2WABZoFgRPAENKFABhShQAABYW aBYETwBDShQAYUoUAG1ICQRzSAkEAA4WaEUY+gBDShQAYUoUAAAUFWj1fZYAFmhFGPoAQ0oUAGFK FAAAFhZoRRj6AENKFABhShQAbUgJBHNICQQADhZomwQ4AENKFABhShQAAA4WaPkoEwBDShQAYUoU AAAOFmgQLBkAQ0oUAGFKFAAADhZo/gZ9AENKFABhShQAFF4dAQDIHQEAzB0BANAdAQD0HQEA+B0B APwdAQAQHgEAFB4BABYeAQAYHgEAGh4BAF4eAQBiHgEAZh4BAHYeAQB6HgEAgB4BAIIeAQCGHgEA ih4BAJgeAQDYHgEA3B4BAOAeAQDuHgEADB8BAA4fAQASHwEAFh8BAPjs4fjs1vjsy/jL+OzA+Mv4 tamelo6Cd29nb1tQAAAAAAAAAAAAAAAUFWijUbAAFmj7AAkAQ0oUAGFKFAAAFhZo+wAJAENKFABh ShQAbUgJBHNICQQADhZoFi8iAENKFABhShQAAA4WaGh9IABDShQAYUoUAAAUFWhFGPoAFmhofSAA Q0oUAGFKFAAAFhZoaH0gAENKFABhShQAbUgJBHNICQQADhZoAQweAENKFABhShQAAA4WaCM6NwBD ShQAYUoUAAAUFWi5Qu0AFmgBDB4AQ0oUAGFKFAAAFhZoAQweAENKFABhShQAbUgJBHNICQQAFBVo SjsPABZouULtAENKFABhShQAABQVaDIbGgAWaLlC7QBDShQAYUoUAAAUFWi5Qu0AFmi5Qu0AQ0oU AGFKFAAAFBVo0gZBABZouULtAENKFABhShQAABQVaEUY+gAWaLlC7QBDShQAYUoUAAAWFmi5Qu0A Q0oUAGFKFABtSAkEc0gJBAAOFmi5Qu0AQ0oUAGFKFAAdFh8BADQfAQBcHwEAXh8BAGIfAQBmHwEA gB8BAKYfAQCqHwEArh8BACQgAQBuIAEAciABAHggAQCAIAEAgiABAIYgAQCSIAEAqiABAKwgAQCw IAEAtCABAPjw5dnOxr6yp5+Xi4B4bWFZUVlFOgAAAAAAAAAUFWgGaYsAFmjLYowAQ0oUAGFKFAAA FhZoy2KMAENKFABhShQAbUgJBHNICQQADhZo4BcBAENKFABhShQAAA4WaGcMEQBDShQAYUoUAAAW FmhnDBEAQ0oUAGFKFABtSAkEc0gJBAAUFWikaFoAFmikaFoAQ0oUAGFKFAAADhZopGhaAENKFABh ShQAABQVaNApiAAWaKRoWgBDShQAYUoUAAAWFmikaFoAQ0oUAGFKFABtSAkEc0gJBAAOFmiUGe0A Q0oUAGFKFAAADhZofX/8AENKFABhShQAABQVaJQZ7QAWaJQZ7QBDShQAYUoUAAAWFmiUGe0AQ0oU AGFKFABtSAkEc0gJBAAOFmhgDqsAQ0oUAGFKFAAADhZoo1GwAENKFABhShQAABQVaKNRsAAWaGAO qwBDShQAYUoUAAAWFmhgDqsAQ0oUAGFKFABtSAkEc0gJBAAUFWj7AAkAFmj7AAkAQ0oUAGFKFAAA DhZohTpsAENKFABhShQAAA4WaPsACQBDShQAYUoUABW0IAEARiEBAEghAQBMIQEAUiEBAHIhAQB2 IQEAeiEBAPohAQD8IQEAACIBAAQiAQBiIgEAZCIBAGgiAQBsIgEAciIBAHQiAQB4IgEAfCIBAJgi AQCqIgEArCIBALAiAQD47eHW+Mq/t7/KrLehlYqCd2tgWFBYRAAAAAAAAAAAAAAAAAAAAAAAFhZo XACnAENKFABhShQAbUgJBHNICQQADhZo6Fu9AENKFABhShQAAA4WaGFvswBDShQAYUoUAAAUFWgd N/UAFmhhb7MAQ0oUAGFKFAAAFhZoYW+zAENKFABhShQAbUgJBHNICQQAFBVop2lMABZop2lMAENK FABhShQAAA4WaKdpTABDShQAYUoUAAAUFWgWBE8AFminaUwAQ0oUAGFKFAAAFhZop2lMAENKFABh ShQAbUgJBHNICQQAFBVoZwwRABZouULtAENKFABhShQAABQVaCxW2QAWaLlC7QBDShQAYUoUAAAO Fmi5Qu0AQ0oUAGFKFAAAFBVoRgjJABZouULtAENKFABhShQAABYWaLlC7QBDShQAYUoUAG1ICQRz SAkEABQVaMtijAAWaMtijABDShQAYUoUAAAWFmjLYowAQ0oUAGFKFABtSAkEc0gJBAAUFWgGaYsA FmjLYowAQ0oUAGFKFAAADhZoy2KMAENKFABhShQAF0ghAQByIQEA/CEBAGQiAQB0IgEArCIBANwi AQD6IgEAJCMBAGwjAQB8IwEAliMBALgjAQAoJAEAhiQBANYkAQD6JAEAHCUBAJAlAQCyJQEAAiYB AIomAQDiJgEA+iYBAJgnAQCmJwEAwikBAPoAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA8AAAAAAA AAAAAAAAAPAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAPAAAAAAAAAAAAAA AADwAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAA AAAAAADwAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA 6wAAAAAAAAAAAAAAAOsAAAAAAAAAAAAAAADrAAAAAAAAAAAAAAAA6wAAAAAAAAAAAAAAAOYAAAAA AAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAZ2QnHNAAAAQAAGdkJHeYAAAE AABnZPMCfAAABAAAZ2S5Qu0AAAQAAGdky2KMAAAasCIBALIiAQC0IgEAtiIBANoiAQDcIgEA4CIB AOQiAQDoIgEA+CIBAPoiAQD+IgEAAiMBACIjAQAkIwEAKCMBACwjAQA+IwEAaiMBAGwjAQBwIwEA fCMBAIAjAQCCIwEA9e317eLWy8C4raGWjoN3bGRcZFBIUD0AAAAUFWjLYowAFmjLYowAQ0oUAGFK FAAADhZoy2KMAENKFABhShQAABYWaMtijABDShQAYUoUAG1ICQRzSAkEAA4WaI0TQABDShQAYUoU AAAOFmjwThIAQ0oUAGFKFAAAFBVoKCMkABZo8E4SAENKFABhShQAABYWaPBOEgBDShQAYUoUAG1I CQRzSAkEABQVaMZn+wAWaMZn+wBDShQAYUoUAAAOFmjGZ/sAQ0oUAGFKFAAAFBVoJHeYABZoxmf7 AENKFABhShQAABYWaMZn+wBDShQAYUoUAG1ICQRzSAkEABQVaNIGQQAWaNIGQQBDShQAYUoUAAAO FmjSBkEAQ0oUAGFKFAAAFBVouULtABZo0gZBAENKFABhShQAABQVaLlC7QAWaAJbXgBDShQAYUoU AAAWFmjSBkEAQ0oUAGFKFABtSAkEc0gJBAAUFWhcAKcAFmhcAKcAQ0oUAGFKFAAADhZoXACnAENK FABhShQAABQVaLlC7QAWaFwApwBDShQAYUoUABeCIwEAlCMBAJYjAQCaIwEAniMBALgjAQC8IwEA wCMBACgkAQAsJAEAMCQBAIYkAQCKJAEA1iQBANokAQD6JAEA/iQBAAIlAQAcJQEAICUBACQlAQAy JQEAdiUBAI4lAQCQJQEAlCUBAJglAQCyJQEAtiUBALolAQACJgEABiYBAPjt4db44cv44db44fjh +L+0rKCYkIiAeOFt+OFi+FYAAAAAAAAAAAAAAAAAFhZoJHeYAENKFABhShQAbUgJBHNICQQAFBVo dkLtABZoy2KMAENKFABhShQAABQVaPcRcgAWaMtijABDShQAYUoUAAAOFmibSHEAQ0oUAGFKFAAA DhZoKCMkAENKFABhShQAAA4WaAdzngBDShQAYUoUAAAOFmgOB8UAQ0oUAGFKFAAADhZofgCGAENK FABhShQAABYWaJtIcQBDShQAYUoUAG1ICQRzSAkEAA4WaJVtYgBDShQAYUoUAAAUFWjLYowAFmiV bWIAQ0oUAGFKFAAAFhZolW1iAENKFABhShQAbUgJBHNICQQAFBVoylIzABZoy2KMAENKFABhShQA ABQVaMtijAAWaMtijABDShQAYUoUAAAWFmjLYowAQ0oUAGFKFABtSAkEc0gJBAAUFWjrFcMAFmjL YowAQ0oUAGFKFAAADhZoy2KMAENKFABhShQAHwYmAQCKJgEAjiYBAJImAQDiJgEA5iYBAOomAQD4 JgEA+iYBAP4mAQACJwEAlicBAJgnAQCmJwEAqCcBAPwnAQAIKAEAJigBACgoAQC+KQEAwCkBAMIp AQDcKQEABioBAEoqAQBsKgEAbioBAHAqAQByKgEAdCoBAB4rAQD47OH47Nb4y+zA+MC4sKigqJio jaiFfXWoal6oU6gAAAAAAAAAAAAAAAAUFWgEdZgAFmjzAnwAQ0oUAGFKFAAAFhZo8wJ8AENKFABh ShQAbUgJBHNICQQAFBVohxaUABZo8wJ8AENKFABhShQAAA4WaNps2QBDShQAYUoUAAAOFmjwRtEA Q0oUAGFKFAAADhZoHinqAENKFABhShQAABQVaOcMKAAWaPMCfABDShQAYUoUAAAOFmjgSt8AQ0oU AGFKFAAADhZo/jVmAENKFABhShQAAA4WaPMCfABDShQAYUoUAAAOFmjcbZcAQ0oUAGFKFAAADhZo JxzQAENKFABhShQAABQVaFUMgAAWaCR3mABDShQAYUoUAAAUFWgdN/UAFmgkd5gAQ0oUAGFKFAAA FBVoYA6rABZoJHeYAENKFABhShQAABQVaLlC7QAWaCR3mABDShQAYUoUAAAWFmgkd5gAQ0oUAGFK FABtSAkEc0gJBAAOFmgkd5gAQ0oUAGFKFAAewikBAAYqAQBKKgEAbioBAIIqAQCyKgEACisBAB4r AQBmKwEAeCsBAMorAQDcKwEAGCwBAFgsAQBmLAEAeCwBAJIsAQAELQEAIi0BAE4tAQCCLQEAsC0B AOYtAQAILgEAPC4BAEwuAQBqLgEAni4BANguAQD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoA AAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAA AAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAA APUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAA AAAAAAAAAAAA9QAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAA AAAAAPoAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1 AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAEAABnZEg45AAABAAAZ2TzAnwAABweKwEAZisBAHgrAQCsKwEArisBAMorAQDMKwEAzisB ANArAQDcKwEAViwBAFgsAQCSLAEABC0BALAtAQDILQEAyi0BAEwuAQBqLgEAni4BABovAQAcLwEA PDABAHowAQB8MAEAfjABAIAwAQCEMAEA9DABAPYwAQD6MAEA/DABAAAxAQACMQEABjEBAAgxAQD4 8Pjl+N3Rxt34u9343fiw+Kj43aCYqI2Cem9nW29bb1tvWwAAABYWaHxVwgBDShQAYUoUAG1ICQRz SAkEAA4WaHxVwgBDShQAYUoUAAAUFWh8VcIAFmh8VcIAQ0oUAGFKFAAADhZoTmwdAENKFABhShQA ABQVaNdm0AAWaNEqdQBDShQAYUoUAAAUFWjXZtAAFmjXZtAAQ0oUAGFKFAAADhZo0Sp1AENKFABh ShQAAA4WaLxjHgBDShQAYUoUAAAOFmjXZtAAQ0oUAGFKFAAAFBVowTS/ABZoSDjkAENKFABhShQA ABQVaHJKAQAWaEg45ABDShQAYUoUAAAUFWgEdZgAFmjzAnwAQ0oUAGFKFAAAFhZo8wJ8AENKFABh ShQAbUgJBHNICQQADhZo8wJ8AENKFABhShQAABQVaLpF+gAWaEg45ABDShQAYUoUAAAOFmiWIpoA Q0oUAGFKFAAADhZoSDjkAENKFABhShQAI9guAQDyLgEAHC8BAH4wAQAcMgEAfjQBAGQ1AQAgNgEA 2DYBAE43AQCiNwEA9DcBAIw5AQB8OgEAGDsBALBBAQCsRAEArkQBAPpEAQAQSAEALkgBAPBIAQCO SQEAyEoBAJRNAQBUTgEAXE8BAORPAQCUUAEA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAA AAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAA AAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1 AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAA AAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAA AAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAA AAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABAAAZ2S8Yx4AAAQAAGdk8wJ8AAAcCDEBAAwxAQAOMQEAHjEBACgxAQB4MQEAejEBABwyAQAe MgEAjDIBAJAyAQCSMgEAwjIBAMQyAQDGMgEAyjIBAOQyAQDmMgEA6DIBAO4yAQAEMwEABjMBAAgz AQAQMwEAKjMBADgzAQBMMwEAZjMBAJIzAQCUMwEAljMBAJozAQC8MwEAvjMBAMIzAQDEMwEA+jMB AHw0AQB+NAEAgDQBAIQ0AQDwNAEA9DQBAPY0AQD6NAEA/jQBAGI1AQBkNQEAZjUBANA1AQDUNQEA 2DUBACA2AQAiNgEAJjYBACw2AQA0NgEATDYBAHA2AQCYNgEA9enh2eHp4dnh6fXh9eH14fXp9eH1 6fXh0eHR4fXh9eH16fXhyeHZ4cG1qsG1weHZwbWqwdnBopqimqIAAAAAAAAAAAAOFmjxSkUAQ0oU AGFKFAAADhZoliKaAENKFABhShQAABQVaEg45AAWaEg45ABDShQAYUoUAAAWFmhIOOQAQ0oUAGFK FABtSAkEc0gJBAAOFmhIOOQAQ0oUAGFKFAAADhZoUE1dAENKFABhShQAAA4WaC0QDgBDShQAYUoU AAAOFmhObB0AQ0oUAGFKFAAADhZofFXCAENKFABhShQAABYWaHxVwgBDShQAYUoUAG1ICQRzSAkE ABQVaHxVwgAWaHxVwgBDShQAYUoUADuYNgEAnDYBAKI2AQCmNgEAqjYBAMw2AQDQNgEA1DYBANY2 AQDYNgEA2jYBAN42AQDyNgEA9jYBAEw3AQBONwEAUDcBAGY3AQBoNwEAbDcBAG43AQCiNwEAzDcB ANA3AQDSNwEA9jcBAP43AQACOAEABDgBAAg4AQAMOAEA0DgBAOo4AQDuOAEA8DgBAPQ4AQBQOQEA YjkBAPTs9OHs2dHsycHZua257MG5oq2iuZqOg5q5c6K5Z7nBucG5wV8ADhZoV0ycAENKFABhShQA ABcVaE5sHQAWaMYCPAA1CIFDShQAYUoUAB8VaFdk0AAWaMYCPAA1CIFDShQAYUoUAG1ICQRzSAkE FBVoTmwdABZo5Q8XAENKFABhShQAABYWaOUPFwBDShQAYUoUAG1ICQRzSAkEAA4WaOUPFwBDShQA YUoUAAAUFWjGAjwAFmjGAjwAQ0oUAGFKFAAAFhZoxgI8AENKFABhShQAbUgJBHNICQQADhZoxgI8 AENKFABhShQAAA4WaE5sHQBDShQAYUoUAAAOFmhIOOQAQ0oUAGFKFAAADhZotBjZAENKFABhShQA AA4WaCtMlwBDShQAYUoUAAAUFWiWIpoAFmiWIpoAQ0oUAGFKFAAADhZoliKaAENKFABhShQAABYW aJYimgBDShQAYUoUAG1ICQRzSAkEJWI5AQByOQEAdDkBAIg5AQCMOQEAjjkBADw6AQBAOgEAQjoB AEY6AQBMOgEATjoBAHQ6AQB2OgEAeDoBAIQ6AQDKOgEAzjoBANA6AQAWOwEAGDsBADI7AQA0OwEA PDsBAD47AQAIPAEAHDwBADI8AQBGPAEAIj0BACQ9AQBoPQEAIj8BACw/AQB+PwEABEABAAZAAQDG QAEAyEABAOxAAQDuQAEA8kABAPhAAQBeQQEA+PDk3NTwyL3wyL3wyL3wtametfCWjpaOloaWhpaG lrV+tZZ+lnaWdo5ulgAOFmjBGrEAQ0oUAGFKFAAADhZoZG5lAENKFABhShQAAA4WaExI6gBDShQA YUoUAAAOFmj/CLQAQ0oUAGFKFAAADhZoyGRtAENKFABhShQAAA4WaDgrfQBDShQAYUoUAAAUFWiz HOEAFmizHOEAQ0oUAGFKFAAAFhZosxzhAENKFABhShQAbUgJBHNICQQADhZosxzhAENKFABhShQA ABQVaE5sHQAWaE5sHQBDShQAYUoUAAAWFmhObB0AQ0oUAGFKFABtSAkEc0gJBAAOFmjlDxcAQ0oU AGFKFAAADhZoxgI8AENKFABhShQAABcVaCQaIgAWaE5sHQA+KgFDShQAYUoUAA4WaE5sHQBDShQA YUoUAAAOFmjZC2EAQ0oUAGFKFAArXkEBAGhBAQB8QQEArEEBAK5BAQCwQQEATkIBAFBDAQC6QwEA vEMBAMBDAQDSQwEA3kMBAOJDAQDuQwEAGEQBADJEAQBaRAEAckQBAJpEAQCoRAEAqkQBAK5EAQC8 RAEAwEQBAMREAQDGRAEA0EQBAPhEAQD6RAEA/EQBABhFAQAmRQEAKEUBAEpFAQD48Pjo3dXN6MXo xejF6MXozejNvbXVqp6Sh5J+cme1XLVcAAAAAAAAAAAAABQVaOw74QAWaLxjHgBDShQAYUoUAAAU FWhPQTsAFmi8Yx4AQ0oUAGFKFAAAFxVo7gEuABZovGMeAD4qAUNKFABhShQAERZovGMeAD4qAUNK FABhShQAFBVoy395ABZovGMeAENKFABhShQAABcVaIhQKQAWaLxjHgA+KgFDShQAYUoUABcVaE9B OwAWaLxjHgA+KgFDShQAYUoUABQVaE4XOQAWaLxjHgBDShQAYUoUAAAOFmh7VegAQ0oUAGFKFAAA DhZogXW5AENKFABhShQAAA4WaJAF8gBDShQAYUoUAAAOFmizHOEAQ0oUAGFKFAAADhZo8wJ8AENK FABhShQAABQVaJYimgAWaCtMlwBDShQAYUoUAAAOFmg4K30AQ0oUAGFKFAAADhZowRqxAENKFABh ShQAAA4WaMhkbQBDShQAYUoUACJKRQEAVEUBALBFAQAyRgEANEYBAFRGAQBYRgEAcEYBAIhGAQCS RgEAlEYBAJ5GAQCgRgEApEYBAKhGAQCqRgEAwEYBAMJGAQDURgEA2EYBAPJGAQD0RgEAAEcBAAJH AQAWRwEAGkcBABxHAQAgRwEAIkcBACpHAQAsRwEARkcBAEhHAQBKRwEAYkcBAGRHAQBmRwEAaEcB AGpHAQDmRwEA6EcBAApIAQAMSAEAKkgBAC5IAQAwSAEA+PDl2tLK5crlv8rlyuXK5crlyuXKtMrl tOXKqaGpmY2poY2pyoLKd8p3yoLKAAAAAAAAAAAAFBVoXGeHABZovGMeAENKFABhShQAABQVaIQt YAAWaLxjHgBDShQAYUoUAAAWFmiuEcQAQ0oUAGFKFABtSAkEc0gJBAAOFmj1fW4AQ0oUAGFKFAAA DhZorhHEAENKFABhShQAABQVaK4RxAAWaK4RxABDShQAYUoUAAAUFWjMBXMAFmi8Yx4AQ0oUAGFK FAAAFBVoiFApABZovGMeAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmjEdyEAQ0oUAGFKFAAA FBVoxHchABZoxHchAENKFABhShQAABQVaOw74QAWaLxjHgBDShQAYUoUAAAOFmh7VegAQ0oUAGFK FAAADhZo4ErfAENKFABhShQALTBIAQAySAEANkgBAEJIAQBESAEATEgBAE5IAQBQSAEAVkgBAFpI AQBcSAEAYEgBAGRIAQBuSAEAdEgBAHpIAQB+SAEAhkgBAIpIAQCQSAEAlEgBAPJIAQD2SAEA+kgB AARJAQAGSQEAEkkBABZJAQAYSQEAHEkBAB5JAQAmSQEAKkkBADBJAQA+SQEAjEkBAI5JAQCQSQEA lEkBAJhJAQCiSQEApkkBAKhJAQCwSQEAtEkBAMBJAQDUSQEA2EkBANpJAQDmSQEA6kkBAPpJAQD8 SQEAMkoBADRKAQB8SgEAfkoBAIRKAQCGSgEA8ksBAPRLAQD2SwEA+EsBAAxMAQAYTAEAGkwBAFxM AQD06eHW4cv04enh9Onh6fTp4enh6eH0wOHA4cDh9MD0wOHA4cDh9MDhwOH0wOG4wOH0wOHA4bDh wOHA4cDhwKjhqOEAAA4WaKF8hABDShQAYUoUAAAOFmjgSt8AQ0oUAGFKFAAADhZoVjJrAENKFABh ShQAABQVaO5PzAAWaLxjHgBDShQAYUoUAAAUFWg9ZFgAFmi8Yx4AQ0oUAGFKFAAAFBVo30A1ABZo vGMeAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAUFWiELWAAFmi8Yx4AQ0oUAGFKFAAAFhZovGMe AENKFABhShQAbUgJBHNICQRCXEwBAGBMAQBQTgEAUk4BAFROAQBWTgEAWk4BAFxOAQBeTgEAYE4B AGJOAQBkTgEAZk4BAGhOAQBsTgEAgE4BAIJOAQCETgEAhk4BALZOAQC4TgEA4E4BAOJOAQBcTwEA YE8BAGJPAQBkTwEAZk8BAGpPAQCaTwEAoE8BAKJPAQDGTwEA5E8BAOhPAQDqTwEA7k8BAPJPAQAU UAEAFlABACJQAQAuUAEAMlABAGZQAQBoUAEAblABAHZQAQCOUAEAklABAJRQAQC4UAEAulABAMZQ AQDIUAEA3FABAPjw5drwzvDDzvDOw87D8MPww/C48MPwzrDwzrjwuPCo8M6wzrjw5aDwuPC48Ljw uPCwlbCKsAAAFBVomGkKABZo5wwoAENKFABhShQAABQVaLoFcwAWaOcMKABDShQAYUoUAAAOFmhX TJwAQ0oUAGFKFAAADhZoy2KMAENKFABhShQAAA4WaOcMKABDShQAYUoUAAAUFWijUF8AFmi8Yx4A Q0oUAGFKFAAAFBVoThc5ABZovGMeAENKFABhShQAABYWaLxjHgBDShQAYUoUAG1ICQRzSAkEABQV aFdMnAAWaLxjHgBDShQAYUoUAAAUFWhXTJwAFmhXTJwAQ0oUAGFKFAAADhZovGMeAENKFABhShQA AA4WaKF8hABDShQAYUoUADbcUAEA3lABAJhRAQCaUQEArlEBALBRAQDKUQEAzFEBAPxSAQA2UwEA flMBAIBTAQCOUwEAkFMBAK5TAQCwUwEAaFQBAGpUAQB4VAEAqlQBAKxUAQDCVAEAxlQBAORUAQDm VAEA7lQBAPBUAQCMVQEAmFUBAJpVAQCcVQEAnlUBAL5VAQDOVQEA2FUBADBWAQA8VgEAVlYBAFhW AQBaVgEAXFYBAGBWAQBsVgEAhlYBAJJWAQAiVwEAJFcBACpXAQD17eLt1+3X7c/t1+3X7cftvLTt qe2p7antqe20nu2W7c+W7c/ti+2L7Zbtg+147QAUFWheW14AFmjnDCgAQ0oUAGFKFAAADhZo3GiC AENKFABhShQAABQVaIxNQQAWaOcMKABDShQAYUoUAAAOFmjBGrEAQ0oUAGFKFAAAFBVo9X1uABZo 5wwoAENKFABhShQAABQVaO1oagAWaOcMKABDShQAYUoUAAAOFmgnHNAAQ0oUAGFKFAAAFBVog1fd ABZo5wwoAENKFABhShQAAA4WaEkceABDShQAYUoUAAAOFmj1fW4AQ0oUAGFKFAAAFBVopgr3ABZo 5wwoAENKFABhShQAABQVaIx5zAAWaOcMKABDShQAYUoUAAAOFmjnDCgAQ0oUAGFKFAAAFBVougVz ABZo5wwoAENKFABhShQAL5RQAQDsUAEAMFEBAJpRAQAKVAEAalQBAHhUAQCMVQEAmlUBANZZAQAq WwEAil4BAIxeAQC0XgEAjmEBAGBjAQBkYwEAimMBAJ5jAQC2YwEAyGMBAMpjAQDkYwEA+gAAAAAA AAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAA AAD1AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPoAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAPAAAAAAAAAA AAAAAADwAAAAAAAAAAAAAAAA6gAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAADqAAAAAAAAAAAAAAAA 6gAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAADqAAAAAAAAAAAAAAAA6gAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlmAQAAAAAEAABnZLxjHgAABAAAZ2Qn HNAAAAQAAGdk5wwoAAAWKlcBACxXAQBgVwEAalcBAGxXAQByVwEAdFcBAH5XAQCAVwEAhlcBAI5X AQCsVwEAvFcBAABYAQAaWAEAzFgBAOBYAQAMWQEADlkBABpZAQAuWQEARFkBAExZAQCSWQEAmFkB AJpZAQCuWQEAsFkBANJZAQDWWQEAHFoBAB5aAQBUWgEAVloBALRdAQDmXQEADF4BAEZeAQBIXgEA hl4BAIheAQCKXgEAjF4BAPXt5dnl2eXZ5e3RydHB0cHRudGx0bHRqZ2pnanRwZXBlcGNhY19jcFy 0QAAAAAAAAAAAAAAAAAAFBVoXlteABZo3GiCAENKFABhShQAAA4WaDdCBABDShQAYUoUAAAOFmiB L0EAQ0oUAGFKFAAADhZorSjkAENKFABhShQAAA4WaMlWrABDShQAYUoUAAAXFWhOeBkAFmhOeBkA NQiBQ0oUAGFKFAAOFmhOeBkAQ0oUAGFKFAAADhZo2wbPAENKFABhShQAAA4WaAUTewBDShQAYUoU AAAOFmjcaIIAQ0oUAGFKFAAADhZoqiRaAENKFABhShQAAA4WaOcMKABDShQAYUoUAAAXFWjHRfEA FmjHRfEANQiBQ0oUAGFKFAAOFmjHRfEAQ0oUAGFKFAAADhZo9X1uAENKFABhShQAABQVaF5bXgAW aOcMKABDShQAYUoUACqMXgEAml4BAJ5eAQCgXgEAol4BAKReAQCyXgEAtF4BABZgAQAYYAEAIGAB ACJgAQBQYAEAUmABAFpgAQBeYAEAaGABAGpgAQBuYAEAfmABANJgAQDiYAEABGEBAAZhAQCOYQEA lGEBAJZhAQCYYQEArmEBALxhAQC+YQEAyGEBAMphAQDMYQEA0mEBANRhAQDWYQEA4GEBAOJhAQD1 6eDUyeC9ta21rbWilqK1orWOtYa1hrV+drV2tXa1dqJudmO1dgAAAAAUFWjPdNsAFmjPdNsAQ0oU AGFKFAAADhZoz3TbAENKFABhShQAAA4WaNkWeABDShQAYUoUAAAOFmjhPksAQ0oUAGFKFAAADhZo bG6QAENKFABhShQAAA4WaIF1uQBDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAUFWjf QDUAFmi8Yx4AQ0oUAGFKFAAADhZokHTQAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWjuAS4A Fmi8Yx4APioBQ0oUAGFKFAAUFWhkGvIAFmi8Yx4AQ0oUAGFKFAAAFxVoWyjaABZovGMeAD4qAUNK FABhShQAERZovGMeAD4qAUNKFABhShQAFxVoT0E7ABZovGMeAD4qAUNKFABhShQAFBVoThc5ABZo vGMeAENKFABhShQAJuJhAQDkYQEA9GEBAPZhAQD4YQEA+mEBABhiAQAaYgEAHGIBADxiAQA+YgEA qmIBAK5iAQDGYgEAAmMBAARjAQAcYwEAWmMBAFxjAQBeYwEAYGMBAGJjAQCCYwEAhGMBAIZjAQCI YwEAmGMBAJxjAQCeYwEAsGMBALJjAQD17eXt2u3a7dLH0se/0se30sf17ambjoRym2RPm2QAAAAA KBVokVT2ABZo4StKAENKFABPSgIAUUoCAF5KAgBhShQAbUgJBHNICQQAGhZokVT2AENKFABPSgIA UUoCAF5KAgBhShQAACMVaJFU9gAWaJFU9gA1CIFDSigAT0oCAFFKAgBeSgIAYUooABIWaJFU9gBP SgIAUUoCAF5KAgAAGBVoN0IEABZo4StKAE9KAgBRSgIAXkoCAAAaFmjhK0oAQ0oUAE9KAgBRSgIA XkoCAGFKFAAAGhZoNT+6AENKFABPSgIAUUoCAF5KAgBhShQAAA4WaPp/BwBDShQAYUoUAAAOFmg3 QgQAQ0oUAGFKFAAAFBVoQUOHABZoQUOHAENKFABhShQAAA4WaEFDhwBDShQAYUoUAAAUFWhGaIcA Fmi8Yx4AQ0oUAGFKFAAADhZo2RZ4AENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAUFWjfQDUAFmi8 Yx4AQ0oUAGFKFAAesmMBALRjAQC2YwEAwmMBAMRjAQDGYwEAyGMBAMpjAQDeYwEA4GMBAOJjAQDk YwEA5mMBAOpjAQAMZAEAEmQBADBkAQBKZAEAWmQBAGBkAQCgZAEAvmQBAORkAQD4ZAEADGUBAPLh 08Xy4bDTnoywhHbTaNNa01rTTNM+0xoWaMJscABDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmhzCncA Q0oUAE9KAgBRSgIAXkoCAGFKFAAAGhZoni/zAENKFABPSgIAUUoCAF5KAgBhShQAABoWaAQGBgBD ShQAT0oCAFFKAgBeSgIAYUoUAAAbFWjhK0oAFmjhK0oANQiBT0oCAFFKAgBeSgIADhZo4StKAENK FABhShQAACIWaJFU9gBDShQAT0oCAFFKAgBeSgIAYUoUAG1ICQRzSAkEACIWaGlXMQBDShQAT0oC AFFKAgBeSgIAYUoUAG1ICQRzSAkEACgVaJFU9gAWaOErSgBDShQAT0oCAFFKAgBeSgIAYUoUAG1I CQRzSAkEABoWaGlXMQBDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmjhK0oAQ0oUAE9KAgBRSgIAXkoC AGFKFAAAIBVoQXgfABZo4StKAENKFABPSgIAUUoCAF5KAgBhShQAABoWaEF4HwBDShQAT0oCAFFK AgBeSgIAYUoUABjkYwEA5mMBAOpjAQBsZAEAKQAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAjAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAFiQBSWYBAAAA1gAAa2TBAAAAFiQBFyQBSWYBAAAA ApZsAAeUQAEI1p4AB/b/aQHtCNwN5BZSGy8e9yQAJ08A/////////////////////wAnkAoEAQAA /////wgBAAD/////ACdPBwQBAAD/////CAEAAP////8AJ6UGBAEAAP////8IAQAA/////wAngwYE AQAA/////wgBAAD/////ACcJBAQBAAD/////CAEAAP////8AJ18GBAEAAP////8IAQAA/////xT2 A58kFTYBF/YDAAAY9gMAABrWHP////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8b1hz///////// ////////////////////////////HNYc/////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x3WHP// //////////////////////////////////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWRgAAAP8A AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAA AP8AAAD/AAAAA2xkAQDUZAEAZGUBAMhlAQAsZgEALmYBADJmAQD5AAAAAAAAAAAAAAAA+QAAAAAA AAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAPkAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAC+AABrZB4CAAAWJAEXJAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3k Fi8e9yQAJ08A////////////////BAEAAAAnkAr/////////////////////ACdPB/////////// //////////8AJ6UG/////////////////////wAngwb/////////////////////ACdfBv////// //////////////8U9gOfJBU2ARf2AwAAGPYDAAAa1hj///////////////////////////////8b 1hj///////////////////////////////8c1hj///////////////////////////////8d1hgA AAD///////////////////////////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/ AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYk AUlmAQAAAAAGDGUBADBlAQBiZQEALGYBAC5mAQAyZgEARmcBAEpnAQB+ZwEAhGcBAIZnAQCIZwEA jGcBAPBnAQD+ZwEAkGgBAKBoAQCiaAEApGgBAKhoAQB0aQEAgmkBAORpAQDmaQEA6mkBAHxqAQB+ agEAlGoBAKJqAQA+awEAQGsBAERrAQCqawEAvmsBAMBrAQDy5NbOwNay1qTWzsDWltak1s7A1ojW zsDWeoh61s7A1mxXKBVokVT2ABZo4StKAENKFABPSgIAUUoCAF5KAgBhShQAbUgJBHNICQQAGhZo oma7AENKFABPSgIAUUoCAF5KAgBhShQAABoWaPV9bgBDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmgz EPoAQ0oUAE9KAgBRSgIAXkoCAGFKFAAAGhZocUYhAENKFABPSgIAUUoCAF5KAgBhShQAABoWaJ4v 8wBDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmioDgEAQ0oUAE9KAgBRSgIAXkoCAGFKFAAAGxVo4StK ABZo4StKADUIgU9KAgBRSgIAXkoCAA4WaOErSgBDShQAYUoUAAAaFmjhK0oAQ0oUAE9KAgBRSgIA XkoCAGFKFAAAGhZoyjD5AENKFABPSgIAUUoCAF5KAgBhShQAABoWaHMKdwBDShQAT0oCAFFKAgBe SgIAYUoUACIyZgEAYGYBAIJmAQCmZgEAIGcBAIZnAQCIZwEA+QAAAAAAAAAAAAAAAPkAAAAAAAAA AAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAvgAAa2RpAwAAFiQBFyQBSWYBAAAAApZsAAeUlwMI1ogABvb/aQHtCNwN5BYv HvckACdPAAQBAAD/////BAEAAAQBAAAAJ5AK/////////////////////wAnTwf///////////// ////////ACelBv////////////////////8AJ4MG/////////////////////wAnXwb///////// ////////////FPYDnyQVNgEX9gMAABj2AwAAGtYYAAAA////////////////////////////G9YY ////////////////////////////////HNYYAAAA////////////////////////////HdYYAAAA ////////////////////////////NNYGAAEFAwAANNYGAAEKA2wAYfYDYgBw1jwAAAD/AAAA/wAA AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAGAAAWJAFJ ZgEAAAAABohnAQCMZwEAtmcBAAZoAQAyaAEAVGgBAKJoAQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAA AAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlm AQAAAAAGomgBAKRoAQCoaAEA3GgBAA5pAQBGaQEAhGkBAEEAAAAAAAAAAAAAAAA7AAAAAAAAAAAA AAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAYAABYkAUlmAQAAAL4AAGtkmAQAABYkARckAUlmAQAAAAKWbAAHlDYBCNaIAAb2 /2kB7QjcDeQWLx73JAAnTwD///////////////8EAQAAACeQCv////////////////////8AJ08H /////////////////////wAnpQb/////////////////////ACeDBv////////////////////8A J18G/////////////////////xT2A58kFTYBF/YDAAAY9gMAABrWGP////////////////////// /////////xvWGP///////////////////////////////xzWGP////////////////////////// /////x3WGAAAAP///////////////////////////zTWBgABBQMAADTWBgABCgNsAGH2A2IAcNY8 AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAaEaQEA5GkBAOZpAQDqaQEAPGoBAHxqAQCkagEA+QAAAAAAAAAAAAAAADsAAAAAAAAAAAAA AAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAvgAAa2TjBQAAFiQBFyQBSWYBAAAAApZsAAeUNgEI1ogABvb/aQHtCNwN5BYvHvck ACdPAP///////////////wQBAAAAJ5AK/////////////////////wAnTwf///////////////// ////ACelBv////////////////////8AJ4MG/////////////////////wAnXwb///////////// ////////FPYDnyQVNgEX9gMAABj2AwAAGtYY////////////////////////////////G9YY//// ////////////////////////////HNYY////////////////////////////////HdYYAAAA//// ////////////////////////NNYGAAEFAwAANNYGAAEKA2wAYfYDYgBw1jwAAAD/AAAA/wAAAAAA /wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAGAAAWJAFJZgEA AAAABqRqAQD+agEAPmsBAEBrAQBEawEAVGsBAFZrAQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAA ADsAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAC+AABrZC4HAAAWJAEXJAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQA J08A////////////////BAEAAAAnkAr/////////////////////ACdPB/////////////////// //8AJ6UG/////////////////////wAngwb/////////////////////ACdfBv////////////// //////8U9gOfJBU2ARf2AwAAGPYDAAAa1hj///////////////////////////////8b1hj///// //////////////////////////8c1hj///////////////////////////////8d1hgAAAD///// //////////////////////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/ AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAA AAAGVmsBAHxrAQCMawEAjmsBAMBrAQAGbAEA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAA AAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAFiQBSWYBAAAA AAXAawEABmwBAAhsAQAMbAEA8GwBAPJsAQD2bAEAFm0BACRtAQDUbQEA1m0BANptAQDsbQEA/m0B ABBuAQBmbgEAgG4BANRuAQDWbgEA2m4BABRvAQAWbwEAKm8BAEBvAQBCbwEAVm8BAFhvAQCSbwEA lG8BAJZvAQCabwEAHHABAB5wAQAicAEALnABADBwAQA4cAEAOnABAEZwAQDIcAEAynABAM5wAQB6 cQEAfHEBAIBxAQCScQEAlHEBAPLq3PLq3PLO8urc8s7A8s7y6tzywM7A8s7ysvLq3PLq3PKhk4WT 8urc8urc8ncAAAAAGhZocUYhAENKFABPSgIAUUoCAF5KAgBhShQAABoWaDMQ+gBDShQAT0oCAFFK AgBeSgIAYUoUAAAaFmgnHNAAQ0oUAE9KAgBRSgIAXkoCAGFKFAAAIBVoJxzQABZoJxzQAENKFABP SgIAUUoCAF5KAgBhShQAABoWaIA9CwBDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmhDS80AQ0oUAE9K AgBRSgIAXkoCAGFKFAAAGhZoKWMoAENKFABPSgIAUUoCAF5KAgBhShQAABsVaOErSgAWaOErSgA1 CIFPSgIAUUoCAF5KAgAOFmjhK0oAQ0oUAGFKFAAAGhZo4StKAENKFABPSgIAUUoCAF5KAgBhShQA LgZsAQAIbAEAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAABrZHkIAAAWJAEXJAFJZgEAAAAC lmwAB5Q2AQjWtAAI9v9pAQgI7QjcDWAS5BYvHvckACdPAP///////////////wQBAAAAJ/oJ//// /////////////////wAnlgD/////////////////////ACdPB/////////////////////8AJ6UG /////////////////////wAnpQb/////////////////////ACeDBv////////////////////8A J18G/////////////////////xT2A58kFTYBF/YDAAAY9gMAABrWIP////////////////////// ////////////////////G9Yg//////////////////////////////////////////8c1iD///// /////////////////////////////////////x3WIAAAAP////////////////////////////// ////////NNYGAAEFAwAANNYGAAEKA2wAYfYDYgBw1lAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8A AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAB CGwBAAxsAQA2bAEASGwBAIZsAQCgbAEA8GwBAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAA AAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAFiQBSWYBAAAAAAbw bAEA8mwBAPZsAQAmbQEAQG0BAIptAQCYbQEAQQAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAA AAAAAAAAAAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABgAAFiQBSWYBAAAAvgAAa2T2CQAAFiQBFyQBSWYBAAAAApZsAAeUNgEI1ogABvb/aQHtCNwN 5BYvHvckACdPAP///////////////wQBAAAAJ5AK/////////////////////wAnTwf///////// ////////////ACelBv////////////////////8AJ4MG/////////////////////wAnXwb///// ////////////////FPYDnyQVNgEX9gMAABj2AwAAGtYY//////////////////////////////// G9YY////////////////////////////////HNYY////////////////////////////////HdYY AAAA////////////////////////////NNYGAAEFAwAANNYGAAEKA2wAYfYDYgBw1jwAAAD/AAAA /wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAABpht AQDUbQEA1m0BANptAQASbgEAHm4BAIJuAQD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAPkAAAAA AAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAC+AABrZEELAAAWJAEXJAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQAJ08A//// ////////////BAEAAAAnkAr/////////////////////ACdPB/////////////////////8AJ6UG /////////////////////wAngwb/////////////////////ACdfBv////////////////////8U 9gOfJBU2ARf2AwAAGPYDAAAa1hj///////////////////////////////8b1hj///////////// //////////////////8c1hj///////////////////////////////8d1hgAAAD///////////// //////////////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAA AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAGgm4B AKRuAQDUbgEA1m4BANpuAQD0bgEA/m4BAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAOwAAAAAA AAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AL4AAGtkjAwAABYkARckAUlmAQAAAAKWbAAHlDYBCNaIAAb2/2kB7QjcDeQWLx73JAAnTwD///// //////////8EAQAAACeQCv////////////////////8AJ08H/////////////////////wAnpQb/ ////////////////////ACeDBv////////////////////8AJ18G/////////////////////xT2 A58kFTYBF/YDAAAY9gMAABrWGP///////////////////////////////xvWGP////////////// /////////////////xzWGP///////////////////////////////x3WGAAAAP////////////// /////////////zTWBgABBQMAADTWBgABCgNsAGH2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAA AAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAABgAAFiQBSWYBAAAAAAb+bgEA Qm8BAFhvAQCUbwEAlm8BAJpvAQDEbwEA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAA AAAAAAAAOwAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA vgAAa2TXDQAAFiQBFyQBSWYBAAAAApZsAAeUNgEI1ogABvb/aQHtCNwN5BYvHvckACdPAP////// /////////wQBAAAAJ5AK/////////////////////wAnTwf/////////////////////ACelBv// //////////////////8AJ4MG/////////////////////wAnXwb/////////////////////FPYD nyQVNgEX9gMAABj2AwAAGtYY////////////////////////////////G9YY//////////////// ////////////////HNYY////////////////////////////////HdYYAAAA//////////////// ////////////NNYGAAEFAwAANNYGAAEKA2wAYfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAA AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAGAAAWJAFJZgEAAAAABsRvAQDM bwEA8G8BAAxwAQAccAEAHnABACJwAQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAA AAAAAAD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+ AABrZCIPAAAWJAEXJAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQAJ08A//////// ////////BAEAAAAnkAr/////////////////////ACdPB/////////////////////8AJ6UG//// /////////////////wAngwb/////////////////////ACdfBv////////////////////8U9gOf JBU2ARf2AwAAGPYDAAAa1hj///////////////////////////////8b1hj///////////////// //////////////8c1hj///////////////////////////////8d1hgAAAD///////////////// //////////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA /wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAGInABAEhw AQB+cAEAmHABAKZwAQCocAEAyHABAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAA AAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAFiQBSWYBAAAAAAbIcAEAynAB AM5wAQDucAEAKQAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAABgAAFiQBSWYBAAAA1gAAa2RtEAAAFiQBFyQBSWYBAAAAApZsAAeUNgEI1p4AB/b/aQHt CNwN5BZSGy8e9yQAJ08A////////////////BAEAAAAnkAr/////////////////////ACdPB/// //////////////////8AJ6UG/////////////////////wAngwb/////////////////////ACcJ BP////////////////////8AJ18G/////////////////////xT2A58kFTYBF/YDAAAY9gMAABrW HP////////////////////////////////////8b1hz///////////////////////////////// ////HNYc/////////////////////////////////////x3WHAAAAP////////////////////// //////////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWRgAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA /wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAA+5wAQAIcQEA JnEBAExxAQB6cQEAfHEBAIBxAQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAA AAD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+AABr ZNgRAAAWJAEXJAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQAJ08A//////////// ////BAEAAAAnkAr/////////////////////ACdPB/////////////////////8AJ6UG//////// /////////////wAngwb/////////////////////ACdfBv////////////////////8U9gOfJBU2 ARf2AwAAGPYDAAAa1hj///////////////////////////////8b1hj///////////////////// //////////8c1hj///////////////////////////////8d1hgAAAD///////////////////// //////801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAGgHEBALhxAQDM cQEA9HEBABpyAQA+cgEAQHIBAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAA APkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4AAGtk IxMAABYkARckAUlmAQAAAAKWbAAHlDYBCNaIAAb2/2kB7QjcDeQWLx73JAAnTwD///////////// //8EAQAAACeQCv////////////////////8AJ08H/////////////////////wAnpQb///////// ////////////ACeDBv////////////////////8AJ18G/////////////////////xT2A58kFTYB F/YDAAAY9gMAABrWGP///////////////////////////////xvWGP////////////////////// /////////xzWGP///////////////////////////////x3WGAAAAP////////////////////// /////zTWBgABBQMAADTWBgABCgNsAGH2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAABgAAFiQBSWYBAAAAAAaUcQEA3HEBAOZx AQA+cgEAQHIBAERyAQBecgEAbHIBAGxzAQBucwEAhHMBAAJ0AQAEdAEACHQBAAp0AQAQdQEAEnUB ABZ1AQDsdQEA7nUBAPJ1AQAudgEAVnYBAJx2AQCedgEAonYBAKZ2AQA6dwEAUncBAJJ3AQCUdwEA oHcBAKx3AQCudwEAsHcBALR3AQAeeAEALHgBADp4AQBWeAEA8uTy3M7ywPKy5PLczqTy3M7y3M7y lvLczojyiPJ68nry3M7ybIjyAAAAAAAAAAAAAAAAAAAAAAAaFmgkJ8wAQ0oUAE9KAgBRSgIAXkoC AGFKFAAAGhZo8E58AENKFABPSgIAUUoCAF5KAgBhShQAABoWaJ4v8wBDShQAT0oCAFFKAgBeSgIA YUoUAAAaFmgzEPoAQ0oUAE9KAgBRSgIAXkoCAGFKFAAAGhZocwp3AENKFABPSgIAUUoCAF5KAgBh ShQAABoWaAQGBgBDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmgpYygAQ0oUAE9KAgBRSgIAXkoCAGFK FAAAGxVo4StKABZo4StKADUIgU9KAgBRSgIAXkoCAA4WaOErSgBDShQAYUoUAAAaFmiiZrsAQ0oU AE9KAgBRSgIAXkoCAGFKFAAAGhZo4StKAENKFABPSgIAUUoCAF5KAgBhShQAJ0ByAQBEcgEAbnIB AKRyAQAicwEAhnMBAAJ0AQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5 AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlmAQAAAAAGAnQBAAR0AQAIdAEA OHQBAI50AQDCdAEA9nQBAEEAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADsA AAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlm AQAAAL4AAGtkbhQAABYkARckAUlmAQAAAAKWbAAHlDYBCNaIAAb2/2kB7QjcDeQWLx73JAAnTwD/ //////////////8EAQAAACeQCv////////////////////8AJ08H/////////////////////wAn pQb/////////////////////ACeDBv////////////////////8AJ18G//////////////////// /xT2A58kFTYBF/YDAAAY9gMAABrWGP///////////////////////////////xvWGP////////// /////////////////////xzWGP///////////////////////////////x3WGAAAAP////////// /////////////////zTWBgABBQMAADTWBgABCgNsAGH2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/ AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAb2dAEAEHUBABJ1AQAW dQEALnUBAGh1AQCudQEA+QAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAA AAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvgAAa2S5FQAA FiQBFyQBSWYBAAAAApZsAAeUNgEI1ogABvb/aQHtCNwN5BYvHvckACdPAP///////////////wQB AAAAJ5AK/////////////////////wAnTwf/////////////////////ACelBv////////////// //////8AJ4MG/////////////////////wAnXwb/////////////////////FPYDnyQVNgEX9gMA ABj2AwAAGtYY////////////////////////////////G9YY//////////////////////////// ////HNYY////////////////////////////////HdYYAAAA//////////////////////////// NNYGAAEFAwAANNYGAAEKA2wAYfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAA AAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAGAAAWJAFJZgEAAAAABq51AQDCdQEA7HUBAO51 AQDydQEAGnYBACR2AQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAD5AAAA AAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+AABrZAQXAAAW JAEXJAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQAJ08A////////////////BAEA AAAnkAr/////////////////////ACdPB/////////////////////8AJ6UG//////////////// /////wAngwb/////////////////////ACdfBv////////////////////8U9gOfJBU2ARf2AwAA GPYDAAAa1hj///////////////////////////////8b1hj///////////////////////////// //8c1hj///////////////////////////////8d1hgAAAD///////////////////////////80 1gYAAQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAA AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAGJHYBAFh2AQBadgEAbnYB AJx2AQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAFiQBSWYBAAAAAAScdgEAnnYBAKJ2AQDUdgEA KQAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAA FiQBSWYBAAAA1gAAa2RPGAAAFiQBFyQBSWYBAAAAApZsAAeUNgEI1p4AB/b/aQHtCNwNYBLkFi8e 9yQAJ08A////////////////BAEAAAAnkAr/////////////////////ACdPB/////////////// //////8AJ6UG/////////////////////wAnpQb/////////////////////ACeDBv////////// //////////8AJ18G/////////////////////xT2A58kFTYBF/YDAAAY9gMAABrWHP////////// //////////////////////////8b1hz/////////////////////////////////////HNYc//// /////////////////////////////////x3WHAAAAP////////////////////////////////80 1gYAAQUDAAA01gYAAQoDbABh9gNiAHDWRgAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAA AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAA9R2AQAMdwEAVHcBAJJ3AQCu dwEAsHcBALR3AQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAA AAAAAAAAOwAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+AABrZKwZAAAWJAEX JAFJZgEAAAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQAJ08A////////////////BAEAAAAn kAr/////////////////////ACdPB/////////////////////8AJ6UG//////////////////// /wAngwb/////////////////////ACdfBv////////////////////8U9gOfJBU2ARf2AwAAGPYD AAAa1hj///////////////////////////////8b1hj///////////////////////////////8c 1hj///////////////////////////////8d1hgAAAD///////////////////////////801gYA AQUDAAA01gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8A AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAGtHcBAOZ3AQD6dwEAPHgBAGZ4 AQCQeAEAkngBAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAA AAAAAAD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4AAGtk9xoAABYkARck AUlmAQAAAAKWbAAHlDYBCNaIAAb2/2kB7QjcDeQWLx73JAAnTwD///////////////8EAQAAACeQ Cv////////////////////8AJ08H/////////////////////wAnpQb///////////////////// ACeDBv////////////////////8AJ18G/////////////////////xT2A58kFTYBF/YDAAAY9gMA ABrWGP///////////////////////////////xvWGP///////////////////////////////xzW GP///////////////////////////////x3WGAAAAP///////////////////////////zTWBgAB BQMAADTWBgABCgNsAGH2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAABgAAFiQBSWYBAAAAAAZWeAEAZHgBAJB4AQCSeAEAlngB AJh4AQCgeAEAuHgBAFx5AQBeeQEAYnkBABB6AQASegEAFnoBACh6AQAqegEAMHoBADJ6AQA0egEA RHoBAEx6AQBcegEAbnoBAHB6AQB4egEAmHoBANB6AQDkegEAQHsBAEJ7AQBGewEAjnsBAJp7AQDy 5NzOwOTA5NzO5NzO5K6grpF/cH9wf+Ri5MDk3M7kVAAAAAAaFmjXf8IAQ0oUAE9KAgBRSgIAXkoC AGFKFAAAGhZobkg+AENKFABPSgIAUUoCAF5KAgBhShQAAB0WaENLzQA2CIFDShQAT0oCAFFKAgBe SgIAYUoUACMVaENLzQAWaENLzQA2CIFDShQAT0oCAFFKAgBeSgIAYUoUAB0WaENLzQA1CIFDShQA T0oCAFFKAgBeSgIAYUoUABoWaENLzQBDShQAT0oCAFFKAgBeSgIAYUoUAAAjFWhDS80AFmhDS80A NQiBQ0oUAE9KAgBRSgIAXkoCAGFKFAAaFmgpYygAQ0oUAE9KAgBRSgIAXkoCAGFKFAAAGxVo4StK ABZo4StKADUIgU9KAgBRSgIAXkoCAA4WaOErSgBDShQAYUoUAAAaFmjhK0oAQ0oUAE9KAgBRSgIA XkoCAGFKFAAAGhZokVT2AENKFABPSgIAUUoCAF5KAgBhShQAIJJ4AQCWeAEAuHgBAMZ4AQDseAEA EnkBAFx5AQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAA AAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlmAQAAAAAGXHkBAF55AQBieQEAnnkBAL55AQDW eQEA8HkBAEEAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAA AAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlmAQAAAL4AAGtk QhwAABYkARckAUlmAQAAAAKWbAAHlDYBCNaIAAb2/2kB7QjcDeQWLx73JAAnTwD///////////// //8EAQAAACeQCv////////////////////8AJ08H/////////////////////wAnpQb///////// ////////////ACeDBv////////////////////8AJ18G/////////////////////xT2A58kFTYB F/YDAAAY9gMAABrWGP///////////////////////////////xvWGP////////////////////// /////////xzWGP///////////////////////////////x3WGAAAAP////////////////////// /////zTWBgABBQMAADTWBgABCgNsAGH2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAbweQEAEHoBABJ6AQAWegEAcnoBAJp6 AQDmegEA+QAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAA APkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvgAAa2SNHQAAFiQBFyQBSWYB AAAAApZsAAeUNgEI1ogABvb/aQHtCNwN5BYvHvckACdPAP///////////////wQBAAAAJ5AK//// /////////////////wAnTwf/////////////////////ACelBv////////////////////8AJ4MG /////////////////////wAnXwb/////////////////////FPYDnyQVNgEX9gMAABj2AwAAGtYY ////////////////////////////////G9YY////////////////////////////////HNYY//// ////////////////////////////HdYYAAAA////////////////////////////NNYGAAEFAwAA NNYGAAEKA2wAYfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAA AAAA/wAAAP8AAAAAAP8AAAD/AAAGAAAWJAFJZgEAAAAABuZ6AQAwewEAQHsBAEJ7AQBGewEAXnsB AJx7AQD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA +QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+AABrZNgeAAAWJAEXJAFJZgEA AAAClmwAB5Q2AQjWiAAG9v9pAe0I3A3kFi8e9yQAJ08A////////////////BAEAAAAnkAr///// ////////////////ACdPB/////////////////////8AJ6UG/////////////////////wAngwb/ ////////////////////ACdfBv////////////////////8U9gOfJBU2ARf2AwAAGPYDAAAa1hj/ //////////////////////////////8b1hj///////////////////////////////8c1hj///// //////////////////////////8d1hgAAAD///////////////////////////801gYAAQUDAAA0 1gYAAQoDbABh9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAA AAD/AAAA/wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAGmnsBAJx7AQAcfAEAHnwBACJ8AQAyfAEA NHwBANJ8AQDUfAEA2HwBAAp9AQAMfQEAIn0BAC59AQB2fQEAeH0BAHx9AQAafgEAMn4BAEB+AQBC fgEARH4BAEh+AQBKfgEATH4BAFp+AQBufgEAcH4BAHJ+AQCEfgEAjH4BAJB+AQCafgEAnH4BAOx+ AQDufgEA8H4BAO/h2cu9r+HZy+Gv4a/h2cvhoeGh4aHh2ZaHeHBocGhwaHBdcAAAFBVoukU6ABZo vGMeAENKFABhShQAAA4WaJEE0wBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAHBVocwp3ABZo4StK AENKFgBhShYAbUgJBHNICQQAHBVocwp3ABZoJxzQAENKFgBhShYAbUgJBHNICQQAFBVocwp3ABZo JxzQAENKFgBhShYAABoWaIA9CwBDShQAT0oCAFFKAgBeSgIAYUoUAAAaFmhDS80AQ0oUAE9KAgBR SgIAXkoCAGFKFAAAGhZoJxzQAENKFABPSgIAUUoCAF5KAgBhShQAABsVaOErSgAWaOErSgA1CIFP SgIAUUoCAF5KAgAOFmjhK0oAQ0oUAGFKFAAAGhZo4StKAENKFABPSgIAUUoCAF5KAgBhShQAACAV aNd/wgAWaOErSgBDShQAT0oCAFFKAgBeSgIAYUoUACScewEAxHsBAOJ7AQAcfAEAHnwBACJ8AQA2 fAEA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAPkA AAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvgAAa2QjIAAAFiQBFyQBSWYBAAAA ApZsAAeUNgEI1ogABvb/aQHtCNwN5BYvHvckACdPAP///////////////wQBAAAAJ5AK//////// /////////////wAnTwf/////////////////////ACelBv////////////////////8AJ4MG//// /////////////////wAnXwb/////////////////////FPYDnyQVNgEX9gMAABj2AwAAGtYY//// ////////////////////////////G9YY////////////////////////////////HNYY//////// ////////////////////////HdYYAAAA////////////////////////////NNYGAAEFAwAANNYG AAEKA2wAYfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA /wAAAP8AAAAAAP8AAAD/AAAGAAAWJAFJZgEAAAAABjZ8AQBIfAEAUnwBAFR8AQCMfAEA0nwBAPkA AAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAYAABYkAUlmAQAAAAAF0nwBANR8AQDYfAEA8nwBACkAAAAAAAAAAAAA AAAjAAAAAAAAAAAAAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAABYkAUlmAQAAANYA AGtkbiEAABYkARckAUlmAQAAAAKWbAAHlDYBCNaeAAf2/2kB7QjcDWAS5BYvHvckACdPAP////// /////////wQBAAAAJ5AK/////////////////////wAnTwf/////////////////////ACelBv// //////////////////8AJ6UG/////////////////////wAngwb/////////////////////ACdf Bv////////////////////8U9gOfJBU2ARf2AwAAGPYDAAAa1hz///////////////////////// ////////////G9Yc/////////////////////////////////////xzWHP////////////////// //////////////////8d1hwAAAD/////////////////////////////////NNYGAAEFAwAANNYG AAEKA2wAYfYDYgBw1kYAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA /wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAPyfAEACn0BADB9AQBEfQEAdn0BAHh9AQB8fQEA +QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAADsAAAAA AAAAAAAAAAD5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvgAAa2TLIgAAFiQBFyQBSWYBAAAAApZs AAeUNgEI1ogABvb/aQHtCNwN5BYvHvckACdPAP///////////////wQBAAAAJ5AK//////////// /////////wAnTwf/////////////////////ACelBv////////////////////8AJ4MG//////// /////////////wAnXwb/////////////////////FPYDnyQVNgEX9gMAABj2AwAAGtYY//////// ////////////////////////G9YY////////////////////////////////HNYY//////////// ////////////////////HdYYAAAA////////////////////////////NNYGAAEFAwAANNYGAAEK A2wAYfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAAAAAP8AAAD/AAAGAAAWJAFJZgEAAAAABnx9AQC2fQEA6H0BABp+AQBKfgEATH4BAHB+AQDw fgEAlH8BAPkAAAAAAAAAAAAAAAD5AAAAAAAAAAAAAAAA+QAAAAAAAAAAAAAAAPkAAAAAAAAAAAAA AABTAAAAAAAAAAAAAAAATgAAAAAAAAAAAAAAAE4AAAAAAAAAAAAAAABOAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAEAABnZLxjHgCmAABrZBYkAAAWJAEXJAFJZgEAAAAClmwAB5Q2AQjWcgAF 9v9pAdwN5BYvHvckACdPAP////////////////////8AJ08H/////////////////////wAnpQb/ ////////////////////ACeDBv////////////////////8AJ18G/////////////////////xT2 A58kFTYBF/YDAAAY9gMAABrWFP//////////////////////////G9YU//////////////////// //////8c1hT//////////////////////////x3WFP//////////////////////////NNYGAAEF AwAANNYGAAEKA2wAYfYDYgBw1jIAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAAA/wAAAP8AAAYAABYkAUlmAQAAAAAI8H4BAPR+AQD4fgEACn8BAAx/AQAOfwEAEH8BADR/ AQA4fwEAbH8BAHB/AQCSfwEAlH8BAJh/AQCcfwEAqH8BAKx/AQDgfwEA5H8BAAqAAQAMgAEAEIAB ABKAAQBOgAEAUIABAHiAAQB6gAEAkIABAJaAAQDOgAEA0IABANyAAQDegAEA9IABAPyAAQD+gAEA HIEBAB6BAQAsgQEALoEBAFqBAQB2gQEAeIEBAISBAQCGgQEAnoEBAKKBAQCmgQEAtIEBALiBAQC8 gQEAxoEBAMiBAQDogQEA7IEBACSCAQAmggEAQoIBAPTp4enh6eHp4dbOw/Tp4enh1s7D9LjhuOG4 4bjhuLClsOGa4ZLh9OGwpbCl4fSa4ZrhsJrhsOGasAAAAA4WaIA9CwBDShQAYUoUAAAUFWhGaIcA Fmi8Yx4AQ0oUAGFKFAAAFBVoEiyzABZoEiyzAENKFABhShQAAA4WaBIsswBDShQAYUoUAAAUFWi6 RToAFmi8Yx4AQ0oUAGFKFAAAFBVoSSkfABZovGMeAENKFABhShQAAA4WaEkpHwBDShQAYUoUAAAU FWhJKR8AFmhJKR8AQ0oUAGFKFAAADhZovGMeAENKFABhShQAABQVaOcR8gAWaLxjHgBDShQAYUoU AAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBDmUfwEADIABAJ6BAQBWggEA4oIBAHSDAQCCgwEA5IMB AAyEAQBKhAEAdIQBAK6EAQDehAEAGoUBAESFAQB4hQEAuoUBAPqFAQBKhgEAboYBAHyGAQDShgEA EocBAGaHAQD+hwEAbogBAJ6IAQAsiQEAqIkBAGSKAQD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAA APoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAA AAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAA AAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6 AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAA AAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAA AAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAAAAAAAEAABnZLxjHgAAHUKCAQBEggEASIIBAE6CAQBQggEAUoIBAFSCAQBWggEA WoIBAF6CAQBmggEAaIIBAGqCAQBsggEAdoIBAHqCAQCkggEAtoIBALiCAQDgggEA4oIBAOaCAQDq ggEA9IIBAPiCAQD8ggEADoMBACKDAQAkgwEANIMBADaDAQBkgwEAZoMBAHKDAQB0gwEAgIMBAIKD AQCEgwEA4IMBAOSDAQDmgwEA6IMBAOyDAQD16uLq4tbq1sviy+LL4sviw/XDuNat4q3iw+LD4vXD 9cO4peKdw5LihnsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQVaEkpHwAWaEkpHwBD ShQAYUoUAAAWFmhJKR8AQ0oUAGFKFABtSAkEc0gJBAAUFWilLB4AFmi8Yx4AQ0oUAGFKFAAADhZo cwdUAENKFABhShQAAA4WaCcc0ABDShQAYUoUAAAUFWiGDwQAFmi8Yx4AQ0oUAGFKFAAAFBVoEiyz ABZovGMeAENKFABhShQAAA4WaBIsswBDShQAYUoUAAAUFWjnEfIAFmi8Yx4AQ0oUAGFKFAAAFhZo vGMeAENKFABhShQAbUgJBHNICQQADhZovGMeAENKFABhShQAABQVaEZohwAWaLxjHgBDShQAYUoU AAAUFWgSLLMAFmgSLLMAQ0oUAGFKFAAq7IMBAPCDAQDygwEA9IMBAAiEAQAKhAEADIQBABCEAQAU hAEAFoQBAECEAQBChAEASIQBAEqEAQBWhAEAWIQBAGqEAQBshAEAcoQBAHSEAQB4hAEAfIQBAH6E AQCAhAEAjoQBAKSEAQCmhAEArIQBALKEAQC2hAEAuIQBAMqEAQDMhAEA3IQBAOKEAQDmhAEA6IQB AP6EAQAAhQEABoUBABiFAQAehQEAIoUBACSFAQA4hQEAOoUBAEKFAQBIhQEATIUBAFaFAQBYhQEA 7+TZ0dnGvuSyqrKqvqKyorKil76qorKiqrKqvqqyqrKqvqqyqrKqj76qsqqyqr6qh48AAAAAAAAA AAAAAAAAAAAADhZoHjBXAENKFABhShQAAA4WaMB4HABDShQAYUoUAAAUFWitPucAFmgHE6IAQ0oU AGFKFAAADhZoBxOiAENKFABhShQAAA4WaK0+5wBDShQAYUoUAAAXFWgHE6IAFmgHE6IANQiBQ0oU AGFKFAAOFmi8Yx4AQ0oUAGFKFAAAFBVoSSkfABZovGMeAENKFABhShQAAA4WaEkpHwBDShQAYUoU AAAUFWhJKR8AFmhJKR8AQ0oUAGFKFAAAFBVorT7nABZoSSkfAENKFABhShQAAB8VaAcTogAWaEkp HwA1CIFDShQAYUoUAG1ICQRzSAkEADJYhQEAWoUBAFyFAQBkhQEAZoUBAHaFAQB8hQEAgIUBAIiF AQCKhQEAkIUBAJ6FAQCmhQEAqIUBALiFAQC+hQEA0IUBANKFAQDihQEA5IUBAPiFAQD+hQEAAoYB AASGAQAQhgEAGIYBACyGAQAuhgEAOIYBADyGAQBAhgEARoYBAEiGAQBOhgEAUoYBAFSGAQBWhgEA aIYBAGqGAQBshgEAboYBAHqGAQCChgEAhoYBAIiGAQCQhgEAkoYBAJSGAQDy6eHV4c3hxdXFveHV 4c3h1eHV4c3h1b21vdW9qZ2pvc29tdW11bXNlc211Y2FfQAAAAAAAAAAAAAADhZowHgcAENKFABh ShQAAA4WaAcTogBDShQAYUoUAAAOFmhzB1QAQ0oUAGFKFAAADhZoJxzQAENKFABhShQAABcVaCQn zAAWaL4FFAA2CIFDShQAYUoUABcVaCQnzAAWaA4DDQA2CIFDShQAYUoUAA4WaL4FFABDShQAYUoU AAAOFmgOAw0AQ0oUAGFKFAAADhZoHjBXAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWgHE6IA FmgHE6IANQiBQ0oUAGFKFAAOFmitPucAQ0oUAGFKFAAAERZowHgcADUIgUNKFABhShQAGhVowHgc ABZoBxOiADUIgTYIgUNKFABhShQAL5SGAQCmhgEAqIYBAKqGAQCshgEAroYBAMCGAQDChgEAxIYB ANCGAQDYhgEA3IYBAN6GAQDshgEA7oYBAPCGAQD+hgEAAIcBAAKHAQAEhwEABocBAAiHAQAMhwEA EIcBABiHAQAghwEAIocBADqHAQA8hwEAVocBAFiHAQBkhwEAbIcBAHKHAQB0hwEAgIcBAIKHAQCY hwEAmocBAKKHAQCmhwEAqocBAMqHAQDMhwEA1IcBANaHAQDchwEA+ocBAPyHAQD+hwEABIgBAAiI AQDz6+Pbz9vjz9vH48/j2+Pbz9vjv8+/28fjz+PP48/jx+PP48/jz+O0z+PP46yglKyJx+MAAAAA AAAAAAAAAAAAAAAUFWhzB1QAFmi8Yx4AQ0oUAGFKFAAAFxVoTGHLABZocwdUADYIgUNKFABhShQA FxVoTGHLABZoTGHLADYIgUNKFABhShQADhZoTGHLAENKFABhShQAABQVaHMHVAAWaHMHVABDShQA YUoUAAAOFmjlNR8AQ0oUAGFKFAAADhZovGMeAENKFABhShQAABcVaAcTogAWaAcTogA1CIFDShQA YUoUAA4WaAcTogBDShQAYUoUAAAOFmhzB1QAQ0oUAGFKFAAADhZowHgcAENKFABhShQAABcVaMB4 HAAWaHMHVAA2CIFDShQAYUoUAAAzCIgBAAqIAQAgiAEAJogBACiIAQA2iAEAOIgBADqIAQBGiAEA TIgBAE6IAQBQiAEAVIgBAF6IAQBgiAEAaIgBAGqIAQBsiAEAbogBAHiIAQB6iAEAiogBAIyIAQCO iAEAkogBAJSIAQCaiAEAnIgBAJ6IAQCkiAEAqIgBAKyIAQCuiAEAyIgBANCIAQDSiAEA2IgBAOKI AQDmiAEA6IgBAPiIAQD6iAEA/IgBACiJAQAqiQEANIkBADiJAQBOiQEA8+vj8+Pr8+Pr2Ovz6/Pr 2OvQyPPA4/PI88jjtdCtpZmlrZmtpa2ZraWtja3Q64UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAOFmjKP+8AQ0oUAGFKFAAAFxVoJCfMABZovgUUADYIgUNKFABhShQAFxVoBxOiABZoBxOiADUI gUNKFABhShQADhZoBxOiAENKFABhShQAAA4WaL4FFABDShQAYUoUAAAUFWjlNR8AFmjaOg0AQ0oU AGFKFAAADhZoYT5HAENKFABhShQAAA4WaNo6DQBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFBVo cwdUABZocwdUAENKFABhShQAAA4WaExhywBDShQAYUoUAAAOFmhzB1QAQ0oUAGFKFAAAFxVoTGHL ABZoTGHLADUIgUNKFABhShQAAC9OiQEAUIkBAFiJAQBaiQEAaIkBAGqJAQCKiQEAjIkBAJCJAQCS iQEAlIkBAKaJAQCwiQEAtIkBALaJAQDiiQEA5IkBABSKAQAWigEAMooBADSKAQA+igEAYIoBAGKK AQBsigEAcIoBAHKKAQCAigEAgooBAJCKAQCSigEAmooBAJyKAQCwigEAsooBALyKAQDMigEA3ooB AOqKAQDsigEA9ooBAPqKAQD8igEAFIsBABaLAQAuiwEAMIsBAESLAQBGiwEAUIsBAI6LAQCQiwEA mosBAJ6LAQCgiwEAtosBALiLAQDOiwEA0IsBAOyLAQDz6/Pr4+vX69frz8fr87/zv/O/87+zv8e/ 87/zv+O/87/zv7Oqs7/Hv/Oi86LzovOilqLHovOi86LzogAXFWjlNR8AFmjlNR8ANgiBQ0oUAGFK FAAOFmjlNR8AQ0oUAGFKFAAAERZo2joNADYIgUNKFABhShQAFxVo2joNABZo2joNADYIgUNKFABh ShQADhZo2joNAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmgHE6IAQ0oUAGFKFAAAFxVoBxOi ABZoBxOiADUIgUNKFABhShQADhZoyj/vAENKFABhShQAAA4WaKJmuwBDShQAYUoUAAAXFWjKP+8A FmjKP+8ANQiBQ0oUAGFKFAAAO2SKAQDuigEAkosBABCMAQBIjAEAnowBAPCMAQCQjQEAvI0BADSO AQD4jgEAhI8BAPyPAQBIkAEAnJABAAyRAQCOkQEAMJIBAOKSAQDkkgEA/pIBAACTAQBEkwEA4JMB AASZAQASmQEAMJoBALKaAQBamwEA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAA AAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoA AAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAA AAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAA APoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAA AAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAA AAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAAAAABwAAAyQBYSQB Z2S8Yx4AAAQAAGdkvGMeAAAc7IsBAO6LAQAEjAEADIwBAA6MAQAYjAEAHIwBAB6MAQAgjAEAJIwB ACaMAQAojAEAKowBACyMAQAujAEAMowBADSMAQA6jAEAPIwBAEaMAQBQjAEAVIwBAFiMAQBajAEA cowBAHSMAQCGjAEAiIwBAJKMAQCUjAEAnIwBAKaMAQCqjAEArIwBAL6MAQDAjAEAwowBAMSMAQDS jAEA1IwBANaMAQDajAEA3IwBAN6MAQDsjAEA7owBAPiMAQD8jAEA8+vf69frz/PPx8/zx/PPu8+z z9fPq/Or86ufq5+r16vzx6vHu8eX85fHjIHz16sAAAAAAAAAAAAAAAAAAAAAAAAAFBVoyj/vABZo vy6IAENKFABhShQAABQVaMo/7wAWaMo/7wBDShQAYUoUAAAOFmi/LogAQ0oUAGFKFAAAFxVoTGHL ABZoTGHLADUIgUNKFABhShQADhZo6xF4AENKFABhShQAAA4WaDVtAQBDShQAYUoUAAAXFWgEBgYA FmgEBgYANQiBQ0oUAGFKFAAOFmgEBgYAQ0oUAGFKFAAADhZov1VJAENKFABhShQAAA4WaLxjHgBD ShQAYUoUAAAXFWjlNR8AFmjlNR8ANgiBQ0oUAGFKFAAOFmjlNR8AQ0oUAGFKFAAAFxVoyj/vABZo yj/vADUIgUNKFABhShQAAC/8jAEA/owBAACNAQAWjQEAGI0BACaNAQA2jQEAOI0BAEiNAQBKjQEA TI0BAGKNAQBojQEAdI0BAHaNAQCMjQEAjo0BAJiNAQCcjQEAoI0BAKKNAQCojQEAqo0BAK6NAQCw jQEAto0BALiNAQC6jQEAxI0BAMiNAQDKjQEA1o0BANiNAQDujQEA8I0BAA6OAQAQjgEAII4BACKO AQAyjgEAPo4BAEqOAQBMjgEAYI4BAGKOAQB0jgEAdo4BAIaOAQCIjgEAoI4BAKKOAQC0jgEA+Ozk 7OT47Pjk+NjP2M/Y+Mf4u/iz+Lv42Kr4x6K7opeiu6K7oruix6KLoouii6KLoouiAAAAAAAAAAAA AAAAAAAAAAAAABcVaL8uiAAWaL8uiAA1CIFDShQAYUoUABQVaL8uiAAWaL8uiABDShQAYUoUAAAO Fmi/LogAQ0oUAGFKFAAAERZobkg+ADYIgUNKFABhShQADhZoyj/vAENKFABhShQAABcVaMo/7wAW aMo/7wA1CIFDShQAYUoUAA4WaLxjHgBDShQAYUoUAAARFmhhPkcANgiBQ0oUAGFKFAAXFWgKSjgA FmgKSjgANgiBQ0oUAGFKFAAOFmhhPkcAQ0oUAGFKFAAAFxVoYT5HABZoYT5HADUIgUNKFABhShQA DhZoCko4AENKFABhShQAM7SOAQC2jgEAuI4BALqOAQC8jgEA9I4BAPaOAQD4jgEAAo8BAAaPAQAI jwEAFo8BABiPAQA4jwEAOo8BAESPAQBGjwEAVI8BAFaPAQBojwEAgI8BAIKPAQCOjwEAko8BAJSP AQCqjwEArI8BAMCPAQDCjwEA1o8BANiPAQD4jwEA+o8BAAaQAQAKkAEADJABAA6QAQAQkAEAHpAB ACCQAQAskAEALpABADCQAQAykAEAOpABADyQAQBGkAEASJABAFKQAQBWkAEAWJABAPPq8+rz4tfP 4sPiw+LD4sPiw+Lz4s/it6+3r7evt6+3z6ebk5uTm5OLk5uTm5PPg5ObAAAAAAAAAAAOFmi+BRQA Q0oUAGFKFAAADhZoxwQpAENKFABhShQAAA4WaCQFYgBDShQAYUoUAAAXFWgkBWIAFmgkBWIANQiB Q0oUAGFKFAAOFmgnHNAAQ0oUAGFKFAAADhZoyj/vAENKFABhShQAABcVaMo/7wAWaMo/7wA1CIFD ShQAYUoUABcVaL8uiAAWaL8uiAA1CIFDShQAYUoUAA4WaLxjHgBDShQAYUoUAAAUFWgeWNUAFmi8 Yx4AQ0oUAGFKFAAADhZovy6IAENKFABhShQAABEWaDdNlQA2CIFDShQAYUoUABcVaL8uiAAWaL8u iAA2CIFDShQAYUoUAAAyWJABAFqQAQBckAEAapABAGyQAQCAkAEAgpABAIiQAQCKkAEAmpABAJyQ AQCokAEArpABALCQAQC6kAEAvJABANKQAQDUkAEA8JABAPKQAQD6kAEA/pABAAqRAQAakQEAHpEB ACCRAQAikQEAJJEBADSRAQA2kQEASJEBAEqRAQBYkQEAWpEBAG6RAQBwkQEAgpEBAISRAQCMkQEA nJEBAKCRAQCikQEAtJEBALaRAQC4kQEAupEBAMyRAQDOkQEA5pEBAOiRAQDykQEA9JEBAACSAQAC kgEACpIBACySAQAukgEARJIBAEiSAQBKkgEAWJIBAFqSAQBmkgEAaJIBAHySAQB+kgEAgpIBAISS AQCckgEAnpIBAKqSAQD16eHp4enh6eHZ0eHp4enh6eHp4enh0eHp4enh6eHp4enh6eHp4dHhxb3F vcW9xb3FvcW9xb2xvdG9xb3FvcW9xb3FvcW9FxVoN02VABZoN02VADYIgUNKFABhShQADhZoN02V AENKFABhShQAABcVaDdNlQAWaDdNlQA1CIFDShQAYUoUAA4WaLxjHgBDShQAYUoUAAAOFmi+BRQA Q0oUAGFKFAAADhZoJAViAENKFABhShQAABcVaCQFYgAWaCQFYgA1CIFDShQAYUoUABQVaCQFYgAW aCQFYgBDShQAYUoUAEaqkgEArJIBAMCSAQDCkgEA0JIBANKSAQDekgEA4JIBAOKSAQDkkgEA6pIB AO6SAQDwkgEA8pIBAP6SAQAAkwEADpMBABCTAQASkwEAFJMBABaTAQAYkwEAGpMBAEKTAQBEkwEA RpMBAFiTAQDckwEA4JMBAPPr8+vz6/Pg2NDLxLzEsaaajZqEeG2EYdhV2EoAAAAAFBVoXVwHABZo vGMeAENKFABhShQAABcVaItHOQAWaLxjHgA+KgFDShQAYUoUABcVaCQOGAAWaLxjHgA+KgFDShQA YUoUABQVaMlnLgAWaLxjHgBDShQAYUoUAAAXFWhbKNoAFmi8Yx4APioBQ0oUAGFKFAARFmi8Yx4A PioBQ0oUAGFKFAAZFmi8Yx4APioBQ0oUAGFKFABtSAkEc0gJBBcVaE9BOwAWaLxjHgA+KgFDShQA YUoUABQVaE4XOQAWaLxjHgBDShQAYUoUAAAUFWgkDhgAFmi8Yx4AQ0oUAGFKFAAADxVoyRtMABZo vGMeADUIgQwVaMkbTAAWaLxjHgAACRZoKxf4ADUIgQ8VaCsX+AAWaLxjHgA1CIEOFmi8Yx4AQ0oU AGFKFAAAFBVoHljVABZovGMeAENKFABhShQAAA4WaDdNlQBDShQAYUoUAAAXFWg3TZUAFmg3TZUA NQiBQ0oUAGFKFAAAHOCTAQDikwEA7JMBAACUAQAelAEAIJQBACyUAQAulAEAQpQBAESUAQBGlAEA SJQBAEqUAQBOlAEAUJQBAG6UAQBwlAEAcpQBAHSUAQCIlAEAipQBAIyUAQCOlAEAkpQBAKKUAQCq lAEA0JQBANKUAQDUlAEA1pQBANiUAQDalAEA3JQBAOqUAQDslAEAAJUBAAKVAQAElQEABpUBAAiV AQAolQEAKpUBACyVAQAwlQEAMpUBADSVAQCElQEA+PD48OXw2vDS5fDC8Lfwt/C38LfwwuXw5fjw wq6lrprwmvCShpKa8JKGkvDC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXFWiC b5oAFmiCb5oANQiBQ0oUAGFKFAAOFmiCb5oAQ0oUAGFKFAAAFBVoVnkmABZovGMeAENKFABhShQA ABEWaP8ItAA1CIFDShQAYUoUABEWaLxjHgA1CIFDShQAYUoUABQVaHlMEgAWaLxjHgBDShQAYUoU AAAfFWhdXAcAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBA4WaCodOQBDShQAYUoUAAAUFWh2bsMA Fmi8Yx4AQ0oUAGFKFAAAFBVoXVwHABZovGMeAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmj/ CLQAQ0oUAGFKFAAuhJUBAIaVAQCKlQEAmJUBAJ6VAQCglQEArJUBAK6VAQDGlQEAyJUBAMqVAQDM lQEA0JUBANKVAQDUlQEABpYBAAiWAQAKlgEADpYBABCWAQAqlgEANpYBAFKWAQBwlgEAdJYBAI6W AQCQlgEAlJYBAJaWAQCalgEAnJYBAKCWAQCilgEAppYBAKiWAQCslgEA7+Tc1OTU5NTk7+TU78nU ua7UodSZ3NSR1IV6cXphemF6YXoAAAAAAAAAAAAAAAAAAAAfFWimbnYAFmi8Yx4ANQiBQ0oUAGFK FABtSAkEc0gJBBEWaLxjHgA1CIFDShQAYUoUABQVaKZudgAWaLxjHgBDShQAYUoUAAAXFWimbnYA Fmi8Yx4ANQiBQ0oUAGFKFAAOFmj/CLQAQ0oUAGFKFAAADhZoqSocAENKFABhShQAABkWaLxjHgA1 CIFDShQAYUoUAG1ICQRzSAkEFBVoQHJnABZovGMeAENKFABhShQAAB8VaEByZwAWaLxjHgA1CIFD ShQAYUoUAG1ICQRzSAkEFBVogm+aABZovGMeAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmhD S80AQ0oUAGFKFAAAFBVoVnkmABZovGMeAENKFABhShQAAB8VaFZ5JgAWaLxjHgA1CIFDShQAYUoU AG1ICQRzSAkEACOslgEArpYBALKWAQC0lgEAvJYBAL6WAQDAlgEAIpcBACaXAQAulwEAapcBAOKX AQDslwEABJgBAAaYAQAQmAEAEpgBAByYAQAAmQEAApkBAASZAQAQmQEAEpkBABqZAQAcmQEAZpkB AGiZAQBqmQEAbJkBAHKZAQB0mQEAdpkBALqZAQDv5NTJ5MG5wbnBubG5prmmucGbwZObiH2bcsGb fcFiVwAAAAAAAAAAAAAUFWiIUCkAFmi8Yx4AQ0oUAGFKFAAAHxVox1k0ABZovGMeADUIgUNKFABh ShQAbUgJBHNICQQUFWg9ZFgAFmi8Yx4AQ0oUAGFKFAAAFBVokDCrABZovGMeAENKFABhShQAABQV aMk6XAAWaLxjHgBDShQAYUoUAAAOFmhIXRwAQ0oUAGFKFAAAFBVox1k0ABZovGMeAENKFABhShQA ABQVaP8ItAAWaP8ItABDShQAYUoUAAAOFmj1fZYAQ0oUAGFKFAAADhZo/wi0AENKFABhShQAAA4W aLxjHgBDShQAYUoUAAAUFWhjbmwAFmhjbmwAQ0oUAGFKFAAAHxVopm52ABZovGMeADUIgUNKFABh ShQAbUgJBHNICQQUFWimbnYAFmi8Yx4AQ0oUAGFKFAAAHxVoKDz6ABZovGMeADUIgUNKFABhShQA bUgJBHNICQQAILqZAQC+mQEAwJkBANKZAQDUmQEAKJoBACqaAQAsmgEAMJoBADiaAQA6mgEA4poB AOSaAQDmmgEA6JoBAO6aAQDwmgEA8poBABybAQAgmwEAIpsBAC6bAQAymwEANpsBADibAQBCmwEA RpsBAEibAQBUmwEAVpsBAFibAQBamwEAZpsBALabAQDEmwEAap0BAG6dAQD15drO9cW4raKXopeP oq2Pf3SPdI90j7iXj5ePl4+XbI9kj1wOFmjgSt8AQ0oUAGFKFAAADhZozyoeAENKFABhShQAAA4W aEhdHABDShQAYUoUAAAUFWhLLdoAFmi8Yx4AQ0oUAGFKFAAAHxVoyTpcABZovGMeADUIgUNKFABh ShQAbUgJBHNICQQOFmi8Yx4AQ0oUAGFKFAAAFBVoPWRYABZovGMeAENKFABhShQAABQVaMdZNAAW aLxjHgBDShQAYUoUAAAUFWiQMKsAFmi8Yx4AQ0oUAGFKFAAAGRZovGMeADUIgUNKFABhShQAbUgJ BHNICQQRFmi8Yx4ANQiBQ0oUAGFKFAAXFWgBMPQAFmi8Yx4ANQiBQ0oUAGFKFAAUFWgTE4QAFmgT E4QAQ0oUAGFKFAAAHxVox1k0ABZovGMeADUIgUNKFABhShQAbUgJBHNICQQUFWgBMPQAFmi8Yx4A Q0oUAGFKFAAkWpsBAGibAQA2oQEAbLIBALqyAQC+sgEAxrIBANayAQDasgEA3rIBAOKyAQDmsgEA 6rIBAOyyAQDwsgEA9LIBAPiyAQD8sgEAArMBAAazAQAKswEADrMBABCzAQAWswEAHLMBACKzAQD6 AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA8QAAAAAA AAAAAAAAAPEAAAAAAAAAAAAAAADrAAAAAAAAAAAAAAAA8QAAAAAAAAAAAAAAAPEAAAAAAAAAAAAA AADxAAAAAAAAAAAAAAAA8QAAAAAAAAAAAAAAAPEAAAAAAAAAAAAAAADmAAAAAAAAAAAAAAAA8QAA AAAAAAAAAAAAAPEAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAA8QAAAAAAAAAAAAAAAPEAAAAAAAAA AAAAAADxAAAAAAAAAAAAAAAA8QAAAAAAAAAAAAAAAPEAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA 8QAAAAAAAAAAAAAAAPEAAAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAQAAEZmPioAAAAEAABGZmAmAAAGAAAWJAFJZgEAAAAJAAADJAEWJAFJZgEAAABhJAEABAAA Z2S8Yx4AABlunQEAhJ4BAJCeAQDYngEA+p4BADqfAQBGnwEA3J8BAOCfAQAAoAEABqABABSgAQAW oAEALqABADCgAQAyoAEANKABAEKgAQBMoAEA2KABANqgAQAWoQEAGKEBADChAQAyoQEA3qEBAOCh AQCEogEAkqIBAKCiAQCiogEArqIBALCiAQC2ogEACKMBAB6jAQAuowEAMKMBADKjAQA0owEADKQB ABCkAQCSpAEAlqQBAKKkAQCkpAEApqQBAKikAQCwpAEA+PD46Pjg+OD42PjY+Nj42PjQ+MD4tfi1 +K34pfid+I2C+J34evh6+KX4pfil+KX4DhZoolTyAENKFABhShQAABQVaMZTUQAWaLxjHgBDShQA YUoUAAAfFWjGU1EAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBA4WaKRYGABDShQAYUoUAAAOFmjR KnUAQ0oUAGFKFAAADhZowGy8AENKFABhShQAABQVaCodOQAWaCodOQBDShQAYUoUAAAfFWjSL+gA Fmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBA4WaPV9lgBDShQAYUoUAAAOFmgqHTkAQ0oUAGFKFAAA DhZoWQkgAENKFABhShQAAA4WaGE5BgBDShQAYUoUAAAOFmgwGHIAQ0oUAGFKFAAADhZovGMeAENK FABhShQAMLCkAQC4pAEA7KQBADylAQDKpQEA3KUBAECmAQBCpgEARKYBAEymAQCApgEAvKYBABSn AQAWpwEAGKcBABqnAQAcpwEAWKcBAGqnAQB0pwEAdqcBAICnAQC8pwEAzKcBANynAQAMqAEAGKgB AKSoAQCmqAEArKgBAK6oAQBGqQEASKkBAEqpAQBOqQEA/qkBAA6qAQB0qgEAdqoBAHiqAQB6qgEA fqoBAJaqAQCkqgEAuKoBALqqAQD+qgEANKsBADarAQAsrgEALq4BADCuAQAyrgEARK4BAE6uAQBQ rgEA+PD48Ojw3PDR8MnwvbK9svDo8Ojwquiq8Pjw3PDc8MnwyfDJ8Nyf3J/wl/CXj/CP8Ojw6PDo 8AAAAAAAAAAOFmipKhwAQ0oUAGFKFAAADhZogTfSAENKFABhShQAABQVaHpoRwAWaLxjHgBDShQA YUoUAAAOFmgqHTkAQ0oUAGFKFAAAFBVoKh05ABZoKh05AENKFABhShQAABYWaCodOQBDShQAYUoU AG1ICQRzSAkEAA4WaKRYGABDShQAYUoUAAAUFWijPksAFmi8Yx4AQ0oUAGFKFAAAFhZovGMeAENK FABhShQAbUgJBHNICQQADhZoolTyAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmjRKnUAQ0oU AGFKFAA3UK4BAFiuAQB2sAEAeLABAISwAQCIsAEALLIBAGqyAQBssgEAcLIBAHKyAQB0sgEAsLIB ALayAQC4sgEAurIBAL6yAQDGsgEAyrIBAMyyAQDOsgEA1rIBAOqyAQDssgEA8LIBAPSyAQAGswEA CrMBAPjw6PDo8ODY0NjQ2Mi92KmbjZuNm3hwm2ObVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAaFmhBGygAQ0oUAE9KAwBRSgMAXkoDAGFKFAAAGBZoQRsoADUIgU9KAgBRSgIAXAiBXkoC AAAOFmhBGygAQ0oUAGFKFAAAKRZoQRsoADUIgUIqD0NKEABPSgIAUUoCAFwIgV5KAgBhShAAcGiA gIAAGhZojxxEAENKFABPSgIAUUoCAF5KAgBhShQAABoWaEEbKABDShQAT0oCAFFKAgBeSgIAYUoU AAAmFWizcpQAFmhBGygANQiBQ0oWAE9KAgBRSgIAXAiBXkoCAGFKFgAAFBVoqSocABZoqSocAENK FABhShQAAA4WaPp/BwBDShQAYUoUAAAOFmiPHEQAQ0oUAGFKFAAADhZoqSocAENKFABhShQAAA4W aLJ4zwBDShQAYUoUAAAOFmjqMjAAQ0oUAGFKFAAADhZovGMeAENKFABhShQAAA4WaFkJIABDShQA YUoUABsKswEADrMBABCzAQAcswEAHrMBACCzAQAiswEALLMBAC6zAQAwswEAMrMBADSzAQA4swEA PLMBAECzAQBCswEARLMBAO/n2ce5x6SPemZ62U87Ty0AAAAAAAAaFmhBGygAQ0ogAE9KAwBRSgMA XkoDAGFKIAAAJhZofTO8ADYIgUIqD0NKHABPSgMAUUoDAF5KAwBhShwAcGiAgIAAACwVaPFOQAAW aH0zvAA2CIFCKg9DShwAT0oDAFFKAwBeSgMAYUocAHBogICAAAAnFWizcpQAFmhBGygANQiBQioP T0oDAFFKAwBcCIFeSgMAcGiAgIAAKRVos3KUABZoQRsoAEIqD0NKHABPSgMAUUoDAF5KAwBhShwA cGiAgIAAKRVojxxEABZoQRsoAEIqAUNKHABPSgMAUUoDAF5KAwBhShwAcGgzMzMAKRVojxxEABZo QRsoAEIqAUNKIABPSgMAUUoDAF5KAwBhSiAAcGgzMzMAGxVojxxEABZoQRsoAD4qAU9KAwBRSgMA XkoDACMVaI8cRAAWaEEbKAA+KgFDSiAAT0oDAFFKAwBeSgMAYUogABoWaEEbKABDShQAT0oCAFFK AgBeSgIAYUoUAAAOFmhBGygAQ0oUAGFKFAAAIBZoQRsoADUIgUNKFABPSgIAUUoCAFwIgV5KAgBh ShQAECKzAQAsswEANLMBADizAQBEswEARrMBAEizAQBMswEAULMBAFazAQBoswEAerMBAIqzAQCa swEAqrMBAKyzAQCwswEAtrMBALqzAQDMswEA4rMBAPSzAQAGtAEAGLQBAPYAAAAAAAAAAAAAAADw AAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAANsAAAAAAAAAAAAAAADSAAAAAAAAAAAAAAAAzQAAAAAA AAAAAAAAAOcAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAOcAAAAAAAAAAAAA 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 /LQBAP60AQAAtQEAArUBABK1AQAUtQEAIrUBACS1AQAytQEANLUBAEC1AQBCtQEARLUBAEi1AQBK tQEAUrUBAFS1AQBWtQEAYrUBAGi1AQB2tQEAeLUBAHy1AQCKtQEAkrUBAKC1AQCmtQEAsLUBAOnb zdvN283bzdu8q7yavJKKgnRpV0ZpdGl0aQAgFWiuAAEAFmiuAAEAQ0oUAE9KAwBRSgMAXkoDAGFK FAAAIhZorgABAENKFABPSgMAUUoDAF5KAwBhShQAbUgJBHNICQQAFBVorgABABZorgABAENKFABh ShQAABoWaK4AAQBDShQAT0oDAFFKAwBeSgMAYUoUAAAOFmiuAAEAQ0oUAGFKFAAADhZo8U5AAENK FABhShQAAA4WaEEbKABDShQAYUoUAAAgFmhBGygANQiBQ0ocAE9KAwBRSgMAXAiBXkoDAGFKHAAA IBZoQRsoADUIgUNKIABPSgMAUUoDAFwIgV5KAwBhSiAAACAWaEEbKAA1CIFDShQAT0oDAFFKAwBc CIFeSgMAYUoUAAAaFmhBGygAQ0ogAE9KAwBRSgMAXkoDAGFKIAAAGhZoQRsoAENKFABPSgMAUUoD AF5KAwBhShQAACwVaPFOQAAWaEEbKAA2CIFCKg9DShwAT0oDAFFKAwBeSgMAYUocAHBogICAABtA tQEAUrUBAFS1AQA+uAEATL4BAHa+AQCYvgEAxr4BAPS+AQAgvwEAesIBAMLGAQAUzAEAGs4BAILO AQAszwEAUNEBACrSAQDk0gEAXNMBAKjTAQA01AEAvtUBAAjaAQBi4AEAlOUBALbuAQD2AAAAAAAA AAAAAAAA8QAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAA AOcAAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5wAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADsAAAA AAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAAAAAA AAAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADs AAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAA AAAAAAAAAN8AAAAAAAAAAAAAAADsAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAAAHAAADJARhJARn ZI0T5QAABAAAZ2R2UJ8AAAQAAGdkvGMeAAAEAABGZohDAAAJAAADJAEWJAFJZgEAAABhJAEAGrC1 AQCytQEA0LUBANK1AQDmtQEA+rUBAPy1AQBEtgEARrYBAFy2AQB+tgEAlrYBAHi3AQCetwEAuLcB ALq3AQDCtwEAxLcBAMa3AQDctwEA3rcBADy4AQA+uAEASLgBAEq4AQBQuAEAUrgBAH64AQCAuAEA iLgBAKi4AQCquAEAwrgBAPjw5d3w0vDKwvDC8Mrwt/C3yqvK8KCYjISMfIR0hGhdAAAAAAAAAAAA AAAAAAAAAAAAAAAAABQVaI555AAWaI555ABDShQAYUoUAAAXFWiOeeQAFmiOeeQANQiBQ0oUAGFK FAAOFmh9M7wAQ0oUAGFKFAAADhZo8E58AENKFABhShQAAA4WaI555ABDShQAYUoUAAAXFWiHMP8A FmiOeeQANQiBQ0oUAGFKFAAOFmj1fZYAQ0oUAGFKFAAAFBVoKh05ABZo7S6UAENKFABhShQAABcV aCodOQAWaO0ulAA2CIFDShQAYUoUABQVaCodOQAWaCodOQBDShQAYUoUAAAOFmhuSD4AQ0oUAGFK FAAADhZoKh05AENKFABhShQAABQVaO0ulAAWaO0ulABDShQAYUoUAAAOFmjPCRcAQ0oUAGFKFAAA FBVozwkXABZozwkXAENKFABhShQAAA4WaO0ulABDShQAYUoUAAAOFmiuAAEAQ0oUAGFKFAAgwrgB AMS4AQDGuAEA/rgBAAC5AQAEuQEAELkBABK5AQAWuQEAGLkBACC5AQAkuQEAJrkBACi5AQAyuQEA NrkBADq5AQA8uQEAQLkBAES5AQBGuQEATrkBAFC5AQBSuQEAVLkBAGK5AQBmuQEAaLkBAH65AQCI uQEAirkBAJ65AQCguQEAorkBALC5AQDiuQEAJroBACi6AQCuugEA7roBAAK7AQAEuwEAIrsBAGK7 AQD26+Pr1+PX68vAuOv2wLjr1+vjsOPr47Dj6+Oo47jjoJWgjeON44XjfeN1AAAAAAAAAAAAAAAA AAAADhZo8BMBAENKFABhShQAAA4WaOFD/ABDShQAYUoUAAAOFmgmJzMAQ0oUAGFKFAAADhZo32bs AENKFABhShQAABQVaCodOQAWaCodOQBDShQAYUoUAAAOFmgqHTkAQ0oUAGFKFAAADhZoSRx4AENK FABhShQAAA4WaIcw/wBDShQAYUoUAAAOFmiSQdAAQ0oUAGFKFAAAFBVokkHQABZokkHQAENKFABh ShQAABcVaI555AAWaI555AA1CIFDShQAYUoUABYWaI555ABDShQAYUoUAG1ICQRzSAkEAA4WaI55 5ABDShQAYUoUAAAUFWiOeeQAFmiOeeQAQ0oUAGFKFAAAERZojnnkADUIgUNKFABhShQAACtiuwEA ZLsBAGa7AQB6uwEAiLsBAIq7AQCMuwEAvrsBAMS7AQAWvAEALrwBAHi8AQCSvAEAzrwBAJy9AQCo vQEAtL0BALi9AQDCvQEAxr0BAMi9AQDKvQEAzL0BANK9AQDgvQEA6L0BAOq9AQDuvQEA8r0BAPS9 AQD8vQEAGr4BACS+AQAmvgEANr4BAEi+AQBKvgEATL4BAE6+AQBQvgEA8+jg2ODM4NjgxOC84LSs pLSstNi02JzYtJy0nLSRtIm0icR+c2e0AAAAAAAAABcVaPATAQAWaOFD/AA1CIFDShQAYUoUABQV aHZQnwAWaOFD/ABDShQAYUoUAAAUFWh2UJ8AFmiSQdAAQ0oUAGFKFAAADhZosnjPAENKFABhShQA ABQVaPATAQAWaOFD/ABDShQAYUoUAAAOFmhJHHgAQ0oUAGFKFAAADhZoQ1hwAENKFABhShQAAA4W aM8JFwBDShQAYUoUAAAOFmjhQ/wAQ0oUAGFKFAAADhZotDj8AENKFABhShQAAA4WaN9m7ABDShQA YUoUAAAXFWiOeeQAFmiOeeQANQiBQ0oUAGFKFAAOFmjwEwEAQ0oUAGFKFAAADhZojnnkAENKFABh ShQAABQVaPATAQAWaPATAQBDShQAYUoUAAAXFWjwEwEAFmjwEwEANQiBQ0oUAGFKFAAAJ1C+AQBe vgEAYL4BAGK+AQBmvgEAaL4BAGy+AQBuvgEAcL4BAHK+AQB0vgEAjL4BAJC+AQCSvgEAlL4BAJa+ AQCYvgEAuL4BALq+AQC+vgEAwL4BAMK+AQDEvgEAxr4BAOa+AQDovgEA7L4BAO6+AQDwvgEA8r4B APS+AQACvwEABL8BABK/AQAUvwEAFr8BABy/AQAevwEAIL8BACy/AQAuvwEAML8BADK/AQA0vwEA +PDn3tb4zsLOts7Wwtar1s6j1sLWq9bOo9bC1qvWzpvOm86PzofOfM5xzgAAAAAAAAAUFWhJHHgA FmjhQ/wAQ0oiAGFKIgAAFBVo4UP8ABZo4UP8AENKFABhShQAAA4WaKkqHABDShQAYUoUAAAXFWjh Q/wAFmjhQ/wANQiBQ0oUAGFKFAAOFmjwEwEAQ0oUAGFKFAAADhZokkHQAENKFABhShQAABQVaOFD /AAWaHZQnwBDShQAYUoUAAAXFWjwEwEAFmjhQ/wANQiBQ0oUAGFKFAAXFWjwEwEAFmh2UJ8ANQiB Q0oUAGFKFAAOFmjhQ/wAQ0oUAGFKFAAADhZodlCfAENKFABhShQAABEWaK4AAQA1CIFDShQAYUoU ABEWaJJB0AA1CIFDShQAYUoUAA8VaK4AAQAWaOFD/AA1CIEOFmiuAAEAQ0oUAGFKFAArNL8BADa/ AQA4vwEAPL8BAD6/AQBCvwEARL8BAF6/AQBgvwEAZL8BAHC/AQCmvwEArr8BALS/AQC2vwEAuL8B AADBAQAOwQEAEMEBAB7BAQCUwQEA0sEBAGLCAQBywgEAdMIBAHbCAQB4wgEAesIBAKrCAQCswgEA usIBALzCAQDIwgEAIsMBACzDAQCYwwEA9e3i7dftzO3AtO2s7aDtmJCIkJiAmIiYoJjtmHVtmGWY XZgAAAAAAAAADhZo8BMBAENKFABhShQAAA4WaG4iygBDShQAYUoUAAAOFmhRPwEAQ0oUAGFKFAAA FBVoUT8BABZoUT8BAENKFABhShQAAA4WaEkceABDShQAYUoUAAAOFmjPCRcAQ0oUAGFKFAAADhZo zyoeAENKFABhShQAAA4WaLQ4/ABDShQAYUoUAAAXFWi0OPwAFmi0OPwANQiBQ0oUAGFKFAAOFmjf ZuwAQ0oUAGFKFAAAFxVobQW7ABZo4UP8AD4qAUNKFABhShQAFxVoSRx4ABZo4UP8AD4qAUNKFgBh ShYAFBVoSRx4ABZo4UP8AENKEABhShAAABQVaEkceAAWaOFD/ABDShIAYUoSAAAUFWhJHHgAFmjh Q/wAQ0oWAGFKFgAADhZo4UP8AENKFABhShQAABQVaEkceAAWaOFD/ABDShoAYUoaACOYwwEA+MMB APrDAQCMxAEAjsQBAJDEAQD4xAEAFMUBABbFAQAYxQEAGsUBABzFAQAoxQEAKsUBACzFAQAwxQEA NMUBADbFAQA4xQEAOsUBAHrFAQB8xQEAnMUBAJ7FAQCkxgEApsYBAMDGAQDCxgEA0MYBAPzGAQBW xwEAWMcBAGrHAQB8xwEAzMcBAPjw+Ojg+NLA0sD4uK2hrbitla34iX74uHa4+LhuuGZeuPAAAAAA AAAAAAAAAAAAAA4WaKBPsQBDShQAYUoUAAAOFmjBG20AQ0oUAGFKFAAADhZo4wB4AENKFABhShQA AA4WaN9m7ABDShQAYUoUAAAUFWjtLpQAFmjtLpQAQ0oUAGFKFAAAFxVo7S6UABZo7S6UADUIgUNK FABhShQAFxVozwkXABZozwkXADUIgW1ICQRzSAkEFxVozwkXABZozwkXADUIgUNKKABhSigAFBVo zwkXABZozwkXAENKFABhShQAAA4WaM8JFwBDShQAYUoUAAAiFmjtLpQAQ0oUAE9KAwBRSgMAXkoD AGFKFABtSAkEc0gJBAAaFmjtLpQAQ0oUAE9KAwBRSgMAXkoDAGFKFAAADxVokTR8ABZokTR8ADUI gQ4WaJE0fABDShQAYUoUAAAOFmhmL+EAQ0oUAGFKFAAADhZo7S6UAENKFABhShQAIszHAQDOxwEA xMgBANDJAQDeygEAAMsBAA7LAQASywEAJMsBACbLAQBQywEAWMsBAFrLAQCmywEAsMsBALLLAQC0 ywEAtssBANzLAQDiywEAAMwBAALMAQAQzAEAEswBABTMAQAezAEAIMwBACLMAQAkzAEAJswBADrM AQA8zAEARswBAEjMAQBQzAEAUswBAF7MAQBgzAEAaMwBAGrMAQDkzAEA5swBAOjMAQASzQEAFM0B ABbNAQBOzQEA+PDl8N3w3fDd8NXw1c3V8NXw1fDC8MK6r82nnJCnkKeQp5CnkKecp4jNiKd8pwAA AAAAAAAAAAAAAAAAFxVoCzRwABZoCzRwADUIgUNKFABhShQADhZoJiczAENKFABhShQAABcVaNd/ wgAWaAs0cAA1CIFDShQAYUoUABQVaAs0cAAWaAs0cABDShQAYUoUAAAOFmgLNHAAQ0oUAGFKFAAA FBVoZi/hABZoCzRwAENKFABhShQAAA4WaM8JFwBDShQAYUoUAAAUFWjBG20AFmhmL+EAQ0oUAGFK FAAADhZocwp3AENKFABhShQAAA4WaEFinQBDShQAYUoUAAAOFmiGMFQAQ0oUAGFKFAAAFBVoZi/h ABZoZi/hAENKFABhShQAAA4WaGYv4QBDShQAYUoUAAAOFmijDKsAQ0oUAGFKFAAuTs0BAFTNAQBW zQEAWM0BAFrNAQBczQEAZs0BAGjNAQBqzQEAbM0BAG7NAQBwzQEAcs0BAI7NAQCWzQEAFs4BABjO AQAazgEAJs4BACjOAQAuzgEAMM4BADLOAQA0zgEAWs4BAFzOAQB6zgEAfM4BAH7OAQCAzgEAgs4B ALLOAQC0zgEAws4BAMTOAQDmzgEA6M4BAPzOAQD47Pjg1ODI4Lz4tKy0rLShlrSKobSKobR4tIq0 +LT4bPhs+Gz4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxVoqi/vABZoqi/vADUIgUNKFABh ShQAIxVoCzRwABZoCzRwADUIgUNKFABPSgMAUUoDAF5KAwBhShQAFxVoCzRwABZoCzRwADUIgUNK FABhShQAFBVoCzRwABZosnjPAENKFABhShQAABQVaAs0cAAWaAs0cABDShQAYUoUAAAOFmhBYp0A Q0oUAGFKFAAADhZoCzRwAENKFABhShQAABcVaI0T5QAWaKov7wA1CIFDShIAYUoSABcVaOMAeAAW aKov7wA1CIFDShYAYUoWABcVaI0T5QAWaKov7wA1CIFDShYAYUoWABcVaJRougAWaKov7wA1CIFD ShQAYUoUABcVaI0T5QAWaKov7wA1CIFDShQAYUoUAA4WaKov7wBDShQAYUoUACX8zgEA/s4BAAjP AQASzwEAFM8BABbPAQAYzwEAGs8BAH7PAQCAzwEAps8BAKjPAQCuzwEAsM8BALjPAQDUzwEA1s8B ANjPAQDgzwEA4s8BAObPAQDszwEACtABAAzQAQAQ0AEAEtABABTQAQAW0AEAMtABADTQAQBM0AEA VtABAFjQAQBa0AEAXtABAGjQAQB00AEAdtABAIbQAQCY0AEAytABANzQAQDs0AEA7tABAO3l3eXR 5dHl0eXR5dHlyb6zyaPJ5cmY5ZjRmOXR5cnliOWAyYDJeMmAyYAAAAAAAAAAAAAAAAAAAAAAAAAA AAAOFmhZCSAAQ0oUAGFKFAAADhZohwKbAENKFABhShQAAB8VaKov7wAWaKov7wA1CIFDShQAYUoU AG1ICQRzSAkEFBVoqi/vABZoqi/vAENKFABhShQAAB8VaKov7wAWaCYnMwA1CIFDShQAYUoUAG1I CQRzSAkEFBVoqi/vABZoJiczAENKFABhShQAABQVaCYnMwAWaCYnMwBDShQAYUoUAAAOFmgmJzMA Q0oUAGFKFAAAFxVoqi/vABZoqi/vADUIgUNKFABhShQADhZogTfSAENKFABhShQAAA4WaKov7wBD ShQAYUoUAAAjFWiqL+8AFmiqL+8ANQiBQ0oUAE9KAwBRSgMAXkoDAGFKFAAAK+7QAQDw0AEA8tAB APbQAQD40AEATtEBAFDRAQCs0QEArtEBAMjRAQDK0QEAzNEBAM7RAQD+0QEAANIBACLSAQAk0gEA KNIBAD7SAQBi0gEAZNIBAGjSAQBq0gEAcNIBAIzSAQCY0gEAmtIBALDSAQCy0gEA1tIBANjSAQDk 0gEA5tIBAPjSAQAa0wEAHNMBACrTAQAs0wEA8uDy4PLVzb3NsqayzabNpp6WzYTNps2WzabNe82m zXNrc2BzYAAAABQVaNIpngAWaNIpngBDShQAYUoUAAAOFmiBN9IAQ0oUAGFKFAAADhZo0imeAENK FABhShQAABEWaIcCmwA1CIFDShQAYUoUACMVaIcCmwAWaIcCmwA1CIFDShQAT0oDAFFKAwBeSgMA YUoUAA4WaFE/AQBDShQAYUoUAAAOFmiRNHwAQ0oUAGFKFAAAFxVohwKbABZohwKbADUIgUNKFABh ShQAFBVohwKbABZohwKbAENKFABhShQAAB8VaIcCmwAWaIcCmwA1CIFDShQAYUoUAG1ICQRzSAkE DhZohwKbAENKFABhShQAABQVaIcCmwAWaKov7wBDShQAYUoUAAAiFmiHApsAQ0oUAE9KAwBRSgMA XkoDAGFKFABtSAkEc0gJBAAaFmiHApsAQ0oUAE9KAwBRSgMAXkoDAGFKFAAlLNMBADjTAQBE0wEA RtMBAE7TAQBY0wEAWtMBAGjTAQBq0wEActMBAHTTAQCC0wEAhNMBAJbTAQCY0wEArtMBALTTAQC2 0wEAxtMBAMjTAQDK0wEA4NMBAOLTAQDq0wEA7NMBAO7TAQD80wEA/tMBABTUAQAW1AEAHNQBAB7U AQAw1AEANNQBAHjUAQC81QEAvtUBAPjw5fjX5fjL+Mv4y/jL+MC0wLTAqZ2pwLTAkYWRhXxwwKnw ZQAAAAAAAAAAAAAAAAAAAAAAABQVaNIpngAWaNd/wgBDShQAYUoUAAAXFWjXf8IAFmjwEwEANgiB Q0oUAGFKFAARFmjwEwEANgiBQ0oUAGFKFAAXFWjXf8IAFmjSKZ4ANgiBQ0oUAGFKFAAXFWjXf8IA FmjXf8IANgiBQ0oUAGFKFAAXFWjXf8IAFmjXf8IANQiBQ0oUAGFKFAAUFWjXf8IAFmjXf8IAQ0oU AGFKFAAAFxVo13/CABZo0imeADUIgUNKFABhShQAFBVo13/CABZo0imeAENKFABhShQAABcVaNIp ngAWaNIpngA1CIFDShQAYUoUABoWaNIpngBDShQAT0oDAFFKAwBeSgMAYUoUAAAUFWjSKZ4AFmjS KZ4AQ0oUAGFKFAAADhZo13/CAENKFABhShQAAA4WaNIpngBDShQAYUoUACS+1QEA8tYBAPjWAQAG 1wEADNcBAEzXAQBS1wEAYtcBAH7XAQCA1wEAgtcBAIbXAQCI1wEAjtcBAJTXAQCi1wEAtNcBALbX AQC81wEAvtcBAMDXAQDC1wEAxNcBAFzYAQBm2AEAatgBAGzYAQBu2AEAdNgBAHbYAQCK2AEAltgB AMLYAQDS2QEA5NkBAOzZAQD82QEA/tkBAATaAQAG2gEACNoBAAraAQD48Pjo+Oj44Ojg18zX4MTg uOC44PjwsKiwnJCwkLCIsPCw8LDwgPB4cAAAAAAAAAAAAAAAAAAAAA4WaKkqHABDShQAYUoUAAAO Fmi0OPwAQ0oUAGFKFAAADhZoWnzJAENKFABhShQAAA4WaKBPsQBDShQAYUoUAAAXFWjfTN0AFmjf TN0ANQiBQ0oUAGFKFAAWFmjfTN0AQ0oUAGFKFABtSAkEc0gJBAAOFmjPKh4AQ0oUAGFKFAAADhZo 30zdAENKFABhShQAABcVaEgHbgAWaEgHbgA1CIFDShQAYUoUAA4WaIE30gBDShQAYUoUAAAUFWiR NHwAFmiRNHwAQ0oUAGFKFAAAERZokTR8ADUIgUNKFABhShQADhZoSAduAENKFABhShQAAA4WaJE0 fABDShQAYUoUAAAOFmhNf94AQ0oUAGFKFAAADhZohwKbAENKFABhShQAKQraAQAa2gEAWNoBAHLa AQB02gEAqtoBAMraAQDO2gEA3NoBAOjaAQDq2gEAEt0BABjdAQCU3QEAlt0BAGDeAQCK3gEAut4B AP7eAQAC4AEABOABAGDgAQBi4AEAZOABAH7gAQCI4AEA9uABAAzhAQAa4QEAHOEBAIThAQCG4QEA kuEBAJThAQDK4QEAzuEBAOjhAQDq4QEAAuIBAATiAQAU4gEAFuIBACDiAQAq4gEALOIBADriAQBA 4gEATOIBAFDiAQD48Pjg+Nj48PjY+ND4yPjI+Mj4wPi1qvii+KL4mviq+Kr4qviq+KL4oviShvh+ +H4AAAAAAAAAAA4WaFkJIABDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAOFmj1fZYA Q0oUAGFKFAAADhZo8BMBAENKFABhShQAAA4WaBNmawBDShQAYUoUAAAUFWiQMKsAFmi8Yx4AQ0oU AGFKFAAAFBVoFCurABZovGMeAENKFABhShQAAA4WaKRYGABDShQAYUoUAAAOFmhRd3sAQ0oUAGFK FAAADhZojRPlAENKFABhShQAAA4WaKMMqwBDShQAYUoUAAAfFWgfNy8AFmi8Yx4ANQiBQ0oUAGFK FABtSAkEc0gJBA4WaK4AAQBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAwUOIBAG7iAQCC4gEAhOIB AKbiAQC64gEAvuIBANLiAQAS4wEAROMBAKjjAQDA4wEA+uMBAPzjAQAG5AEACOQBAIrkAQCg5AEA 9uQBAETlAQBG5QEAiuUBAJDlAQCS5QEAluUBALDlAQDO5QEA2uUBAIzmAQCY5gEA+uYBAPzmAQA0 6AEAPugBAFDoAQBW6AEArukBANzpAQA46gEAOuoBADzqAQAI6wEAJOsBACbrAQA46wEAguwBAIrs AQDC7AEA/uwBABbtAQAa7QEAcO0BAHLtAQB07QEAiu0BAIztAQCQ7QEA+PDo4PDo8Njw4NDg6NDo 4Mjg0PjQ+NDwvPC08Pjw+PD48Mjw4NDwqfCh8NjwyPDg8JnwoY6hjqEUFWieU7wAFmieU7wAQ0oU AGFKFAAADhZo4gp/AENKFABhShQAAA4WaJ5TvABDShQAYUoUAAAUFWhSDW4AFmi8Yx4AQ0oUAGFK FAAADhZoUXd7AENKFABhShQAABcVaItHOQAWaLxjHgA+KgFDShQAYUoUAA4WaM8qHgBDShQAYUoU AAAOFmhWJ84AQ0oUAGFKFAAADhZo4ErfAENKFABhShQAAA4WaBNmawBDShQAYUoUAAAOFmhZCSAA Q0oUAGFKFAAADhZovGMeAENKFABhShQAAA4WaKoBggBDShQAYUoUADiQ7QEApO0BAPLtAQAK7gEA eO4BAK7uAQC07gEAtu4BALjuAQDG7gEAyO4BAMruAQDM7gEAzu4BANDuAQDS7gEACO8BADjwAQA6 8AEAUPABAGTwAQAe8gEAPvIBAEryAQBS8gEAVPIBAFjyAQBg8gEAqPIBAOTyAQDs8gEAZvMBAGjz AQDs8wEA+PDo8Ojw3dLHu667pZmOpYZ+hnaGboZuhmaGZobohlaGAAAAHxVoZhESABZovGMeADUI gUNKFABhShQAbUgJBHNICQQOFmg3QgQAQ0oUAGFKFAAADhZo2iXYAENKFABhShQAAA4WaFkJIABD ShQAYUoUAAAOFmixI3AAQ0oUAGFKFAAADhZovGMeAENKFABhShQAABQVaEEbKAAWaLxjHgBDShQA YUoUAAAXFWhbKNoAFmi8Yx4APioBQ0oUAGFKFAARFmi8Yx4APioBQ0oUAGFKFAAZFmi8Yx4APioB Q0oUAGFKFABtSAkEc0gJBBcVaE9BOwAWaLxjHgA+KgFDShQAYUoUABQVaE4XOQAWaLxjHgBDShQA YUoUAAAUFWhSDW4AFmi8Yx4AQ0oUAGFKFAAAFBVonlO8ABZovGMeAENKFABhShQAAA4WaM8qHgBD ShQAYUoUAAAOFmieU7wAQ0oUAGFKFAAADhZoi0c5AENKFABhShQAIbbuAQC47gEACO8BAKryAQCG /QEAjAYCADQTAgD+SgMAjlEDAJBRAwDiUQMAVFcDAFhiAwBObAMAUHcDAJB8AwCSfAMA6nwDAEiE AwAOjQMAEI0DAJqNAwC0kwMAQpsDAEabAwCamwMAqqADAC6hAwCupQMAfqgDAPoAAAAAAAAAAAAA AAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAA AAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA +gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAA AAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAA AAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoA AAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAQAAGdkvGMeAAAd7PMBAO7zAQDy8wEA9PMBACj0 AQAs9AEALvQBAFT0AQBY9AEAXPQBAGD0AQBi9AEAZvQBAGr0AQBs9AEAhPQBAIb0AQCI9AEAmPQB AJr0AQC29AEAuPQBANr0AQDe9AEACvUBAAz1AQCO9QEAoPUBALD1AQC09QEA1vUBANj1AQDo9QEA 6vUBAPT1AQAQ9gEAjPYBAI72AQDG9gEAPvcBAFz3AQBq9wEAevcBAHz3AQAi+QEALPkBADD5AQAy +QEACPoBAAr6AQA++gEA9en14en14enW6dbh6fXh9c7h9eHG4enh9eG+4b7hs+Gz4avhm+Gr4avh k+GL4YDhgOEAABQVaEkCCAAWaLxjHgBDShQAYUoUAAAOFmjPKh4AQ0oUAGFKFAAADhZoEyr/AENK FABhShQAAB8VaGYREgAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEDhZo7115AENKFABhShQAABQV aLB39AAWaLxjHgBDShQAYUoUAAAOFmhcMa4AQ0oUAGFKFAAADhZoNBJwAENKFABhShQAAA4WaIA9 CwBDShQAYUoUAAAUFWgXNn4AFmi8Yx4AQ0oUAGFKFAAADhZovGMeAENKFABhShQAABYWaLxjHgBD ShQAYUoUAG1ICQRzSAkEABQVaGYREgAWaLxjHgBDShQAYUoUADI++gEAQPoBAEL6AQBE+gEAdvoB AHj6AQB6+gEAfvoBAIL6AQCe+gEAuvoBAN76AQDg+gEAIPwBACT8AQA2/AEAPvwBAOD8AQDk/AEA gv0BAIT9AQD2/QEA+P0BAAb/AQAI/wEAMAECADIBAgBIAQIAfgECAIABAgC6AQIAxAECAMYBAgDI AQIAygECAFoDAgBcAwIABAYCAAYGAgBQBgIAfAYCAH4GAgCKBgIA9e317d3S7cbtvu2+7cbttu3G 7a7to+2u7b6b7ZDtiMaQxu2A7XjtcL5wAAAAAAAAAAAAAA4WaAViPABDShQAYUoUAAAOFmjaJdgA Q0oUAGFKFAAADhZo1lfzAENKFABhShQAAA4WaPV9lgBDShQAYUoUAAAUFWhzQrUAFmi8Yx4AQ0oU AGFKFAAADhZoeRB+AENKFABhShQAABQVaIkvNwAWaLxjHgBDShQAYUoUAAAOFmjvXXkAQ0oUAGFK FAAADhZoXDGuAENKFABhShQAAA4WaIA9CwBDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJ BAAUFWgqNd0AFmi8Yx4AQ0oUAGFKFAAAHxVosHf0ABZovGMeADUIgUNKFABhShQAbUgJBHNICQQO Fmi8Yx4AQ0oUAGFKFAAAFBVoSQIIABZovGMeAENKFABhShQAKooGAgCMBgIAjgYCAGQHAgBmBwIA aAcCAGwHAgBwBwIAdAcCAHIIAgCQCAIA7AgCAPIIAgD0CAIACAkCAEgJAgBWCQIAWgoCAMQKAgDG CgIAyAoCAMwKAgDOCgIATAsCAFQLAgBgCwIA8gsCAPQLAgB8DAIAnAwCAKwMAgCuDAIAxAwCAMYM AgA0DQIANg0CAHgNAgD48OjYzejBzei56LHoqei56KGWiqGWoYKhem56Znpuem56bnoAAAAAAAAA AAAAAAAAAAAAAAAAAA4WaGJSYQBDShQAYUoUAAAXFWjjC7sAFmjjC7sANQiBQ0oUAGFKFAAOFmjj C7sAQ0oUAGFKFAAADhZoXDGuAENKFABhShQAABYWaHkQfgBDShQAYUoUAG1ICQRzSAkEABQVaHkQ fgAWaHkQfgBDShQAYUoUAAAOFmh5EH4AQ0oUAGFKFAAADhZoWQkgAENKFABhShQAAA4WaC5y/gBD ShQAYUoUAAAOFmjWV/MAQ0oUAGFKFAAAFhZovGMeAENKFABhShQAbUgJBHNICQQAFBVosHf0ABZo vGMeAENKFABhShQAAB8VaNcBqwAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEDhZovGMeAENKFABh ShQAAA4WaPUe+gBDShQAYUoUAAAOFmiJIIMAQ0oUAGFKFAAkeA0CAHoNAgB8DQIAfg0CAIANAgCC DQIAmg0CAMgNAgDWDQIA2A0CAOINAgCoDgIArA4CABgPAgAcDwIANg8CADgPAgA6DwIAPg8CAIAP AgCCDwIAjA8CAI4PAgCWDwIAmA8CAKIPAgCkDwIA5A8CABIQAgBaEAIAXBACAJIQAgCwEAIAvhAC AMIQAgDEEAIAzhACANgQAgDaEAIABBECAAgRAgBCEQIAchECAB4SAgAgEgIA7BQCAO4UAgCKFgIA jBYCAK4WAgCwFgIAtBYCAPbu5trm0ubK5srmyubK5r/mt+as5qzmrOas5tLmrOak5tLm0ubS5tLm 0uac5pTmieaJ5gAAAAAAAAAAAAAAAAAAABQVaCYr4wAWaLxjHgBDShQAYUoUAAAOFmhcMa4AQ0oU AGFKFAAADhZosy2JAENKFABhShQAAA4WaHsBBgBDShQAYUoUAAAUFWhJAggAFmi8Yx4AQ0oUAGFK FAAADhZoYlJhAENKFABhShQAABQVaFkJIAAWaFkJIABDShQAYUoUAAAOFmhJZYMAQ0oUAGFKFAAA DhZoWQkgAENKFABhShQAABcVaGJSYQAWaGJSYQA1CIFDShQAYUoUAA4WaLxjHgBDShQAYUoUAAAO FmjjC7sAQ0oUAGFKFAAAERZo4wu7ADUIgUNKFABhShQAADO0FgIAwhYCACQXAgBAFwIAWhcCAIIX AgCGFwIAAEoDAJJKAwD6SgMA/EoDAP5KAwAASwMAAksDAEZLAwBISwMAaEsDAGpLAwBsSwMAgksD AI5LAwCQSwMA5ksDAE5MAwBqTAMAxEwDAHZNAwB4TQMAiE0DAIpNAwCcTQMApk0DAMpNAwBsTgMA uk4DAIBPAwCOTwMAkE8DAM5PAwDcTwMAJlADADZQAwBMUAMAiFADAIpQAwD6UAMA/FADAPjw6PD4 8Ob46Pjw3tbe1t7W3tbe1t7O1s7ew9643rDesM6wzqjOoM6YzpCEznwAAAAAAAAAAAAAAAAAAA4W aKg9cABDShQAYUoUAAAXFWh7AQYAFmh7AQYANQiBQ0oUAGFKFAAOFmh7AQYAQ0oUAGFKFAAADhZo GE/iAENKFABhShQAAA4WaOBK3wBDShQAYUoUAAAOFmjxX78AQ0oUAGFKFAAADhZosHN9AENKFABh ShQAABQVaN8n0QAWaN8n0QBDShQAYUoUAAAUFWhkbmUAFmhkbmUAQ0oUAGFKFAAADhZofUk4AENK FABhShQAAA4WaGRuZQBDShQAYUoUAAAOFmjfJ9EAQ0oUAGFKFAAAA1UIAQ4WaCJ0CgBDShQAYUoU AAAOFmi8Yx4AQ0oUAGFKFAAADhZo8jkPAENKFABhShQALksEQAQwBDcEOARCBEwEIABBBDIEPgQ5 BCAAPQQwBEEEQgQ+BE8ESQQ4BDkEIAA4BD0EQgQ1BEAENQRBBCAAOAQ7BDgEIAAzBEAEQwQ/BD8E PgQ5BCAAQQQ4BDsETAQ9BEsERQQgADgEIAA0BD4EMQRABD4EQQQ+BDIENQRBBEIEPQRLBEUEIAA7 BE4ENAQ1BDkELAAgAEEEPwQ+BEEEPgQxBD0ESwRFBCAAPgRGBDUEPQQ4BEIETAQgAEEEOARCBEME MARGBDgETgQgADgEIAA/BD4EPAQ+BEcETAQgAD0ENQQ0BDUENQRBBD8EPgRBBD4EMQQ9BEsEPAQu AA0AIAAdBDAEIABBBDAEPAQ+BDwEIAAyBEsEQQQ+BDoEPgQ8BCwAIAA8BDgEQAQ+BDIEPgQ3BDcE QAQ1BD0ERwQ1BEEEOgQ+BDwELAAgAEMEQAQ+BDIEPQQ1BCAAMgRLBDYEOAQyBDAEPQQ4BDUEIAA3 BDAEMgQ4BEEEOARCBCAAPgRCBCAAQAQ1BEgENQQ9BDgETwQgADcEMAQ0BDAERwQ4BCAATQREBEQE NQQ6BEIEOAQyBD0EPgQzBD4EIAAzBDsEPgQxBDAEOwRMBD0EPgQzBD4EIABDBD8EQAQwBDIEOwQ1 BD0EOARPBCwAIAAyBCAAPwQ1BEAEMgRDBE4EIAA+BEcENQRABDUENARMBCwAIABBBDIENQRABDYE NQQ9BDgETwQgADIEOwQwBEEEQgQ4BCAAPAQ+BD0EPgQ/BD4EOwQ4BEEEQgQ+BDIEIAA4BCAAQgRA BDAEPQRBBEQEPgRABDwEMARGBDgEOAQgAD4ENAQ9BD4EPwQ+BDsETwRABD0EPgQzBD4EIAA8BDgE QAQwBCAAMAQ8BDUEQAQ4BDoEMAQ9BEEEOgQ+BDMEPgQgADoEPgQ9BDMEOwQ+BDwENQRABDAEQgQw BC4AIAAdBDAEIAA0BDAEPQQ9BEsEOQQgADwEPgQ8BDUEPQRCBCAAQQRCBD4EQAQ+BD0EPQQ4BDoE OAQgAEAEMAQ3BDQENQQ7BDUEPQQ4BE8EIAA4BDwENQROBEIEIABIBDgEQAQ+BDoEOAQ1BCAAMgQ+ BDcEPAQ+BDYEPQQ+BEEEQgQ4BCAAMgQ7BDgETwQ9BDgETwQgAD0EMAQgADQAIAAxBDsEPgQ6BDAE IAA4BEUEIAAiAD8EOARABDAEPAQ4BDQESwQiAC0AIAAQBDwENQRABDgEOgQwBCgAKwAVBCEEKQAs ACAAIAQ+BEEEQQQ4BE8ELAAgABoEOARCBDAEOQQgADgEIAAwBEAEMAQxBEEEOgQ+BC0AMAREBEAE OAQ6BDAEPQRBBDoEOAQ5BCAAPAQ4BEAELgAgABwEPgRJBD0ENQQ5BEgENQQ1BCAAMgQ7BDgETwQ9 BDgENQQgAD0EMAQgADcEMAQ/BDAENAQ9BEMETgQgABAEPAQ1BEAEOAQ6BEMEIAA4BCAAQQQ7BDAE MQQ+BDUEIAA9BDAEIAAgBD4EQQRBBDgETgQsACAAOgQwBDoEIABBBDsENQQ0BEEEQgQyBDgENQQg AEAEOARBBDoEIAA/BEAEPgQ4BDMEQARLBEgEMAQgADIEIAAyBD4EOQQ9BDUELAAgADIESwQ9BEME NgQ0BDAENQRCBCAAMwQ7BD4EMQQwBDsETAQ9BEsERQQgAEAEMAQxBD4EMgQ7BDAENAQ1BDsETARG BDUEMgQgAD8EPgRBBDsENQQ0BD0EOAQ1BCAAQgRLBEEETwRHBDgEIAA7BDUEQgQgADQENQQ5BEEE QgQyBD4EMgQwBEIETAQgADYEUQRBBEIEOgQ+BCAAOAQgADwEMAQ6BEEEOAQ8BDAEOwRMBD0EPgQg ADAEOgRCBDgEMgQ9BD4ELgAgACMEQQQ/BDUERQQgADAEQgQ7BDAEPQRCBD4EMgQgADIEIAA/BDUE QAQ1BEUEMgQwBEIENQQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8EIAAoBEMEPAQ1BEAEPgQ8BCAAOAQg ABUEMwQ4BD8EQgQ+BDwEIAAyBEsEOwQ4BDsEQQRPBCAAMgQgAEYEOAQyBDgEOwQ4BDcEMARGBDgE PgQ9BD0ESwQ5BCAAMQQ7BDgERgQ6BEAEOAQzBCAAPQQwBEgENQQ5BCAATQRABEsELgAgABwEOARA BCAAQAQwBEEERwQ7BDUEPQRRBD0EIAA9BDAEIABHBDUEQgRLBEAENQQgAEcEMARBBEIEOAQuACAA IARDBEEEQQQ6BDgEOQQgABwEOARABCwAIAAyBEsEPwQ+BDsEPQRPBE4ESQQ4BDkEIAA8BDgEQQRB BDgETgQgAEEEOwQwBDIEPQQ+BDMEPgQgADcEMARJBDgEQgQ9BDgEOgQwBCAAIAQ+BDQEMAQsACAA PgQ6BDAENwQwBDsEQQRPBCAANwQwBDYEMARCBCAAMgQgAD8EOARABDAEPAQ4BDQENQQgADAEQgQ7 BDAEPQRCBD4EMgQgADwENQQ2BCAANQRRBCAARwQwBEEEQgQ1BDkEIAA4BCAAQwRBBEIEQwQ/BDgE OwQgADwENQRBBEIEPgQgADIEQAQwBDMEQwQhAA0ADQAgACAAIAAgACAAIAAgAEkASQBJADIEKQAg ABIENQQ7BDgEOgQ4BDUEIAA/BDUEQAQ1BEEENQQ7BDUEPQQ4BE8EIAA4BCAAMgQ+BDkEPQRLBA0A IAAfBD4EQQQ7BDUENARBBEIEMgQ4BE8EIAA/BD4EQQQ7BDUEPwQ+BEIEPgQ/BD0EPgQzBD4EIABD BD8EQAQwBDIEOwQ1BD0EOARPBCAAMgRLBDsEOAQ7BDgEQQRMBCwAIAAyBCAAQgQ+BDwEIABHBDgE QQQ7BDUELAAgADgEIAAyBCAAPAQwBEEEQQQ+BDIESwQ1BCAAPAQ4BDMEQAQwBEYEOAQ4BCAAMgAt AEUEIAAxBDsEOAQ3BDoEOARFBCAAMwQwBD8EOwQ+BDMEQARDBD8EPwQgAD4ENAQ9BD4EMwQ+BCAA QAQ+BDQEMAQgAFIALgAgACEEMAQ8BEsEPAQgAE8EQAQ6BDgEPAQgAEEEPgQxBEsEQgQ4BDUEPAQg AEEEQgQwBDsEPgQgAD8ENQRABDUEQQQ1BDsENQQ9BDgENQQgAFIAMQBhACAAQQQgABEEMAQ7BDoE MAQ9BCAAPgQxBEAEMARCBD0EPgQgAD0EMAQgACAEQwRBBEEEOgRDBE4EIABABDAEMgQ9BDgEPQRD BCAAPgQ6BD4EOwQ+BCAAPwRPBEIEOAQgAEIESwRBBE8ERwQgADsENQRCBCAAPQQwBDcEMAQ0BC4A IAAVBDIEQAQ+BD8EMAQgAD4EOgQwBDcEMAQ7BDAEQQRMBCAAMgQ+BCAAMgQ7BDAEQQRCBDgEIABS ADEAYgAtACAARwQwBEEEQgQ4BCAAUgAsACAAPQQwBEUEPgQ0BE8ESQQ1BDkEQQRPBCAAPwQ+BDQE IAAyBDsEOARPBD0EOAQ1BDwEIAAwBEIEOwQwBD0EQgQ+BDIEKAAoBEMEPAQ1BEAELAAgAD8EPgRC BD4EPAQgADUEMwQ4BD8ENQRCBEEEOgQ4BEUEIAA2BEAENQRGBD4EMgQpACwAIAA9BDAERwQwBDIE SAQ4BEUEIAAyBD4ENQQ9BD0ESwQ1BCAANAQ1BDkEQQRCBDIEOARPBCAAPwRABD4EQgQ4BDIEIAAz BDgEPwQ1BEAEMQQ+BEAENQQ1BDIELgAgAFIAMQBhACAAMQRLBDsEOAQgAD8EQAQwBDoEQgQ4BEcE NQRBBDoEOAQgAD8EPgQ7BD0EPgRBBEIETAROBCAAMgRLBEIENQRBBD0ENQQ9BEsEIAA4BDcEIAAV BDIEQAQ+BD8ESwQgADgELAAgAD8EQAQ+BDkENARPBCAARwQ1BEAENQQ3BCAAIgAxBEMEQgRLBDsE PgRHBD0EPgQ1BCAAMwQ+BEAEOwRLBEgEOgQ+BCIAKABHBDAEQQRCBDgERwQ9BD4ENQQgAEMEPQQ4 BEcEQgQ+BDYENQQ9BDgENQQpACwAIABBBEIEMAQ7BDgEIAAwBEAEOARPBDwEOAQuACAAFAQyBDUE IABCBEsEQQRPBEcEOAQgADsENQRCBCAAPwQ+BD0EMAQ0BD4EMQQ4BDsEPgRBBEwEIAAwBEIEOwQw BD0EQgQwBDwELAAgAEcEQgQ+BDEEIAA+BEEEMgQ+BDgEQgRMBCAAPQQ+BDIESwQ1BCAAQgQ1BEAE QAQ4BEIEPgRABDgEOAQsACAAMgRLBEAEMARBBEIEOARCBEwEIAAzBD4EQAQ+BDQEMAQgADgEIAA8 BDAEQgQ1BEAEOAQwBDsETAQ9BD4ENQQgADwEPgQzBEMESQQ1BEEEQgQyBD4ELAAgADIESwQ7BDgE MgRIBDUENQRBBE8EIAAyBCAAQAQ+BDYENAQ1BD0EOAQ1BCAANARABDUEMgQ9BDgERQQgABMEQAQ1 BEYEOAQ4BCAAOAQgACAEOAQ8BDAELAAgADAEIAA/BD4ENwQ0BD0ENQQ1BC0AIAAQBD0EMwQ7BDgE OAQgADgEIAAkBEAEMAQ9BEYEOAQ4BC4ADQAgABIEIAA/BDUEQAQyBEsENQQgADIENQQ6BDAEIAA9 BDAESAQ1BDkEIABNBEAESwQsACAARwQ1BEAENQQ3BCAANAAgAEIESwRBBE8ERwQ4BCAAOwQ1BEIE IAA/BD4EQQQ7BDUEIAA4BEEERQQ+BDQEMAQgAEEEIAARBDAEOwQ6BDAEPQQsACAAMgQgAD4EMQQ7 BDgERwQ4BDUEIAAzBEMEPQQ9BD4EMgQgADAEQAQ4BDgEIAAyBDUEQAQ9BEMEOwQ4BEEETAQsACAA PwQ+BDQEMAQyBDgEMgQgACAEOAQ8BCAAOAQgABMEQAQ1BEYEOAROBCwAIAA9BDAEIABBBDIEPgQ1 BDkEIABABD4ENAQ9BD4EOQQgADcENQQ8BDsENQQgADcEMAQ2BDMEOwQ4BCAAQQQyBD4ENQQ5BCAA QQQ7BDAEMgQ+BDkEIAA9BD4EMgRDBE4EIAAyBDUEOwQ4BDoEQwROBCAARgQ4BDIEOAQ7BDgENwQw BEYEOAROBCAAQQQ7BDAEMgRPBD0EQQQ6BDgERQQgAD0EMARABD4ENAQ+BDIELAAgAD4EOgRABEME NgQ1BD0EPQRDBE4EIABABD4ENARBBEIEMgQ1BD0EPQRLBDwEOAQgADoEQwQ7BEwEQgRDBEAEMAQ8 BDgELAAgADgEIAAyBD0EPgQyBEwEIABBBEIEPgQ7BDoEPQRDBDsEOARBBEwEIABBBD4EIABBBDIE PgQ4BDwEIAA0BEAENQQyBD0EOAQ8BCAAMgRABDAEMwQ+BDwELgAgABMENQQ9BDUEQgQ4BEcENQRB BDoEPgQ1BCAATwQ0BEAEPgQgAD8EPgRCBD4EPAQ6BD4EMgQgAFIAMQBhACgAPwRABD4ERgQ1BD0E QgQgAD8EQAQ4BD0EMAQ0BDsENQQ2BD0EPgRBBEIEOAQgADoEIAAzBDAEPwQ7BD4EMwRABEMEPwQ/ BDUEIABSADEAYQAgADEEPgQ7BEwESAQ1BCAANQAwACUAKQAtACAAIARDBEEETAQuACAAEwQ1BD4E MwRABDAERAQ4BEcENQRBBDoEOAQgAD8EQAQ1BDQEQQRCBDAEMgQ7BE8ENQRCBCAATQQ7BDsEOAQ/ BEEEIABBBCAARAQ+BDoEQwRBBDAEPAQ4BCAAMgQgABwEPgRBBDoEMgQ1BCAAOAQgABoEOAQ1BDIE NQQgADgEIAAxBD4EOwRMBEgEPgQ5BCAAPwQ+BDsEQwQ+BEEETAROBCAAfgAxADAAMAAwADoEPAQu ACAALQRCBD4EIABPBDQEQAQ+BCAAQQREBD4EQAQ8BDgEQAQ+BDIEMAQ7BD4EQQRMBCAAMgQgADEA MAAtADEAMwAgADIENQQ6BDAERQQgADgEIABCBEsEQQRPBEcEQwQgADsENQRCBCAAMQRLBDsEPgQg AEQEQwQ9BDQEMAQ8BDUEPQRCBD4EPAQgAEAEQwRBBEEEOgQ4BEUEIABGBDAEQARBBEIEMgQgADgE IAA4BDwEPwQ1BEAEOAQ5BC4AIAAdBDAEQAQ+BDQESwQgABUEMgRABD4EPwRLBCwAIAAyBD4EQQRC BD4ERwQ9BD4EOQQsACAATgQ2BD0EPgQ5BCAAOAQgADcEMAQ/BDAENAQ9BD4EOQQgABAENwQ4BDgE LAAgADgEQQQ/BEsEQgQwBDIEIAAyBCAAMQQ+BDsETARIBDUEOQQgADgEOwQ4BCAAPAQ1BD0ETARI BDUEOQQgAEEEQgQ1BD8ENQQ9BDgEIAA+BDoEQwQ7BEwEQgRDBEAEOAQyBDAETgRJBDUENQQgADIE PgQ3BDQENQQ5BEEEQgQyBDgENQQgADAEQAQ4BDUEMgQsACAAQgQwBDoENgQ1BCAAQwQ9BDAEQQQ7 BDUENAQ+BDIEMAQ7BDgEIAA6BEMEOwRMBEIEQwRABEMEIAA9BDAESAQ4BEUEIAA/BEAENQQ0BDoE PgQyBCAAOAQgAD8EPgRBBEIEQAQ+BDgEOwQ4BCAAPQQ+BDIESwQ1BCAARgQ4BDIEOAQ7BDgENwQw BEYEOAQ4BCAAQQQ+BDIEQAQ1BDwENQQ9BD0EPgRBBEIEOAQtACAAFwQwBD8EMAQ0BD0EQwROBCgA FQQyBEAEPgQ/BDAEKwAQBDwENQRABDgEOgQwBCAAOAQgAEEEMARCBDUEOwQ7BDgEQgRLBCkALAAg ADAEQAQwBDEEQQQ6BDgEOQQgADwEOARABCwAIAAYBD0ENAQ4BE8ELAAgABoEOARCBDAEOQQgADgE IAA/BEAEPgRHBDgENQQuACAAGARFBCAAOgRDBDsETARCBEMEQARLBCAAOAQgAE8ENwRLBDoEOAQg AE0EMgQ+BDsETgRGBDgEPgQ9BDgEQAQ+BDIEMAQ7BDgEIAAyBD4EOgRABEMEMwQgADAEQAQ4BDkE QQQ6BD4EMwQ+BCAARgQ1BD0EQgRABDAEIABBBDUEMgQ1BEAEMAQgABAENwQ4BDgEIAA4BCAAMgQg AEIENQRBBD0EPgQ8BCAAMgQ3BDAEOAQ8BD4ENAQ1BDkEQQRCBDIEOAQ4BCAAQQQgAD0EOAQ8BC4A IAAaBEMEOwRMBEIEQwRABDAEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCwAIAAgBEMEQQRBBDoEOAQ5 BCAAJAQ1BD0EOAQ6BEEELAAgADcEMAQgAEIESwRBBE8ERwQ4BCAAOwQ1BEIEIAA/BD4EQQQ7BDUE IAA/BD4EQgQ+BD8EMAQgADIEPgRBBEEEQgQwBD0EPgQyBDgEOwQwBCAAQQQ1BDEETwQgADIEIAAy BDgENAQ1BCAAPAQ9BD4EMwQ+BD4EMQRABDAENwQ4BE8EIABABDAENwQ+BDEESQQ1BD0EPQRLBEUE IAA4BCAAPQQ1BDcEMAQyBDgEQQQ4BDwESwRFBCwAIAA9BD4EIABABD4ENARBBEIEMgQ1BD0EPQRL BEUEIAA6BEMEOwRMBEIEQwRABCAAPgQ6BEAEQwQ2BDAETgRJBDgERQQgADUEUQQgAD0EMARABD4E NAQ+BDIELgAgABwESwQsACAAOgQwBDoEIAA0BEAENQQyBD0EOAQ1BCAAMwQ4BD8ENQRABDEEPgRA BDUEOAQgAD4EOgQwBDcEMAQ7BDgEQQRMBCAAMgQgAEYENQQ9BEIEQAQ1BCAAPAQ4BEAEMAQsACAA NwQwBCAAQgRLBEEETwRHBDgEIAA7BDUEQgQgAEEEPgQ3BDQEMAQ9BD0EPgQzBD4EIAA/BD4EQgQ+ BDwEIAA4BCAAOgRABD4EMgRMBE4EIAA9BDAESAQ4BEUEIAA/BEAENQQ0BDoEPgQyBCwAIAAyBCAA RgQ1BD0EQgRABDUEIAA9BD4EMgQ+BDkEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAARgQ4BDIEOAQ7 BDgENwQwBEYEOAQ4BC4AIAASBDUEOwQ4BEcEMAQ5BEgEOAQ5BCAAIAQ+BDQEIAA4BEEEQgQ+BEAE OAQ4BCwAIAAyBCAAPwQ+BEAESwQyBDUEIAA0BD4EMQRABD4EOQQgADsETgQxBDIEOAQgADoEIAAx BDsEOAQ2BD0EOAQ8BCAAPQQwBEAEPgQ0BDAEPAQsACAAQQQ4BDwEMgQ+BDsEOARHBDUEQQQ6BDgE IAA9BDAEPwQ4BEEEMAQ7BCAAHgQgAD0EMAQgABUEMgRABDAENwQ4BDgELQAgADoEPgRBBDwEOARH BDUEQQQ6BD4EPAQgADQEPgQ8BDUEIABBBDIEPgQ4BEUEIAA9BDAEQAQ+BDQEPgQyBC4ADQAgACIE MAQ6BD4EOQQgAEUEPgQ0BCAAMgQ1BEkENQQ5BCAAPQQ1BCAAPAQ+BDMEIAA9BDUEIABABDAENwQx BEMENAQ4BEIETAQgAEIENQRFBCwAIAA6BEIEPgQgADEEPgRABD4EOwRBBE8EIABBBCAAMwQ7BD4E MQQwBDsETAQ9BD4EOQQgAEYEOAQyBDgEOwQ4BDcEMARGBDgENQQ5BCAAHwRABDUENAQ6BDAEIAA0 BD4EIAA/BD4EQgQ+BD8EMAQuACAAEgQ9BEMESAQ4BDIEIABBBEIEQAQwBEUEIAA4BCAAQwQ2BDAE QQQsACAAMARABDgEOAQgAEEEQgQwBDsEOAQgAD4EMQRKBDUEOgRCBD4EPAQgAD0ENQQ9BDAEMgQ4 BEEEQgQ4BCAAQQQ+BCAAQQRCBD4EQAQ+BD0ESwQgAE4ENgQ9BEsERQQgAE0EOwQ4BEIEIAA4BCwA IAAyBCAAOARCBD4EMwQ1BCwAIAA4BEUEIAA/BD4EQgQ+BDwEOgQ4BCAAQQQ4BEEEQgQ1BDwEMARC BDgERwQ1BEEEOgQ4BCAAPwQ+BDQEMgQ1BEAEMwQwBE4EQgRBBE8EIAA6BD4ENwQ9BE8EPAQsACAA PwQ+BD8ESwRCBDoEMAQ8BCAAQwQ9BDgERwRCBD4ENgQ4BEIETAQgADIEPgQ5BD0EPgQ5BCAAOAQg AEAEMAQ3BDsEPgQ2BDgEQgRMBCAAOAQ3BD0EQwRCBEAEOAQgAEIEPgQzBD4ELAAgADoEQgQ+BCAA NQRJBDUEIAA9BDUENAQwBDIEPQQ+BCAAQQQwBDwEIABABD4ENgQwBDsEIAA9BDAEQAQ+BDQESwQu ACAAGgQgADoEPgQ9BEYEQwQgADIEQgQ+BEAEPgQ5BCAAQgRLBEEETwRHBDgEIAA7BDUEQgQgAD8E PgRBBDsENQQgAD8EPgRPBDIEOwQ1BD0EOARPBCAARQRABDgEQQRCBDgEMAQ9BEEEQgQyBDAEIAA9 BDAESAQgAEAEMAQ3BDQEMAQyBDsENQQ9BD0ESwQ5BCAAOAQgAEAEMARBBD8EOAQ7BDUEPQQ9BEsE OQQgAD0EMAQgADoEQwRBBDoEOAQgAD0EMARABD4ENAQgAD8EQAQ4BDMEPgQyBD4EQAQ1BD0EIAA6 BCAAQQQ8BDUEQARCBD0EPgQ5BCAAOgQwBDcEPQQ4BCAAMgRABDAEMwQ+BDwEIABHBDUEOwQ+BDIE NQRHBDUEQQRCBDIEMAQuACAAGAQgADIEPAQ1BEEEQgQ1BCAAQQQgAD0EMAQ8BDgELQAgADIENQRB BEwEIABHBDUEOwQ+BDIENQRHBDUEQQQ6BDgEOQQgAEAEPgQ0BC4AIAAnBDUEOwQ+BDIENQRHBDUE QQQ6BDgENQQgADYEOAQ3BD0ETAQgADgEIABABD4ENARBBEIEMgQ+BCAAPwQ1BEAEOAREBDUEQAQ4 BDgEIABDBDYENQQgAD4EMQQ1BEEERgQ1BD0ENQQ9BEsEIAAyBDsEMARBBEIETAROBCAAMwQ7BD4E MQQwBDsEOARBBEIEPgQyBC4AIAAcBDgEQAQgAD8EMARABDAEOwQ4BDcEPgQyBDAEPQQgAEEEQgRA BDAERQQ+BDwEIAA4BCAANwQ+BDwEMQQ4BEAEPgQyBDAEPQQgADcEMAQ6BEMEOwQ4BEEEPQRLBDwE OAQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQwBDwEOAQuACAAHgQ9BCAAMQQ+BDgEQgRBBE8EIAA9 BDAEQQQsACAAMQQ+BDgEQgRBBE8EIAAzBDsEPgQxBDAEOwRMBD0EQwROBCAATQQ7BDgEQgRDBC0A IABBBDIEPgQ1BDMEPgQgAEUEPgQ3BE8EOAQ9BDAELAAgADEEPgQ4BEIEQQRPBCAAQQQwBDwEIABB BDUEMQRPBC0AIABBBDIEPgQ1BDkEIAA9BDUEQwQ/BEAEMAQyBDsETwQ1BDwEPgQ5BCAAPAQ+BEkE OAQsACAAQQQyBD4EOARFBCAAMQQ+BDsENQQ3BD0ENQQ5BCwAIAAxBD4EOwQ4BCwAIAA9BDUEPQQw BDIEOARBBEIEOAQgADgEIABEBDAEQgQwBDsETAQ9BD4EMwQ+BCAAMgQ7BDgETwQ9BDgETwQgAD4E NAQ9BDgERQQgADUEMwQ+BCAARwQwBEEEQgQ1BDkEIAA9BDAEIAAgADQEQARDBDMEOAQ1BC4AIAAc BDgEQAQgADEEPgQ4BEIEQQRPBCAAQQQyBD4ENQQ5BCAAPwQ+BEAEPgRHBD0EPgRBBEIEOAQgADgE IAA/BDAENAQ1BD0EOARPBCAAMgQgADEENQQ3BDQEPQRDBCAAPQQ1BDEESwRCBDgETwQuACAAFQQ8 BEMEIABBBEIESwQ0BD0EPgQgAD8ENQRABDUENAQgAD0EMAQ8BDgELAAgAD0EPgQgADUEMwQ+BCAA QAQwBDEEQQQ6BDAETwQgAEEEQwRJBD0EPgRBBEIETAQgADEEPgQ4BEIEQQRPBCAAQQQyBD4ENQQ5 BCAAQAQwBDEEPgQyBDsEMAQ0BDUEOwRMBEcENQRBBDoEPgQ5BCAAQQRCBD4EQAQ+BD0ESwQuACAA HgQ9BCAANwQwBDEESwQ7BCAAPgQgADsETgQxBDIEOAQgADgEIABABD4ENARBBEIEMgQ1BCwAIAA4 BCAAPwQ+BE0EQgQ+BDwEQwQgADgEQQQ/BD4EOwQ9BDgEQgQgADEENQQ3BEMEPAQ9BEsEOQQgAD8E QAQ4BDMEPgQyBD4EQAQgAEYENQQ9BD4EOQQgADQEMAQ2BDUEIABDBEkENQQ8BDsENQQ9BDgETwQg AEEEMgQ+BDgERQQgAD0EMARGBDgEPgQ9BDAEOwRMBD0ESwRFBCAAOAQgADsETgQxBEsERQQgADQE QARDBDMEOARFBCAAPgQxBEkENQRBBEIEMgQ1BD0EPQRLBEUEIAA4BD0EQgQ1BEAENQRBBD4EMgQs ACAAMgQgAEIEPgQ5BCAAPAQ1BEAENQQsACAARwRCBD4EIAA+BD0EOAQgADIEPgQ+BDEESQQ1BCAA PAQ+BDMEQwRCBCAAMQRLBEIETAQgAEMESQQ1BDwEOwQ1BD0ESwQsACAAMgQ1BDQETAQgAD4EPQQ4 BCAAQQREBD4EQAQ8BDgEQAQ+BDIEMAQ9BEsEIAA9BDAEIAA+BEEEPQQ+BDIENQQgADsEPgQ2BD0E PgQzBD4EIAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0EOARPBCAAOAQgAD4EMQQ8BDAEPQQwBCAAOAQs ACAAMgQgAEEEQwRJBD0EPgRBBEIEOAQsACAAQQQ+BDIEPwQwBDQEMAROBEIEIABBBCAAOAQ9BEIE NQRABDUEQQQwBDwEOAQgAD4EMQQ8BDAEPQRJBDgEOgQwBC4ADQAgAB0EMARBBEIEQwQ/BDgEOwQw BCAAPwQ+BEAEMAQgAD4ERwQ1BEAENQQ0BD0ESwRFBCAAMAQ6BEIEOAQyBD0ESwRFBCAAMgQ+BDUE PQQ9BEsERQQgADQENQQ5BEEEQgQyBDgEOQQgAD8EQAQ+BEIEOAQyBCAAPQQwBEgENQQzBD4EIABA BD4ENAQwBCAAOAQgAD8EPgQxBDUENAQgAD0EMAQ0BCAAPQQwBDwEOAQtACAAPQQwBCAARARABD4E PQRCBDAERQQgAE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ+BDwEIAA4BCAAMwQ1BD0ENQRCBDgERwQ1 BEEEOgQ+BDwEKAA/BEAEPgQ4BDcEMgQ+BDQEQQRCBDIEPgQgADgEIABBBDEESwRCBCAAMwRABDUE OgQwBDwEOAQgADIEOAQ9BDAEIAA4BCAAPwQ+BEEEOwQ1BDQEQwROBEkEMARPBCAAMAQ7BDoEPgQz BD4EOwQ4BDcEMARGBDgETwQgAEEEOwQwBDIETwQ9BCkAIAA4BCAAOAQ0BDUEPgQ7BD4EMwQ4BDkE IAA4BCAARgQ1BD0EPQQ+BEEEQgQ1BDkEKABFBEAEOARBBEIEOAQwBD0EOAQ3BDAERgQ4BE8ELAAg ADoEQAQ+BDIETAROBCAAOAQgAD0EMARBBDgEOwQ4BDUEPAQgADcEMAQ8BDUEPQQ4BDIESAQwBE8E IABBBD4EMQQ+BE4EIAAyBDUEQARDBCAAMgQgAEAEPgQ0BD0ESwRFBCAAMQQ+BDMEPgQyBCkALgAg ADIAIABNBEIEOARFBCAAQQRDBD8ENQRABEQEMAQ6BEIEPgRABDAEIAA+BD8EQAQ1BDQENQQ7BDgE OwQ4BCAANgQ4BDcEPQRMBCAAMARABDgENQQyBCwAIABBBDsEMAQyBE8EPQQgADgEIABABEMEQQRB BDoEOARFBCAAMgQ/BDsEPgRCBEwEIAA0BD4EIAA9BDAESAQ1BDMEPgQgADIEQAQ1BDwENQQ9BDgE LgAgAB8EPgQ7BD0EQwROBCAAMAQ7BDoEPgQzBD4EOwQ4BDcEMARGBDgETgQgADgEIAAyBEsEQAQ+ BDYENAQ1BD0EOAQ1BCAAQQRCBEAEMAQ9BCAAQQQ7BDAEMgRPBD0EQQQ6BD4EOQQgADMEQARDBD8E PwRLBCwAIAA9BDUEQQQ8BD4EQgRABE8EIAA9BDAEIABBBDgEOwRMBD0EPgQ1BCAAQQQ+BD8EQAQ+ BEIEOAQyBDsENQQ9BDgENQQgAEMENAQwBDsEPgRBBEwEIAA/BEAEPgQyBDUEQQRCBDgEIAA/BEAE OAQ8BDUEQAQ9BD4EIAA3BDAEIAAyADAAMAAwADsENQRCBCgAQQQgADwEPgQ8BDUEPQRCBDAEIAA+ BEEEPQQ+BDIEMAQ9BDgETwQgACUENQRABEEEPgQ9BDUEQQQwBCAAMwRABDUEOgQwBDwEOAQgADgE IAA9BDAERwQwBDsEMAQgACIAOgRDBDsETARCBEMEQAQ9BD4EMwQ+BCAAQQQ+BEIEQARDBDQEPQQ4 BEcENQRBBEIEMgQwBCIAIAA4BCAANAQ+BCAAQQRABDUENAQ9BDgERQQgADIENQQ6BD4EMgQsACAA OgQ+BDMENAQwBCAANAQ4BD8EOwQ+BDwEMARCBDgERwQ1BEEEOgQ+BDUEIAA4BCAATQQ6BD4EPQQ+ BDwEOARHBDUEQQQ6BD4ENQQgADIEOwQ4BE8EPQQ4BDUEIAA3BDAEPwQwBDQEMAQgAD0EMAQgACAE PgRBBEEEOAROBCAAPwRABDgEIAAfBDUEQgRABDUEIABJACAAQwRBBDgEOwQ4BDsEPgRBBEwEIAA8 BD0EPgQzBD4EOgRABDAEQgQ9BD4EIAA/BD4EIABBBEAEMAQyBD0ENQQ9BDgETgQgAEEEIAA0BEAE NQQyBD0EOAQ8BDgEIAAyBEAENQQ8BDUEPQQwBDwEOAQpACwAIAA/BD4EOwQ9BEMETgQgAEUEQAQ4 BEEEQgQ4BDAEPQQ4BDcEMARGBDgETgQgAD8EQAQ+BDIENQQ7BDgEIAA1BEkENQQgADEESwRBBEIE QAQ1BDUELQAgADQEPgQgADkAOAA4ACAAMwQ+BDQEMAQgAD0EMARIBDUEOQQgAE0EQARLBC4AIAAf BEAEOARHBDUEPAQsACAANQRBBDsEOAQgADIEQgQ+BEAEPgQ1BCAAPwQ+BDQENAQwBDUEQgRBBE8E IAA4BEEEPwRABDAEMgQ7BDUEPQQ4BE4EIAAyBCAAQQRCBD4EQAQ+BD0EQwQgAEAEQwRBBEEEOgQ+ BDMEPgQgADwENQQ9BEIEMAQ7BDgEQgQ1BEIEMAQgADgEIAA0BEMERQQwBCgAQQApACwAIAA/BDUE QAQyBD4ENQQtACAAMQQ1BDcEQwRBBDsEPgQyBD0EPgQgADIEQAQ1BDQEPQRLBDkEIAA4BCAAPgQ/ BDAEQQQ9BEsEOQQgAD0EMARABDoEPgRCBDgEOgQsACAAPgRCBCAAOgQ+BEIEPgRABD4EMwQ+BCAA MQQeBDsETARIBDAETwQgAEcEMARBBEIETAQgAD0EMARBBDUEOwQ1BD0EOARPBCAAQQRCBEAEMAQ9 BCAAQQQ7BDAEMgRPBD0EQQQ6BD4EOQQgADMEQARDBD8EPwRLBCgAOAQgADQEQARDBDMEOARFBCAA MwRABEMEPwQ/BCkAIAAyBEsEPQRDBDYENAQ1BD0EMAQgAEEEPgRCBD0EOAQgADsENQRCBCAAPARD BEcEOARCBEwEQQRPBCAAMgQgADAEMwQ+BD0EOAQ4BCAAPwRLBEIEOgQ4BCwAIAAyBEsENgQ4BDME MAROBEkENQQ5BCAAOAQ3BCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQgAD0EMARIBDgERQQgAEAEPgQ0 BD0ESwRFBCAAOwROBDQENQQ5BC0AIABABDAENwRABEMESAQwBE4ESQQ1BDkEIAA4BEUEIAA3BDQE PgRABD4EMgRMBDUELAAgADcENAQ+BEAEPgQyBEwENQQgADgERQQgADMENQQ9BD4EMgQsACAAQAQw BDcEOwQwBDMEMAROBEkENQQ5BCAAPQRABDAEMgRBBEIEMgQ1BD0EPQQ+BC4AIAASBEAEMAQzBEME IABDBDQEMAQ7BD4EQQRMBCAAMgRLBDoEOwROBEcEOARCBEwEIABBBD4ENwQ9BDAEPQQ4BDUEIAAg BD4ENAQwBCAAOAQgAEEEOARBBEIENQQ8BD4EPgQxBEAEMAQ3BEMETgRJBDgENQQgADwEPQQ+BDME PgQyBDUEOgQ+BDIESwQ1BCAAOAQ9BEEEQgQ4BEIEQwRCBEsEIABBBDUEPARMBDgEIAA4BCAAQAQ+ BDQEMAQgAEEEPAQ1BD0EOAQ7BDgEQQRMBCAAQQQ7BEMERwQwBDkEPQRLBDwEOAQgADEEQAQwBDoE MAQ8BDgEIAA7BE4ENAQ1BDkEIAA3BDAERwQwBEEEQgRDBE4EIAAyBEEEUQQgADUESQQ1BCAAPwQ+ BCAAOwROBDEEMgQ4BCwAIAA9BD4EIAA4BCAAPwQ+BCAAPAQwBEIENQRABDgEMAQ7BEwEPQRLBDwE IAA4BDsEOAQgAEEEPgRGBDgEMAQ7BEwEPQRLBDwEIAA/BEAEOARHBDgEPQQwBDwEIAA/BEAEOAQy BDsENQQ6BDAEQgQ1BDsETAQ9BEsEPAQgADQEOwRPBCAAOARFBCAAQAQ+BDQEOARCBDUEOwQ1BDkE LgAgAA0AIAAXBDAEIAA/BD4EQQQ7BDUENAQ9BE4ETgQgAEIESwRBBE8ERwRDBCAAOwQ1BEIEIAA+ BDEESQQ1BEEEQgQyBD4EIABDBDQEMAQ7BD4EQQRMBCAAQAQwBDcEOwQ+BDYEOARCBEwEIAA0BD4E IAA8BD4EQAQwBDsEOAQgAEAEMAQ3BDwEPQQ+BDYENQQ9BDgETwQgAEEEIAA7BE4EMQRLBDwELAAg AD8ENQRABDIESwQ8BCAAPwQ+BD8EMAQyBEgEOAQ8BEEETwQsACAARwQ1BDsEPgQyBDUEOgQ+BDwE IAA4BCAAPQQwBEAEPgQ0BCAAMQRDBDQEQwRJBDUEMwQ+BCAATQRCBD4EIAA8BD0EPgQzBD4ERgQy BDUEQgQ9BD4ENQQsACAAQQQ8BDUESAQwBD0EPQQ+BDUEIAAzBDsEPgQxBDAEOwRMBD0EPgQ1BCAA QQRCBDAENAQ+BCAAQQQ1BEAESwRFBCAAQAQwBDEEPgQyBCwAIAAyBCAAPQRDBDYENAQwBEUEIABC BDUEOgRDBEkENQQzBD4EIABDBD8EQAQwBDIEOwQ1BD0EOARPBCAAQAQwBEEEQgRPBEkENQQ1BCAA QQQyBD4ETgQgADMENQQ9BDUEQgQ4BEcENQRBBDoEQwROBCAAMgQ1BEAEQQQ4BE4EIAA0BDsETwQg ADcEMAQ8BDUEPQRLBCAAPARRBEAEQgQyBEsERQQsACAAQwRBBEIEMARABDUEMgRIBDgERQQgADwE PgQ0BDUEOwQ1BDkELgAgAC0EQgQ+BCAAQQRCBDAENAQ+BCAARQQ+BDsEPgQ0BD0ESwRFBCAAOwQ4 BEcEPQQ+BEEEQgQ1BDkEIAA4BCAANQQzBD4EIABFBD4EOwQ+BDQEPQQwBE8EIAA9BDUEPQQwBDIE OARBBEIETAQgAD0EMAQgAEEEPgQyBDUEQQRCBDgEIABBBDIEPgQ4BEUEIAA+BEIERgQ+BDIELQA+ BEEEPQQ+BDIEMARCBDUEOwQ1BDkELgAgABIENQQ7BDgEOgQ+BDUEIAA/BDUEQAQ1BEEENQQ7BDUE PQQ4BDUEIABGBDIENQRCBD0ESwRFBCAAPQQwBEAEPgQ0BD4EMgQgAD8EPgQ0BDAEMgQ7BE8ENQRC BCAAQAQwBDcEMgQ4BEIESwQ5BCAAQQQ1BDIENQRABCAAOAQsACAAMwQ7BDAEMgQ9BD4ENQQsACAA IAQ+BEEEQQQ4BE4ELAAgAEMEMQQ4BDIEMAQ1BDwEQwROBCAAMgRBBDUEPAQ4BCAAOwQ1BDMEOAQ+ BD0EMAQ8BDgEIAA3BDsEMAQuACAAEQQ+BEAETAQxBDAEIAA2BDUEIAAyBD4EQQRCBD4EOgQwBCAA OAQgADcEMAQ/BDAENAQwBCAANAQ+BDEEMAQyBDsETwQ1BEIEIAA/BEAEPgRCBDgEMgQ9BDgEOgQ+ BDIEIAAgBD4EQQRBBDgEOAQsACAAPQQwBCAAOgQ+BEIEPgRABEMETgQgADIEIAA4BEIEPgQzBDUE IAA9BDAEPwRABDAEMgQ7BDUEPQQgADAENARBBDoEOAQ5BCAAQgRABDUENwRDBDEENQRGBCAAOAQ3 BCAAQgRABFEERQQgADMEOwQ+BDEEMAQ7BEwEPQRLBEUEIABGBDUEPQRCBEAEPgQyBCAAMgQ7BDAE QQRCBDgELAAgAD0ENQQgAEEERwQ4BEIEMARPBCAAMAQ6BEIEOAQyBD0EPgQzBD4EIABABDAENwQ7 BD4ENgQ1BD0EOARPBCAANQRRBCAAOAQ3BD0EQwRCBEAEOAQuAA0ADQAgACAAIAAgACAAIAAgAEkA SQBJADMEKQAgABAEIAA/BEAEPgRCBDgEMgQgAFIAQQAoAD0ENQQxBD4EIAA/BEAEPgRCBDgEMgQg AEEEMgQ1BEIEMAQpAA0AIAAdBDUEQQQ8BD4EQgRABE8EIAA9BDAEIAAyBDgENAQ4BDwEQwROBCAA MQQ1BDcEMgRABDUENAQ9BD4EQQRCBEwEIABBBD4EMgRABDUEPAQ1BD0EPQQ+BDMEPgQgAD8EQAQw BDIEPgRBBDsEMAQyBD0EPgQzBD4EIABFBEAEOARBBEIEOAQwBD0EQQRCBDIEMAQsACAARQRABDgE QQRCBDgEMAQ9BEEEOgQ4BDkEIAA8BDUEPQRCBDAEOwQ4BEIENQRCBCAANAQ+BDEEQAQwBCAAOAQg ADcEOwQwBCAARAQ4BDoEQQQ4BEAEQwQ1BEIEIAA/BD4ENARBBD4ENwQ9BDAEPQQ4BDUEIAA9BDAE IAA+BEgEOAQxBD4ERwQ9BD4EPAQgADIEPgRBBD8EQAQ4BE8EQgQ4BDgEIAA/BDUEQAQyBD4EMwQ+ BCAARAQwBDoEQgQ+BEAEMAQgAD0EMARIBDUEMwQ+BCAAQwQ9BDgERwRCBD4ENgQ1BD0EOARPBCwA IAAwBDsEOgQ+BDMEPgQ7BDUELQAgADQEMAQ1BEIEQQRPBCAAIgAwBDQEQQQ6BDgEOQQiACAAPgQx BDwEMAQ9BD0ESwQ5BCAAMgRLBDEEPgRABCAAPAQ1BDYENARDBCAAIgA0BD4EMQRABD4EPAQiACAA OAQgACIANwQ7BD4EPAQiACgAQgQ+BCAANQRBBEIETAQgADwENQQ2BDQEQwQgAEAENQRIBDUEPQQ4 BDUEPAQgAEAEMAQ3BEAENQRIBDgEQgRMBCAAOAQ7BDgEIAA3BDAEPwRABDUEQgQ4BEIETAQpACwA IABBBDoEQARLBDIEMARPBCAAQgRABDUEQgQ4BDkELAAgAD8EQAQwBDIEOAQ7BEwEPQRLBDkEIAAy BEsEMQQ+BEAELQAgADsENQQzBDAEOwQ4BDcEPgQyBDAEQgRMBCgAQgQ+BCAANQRBBEIETAQgAEEE PgQ3BDQEMARCBEwEIABBBDgEQQRCBDUEPARDBCAAPQQ+BEAEPAQgAD4EMQQ+BEAEPgRCBDAELAAg AD8EQAQ4BCAAOgQ+BEIEPgRABD4EOQQgADAEOwQ6BD4EMwQ+BDsETAQgADgEIAA7BE4EMQRLBDUE IAA0BEAEQwQzBDgENQQgAD0EMARABDoEPgRCBDgEOgQ4BCAAMgRLBDwESwQyBDAETgRCBEEETwQg ADgENwQgAD4EMQRJBDUEQQRCBDIEMAQgAEEEIAA/BD4ETwQyBDsENQQ9BDgENQQ8BCAAPQQ+BDIE SwRFBCAAPwQ+BDoEPgQ7BDUEPQQ4BDkEIAA7BE4ENAQ1BDkEKQAuACAAGgRABD4EPAQ1BCAAQgQ+ BDMEPgQsACAAPwQ+BEAEPgQ6BDgEIAA0BDUEOwQ1BD0EOARPBCAAPQQwBCAARwQ1BEAEPQQ+BDUE IAA4BCAAMQQ1BDsEPgQ1BCAAPwRABDgEMgQ1BDsEOAQgADoEIAAxBD4EOwRMBEgEPgQ8BEMEIAA6 BD4EOwQ4BEcENQRBBEIEMgRDBCAAOgQ+BD0ERAQ7BDgEOgRCBD4EMgQgADgEIAA6BEAEPgQyBDgE IAAyBD4EIAAyBEEENQQ8BCAAPAQ4BEAENQQtACAAQAQ1BDsEOAQzBDgEPgQ3BD0ESwQ1BCwAIAA4 BDQENQQ+BDsEPgQzBDgERwQ1BEEEOgQ4BDUELAAgAE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ4BDUE IAAyBD4EOQQ9BEsELgAgACEEOgRABEsEQgQ4BDUEIABEBEAEMAQ6BEIEMAQ7BEwEPQQ+BEEEQgQ4 BCAAQAQ1BDAEOwRMBD0EPgQzBD4EIABDBEEEQgRABD4EOQRBBEIEMgQwBCAAPAQ4BEAEMAQgADoE MARCBDUEMwQ+BEAEOARHBD0EPgQ5BCAAQgRABDAEOgRCBD4EMgQ6BD4EOQQgABwgNAQ+BDEEQAQ+ BC0ANwQ7BD4EHSAgADUEQQRCBEwEIAA+BEEEPQQ+BDIEMAQgAEAEMAQ3BDQENQQ7BDUEPQQ4BE8E KAA+BEIENAQ1BDsENQQ9BDgETwQgADcEPQQwBD0EOAQ5BCAAPgRCBCAAOwROBDQENQQ5BCAAOAQg ADgERQQsACAANwQ9BDAEPQQ4BDkELAAgADwEPgQ9BD4EPwQ+BDsEOAQ3BDAERgQ4BE8EKQAgADgE IAA+BD8EPgRABDAEIAAyBDsEMARBBEIEOAQgAD0EMAQgADwEOARABD4EMgQ+BDcENwRABDUEPQRH BDUEQQQ6BD4EPAQgAEMEQAQ+BDIEPQQ1BC4AIAAQBCAAPwQ+BEAEMAQxBD4ESQQ1BD0EOAQ1BCAA PgQxBEkENQRBBEIEMgQwBCAAMAQ7BDoEPgQzBD4EOwQ1BDwEIAA4BCAATQRCBD4EOQQgAEAENQQ7 BDgEMwQ4BDUEOQQgAEEEMgRPBDcEMAQ9BEsEIAA4BCAANAQ+BD8EPgQ7BD0ETwROBEIEIAA0BEAE QwQzBCAANARABEMEMwQwBC4ADQAgACEEPgQyBEAENQQ8BDUEPQQ9BDAETwQgADIEPgQ7BD0EMAQg AEMEPQQ4BEcEQgQ+BDYENQQ9BDgETwQgADgEIABABDAEQQQ/BEsEOwQ1BD0EOARPBCAAQARDBEEE QQQ6BDgERQQsACAAQwQ2BDUEIAA0BDsEOARCBDUEOwRMBD0EPgQ1BCAAMgRABDUEPARPBCAAPwRA BDUEMQRLBDIEMAROBEkEOARFBCAAPwQ+BDQEIAAyBDsEMARBBEIETAROBCAAUgBBACwAIAA6BCAA PQQwBEEEQgQ+BE8ESQQ1BDwEQwQgADIEQAQ1BDwENQQ9BDgEIAAgAEAEMAQ3BDQENQQ7BDUEPQQ9 BEsERQQgAD0EMAQgAD0ENQRBBDoEPgQ7BEwEOgQ+BCAAMwQ+BEEEQwQ0BDAEQARBBEIEMgQoACAE PgRBBEEEOAROBCwAIAAjBDoEQAQwBDgEPQRDBCAAOAQgABEENQQ7BD4EQARDBEEEQQQ4BE4EKQAs ACAAIAA/BEAENQQ0BEEEQgQwBDIEOwRPBE4ESQQ4BEUEIAA8BDgEPQQ4BDwEMAQ7BEwEPQRLBDkE IAA/BEAEPgRGBDUEPQRCBCAAQQRDBDwEPAQwBEAEPQQ+BDMEPgQgAD0EMARBBDUEOwQ1BD0EOARP BCAAFwQ1BDwEOwQ4BCwAIABNBEIEPgQgAEEEOAQ9BDUEQAQzBDgETwQgAD4EMQRKBDUENAQ4BD0E NQQ9BDgETwQgABEEOAQxBDsEOAQ4BCwAIAAwBD0EQgQ4BEEEPgRGBDgEMAQ7BEwEPQQ+BDkEIAA/ BEAEPgQ/BDAEMwQwBD0ENARLBCAAOAQgAD8EQARPBDwEPgQzBD4EIAAzBDUEPQQ+BEYEOAQ0BDAE LgAgACcENQRABDUENwQgADEALgA1ACAAQgRLBEEETwRHBDgEIAA7BDUEQgQgAD8EPgRBBDsENQQg AEAEPgQ2BDQENQQ9BDgETwQgAEEEOwQwBDIETwQ9BEEEOgQ4BEUEIAA/BDsENQQ8BDUEPQQsACAA QARDBEEEQQQ6BDgEOQQgAEAEPgQ0BCwAIAA9BDUEQQRDBEkEOAQ5BCAATwQ0BEAEPgQgAEAEQwRB BEEEOgQ+BDMEPgQgADQEQwRFBDAEIABBACwAIABABDAEQQRBBDUETwQ9BCAAPwQ+BCAAPAQ4BEAE QwQsACAAMAQgAD4EQQRCBDAEMgRIBDgENQRBBE8EIAAyBCAAQQQyBD4ENQQ8BCAAPQQwBEAEPgQ0 BDUEIABABDAENwQ0BDAEMgQ7BDUEPQRLBCAAOwQ+BDYETAROBCAAOAQgAD4EMQQ8BDAEPQQ+BDwE IAA/BEAEPgQ/BDAEMwQwBD0ENARLBCwAIAAwBDsEOgQ+BDMEPgQ7BDgENwQwBEYEOAQ1BDkELAAg ADwEPQQ+BDYENQRBBEIEMgQ+BDwEIAAxBD4EOwQ1BDcEPQQ1BDkEIAA4BCAAPwRABD4EMQQ7BDUE PAQsACAAQQQ7BDAEMQQ+BEEEQgRMBE4ELAAgAEEEQgRABDAERQQ+BDwELAAgADMEOwRDBD8EPgRB BEIETAROBCwAIAAxBDUENwQ9BEAEMAQyBEEEQgQyBDUEPQQ9BD4EQQRCBEwETgQgAD4EOgRABEME NgQ1BD0EOARPBCAAOwQ4BDEEPgQgAEEEMAQ8BDgEIAA0BDUEMwRABDAENAQ4BEAEPgQyBDAEOwQ4 BCAAOAQvADgEOwQ4BCAAMQQ+BDsENQROBEIELgAgAB8EPgQgAD8EOwQwBD0EQwQgADIEQAQwBDME MAQsACAAMgRCBD4EQAQwBE8EIAAyBD4EOwQ9BDAEIAA4BEEEQgRABDUEMQQ7BDUEPQQ4BE8EIABA BEMEQQRBBDoEOARFBCAAOAQgAD8EPgRABDAEMQQ+BEkENQQ9BDgETwQgAD4EQQRCBDAEMgRIBDgE RQRBBE8EIABABDAEMQQ+BEIEMAQ1BEIEIAAyBCAAPwQ+BDsEPQRDBE4EIABBBDgEOwRDBCAAOAQg AEMENgQ1BCAAMQQ7BDgENwQ6BDAEIAA6BCAANwQwBDIENQRABEgENQQ9BDgETgQuACAAIgQ1BCAA PgRBBEIEMARCBDoEOAQgAEAEQwRBBEEEOgQ4BEUELAAgAEcEQgQ+BCAAPAQ+BDMEQwRCBCAAPQQ1 BCAAQQRCBDAEQgRMBCAAMwQ1BD0ENQRCBDgERwQ1BEEEOgQ4BDwEIAA8BEMEQQQ+BEAEPgQ8BCwA IAA9BDAEPwRABDAEMgQ7BE8ETgRCBEEETwQgAEcENQRABDUENwQgAD4ERwQ1BEAENQQ0BD0EPgQ1 BCAAIgAxBEMEQgRLBDsEPgRHBD0EPgQ1BCAAMwQ+BEAEOwRLBEgEOgQ+BCIAIAA4BCAAPgQxBEAE MAQ3BEMETgRCBCAAPQQ+BDIESwQ5BCAAPQQwBEAEPgQ0BCAAQAQwBDEEPgQyBCwAIAA1BEEEOwQ4 BCAAPQQwBCAATQRCBD4EIABFBDIEMARCBDgEQgQgADgERQQgAEEEOAQ7BCwAIAA7BDgEMQQ+BCAA PgQ6BD4EPQRHBDAEQgQ1BDsETAQ9BD4EIAAyBEsEPAQ4BEAEMAROBEIEIAA4BCwAIABABDAENwQy BDUETwQ9BD0ESwQ1BCAAOgQwBDoEIAA/BDUEPwQ1BDsEIAA/BD4EIAAyBDUEQgRABEMELAAgADgE NARDBEIEIABBBDIEPgQ4BDwEOAQgAD4EQQRCBDAEQgQ6BDAEPAQ4BCAAMgQgAEMEQQQ7BEMENgQ1 BD0EOAQ1BCAANAQ1BD0ETAQzBDAEPAQgADgEIAAyBDsEMARBBEIEOAQtACAAMQRDBDQEQwRJBDUE PARDBCAANAQ+BDsEMwQ+BEEEQAQ+BEcEPQQ+BDwEQwQgABMEGwQeBBEEEAQbBCwEHQQeBBwEIwQg AEAEMAQxBEEEOgQ+BDwEQwQgAD8EPgRABE8ENAQ6BEMEIABSAEEALgANAA0AIAAgACAAIAAgACAA IABJAEkASQA0BCkAIAAiAC4EPQQ+BEgENQRBBDoEOAQ5BCAAPAQwBDoEQQQ4BDwEMAQ7BDgENwQ8 BCIAIAAwBEIEOwQwBD0EQgQ+BDIEIAA4BCAAMgQ+BDkEPQQwBCAAPQQwBCAAQwQ9BDgERwRCBD4E NgQ1BD0EOAQ1BA0AIAAnBEIEPgQgADEEQwQ0BDUEQgQsACAANQRBBDsEOAQgAD8EPgQxBDUENAQ4 BEIEIABSAEEAPwAgABIEQQRRBCAAPgQxBEkENQRBBEIEMgQ+BCAAPwRABDUEMgRABDAEQgQ4BEIE QQRPBCAAMgQgACIANgQ4BDIEPgRCBD0ESwRFBCIALAAgAEEEOwRDBDYEMARJBDgERQQgAEUEPgQ3 BE8EOAQ9BEMELgAgABAEIABBBD4EIAAyBEAENQQ8BDUEPQQ1BDwEIAAxBEMENAQ1BEIEIAA/BEME SQQ1BD0EPgQgAD8EPgQ0BCAAPQQ+BDYEIABABD4EMQQ+BEIEMAQ8BDgELAAgADoEPgRCBD4EQARL BDUEIAA3BDAEPAQ1BEEEQgRPBEIEIAA7BE4ENAQ1BDkEIAA6BDAEOgQgAD0ENQQ9BEMENgQ9BEsE NQQgADwEPgQ0BDUEOwQ4BC4AIAASBCAATQRCBD4EPAQgAEEEQwRCBEwEIAA7BD4EMwQ4BDoEOAQg AEAENQQ7BDgEMwQ4BD4ENwQ9BD4EMwQ+BCAAQQRCBEAENQQ8BDsENQQ9BDgETwQgADoEIAAyBDsE MARBBEIEOAQuACAAEgQgAEIEMAQ6BD4EPAQgAEEEOwRDBEcEMAQ1BCAARwQ1BDsEPgQyBDUERwQ1 BEEEQgQyBD4EIAA4BDcEPAQ1BD0EOARCBEEETwQgAD0EMARBBEIEPgQ7BEwEOgQ+BCwAIABHBEIE PgQgADEENQRBBEEEPARLBEEEOwQ1BD0EPQQ+BCAAMQRDBDQENQRCBCAAMwQ+BDIEPgRABDgEQgRM BCAAPgQgADUEMwQ+BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ4BEUEIAA6BDAERwQ1BEEEQgQyBDAE RQQuACAAHQQ+BCAAOgQwBDoEPgQ5BCAAMQRLBCAAPQQ4BCAAPgQ6BDAENwQwBDsEMARBBEwEIABA BDUEMAQ7BEwEPQQ+BEEEQgRMBCwAIAAyBCAAQgQ+BDwEIAA4BDsEOAQgADgEPQQ+BDwEIAAyBDgE NAQ1BCAARwQ1BDsEPgQyBDUERwQ1BEEEQgQyBD4EIAA/BEAEPgQ0BD4EOwQ2BDgEQgQgAEEEQwRJ BDUEQQRCBDIEPgQyBDAEPQQ4BDUEIAA4BCAAQgQ+BDsETAQ6BD4EIAAyBD4EPwRABD4EQQQgADIE QAQ1BDwENQQ9BDgELAAgADoEPgQzBDQEMAQgAD4EPQQ+BCAAQQRCBDAEPQQ1BEIEIABBBDIEPgQx BD4ENAQ9BEsEPAQsACAANQRBBDsEOAQgADUEPARDBCAAMgQ+BD4EMQRJBDUEIAA9BEMENgQ9BD4E IAAyBEsENgQ4BEIETAQuACAAGAQgAD8EPgRNBEIEPgQ8BEMEIAAzBDsEPgQxBDAEOwRMBD0EMARP BCAAMQQ1BEEEOgQ+BDwEPwRABD4EPAQ4BEEEQQQ9BDAETwQgADIEPgQ5BD0EMAQgAD4ERwQ1BD0E TAQgADIEMAQ2BD0EMAQgADQEOwRPBCAAPwQ+BDEENQQ0BEsEIABSAEEALAAgAD8EPgRNBEIEPgQ8 BEMEIAA/BD4EQQQ7BDUENAQ+BDIEMARCBDUEOwQ4BCAATQRCBD4EMwQ+BCAAMQQ+BDMEMAQgAD8E QAQ1BD0ENQQxBEAENQQzBDAETgRCBCAAPgQxBEkENQQ5BCAAMQQ1BDcEPgQ/BDAEQQQ9BD4EQQRC BEwETgQgADIESwQ2BDgEMgQwBD0EOARPBCAARwQ1BDsEPgQyBDUERwQ1BEEEQgQyBDAEIAA4BCAA PgRCBD0EPgRBBE8EQgRBBE8EIAA6BCAAMgQ+BDkEPQQ1BCAAOgQwBDoEIAAxBDUENwRDBDwEPQRL BDUEIABEBDAEPQQwBEIEOAQ6BDgELAAgADIEPgQ5BD0ENQQgAD0EMAQgAEMEPQQ4BEcEQgQ+BDYE NQQ9BDgENQQgAD8EQwRBBEIETAQgADQEMAQ2BDUEIABGBDUEPQQ+BDkEIAAzBDsEPgQxBDAEOwRM BD0EPgQ5BCAAOgQwBEIEMARBBEIEQAQ+BEQESwQuACAADQAgAB4EPQQ4BCAAPQQ1BCAAPwQ+BD0E OAQ8BDAETgRCBCwAIABHBEIEPgQgADgERQQgAD8EPgQxBDUENAQwBCAAPQQwBDQEIABHBDUEOwQ+ BDIENQRHBD0EPgRBBEIETAROBCAAMQRDBDQENQRCBCAAOARFBCAANgQ1BCAAPwQ+BEAEMAQ2BDUE PQQ4BDUEPAQgADIEIAA0BD4EOwQzBD4EQQRABD4ERwQ9BD4EOQQgAD8ENQRABEEEPwQ1BDoEQgQ4 BDIENQQgADIEIAAxBD4EQARMBDEENQQgAEEEIAAxBD4EOwQ1BDUEIABBBDgEOwRMBD0ESwQ8BDgE IAA+BDEEPAQwBD0ESQQ4BDoEMAQ8BDgEIAA4BCAAPgRCBEAEOARGBDAEQgQ1BDsETAQ9BEsEPAQ4 BCAAPwQ+BEEEOwQ1BDQEQQRCBDIEOARPBDwEOAQgAEEEMgQ+BDUEMwQ+BCAAPQQ1BE0ERAREBDUE OgRCBDgEMgQ9BD4EMwQ+BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQgADgEIAA+BDEENQRBBEcENQQ7 BD4EMgQ1BEcEOAQyBDAEPQQ4BE8ELgAgAB4EMQQ8BDAEPQRDBEIESwQ1BCAAQQQwBDwEOAQsACAA PgQ9BDgEIAA9BDUEIAAzBD0EQwRIBDAETgRCBEEETwQgAD4EMQQ8BDAEPQRLBDIEMARCBEwEIAA0 BEAEQwQzBDgERQQgADgEIABEBD4EQAQ8BDgEQARDBE4EQgQgAD8EPgRABD4ERwQ9BEsEOQQgADoE QARDBDMELAAgADIEIAA6BD4EQgQ+BEAEPgQ8BCAAPgQ0BD0EMAQgAEcEMARBBEIETAQgADcEPAQV BE8EKAA/BD4EIAARBDgEMQQ7BDgEOAQgAE0EQgQ+BCAANQQyBEAENQQ4BCkAIAAjBEAEPgQxBD4E QAQ+BEEEMAQsACAAMwQ+BDsEPgQyBDAELAAgADUEQQRCBCAAMgRCBD4EQARDBE4ELQAgAEEEMgQ+ BDkEIABFBDIEPgRBBEIEKAAzBD4ENQQyBCkALAAgADAEIAA/BEMEQgRMBCAAOgQgADUENAQ4BD0E NQQ9BDgETgQgAEEEIAA4BEEEQgQ4BD0EPgQ5BCwAIABBBDAEPAQ4BDwEIABBBD4EMQQ+BDkEIAA4 BCAAQQQ+BCAAMgRBBDUEPAQ4BCAAOAQgAEEEMgQ+BDEEPgQ0BDUEIAA+BEIEIABBBD4EMQRBBEIE MgQ1BD0EPQQ+BDMEPgQgAEEESgQ1BDQENQQ9BDgETwQgAD4EQgRABDUENwQwBD0EIAA9BDAEMgRB BDUEMwQ0BDAELgAgABQEMAQ2BDUEIABBBDAEPARLBDkEIABBBDgEOwRMBD0ESwQ5BCAAPgQxBDwE MAQ9BEkEOAQ6BCAAPQQ1BCAAPAQ+BDYENQRCBCAAMQRLBEIETAQgAEIEMAQ6BDgEPAQgADIENQRH BD0EPgQsACAAQgQwBDoEIAA6BDAEOgQgADcEMAQyBDgEQQQ4BEIEIAA+BEIEIABBBDIEPgQ1BDkE IAA/BEAEOARABD4ENARLBCAAOAQgADIEQQQ1BDMENAQwBCAAPAQ+BDYENQRCBCAAMQRLBEEEQgRA BD4EIABDBDwENQRABDUEQgRMBCAAPwQ+BCAAQgQ1BDwEIAA4BDsEOAQgADgEPQRLBDwEIAA/BEAE OARHBDgEPQQwBDwELAAgAEMEQgRABDAEQgQ4BDIEIAA/BEAEOAQgAE0EQgQ+BDwEIAAyBDwENQRB BEIENQQgAEEEIAA2BDgENwQ9BEwETgQgADgEIABBBDIEPgROBCAAMgQ7BDAEQQRCBEwELgAgAB0E PgQsACAAQgQ1BDwEIAA9BDUEIAA8BDUEPQQ1BDUELAAgADsETgQ0BDgEIABCBDAEOgQgAEEEOAQ7 BEwEPQQ+BCAANQRRBCAAOwROBDEETwRCBCwAIABHBEIEPgQgADMEPgRCBD4EMgRLBCAAQAQwBDQE OAQgADIEOwQwBEEEQgQ4BCAAOAQ0BEIEOAQgAD0EMAQgAEEEMAQ8BEsENQQgAEMENgQwBEEEPQRL BDUEIAA/BEAENQRBBEIEQwQ/BDsENQQ9BDgETwQgADgEIABDBD0EOARHBEIEPgQ2BDAEQgRMBCAA QQQ1BDEENQQgAD8EPgQ0BD4EMQQ9BEsERQQgADEENQQ3BCAAQQQ+BDIENQRBBEIEOAQgADgEIABB BD4EQQRCBEAEMAQ0BDAEPQQ4BE8ELgAgABQEOwQ4BEIETARBBE8EIABNBEIEPgQgADEENQRBBDoE PgQ9BDUERwQ9BD4EIAA9BDUEIAA8BD4ENgQ1BEIEIAA4BCwAIAAyBCAAOARCBD4EMwQ1BCwAIAAy BEEETwQgAEYEOAQyBDgEOwQ4BDcEMARGBDgETwQgADgENARRBEIEIAA/BD4ENAQgADYENQRABEIE MgQ1BD0EPQRLBDkEIAA9BD4ENgQgADgEIAAyBEEETwQgADcENQQ8BD0EMARPBCAANgQ4BDcEPQRM BCAAMgQ8BDUEQQRCBDUEIABBBCAAPQQ1BDkELgANACAADQAgACAAIAAgACAAIAAgAEkASQBJADUE KQAgACEEPgRGBDgEMAQ7BEwEPQQwBE8EIAA/BDgEQAQwBDwEOAQ0BDAEIAAwBEIEOwQwBD0EQgQ+ BDIEDQAgACEENQQ5BEcEMARBBCAAPARLBCAAQQRCBDAEOwQ4BCAAPQQwBDEEOwROBDQEMARCBDUE OwRPBDwEOAQgAD4ERwQ1BEAENQQ0BD0EPgQ5BCAAMgRLBEAEPgRBBEgENQQ5BCAAPwQ4BEAEMAQ8 BDgENARLBCAAUgBBAC4AIAAdBD4EIAA9BDUEIAA6BDAEPAQ1BD0EPQQ+BDkELAAgADAEIABBBD4E QQRCBD4ETwRJBDUEOQQgADgENwQgADMEOwQ+BDEEMAQ7BEwEPQRLBEUEIAA+BEAEMwQwBD0EOAQ3 BDAERgQ4BDkEIAA4BCAAQAQ1BEEEQwRABEEEPgQyBCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQtACAA NAQ1BD0ENQQzBCwAIAAzBD4EQQRDBDQEMARABEEEQgQyBDUEPQQ9BD4EOQQgADIEOwQwBEEEQgQ4 BCwAIAAhBBwEGAQuACAALQRCBD4EIAAiAEEEPgRGBDgEMAQ7BEwEPQQwBE8EIgAgAD8EOARABDAE PAQ4BDQEMAQuACAAFQRRBCAARARDBD0ENAQwBDwENQQ9BEIEIAAyBCAARgQ1BD0EPQQ+BEEEQgRP BEUEIABABDAENwQ0BDUEOwQ1BD0EOARPBC0AIAA8BD4EPQQ+BD8EPgQ7BDgENwQwBEYEOAQ4BCAA OAQgAD4EQgQ0BDUEOwQ1BD0EOARPBCAAOwROBDQENQQ5BCAAPgRCBCAAMQQ7BDAEMwQgAD8EQAQ4 BEAEPgQ0BEsEKABABDAENwQyBEAEMARCBCAAOAQgAEAEMAQ3BDIEMAQ7BCAAOAQ9BEEEQgQ4BEIE QwRCBD4EMgQsACAAQAQ1BDAEOwQ4BDcEQwROBEkEOARFBCAARgQ1BD0EPQQ+BEEEQgQ4BCAAQAQ+ BDQEMAQsACAAQQQ6BEAESwRCBDgENQQgADcEPQQwBD0EOAQ5BCwAIAA6BD4EPQRGBDUEPQRCBEAE MARGBDgETwQgADwEMARCBDUEQAQ4BDAEOwRMBD0ESwRFBCAAMQQ7BDAEMwQgADgEIAA0BDUEPQQ1 BDMEIAAyBCAAQARDBDoEMARFBCAAPQQ1BEEEOgQ+BDsETAQ6BDgERQQgAEEENQQ8BDUEOQQsACAA PgRCBDIEQAQwBEkENQQ9BDgENQQgAD8EQAQ4BEAEPgQ0BEsEIABBBD4EMgRABDUEPAQ1BD0EPQRL BEUEIAA7BE4ENAQ1BDkEIAA+BEIEIABCBDAEOgQ4BEUEIABGBDUEPQQ9BD4EQQRCBDUEOQQsACAA OgQwBDoEIABHBDUEOwQ+BDIENQRHBD0EPgRBBEIETAQsACAAPwQ+BEAETwQ0BD4ERwQ9BD4EQQRC BEwELAAgAEEEPgQyBDUEQQRCBDsEOAQyBD4EQQRCBEwEIAA4BCAAPwRABD4ERwQ4BDUEKQAuACAA JgQ1BD0EPQQ+BEEEQgRMBCAATQRCBD4EOQQgAD8EOARABDAEPAQ4BDQESwQgADQEOwRPBCAAMARC BDsEMAQ9BEIEPgQyBCAAMgQgAEIEPgQ8BCwAIABHBEIEPgQgADIEIABBBDsEQwRHBDAENQQgACIA PwQ+BEIEPgQ/BDAEIgAsACAAMwQ7BDAEMgQ9BEsENQQgADYEQAQ1BEYESwQgADIESwQ2BDgEMgRD BEIEIAA9BDAEIAAyBDUEQARIBDgEPQQ1BCAAPwQ4BEAEMAQ8BDgENARLBC4ADQAgACAEMAQ3BDQE NQQ7BDUEPQQ4BDUEIABHBDUEOwQ+BDIENQQ6BDAEIAA/BEAEPgQ4BEEERQQ+BDQEOARCBCAAPwQ+ BCAAQARPBDQEQwQgAD8EQAQ4BD4EQAQ4BEIENQRCBD0ESwRFBCAAPQQwBD8EQAQwBDIEOwQ1BD0E OAQ5BDoADQAxAC4AIAAtBDsEOARCBDAEIAA4BCAAQAQwBDEESwQsACAAOgQwBDoEIAA+BEIEQAQw BDYENQQ9BDgENQQgAEAEMAQ3BDQENQQ7BDUEPQQ4BE8EIABDBDwEMAQgADgEIABBBD4EMgQ1BEEE QgQ4BCwAIAAzBDsEMAQyBD0EPgQ5BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIAA9BDAEIAA3BD0EMAQ9 BDgENQQgADgEIAA/BEAEMAQyBDgEOwRMBD0EPgQ1BCAAPAQ4BEAEPgQ/BD4EPQQ4BDwEMAQ9BDgE NQQgAEYENQQ9BEIEQAQwBDsETAQ9BEsERQQgADAEQQQ/BDUEOgRCBD4EMgQgAEAENQQwBDsETAQ9 BD4EQQRCBDgELAAgAD4EMQRJBDgERQQgAEEEMgQ+BDkEQQRCBDIEIAA6BDAEQARCBDgEPQRLBCAA PgRCBD0EPgRIBDUEPQQ4BDkEIABHBDUEOwQ+BDIENQQ6BDAEIAA4BCAAPAQ4BEAEMAQuACAAEQQ+ BEAETAQxBDAEIAA/BEAEPgRCBDgEMgQgAEEEPgQ6BEAESwRCBDgETwQgADcEPQQwBD0EOARPBCAA MgQ+BDcEPAQ+BDYEPQQwBCAANwQwBCAAQQRHBDUEQgQgAEAENQQ0BDoEPgQ5BCwAIAA9BD4EIAA3 BDAEQgQ+BCAAPgQxBD0EPgQyBDsETwROBEkENQQ5BEEETwQgAEEEPgQgADIEQAQ1BDwENQQ9BDUE PAQgAD8EQAQ+BEEEOwQ+BDkEOgQ4BCAAQwQ8BD0ESwRFBCAAQAQwBDEEPgQyBCAAOAQgAEEEPgRH BEMEMgRBBEIEMgRDBE4ESQQ1BDkEIABNBDsEOARCBEsELgAgAB8EQAQ+BD8EMAQzBDAEPQQ0BDAE IABEBD4EQAQ8BDgEQARDBDUEQgQsACAAOgQwBDoEIABBBDsENQQ0BEEEQgQyBDgENQQgAE0EQgQ+ BDMEPgQgAEAEMAQ3BDQENQQ7BDUEPQQ4BE8ELAAgADoEQwQ7BEwEQgQgAEIEPgRCBDAEOwRMBD0E PgQ5BCAAMgQ7BDAEQQRCBDgELAAgAD4EQQQ9BD4EMgQwBD0EPQRLBDkEIAA9BDAEIAA+BDEESQQ1 BDwEIAA9BDUENwQ9BDAEPQQ4BDgEIABABDUEMAQ7BEwEPQQ+BDMEPgQgAEMEQQRCBEAEPgQ5BEEE QgQyBDAEIAA8BDgEQAQwBCAAQQQyBD4EOAQ8BDgEIAAwBDQENQQ/BEIEMAQ8BDgELAAgAD0ENQQg AEEERwQ4BEIEMARPBCAAQQQwBDwESwRFBCAAQQQ4BDsETAQ9BEsERQQgACIARQQ+BDcETwQ1BDIE IABNBEIEPgQzBD4EIAA8BDgEQAQwBCIALAAgAEEEQgQ+BE8ESQQ4BEUEIAA9BDAEIAA8BDgEQQRC BDgERwQ1BEEEOgQ+BDkEIAAyBDUEQARFBEMESAQ6BDUEIABBBD4ERgQ4BDAEOwRMBD0EPgQ5BCAA PwQ4BEAEMAQ8BDgENARLBC4ADQAyAC4AIAAgBDAENwQ0BDUEOwQ1BD0EOAQ1BCAAPQQwBEAEPgQ0 BD4EMgQgAD0EMAQgAEEEQgRABDAEPQRLBCwAIAA6BDAEOgQgAEEEOwQ1BDQEQQRCBDIEOAQ1BCwA IABDBEEEQgRABDAEPQQ1BD0EOAQ1BCAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgQ1BDkEIAA+BDEEPAQ1 BD0EMAQgADgEPQREBD4EQAQ8BDAERgQ4BDUEOQQgAD0EMARABD4ENAQwBDwEOAQgAD0EMAQgAD4E MQRJBDUEPAQgAE8ENwRLBDoENQQsACAAOgQwBDoEIAA+BEIEQAQwBDYENQQ9BDgENQQgADwEPgQ9 BD4EPwQ+BDsEOAQ4BCAAPQQwBCAAQgRABDAEOgRCBD4EMgQ6BEMEIABBBD4EMQRLBEIEOAQ5BCAA OAQgAEMEPwRABDAEMgQ7BDUEPQQ4BDUEIABABD4EQQRCBD4EPAQgADgEIABABDAENwQyBDgEQgQ4 BDUEPAQgAD0EMARABD4ENAQ+BDIEIABHBDUEQAQ1BDcEIABCBEAEMAQ0BDgERgQ4BDgEIAA4BCAA NwQwBDIENQRCBC4AIAAhBDoEQARLBEIEOAQ1BCwAIABDBD0EOARHBEIEPgQ2BDUEPQQ4BDUEIAA4 BEEEQgQ+BEAEOAQ4BCAAOAQgADwEMAQ9BDgEPwRDBDsETwRGBDgEOAQgADUETgQuACAAJAQ+BEAE PAQ4BEAEQwQ1BEIEIAA6BEMEOwRMBEIEIAAwBDIEQgQ+BEAEOARCBDUEQgQwBCwAIAA9BDAEPwRA BDAEMgQ7BE8ENQQ8BD4EMwQ+BCAAPgRGBDUEPQRJBDgEOgQwBDwEOAQgADgEQQRCBD4EQAQ4BEcE NQRBBDoEOARFBCAAQQQ+BDEESwRCBDgEOQQgADgEIABEBDAEOgRCBD4EOwQ+BDMEOAQ4BC4ADQAz AC4AIAAjBD8EQAQwBDIEOwQ1BD0EOAQ1BCAARwQ1BEAENQQ3BCAAQAQ1BDsEOAQzBDgETgQgADgE IAAzBD4EQQRDBDQEMARABEEEQgQyBD4EIAA+BEEEQwRJBDUEQQRCBDIEOwRPBDUEQgRBBE8EIAA9 BDAEIAA+BEEEPQQ+BDIENQQgAEAEMAQ3BDQENQQ7BDUEPQQ4BE8EIABGBDUEPQQ9BD4EQQRCBDUE OQQuACAADQAzADAELQAgACAENQQ7BDgEMwQ4BE8EIAA0BD4EMQRABDAEIAA4BCAANwQ7BDAEIABA BDAENwRABEsEMgQwBDUEQgQgAEMENgQ1BCAAPQQ1BCAAQgQ+BDsETAQ6BD4EIABBBDIETwQ3BDAE PQQ9BEsENQQgADoEMARCBDUEMwQ+BEAEOAQ4BC0AMAQ9BEIEMAQzBD4EPQQ4BEEEQgRLBCwAIAA9 BD4EIAA4BCAAPgRCBEAEMAQ2BDAENQRCBCAAOARBBEIEOAQ9BD0EPgQ1BCAANwQ9BDAEPQQ4BDUE IABNBDsEOARCBEsEIAAyBCAAMgQ4BDQENQQgAEAEMAQ3BEAEPgQ3BD0ENQQ9BD0ESwRFBCAATQQ7 BDUEPAQ1BD0EQgQ+BDIELgAgACIEMAQ6BCAARgQ1BDsENQQ/BD4EOwQwBDMEMAQ9BDgENQQgAEAE NQQ0BEMERgQ4BEAEQwQ1BEIEQQRPBCAANAQ+BCAAOwQ+BDMEOARHBDUEQQQ6BDgERQQgADIESwQy BD4ENAQ+BDIELAAgADgEMwQ9BD4EQAQ4BEAEQwROBEkEOARFBCAAMwQ+BDsEPgRBBCAAQQQ+BDIE NQRBBEIEOAQuACAAIAQ1BDsEOAQzBDgETwQgAEEEQgRABDUEPAQ4BEIEQQRPBCAAOgQgAEAEMAQ3 BDQENQQ7BDUEPQQ4BE4EIAA0BEMERQQ+BDIEPQQ+BDkEIAA4BCAAPAQ4BEAEQQQ6BD4EOQQgADYE OAQ3BD0ENQQ5BCwAIAA6BDAEOgQgAEEEOwQ1BDQEQQRCBDIEOAQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4 BDgEIAA9BDAEIAA3BD0EMAQ9BDgENQQgAEEEMgRPBEIEPgQzBD4EIAA/BDgEQQQwBD0EOARPBCAA OAQgADgEQQRCBD4EQAQ4BDgEIAA4BCAAPQQwBCAAPwQ+BEEEQAQ1BDQEPQQ4BEcENQRBBDoEOAQ1 BCAAQwRBBDsEQwQzBDgEIAAyBCAAPgRCBD0EPgRIBDUEPQQ4BE8ERQQgAEEEIAARBD4EMwQ+BDwE LgANADMAMQQtACAAHQQwBDIETwQ3BEsEMgQwBD0EOAQ1BCAAOwQ+BDYEPQQ+BDMEPgQgAD8EPgQ9 BDgEPAQwBD0EOARPBCAAQQQyBD4EMQQ+BDQESwQgADoEMAQ6BCAAOwQ4BDEENQRABDAEOwQ4BDcE PAQwBCwAIAA/BD4EQQRCBEMEOwQ4BEAEQwROBEkENQQzBD4EIAAwBDEEQQQ+BDsETgRCBD0EPgRB BEIETAQgAEEEMgQ+BDEEPgQ0BCAAPwRABDgEPAQ1BD0EOARCBDUEOwRMBD0EPgQgADoEIABDBDcE OgQ+BDwEQwQgADsEOARHBD0EPgRBBEIEPQQ+BC0AOAQ9BDQEOAQyBDgENARDBDAEOwRMBD0EPgQ8 BEMEIAAwBEEEPwQ1BDoEQgRDBCAARwQ1BDsEPgQyBDUEOgQwBCAAOAQgAEIEMAQ6BCAAQAQwBDcE QARLBDIEMAROBEkENQQzBD4EIAA4BD0ENAQ4BDIEOAQ0BEMEMAQ7BEwEPQRDBE4EIAA/BEAEOARA BD4ENARDBCAARwQ1BDsEPgQyBDUEOgQwBCAAPgRCBCAAQQQ+BEYEOAQwBDsETAQ9BD4EOQQgAD4E QgRABDAENgQwBDUEQgQgADwEPgQ9BD4EPwQ+BDsEOAROBCAAPQQwBCAAQAQ+BDQEIAA4BCAAPQQw BCAAMgRLBDQEMARHBEMEIAA9BDAEQAQ+BDQEMAQ8BCAAPwRABDAEMgQwBCAAQAQwBDcEPAQ9BD4E NgQwBEIETARBBE8ELgANACAAEgQgAEYENQQ7BD4EPAQsACAAQAQwBDcENAQ1BDsENQQ9BDgENQQg AEYENQQ7BDUEPwQ+BDsEMAQzBDAEPQQ4BE8EIAA9BDAEQAQ+BDQEPgQyBCAAPwRABDgEMgQ+BDQE OARCBCAAOgQgADoEPgQ7BDsEMAQ/BEEEQwQgADwEOARABD4EPwQ+BD0EOAQ8BDAEPQQ4BE8EIABA BDAEMQQ+BDIELAAgAD4EQgRABDAENgQwBE8EIAA+BDEESQQ4BDUEIABEBDAEOgRCBD4EQARLBCAA MgRLBEgENQQgADIEIABBBD4EMgQ+BDoEQwQ/BD0EPgRBBEIEOAQgADoEMAQ6BCAAPAQ+BD0EPgQ/ BD4EOwQ4BE4EIAA9BDAEIAAyBDsEMARBBEIETAQuACAAIQQ+BD8EQAQ+BEIEOAQyBDsETwRCBEwE QQRPBCAAPQQwBDIETwQ3BEsEMgQwBD0EOAROBCAAOwQ+BDYEPQRLBEUEIABGBDUEOwQ1BDkEIAAy BD4ENwQ8BD4ENgQ9BD4EIAA/BEAEOAQgAEMEQQQ7BD4EMgQ4BDgEIAA9BDAEOwQ4BEcEOARPBCAA QQQ+BDEEQQRCBDIENQQ9BD0ESwRFBCAATwRBBD0ESwRFBCAARgQ1BD0EPQQ+BEEEQgQ1BDkELAAg ADIESwRCBDUEOgQwBE4ESQQ4BEUEIAA4BDcEIAA3BD0EMAQ9BDgETwQsACAAOgQ+BEIEPgRABD4E NQQgADUEQQRCBEwEIABCBD4EOwRMBDoEPgQgAEMEIABNBDsEOARCBEsEIAA4BCAAMgQ+BDcEPAQ+ BDYEPQQ+BCAAPgQxBEsERwQ9BD4EIABCBD4EOwRMBDoEPgQgADQEOwRPBCAAQAQwBDEEPgQyBCAA MgQ9BDUEIABBBEQENQRABEsEIAAyBD4ENwQ0BDUEOQRBBEIEMgQ4BE8EIAA/BEAEPgQ/BDAEMwQw BD0ENARLBCwAIABABDUENgQ1BC0AIAA/BEAENQQxBEsEMgQwBE4ESQQ4BEUEIAA/BD4ENAQgADIE PgQ3BDQENQQ5BEEEQgQyBDgENQQ8BC4AIAAtBEIEPgQgAEEEPgQ/BEAEPgRCBDgEMgQ7BDUEPQQ4 BDUEIAA4BD0ERAQ+BEAEPAQwBEYEOAQ+BD0EPQQ+BDkEIAAyBD4EOQQ9BDUELAAgADIENQQ0BEME SQQ1BDkEQQRPBCAAMwQ7BD4EMQQwBDsETAQ9BD4EIAA/BEAEPgRCBDgEMgQgADIEQQQ1BEUEIABA BDAEMQQ+BDIELAAgADoEMAQ6BCAAPQQ+BEEEOARCBDUEOwQ1BDkEIAA+BEEEQgQwBEIEOgQ+BDIE IABABDUEMAQ7BEwEPQQ+BDkEIABBBDIEPgQxBD4ENARLBC4AIAAiBDAEOgQgADoEMAQ6BCAAPwRA BD4EPwQwBDMEMAQ9BDQEMAQgADgEQQQ/BD4EOwRMBDcEQwQ1BEIEIAA8BDAEPQQ4BD8EQwQ7BE8E RgQ4BDgEIABBBCAAMwQ7BEMEMQQ+BDoEOAQ8BDgEIABBBDsEPgRPBDwEOAQgAEcENQQ7BD4EMgQ1 BEcENQRBBDoEPgQzBD4EIAAxBDUEQQRBBD4ENwQ9BDAEQgQ1BDsETAQ9BD4EMwQ+BCwAIABABDAE MQRLBCAARwRDBDIEQQRCBDIEQwROBEIEIAAyBDsEMARBBEIETAQgAD0ENQQgAEIEPgQ7BEwEOgQ+ BCAAMgQgADIEOAQ0BDUEIABEBD4EQAQ8BDAEOwRMBD0EPgQzBD4EIAA+BDEEPAQwBD0EMAQsACAA PQQ+BCAAOAQgADIEIAAyBDgENAQ1BCAAOgQ+BDMEPQQ4BEIEOAQyBD0EPgQzBD4EIAA0BDgEQQRB BD4EPQQwBD0EQQQwBCwAIAA/BD4ENAQwBDIEOwRPBDUEPAQ+BDMEPgQgAEEEQgRABDAERQQ+BDwE LAAgAEEEQgRLBDQEPgQ8BCAAOAQgAD0EMARABDoEPgRCBDgEOgQwBDwEOAQuACAAEgQgAEEEOwRD BEcEMAQ1BCAAQwQ0BDAERwQ4BCwAIAA4BDQENQQ+BDsEPgQzBDgETwQgADcEMAQ6BEAENQQ/BDsE TwQ1BEIEIABABDAENwQ0BDUEOwQ1BD0EOAQ1BCAAQAQwBEYEOAQ+BD0EMAQ7BEwEPQQ+BDMEPgQg ADgEIABCBEAEMAQ9BEEERgQ1BD0ENAQ1BD0EQgQ9BD4EMwQ+BCwAIABNBDsEOARCBEsEIAA4BCAA QAQwBDEEPgQyBCwAIAAzBDUEPgQzBEAEMAREBDgERwQ1BEEEOgQ4BCAAQwQ0BDAEOwQ1BD0EPQRL BDUEIABHBDAEQQRCBDgEIAA+BDQEPQQ+BDMEPgQgAD0EMARABD4ENAQwBCwAIABDBD8EQAQwBDIE OwQ1BD0ERgQ1BDIEIAA4BCAAQAQwBDEEPgRCBD0EOAQ6BD4EMgQsACAAOwQ4BEcEPQQ+BEEEQgRM BCAAOAQgAD4EMQRJBDUEQQRCBDIEPgQuACAAFwQwBDoEQAQ1BD8EOwRPBDUEQgRBBE8EIAA6BEME OwRMBEIEIABHBDUEOwQ+BDIENQRHBDUEQQQ6BD4EOQQgADsEOARHBD0EPgRBBEIEOAQsACAANQRR BCAAPAQ9BDgEPARLBEUEIABBBDIEPgQxBD4ENAQgADgEIAA/BEAEMAQyBCAAOAQ7BDgELAAgAD0E MAQ+BDEEPgRABD4EQgQsACAAOARFBCAAPgRCBEEEQwRCBEEEQgQyBDgENQQgADIEIABBBD4EPgRC BDIENQRCBEEEQgQyBDgEOAQgAEEEIAA/BD4EQAQ+BEcEPQQ+BDkEIAA0BDIEPgQ4BEcEPQQ+BDkE IAA7BD4EMwQ4BDoEPgQ5BC4ADQA0AC4AIAAjBD8EQAQwBDIEOwQ1BD0EOAQ1BCAAMwQ7BD4EMQQw BDsETAQ9BEsEPAQ4BCAAPAQwBEIENQRABDgEMAQ7BEwEPQRLBDwEOAQgAEYENQQ9BD0EPgRBBEIE TwQ8BDgELAAgADoEMAQ6BCAAQQQ7BDUENARBBEIEMgQ4BDUEIAA4BEUEIAA8BD4EPQQ+BD8EPgQ7 BDgENwQwBEYEOARPBCAAQQQ1BDwETARPBDwEOAQgAE0EOwQ4BEIESwQgADgENARRBEIEIABHBDUE QAQ1BDcEIABABDAENwQ0BDUEOwQ1BD0EOAQ1BCAAMQQ1BDQEPQRLBEUEIAA+BEIEIAAxBD4EMwQw BEIESwRFBCAAOAQgAD8EPgRBBDsENQQ0BEMETgRJBDgEOQQgAD4EQgRBBDUEMgQgADEEPgQ7BEwE SAQ1BDkEIABHBDAEQQRCBDgEIAA9BDAEQQQ1BDsENQQ9BDgETwQgAD8EQAQ4BCAAQAQwBEEEPwRA BDUENAQ1BDsENQQ9BDgEOAQgADQENQQ9BDUEMwQuACAAIwRBBEIEMAQ9BDAEMgQ7BDgEMgQwBDUE QgRBBE8EIABABDAENwRABEsEMgQsACAAQQRCBEAENQQ8BE8ESQQ4BDkEQQRPBCAAOgQgAEAEMAQ3 BD0EOARGBDUEIAA8BDUENgQ0BEMEIAAxBD4EMwQwBEIEQQRCBDIEMAQ8BDgEIAAyBEEENQQzBD4E IAA8BDgEQAQwBCAAMgQgAEAEQwQ6BDAERQQgAD4ENAQ9BD4EMwQ+BCAARwQ1BDsEPgQyBDUEOgQw BCAAOAQgAD8EQAQ+BDYEOARCBD4ERwQ9BEsEPAQgADwEOAQ9BDgEPARDBDwEPgQ8BCAAPgRBBEIE MAQ7BEwEPQRLBEUELgAgACAEMAQxBEsEIAA/BEAEPgQ0BD4EOwQ2BDAETgRCBCAAQgQ1BEAETwRC BEwEIAAyBD4ENwQ8BD4ENgQ9BD4EQQRCBDgEIAA/BD4EOwRDBEcENQQ9BDgETwQgADcEPQQwBD0E OAQ5BCwAIAA4BCAAMQQ+BDsETARIBDAETwQgAEcEMARBBEIETAQgAD0EMARHBDgEPQQwBDUEQgQg ADQEQwQ8BDAEQgRMBCAAPgQgAEIEPgQ8BCwAIAA6BDAEOgQgADcEMARABDAEMQQ+BEIEMARCBEwE IAA0BDUEPQQ1BDMEIABBBEIEPgQ7BEwEOgQ+BCwAIABHBEIEPgQxBEsEIABFBDIEMARCBDgEOwQ+ BCAAPQQwBCAAMQQ1BEEEOgQ+BD0ENQRHBD0ESwQ1BCAAPwQ+BEIEQAQ1BDEEPQQ+BEEEQgQ4BCAA QQQyBD4ENQQ5BCAAOwQ4BEcEPQQ+BEEEQgQ4BC4AIAAtBEIEPgQgAEIENQQ8BCAAMQQ+BDsENQQ1 BCAATQREBEQENQQ6BEIEOAQyBD0EPgQsACAARwQ1BDwEIABBBDgEOwRMBD0ENQQ1BCAAMQQ+BDsE NQQ9BCAAQAQ+BDQELAAgAD0ENQRBBD8EPgRBBD4EMQQ9BEsEOQQgADcEMARJBDgESQQwBEIETARB BE8EIAA+BEIEIAA3BDAEOgQ+BD0EMAQgADgEIAA/BD4EOwQ4BEIEOAQ6BDgEIAAzBDUEPQQ+BEYE OAQ0BDAELAAgAD4EQgQgADsEPgQ2BD0ESwRFBCAAOAQ0BDUEPgQ7BD4EMwQ4BDkEIAA4BCAAPgRC BCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ5BC4AIAAgABEENQRBBEEEPgQyBDUEQQRCBD0EPgQ1BCAA MgRLBDoEMARHBDgEMgQwBD0EOAQ1BCAAOAQ3BCAAQAQwBDEEPgQyBCAANAQ1BD0ENQQzBCAANAQ1 BDsEMAQ1BEIEIAA4BEUEIAA/BD4EOwQ9BD4EQQRCBEwETgQgADcEMAQyBDgEQQQ4BDwESwQ8BDgE IAA+BEIEIABFBD4ENwRPBDgEPQQwBCwAIAA4BCAAPgQ9BDgEIAA2BDUEQARCBDIEQwROBEIEIABA BDAENAQ4BCAAPQQ1BDMEPgQgAEEEMgQ+BDUEOQQgADYEOAQ3BD0ETAROBCAAQQQgADwEMAQ6BEEE OAQ8BDAEOwRMBD0EPgQ5BCAAMwQ+BEIEPgQyBD0EPgRBBEIETAROBC4AIAAjBEEEOAQ7BDUEPQQ9 BEsEOQQgADIEOwQwBEEEQgRMBE4EIAA3BD0EMAQ9BDgETwQgADgEIAA4BDQENQQ+BDsEPgQzBDgE OAQsACAAPwRABD4ERgQ1BEEEQQQgAEQEOAQ9BDAEPQRBBD4EMgQ+BDMEPgQgAEAEMAQ3BDQENQQ7 BDUEPQQ4BE8EIAA9BDUEIABCBD4EOwRMBDoEPgQgAD4EQgQxBDgEQAQwBDUEQgQgAEYENQQ9BD0E PgRBBEIEOAQgAEMEIABABDAEMQQwBCwAIAA9BD4EIAA4BCAANwQwBEEEQgQwBDIEOwRPBDUEQgQg ADUEMwQ+BCAAMgQ+BDUEMgQwBEIETAQgAEEEIAA0BEAEQwQzBDgEPAQ4BCwAIABDBEEEOgQ+BEAE TwRPBCAANgQ1BEAEQgQyBEMEIAA4BCAAQAQwBDcEMwQ+BD0ETwRPBCAAQAQwBDcENAQ1BDsENQQ9 BDgENQQuACAAIAQwBDQEOAQgADQENQQ9BDUEMwQgADsETgQ0BDgEIABBBEIEMAQ9BD4EMgRPBEIE QQRPBCAAQQQ/BD4EQQQ+BDEEPQRLBCAAPQQwBCAAOwROBDEESwQ1BCAAPwQ+BEEEQgRDBD8EOgQ4 BC4AIAAjBD8EQAQwBDIEOwQ1BD0EOAQ1BCAAQQRCBDAEPQQ+BDIEOARCBEEETwQgAEMEQQRCBD4E OQRHBDgEMgRLBDwEIAA4BCAAQgQ+BEcENQRHBD0ESwQ8BC4AIAAgBDUEOgQ7BDAEPAQwBCAAOAQg AD8EQAQ+BD8EMAQzBDAEPQQ0BDAEIAA0BDUEPQQ1BDMEIAA/BEAEOAQyBD4ENARPBEIEIAA6BCAA OgRDBDsETARCBEMELAAgAD8EOARCBDAETgRJBDUEPARDBCAAPwQ+BEIEQAQ1BDEEOARCBDUEOwRM BEEEQgQyBD4ELAAgADYEMAQ0BD0EPgRBBEIETAQsACAAPgQxBDwEMAQ9BCAAOAQgAD4EQgQyBEAE MARJBDAENQRCBCAAMgQ9BDgEPAQwBD0EOAQ1BCAAPgRCBCAAQAQ1BDAEOwRMBD0ESwRFBCAARgQ1 BD0EPQQ+BEEEQgQ1BDkELgANADUALgAgAB0EMAQ6BD4EPQQ1BEYELAAgAD4EOgQ+BD0ERwQwBEIE NQQ7BEwEPQQ+BDUEIABABDAENwQ0BDUEOwQ1BD0EOAQ1BCAAQAQ+BDQEMAQgAD8EQAQ+BDgEQQRF BD4ENAQ4BEIEIAA4BDcEPAQ1BD0ENQQ9BDgENQQ8BCAAPwRABDgEQAQ+BDQESwQgAEcENQQ7BD4E MgQ1BDoEMAQuACAAGwROBDQENQQ5BCAANwQwBEAEMAQ2BDAETgRCBCAANARDBEgENQQyBD0ESwQ8 BDgEIAA4BCAARAQ4BDcEOARHBDUEQQQ6BDgEPAQ4BCAAMQQ+BDsENQQ3BD0ETwQ8BDgEIAA4BCAA QwQ/BEAEMAQyBDsETwROBEIEIABABDAENwQ7BDgERwQ9BEsEPAQ4BCAAMwRABEMEPwQ/BDAEPAQ4 BCAAMQQ+BDsETAQ9BEsERQQsACAAPwRABD4EPwQwBDMEMAQ9BDQEOARABEMETwQgACIANAQ+BDEE QAQ+BCIAIAA6BD4EPQQ6BEAENQRCBD0EPgQ5BCAAMQQ+BDsENQQ3BD0EOAQgADgEIAA7BDUERwQ1 BD0EOAQ1BCAAPgRCBCAAPQQ1BFEEIAA6BDAEOgQgADcEOwQ+BCAAPwQ+BDQEIAA8BDAEQQQ6BDAE PAQ4BCAAIgA9BDUEQgQ+BDsENQRABDAEPQRCBD0EPgRBBEIEOAQiACAAOAQgAEMESQQ1BDwEOwQ1 BD0EOARPBCAAIgBBBDIEPgQxBD4ENAQiAC4AIAAaBDAENgQ0BDAETwQgADEEPgQ7BDUENwQ9BEwE IAA3BDAENAQwBDUEQgQgAEEEMgQ+BFEEIAAzBDsEPgQxBDAEOwRMBD0EPgQ1BCAAPgQxBEkENQRB BEIEMgQ+BDoAIAA+BDEESQQ1BEEEQgQyBD4EIAA/BEwETgRJBDgERQQsACAAPgQxBEkENQRBBEIE MgQ+BCAAOgRDBEAETwRJBDgERQQsACAAPgQxBEkENQRBBEIEMgQ+BCAAQQQgAEIEPgQ7BDUEQAQw BD0EQgQ9BD4EQQRCBEwETgQgADgEIAAbBBMEEQQiBC0AQQQ+BD4EMQRJBDUEQQRCBDIEMAQsACAA PgQxBEkENQRBBEIEMgQ+BCAAPAQwBEIENQRABDUEOQQsACAAQQQ0BDUEOwQwBDIESAQ4BEUELwA0 BDUEOwQwBE4ESQQ4BEUEIAAwBDEEPgRABEIELgAgABEEPgQ7BDUENwQ9BDgEIAA8BDgEQAQ+BDIE PgQ3BDcEQAQ1BD0EOARPBCAAQwRBBDgEOwQ4BDIEMAROBEIEIABNBEQERAQ1BDoEQgQuACAAHAQ+ BEkETAQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ+BDMEPgQgAEIENQRABEAEPgRABDAEIABBBD8E PgRBBD4EMQQ9BDAEIAA8BDUEPQRPBEIETAQgAD8EQAQ4BEAEPgQ0BEMEIABABDAEMQQ+BDIEIAAy BCAAQQRCBD4EQAQ+BD0EQwQgAD8EPgRCBDUEQAQ4BCAATQRCBD4EOQQgAD8EQAQ4BEAEPgQ0BEsE IAAyBD8EOwQ+BEIETAQgADQEPgQgAD8EPgQ7BD0EPgQzBD4EIABDBD0EOARHBEIEPgQ2BDUEPQQ4 BE8EIAA9BDUEQwQzBD4ENAQ9BD4EMwQ+BCAAPQQwBEAEPgQ0BDAELgAgABoEQwQ7BEwEQgQgADwE PQQ4BDwEPgQ5BCAAQQQyBD4EMQQ+BDQESwQgAD8EPgQ0BCAANAQ1BDkEQQRCBDIEOAQ1BDwEIAA/ BEAEPgQ/BDAEMwQwBD0ENARLBCAANAQ1BD0ENQQzBCAAPwRABDgEMgQ+BDQEOARCBCAAOgQgAEAE MAQ3BD0ESwQ8BCAAMQQ+BDsENQQ3BD0ENQQ9BD0ESwQ8BCAAQgQ1BEcENQQ9BDgETwQ8BCAAMgQg AEAEPgQ0BEMELAAgADIEQAQ+BDQENQQgAEMEMQQ4BDkEQQRCBDIEIABBBDIEPgQ4BEUEIAA0BDUE QgQ1BDkEIAAwBDEEPgRABEIEPgQ8BCAAOAQgADIESwQ8BDgEQAQwBD0EOARPBCAAOAQgADQENQQz BEAEMAQ0BDAERgQ4BDgEIAA+BEIEIAAwBDsEOgQ+BDMEPgQ7BE8ELAAgAD8EOwROBEEEIABBBDwE NQRABEIEOAQgADgEIAA9BDUEQAQ+BDYENARRBD0EPQRLBDUEIAA+BEIEIAA8BDAEPQQ4BD8EQwQ7 BE8ERgQ4BDkEIABBBDUEOgRBBEMEMAQ7BEwEPQQ+BEEEQgRMBE4ELAAgADgEPQRBBEIEOAQ9BDoE QgQwBDwEOAQgAEAEMAQ3BDwEPQQ+BDYENQQ9BDgETwQgADgEIAA+BEIEPQQ+BEgENQQ9BDgENQQ8 BCAAOgQgAEEENQQ8BEwENQQgADgEIAA+BDEESQQ1BEEEQgQyBEMELgAgABIESwQxBD4EQAQgADYE NQQ9BEkEOAQ9BDAEPAQ4BCAAPQQ1BCAAQQQ4BDsETAQ9BEsERQQsACAANwQ0BD4EQAQ+BDIESwRF BCAAOAQgADoEQAQwBEEEOAQyBEsERQQsACAAMAQgADEEPgQzBDAEQgRLBEUEIAA4BCAAQQQyBDUE QARFBDAEOgRCBDgEMgQ9BEsERQQgAEEENQQ6BEEEQwQwBDsETAQ9BD4EIAAyBDUENAQ1BEIEIAA6 BCAANAQ1BDMEQAQwBDQEMARGBDgEOAQgADIEIABBBEIEPgRABD4EPQRDBCAAQQQ7BDAEMQRLBEUE IAA4BCAAQwRJBDUEQAQxBD0ESwRFBC4AIAAtBEIEPgQgAE8EQAQ6BD4EIAA9BDAEMQQ7BE4ENAQw BDUEQgRBBE8EIABBBDUEOQRHBDAEQQQgADIEIAA6BEAEQwQ/BD0ESwRFBCwAIABEBDgEPQQwBD0E QQQ+BDIEPgQgAEAEMAQ3BDIEOARCBEsERQQgADMEPgRABD4ENAQwBEUELAAgAD4EQQQ+BDEENQQ9 BD0EPgQgADIEIAAcBD4EQQQ6BDIENQQsACAAMwQ0BDUEIAA6BEAEMARBBDgEMgRLBEUEIAA4BCAA NwQ0BD4EQAQ+BDIESwRFBCAAOwROBDQENQQ5BCAAMgQgAEAEMAQ3BEsEIAA8BDUEPQRMBEgENQQs ACAARwQ1BDwEIAAyBCAAPAQ1BDsEOgQ4BEUEIAAzBD4EQAQ+BDQEMARFBC4ADQA2AC4AIAAfBD4E QQQ7BDUENAQ9BDgEOQQgAEIEOAQ/BCAAQAQwBDcENAQ1BDsENQQ9BDgETwQsACAAMgQ+BDUEPQQ9 BEsEOQQsACAAQQQ+BEcENQRCBDAENQRCBEEETwQgAEEEIAA/BEAENQQ0BEsENARDBEkEOAQ8BDgE IAA8BDUEQgQ+BDQEMAQ8BDgEIAA6BDAEOgQgAD0EMAQ4BDEEPgQ7BDUENQQgAE8EMgQ9BEsEOQQg ADgEIAA9BDAENAQ1BDYEPQRLBDkELAAgAE0EQgQ+BCAAOgQ7BDAEQQRBBDgERwQ1BEEEOgQwBE8E IAAyBD4ENQQ9BD0EMARPBCAAMgQ7BDAEQQRCBEwELgAgACAEMAQ3BDQENQQ7BDUEPQQ4BDUEIABB BDgEOwRMBD0ESwRFBCAAOAQgAEEEOwQwBDEESwRFBCAAMgQ+BDkEPQQ+BDkEIAA4BCAAPQQwBEEE OAQ7BDgENQQ8BCAAPwQ+BDcEMgQ+BDsETwQ1BEIEIAAyBCAAOgRABDAEQgRHBDAEOQRIBDgENQQg AEEEQAQ+BDoEOAQgAEMEPQQ4BEcEQgQ+BDYEOARCBEwEIAAyBEAEMAQzBDAEIAA4BCAAQwRBBEIE MAQ9BD4EMgQ4BEIETAQgADIEOwQwBEEEQgRMBCAAPQQwBDQEIAA7BE4EMQRLBDwEIABBBEIEQAQw BEIENQQzBDgERwQ1BEEEOgQ4BDwEIAA+BDEESgQ1BDoEQgQ+BDwELgAgAB4EPQQwBCAAOARBBD8E PgQ7BEwENwRDBDUEQgQgAD0ENQQ9BDAEMgQ4BEEEQgRMBCwAIAA6BDAEOgQgADEEPgQ8BDEEQwQs ACAANwQwBDsEPgQ2BDUEPQQ9BEMETgQgADIEIABDBDwEMARFBCAAOwROBDQENQQ5BCAAPwRABD4E PwQwBDMEMAQ9BDQEPgQ5BCAAPQQ1BD0EMAQyBDgEQQRCBDgEIAA0BEAEQwQzBCAAOgQgADQEQARD BDMEQwQgADQEOwRPBCAAPwRABD4EMgQ+BDoEMARGBDgEOAQgAEEEMAQ8BD4EOQQgAEEENQQxBE8E LAAgADgEIABDBDwEPQQ+BDYEMAQ1BEIEIABNBEIEQwQgAD0ENQQ9BDAEMgQ4BEEEQgRMBCwAIAA6 BDAEOgQgAD4EMwQ9BDUEPQQ9BEsEOQQgAEgEMARABCwAIAAyBCAAQgQ1BEcENQQ9BDgENQQgAD8E NQRABDgEPgQ0BDAEIABBBDIEPgQ1BDMEPgQgAEEEQwRJBDUEQQRCBDIEPgQyBDAEPQQ4BE8ELgAg ABIEPgQ5BD0EMAQgAEMEQQQ4BDsEOAQyBDAENQRCBCAANwQwBDIEOARBBDgEPAQ+BEEEQgRMBCAA PgRCBCAANAQ1BD0ENQQzBCAAOAQgAEMEQQRCBDAEPQQwBDIEOwQ4BDIEMAQ1BEIEIAA6BEMEOwRM BEIEIABBBDgEOwRLBCAAPgRABEMENgQ4BE8ELAAgADAEIAAyBDoEQwQ/BDUEIABBBCAAPwQ1BEAE MgRLBDwEOAQgADUATgQgADoEQwQ7BEwEQgQwBDwEOAQtACAAOgRDBDsETARCBCAAQQQ4BDsESwQg ADIEPgQ+BDEESQQ1BCAAOAQgADcEMAQ6BD4EPQQgADQENgRDBD0EMwQ7BDUEOQQuAA0AIAAdBD4E IAA9BDAEIAA/BDgEQAQwBDwEOAQ0BDUEIAA9BDUEIABDBD8EOwRLBEIETAQgADQEMAQ2BDUEIABB BDAEPAQ+BDwEQwQgAEEEOAQ7BEwEPQQ+BDwEQwQgADgEIAA1BDUEIABGBDUEPQQ9BD4EQQRCBEwE IABBBDgEOwRMBD0EPgQgADcEMAQyBDgEQQQ4BEIEIAA+BEIEIAAzBDsEQwQxBDgEPQRLBCAANwQw BEIEPgQ/BDsENQQ9BDgETwQuACAAHwRABDgEIAA+BD8EQAQ1BDQENQQ7BDUEPQQ9BD4EOQQgADME OwRDBDEEOAQ9BDUEIAA/BDgEQAQwBDwEOAQ0BDAEIAA9BDUEIAA/BD4EPAQ+BDYENQRCBCAAPQQ4 BDoEPgQ8BEMELgAgAB8EPgRABD4ERwQ9BD4EQQRCBEwEIAA2BDUEIAAwBD0EMAQ7BD4EMwQ4BEcE PQQ+BDkEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAQQRCBEAEQwQ6BEIEQwRABEsEIAA0BDsETwQg ABMEOAQ/BDUEQAQxBD4EQAQ1BDgEIAA/BEAENQQ+BDQEPgQ7BDUEMgQwBDUEQgRBBE8EIAA/BEAE OAQ9BEYEOAQ/BD4EPAQgADUENAQ4BD0EQQRCBDIEMAQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8ELAAg AEEEPgQzBDsEMARBBD0EPgQgADoEPgRCBD4EQAQ+BDwEQwQgAD0EQwQ2BD0EPgQgAD4EMQQ1BEEE PwQ1BEcEOARCBEwEIAAyBEEENQQ+BDEESQQ4BDkELAAgADwEMAQ6BEEEOAQ8BDAEOwRMBD0EPgQg ADQEPgRBBEIEQwQ/BD0ESwQ5BCAAQQQ/BD4EQQQ+BDEEIABBBD8EMARBBDUEPQQ4BE8EIAA0BDsE TwQgADIEQQQ1BEUEIAAyBCAAPgRHBDUEQAQ1BDQEPQQ+BDkEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5 BCAAOgQwBEIEMARBBEIEQAQ+BEQENQQtACAAQQQ+BEYEOAQwBDsETAQ9BEsEOQQgACIAPwQ7BD4E QgQiAC4ADQANACAAIAAgACAAIAAgACAASQBJAEkANgQpACAAGgQ+BD0ENQRGBA0AIAAUBEAENQQy BD0ETwRPBCAANwQwBDIEOARBBEIETAQgADgEIABEBDAEPQQwBEIEOARHBD0EMARPBCAAPQQ1BD0E MAQyBDgEQQRCBEwEIAA6BCAAIARDBEEEOAQgADcEMAQgAEIESwRBBE8ERwQ4BCAAOwQ1BEIEIAA/ BD4EPAQ+BDMEOwQ4BCAAMwQ7BD4EMQQwBDsEOARBBEIEMAQ8BCAAQQQ7BD4EPAQ4BEIETAQgAD0E MARIBCAAIAQ+BDQELgAgAB0EMARIBCAANARDBEUEIABDBDMEMARBBCwAIAAwBCAAMgQ1BEAEMAQg AEEEOwQ1BD8EMAQuACAAHwRLBEIEOgQ4BCAAOAQgAEMEMQQ4BDkEQQRCBDIEPgQgAEAEQwRBBEEE OgQ+BDMEPgQgAD0EMARABD4ENAQwBCAANAQ+BDsENgQ9BEsEIABBBDoEPgRABD4EIAA3BDAEOgQ+ BD0ERwQ4BEIEQQRPBCAAMgQ8BDUEQQRCBDUEIABBBCAAPQQwBEgEOAQ8BCAAOARBBEcENQQ3BD0E PgQyBDUEPQQ4BDUEPAQuACAAHgQxBDwEMAQ9BCAAOAQgADsEPgQ2BEwEIAA/BEAEPgQ9BDgENwQw BDsEOAQgADIEQQQ1BEUEIAA4BCAAMgRBBFEELgAgAB0EMARIBDgEIABBBEIEQAQwBD0ESwQgADgE IAAzBD4EQQRDBDQEMARABEEEQgQyBDAEIAAyBCAAQARDBDgEPQQwBEUELAAgADAEIAAwBDsEOgQ+ BDMEPgQ7BEwEIAA0BD4EMQQ4BDIEMAQ1BEIEIAA+BEEEQgQwBDIESAQ4BEUEQQRPBCAANgQ4BEIE NQQ7BDUEOQQgADEESwRBBEIEQAQ1BDUEIAA7BE4EMQRLBEUEIAA8BDgEQAQ+BDIESwRFBCAAMgQ+ BDkEPQQuACAAHQQwBEgEOAQgADYENQQ9BEkEOAQ9BEsEIABDBD0EOAQ2BDUEPQRLBCAAPwQ1BEAE NQQ0BCAAIAQ+BDQEPgQ8BCwAIAAwBCAAPARDBDYERwQ4BD0ESwQgAD8EPgRCBDUEQARPBDsEOAQg ADIEPgQ7BE4EIAA6BCAANgQ4BDcEPQQ4BC4AIAAUBD4EIAA0BDIEQwRFBCAAPAQ4BDsEOwQ4BD4E PQQ+BDIEIAA0BDUEQgRBBDoEOARFBCAANgQ4BDcEPQQ1BDkEIAAyBCAAMwQ+BDQEIAA+BDEEQARL BDIEMAROBEIEQQRPBCAAPgRCBCAAMAQxBD4EQARCBDAELgAgACMEMQQ4BEIESwQgAEEEMgQ+BDgE PAQ4BCAANgQ1BCAAPAQwBEIENQRABE8EPAQ4BCAAOAQ3BCAANwQwBCAAMAQ7BDoEPgQzBD4EOwRP BCAAOAQgAD0EOAQ3BDoEPgQ5BCAAPQRABDAEMgRBBEIEMgQ1BD0EPQQ+BEEEQgQ4BCwAIAA2BDUE QQRCBD4EOgQ+BDkEIAA/BEAEPgQ/BDAEMwQwBD0ENARLBCAAOAQ9BDQEOAQyBDgENARDBDAEOwRM BD0EPgRBBEIEOAQgADgEIAAiAD8EQAQwBDIEIgAgADYENQQ9BEkEOAQ9BEsEIAA9BDAEIABDBDEE OAQ5BEEEQgQyBD4ELAAgADwEPQQ+BDMEPgRBBEIEPgRABD4EPQQ9BDUEMwQ+BCAANwQ+BDwEMQQ4 BEAEPgQyBDAEPQQ4BE8EIAA4BCAAPgRCBDoEQARLBEIEPgQzBD4EIABCBDUEQARABD4EQAQwBC4A IAAYBCwAIAA6BD4EPQQ1BEcEPQQ+BCwAIAA8BDgEOwQ7BDgEPgQ9BCAAQQQ8BDUEQARCBDUEOQQg AD4EQgQgADAEOwQ6BD4EMwQ+BDsETwQoADgEIAA0BEAEQwQzBDgERQQgAD0EMARABDoEPgRCBDgE OgQ+BDIEKQAtACAAPwRABE8EPARLBEUEIAA4BCAAOgQ+BEEEMgQ1BD0EPQRLBEUEIAA/BD4EQQQ7 BDUENARBBEIEMgQ4BDkEIABDBD8EPgRCBEAENQQxBDsENQQ9BDgETwQuACAAFgQ1BD0ESQQ4BD0E SwQgACAEQwRBBDgELAAgADoEMAQ6BCAAPQQwBEEEQgQ+BE8ESQQ4BDUEIABBBDAEQgQwBD0EOARB BEIEOgQ4BCAANgQ1BEAEQgQyBEMETgRCBCAAOAQgADQEPgQxBDgEMgQwBE4EQgQgAEEEMgQ+BFEE IAAxBD4EOwRMBD0EPgQ1BCwAIABBBEIEQAQwBDQEMAROBEkENQQ1BCAAPwQ+BEIEPgQ8BEEEQgQy BD4EIAA4BCAAQwQ8BEAEQwRCBCAAMgQ8BDUEQQRCBDUEIABBBCAAPQQ4BDwEIAA4BCAAQQQ+BCAA QQQyBD4EOAQ8BDgEIAAxBEsEMgRIBDgEPAQ4BCAAPARDBDYEMAQ8BDgELAAgADAEIABBBDUEOQRH BDAEQQQtACAAQQQ+BDoEMAQ8BDUEQAQ9BDgEOgQwBDwEOAQgADwEQwQ2BEEEOgQ+BDMEPgQgAD8E PgQ7BDAELAAgAD4EMQQ1BDcEMQQ+BDsENQQ9BD0ESwQ8BDgEIAA9BDAEOgQ+BD0ENQRGBCAANAQ+ BDcEPgQ5BCAAPQQwBEAEOgQ+BEIEOAQ6BDAELAAgADQEPgRBBEIEMARCBD4ERwQ9BD4EOQQgADQE OwRPBCAAIgBNBEIEOARFBCAAPQQ1BDQENQQ8BD4EOgRABDAEQgQ4BEcENQRBBDoEOARFBCwAIAAy BDUERwQ9BD4EIAA/BEwETgRJBDgERQQgADgEIAA9BDgEOgQwBDoEIAA9BDUEIAA2BDUEOwQwBE4E SQQ4BEUEIABDBDwEOARABDAEQgRMBCIAIABABEMEQQRBBDoEOARFBCwAIAA3BDAEMgQ1BEAESAQ4 BDIEIABNBD8EPgRFBEMEIABBBDsEMAQyBEsEIABBBDIEPgQ1BDMEPgQgAEAEPgQ0BDAEIAA4BCAA PQQ1BCAANwQwBDQENQRABDYEOAQyBDAETwQgAEEEMgQ+BDUEMwQ+BCAAMgRABDAEMwQwBCAAOAQg AD0EPgQyBD4EMwQ+BCAANgQ4BDsETARGBDAEIAA6BDsENQRCBDoEOAQgADEENQRBBEEEPARLBEEE OwQ1BD0EPQRLBDwEOAQgAEEEOgQwBD0ENAQwBDsEMAQ8BDgELAAgAD8EPgQ3BDUEQARBBDoEOAQ8 BCAAPARDBEcENQQ9BDgERwQ1BEEEQgQyBD4EPAQgADgEIAA/BEAEOARCBD4EQAQ9BEsEPAQ4BCAA PwRABDgENwRLBDIEMAQ8BDgEIAA6BCAAPQQ+BDIESwQ8BCAAOgQyBDAEQARCBDgEQAQwBD0EQgQw BDwELAAgAEEEMgQ+BDgEPAQgAD8EPgRFBD4EOwQ+BDQENQQyBEgEOAQ8BCAAMQRABDAEQgRMBE8E PAQsACAAPwRABD4EQgRPBD0EQwRCBEwEIABABEMEOgRDBCAAPwQ+BDwEPgRJBDgELgAgAB0EMARI BDgEIAAzBD4EQQRDBDQEMARABEEEQgQyBDAEIABBBDMEPQQ4BDsEOAQuACAAHQQwBEgEIAA9BDAE QAQ+BDQEIAA4BDcEMgQ+BDQETwRCBCAAMgRBBDUEMgQ+BDcEPAQ+BDYEPQRLBDwEOAQgADwENQRC BD4ENAQwBDwEOAQsACAAPQQwBEcEOAQ9BDAETwQgAD4EQgQgAE4EMgQ1BD0EMAQ7BEwEPQQ+BDkE IABOBEEEQgQ4BEYEOAQ4BCAAOAQgAEEEOARBBEIENQQ8BEsEIAAyBD4EQQQ/BDgEQgQwBD0EOARP BCAAQAQwBDEEPgQyBCAAOAQ3BCAAQARDBEEEQQQ6BDgERQQgADQENQRCBDUEOQQgADQEPgQgADEE PgRABEwEMQRLBCAAQQQgAEEENQQ8BEwENQQ5BCAAOAQgAEAEPgQ0BD4EPAQgADgEIABDBD0EOARH BEIEPgQ2BDUEPQQ4BE8EIAAyBDcEQAQ+BEEEOwRLBEUEIAAyBEEENQQ5BCAAQQQ4BDsEPgQ5BCAA MgQ7BDAEQQRCBDgEIABBBDIEPgQ4BEUEIAA6BEMEOwRMBEIEPgQyBC4AIAAgBEMEQQRMBCAAQwRC BD4EPwQ4BDsEOAQgADIEIAA6BEAEPgQyBDAEMgQ+BDwEIAAxBD4EOwQ+BEIENQQsACAAMAQgAD8E NQRCBDsETwQgADcEPgQ7BD4EQgQ+BDMEPgQgAEIENQQ7BEwERgQwBCAANwQwBEIETwQ9BEMEQgQw BCAAMgQ+BDoEQARDBDMEIABIBDUEOAQgAD0EMARIBDUEOQQgACYEOAQyBDgEOwQ4BDcEMARGBDgE OAQuACAAEgRABDAEMwQgAEEENgQwBDsEIABBBDwENQRABEIENQQ7BEwEPQRLBDUEIAA+BDEESgRP BEIEOARPBC4ADQAgAB8EPgQ/BDAENAQwBE8EIAA/BD4ENAQgADIEOwQwBEEEQgRMBCAAMARCBDsE MAQ9BEIEPgQyBCAAQgQ1BDwEPwQwBDwEOAQsACAAOgQ+BEIEPgRABEsENQQgAEMEQQRCBDAEPQQ+ BDIEOAQ7BDgEQQRMBCAAPwQ+BEEEOwQ1BDQEPQQ4BDUEIABBBD4EQgQ9BDgEIAA7BDUEQgQgAD0E MAQgAEIENQRABEAEOARCBD4EQAQ4BDgEIAAgBEMEQQQ4BCwAIAA8BEsEIAA4BDwENQQ1BDwEIAAy BEEENQQgAEgEMAQ9BEEESwQgAD4ERwQ1BD0ETAQgAEEEOgQ+BEAEPgQgADIESwQ8BDUEQAQ1BEIE TAQgAD8EPgQ0BCAANgQ1BEAEQgQyBDUEPQQ9BEsEPAQgAD0EPgQ2BD4EPAQgAEUEPgQ3BE8EOAQ9 BDAEIAA4BDsEOAQgAD4EQQRCBDAEQgRMBEEETwQgADIEIAAyBDgENAQ1BCAAQAQwBDcENARABD4E MQQ7BDUEPQQ9BD4EMwQ+BCwAIAA/BD4EOgQ+BEAENQQ9BD0EPgQzBD4EIAA4BCAAPQQ4BEcEQgQ+ BDYEPQQ+BDMEPgQgAD0EMARABD4ENAQwBCwAIAAyBDsEMARHBDAESQQ1BDMEPgQgADYEMAQ7BDoE PgQ1BCAAQQRDBEkENQRBBEIEMgQ+BDIEMAQ9BDgENQQgAEEEQAQ1BDQEOAQgADQEQARDBDMEOARF BCAANAQwBDIEPQQ+BCAAPwQ+BDoEPgRABDUEPQQ9BEsERQQuACAAGAQgADQEMAQ2BDUEIAA1BEEE OwQ4BCAAPQQ1BCAAPwRABD4EOAQ3BD4EOQQ0BDUEQgQgAD8EPgQ7BD0EPgQ5BCAANwQwBDwENQQ9 BEsEIABHBDUEOwQ+BDIENQQ6BDAEIABABD4EMQQ+BEIEPgQ8BCwAIAA+BD0EIABDBEIEQAQwBEIE OARCBCAAQQQyBD4ETgQgAEcENQQ7BD4EMgQ1BEcEPQQ+BEEEQgRMBCAAOAQgAD8EQAQ1BDIEQAQw BEIEOARCBEEETwQgADIEIAA8BEMEQAQwBDIENQQ5BD0EOAQ6BCAAQAQwBDEEPgQyBCwAIABABDAE MQQ+BEIEMAROBEkEOARFBCAAPQQwBCAAMQQ7BDAEMwQ+BCAAOgQ+BEAEPgQ7BDUEMgRLBCAAOAQg AD0ENQQgADQEPgQzBDAENARLBDIEMAROBEkEOARFBEEETwQgADQEMAQ2BDUEIAA+BCAANQRRBCAA QQRDBEkENQRBBEIEMgQ+BDIEMAQ9BDgEOAQuAA0AIAAgACAAHgRHBD0EOARBBEwELAAgACAEIwQh BCwEIAAhACEAIQAgACAAIAAVBEkENQQgADIERwQ1BEAEMAQgADwESwQgADEESwQ7BDgEIABBBDIE PgQxBD4ENAQ9BEsEPAQ4BCAANAQ1BEIETAQ8BDgEIAAgBD4ENAQwBCwAIABBBDsEMAQyBDgEOwQ4 BEEETAQgAEEEMAQ8BDgEIAA4BCAAQQQ7BDAEMgQ4BDsEOAQgAD8EQAQ1BDQEOgQ+BDIELAAgADQE MAQyBEgEOARFBCAAPQQwBDwEIAA+BDMEPgQ9BEwEIAAwBEAEOAQ1BDIELAAgAD0ENQQxBD4EIAAz BDgEPwQ1BEAEMQQ+BEAENQQ1BDIEIAA4BCAAQQQwBDwEQwQgAEEEOwQwBDIETwQ9BEEEOgRDBE4E IABBBDsEMAQyBEMELgAgABAEIABBBDUEOQRHBDAEQQQgADwESwQgAEMEPAQ4BEAEMAROBEkEOAQ1 BCAAQAQwBDEESwQsACAANwQwBDIEOARBBE8ESQQ4BDUEIAA+BEIEIABNBDsEOARCBEsEIAA4BCAA QQQ7BDAEMQRLBEUEIAA7BDgENAQ1BEAEPgQyBC4AIAAYBCAANQRBBDsEOAQgADgEPAQgAD0ENQQg AEUEMgQwBEIEMAQ1BEIEIABBBDgEOwQgADIESwQyBDUEQQRCBDgEIAA9BDAEQQQgADgENwQgADEE PgQ7BD4EQgQwBCwAIAA3BDAEMQQ7BD4EOgQ4BEAEPgQyBDAEQgRMBCAAPAQ1BEcEIAAyBEAEMAQz BDAEIAA4BCAAQQQ/BDAEQQRCBDgEQQRMBCwAIAA1BEEEOwQ4BCAAPgQ9BDgEIAAyBCAAOgRABDAE QgRHBDAEOQRIBDgENQQgAEEEQAQ+BDoEOAQgAD0ENQQgADcEMAQ5BDwEQwRCBCAAPwQ+BDcEOARG BDgETgQgADIEQQQ1BEEEQgQ+BEAEPgQ9BD0ENQQ5BCAAPgQxBD4EQAQ+BD0ESwQgAD0EMARABD4E NAQwBCwAIAA9BDUEIAAyBD4ENwRMBDwEQwRCBCAAPQQwBCAAQQQ1BDEETwQgAD4EQgQyBDUEQgRB BEIEMgQ1BD0EPQQ+BEEEQgRMBCAAPgRBBDIEPgQxBD4ENgQ0BDUEPQQ4BE8EIAA9BDAEQQQgAD4E QgQgADEEPgQ7BDUENwQ9BDUEOQQsACAAPQQ1BCAAOwQ1BDMEMAQ7BDgENwRDBE4EQgQgAD0EMARA BDoEPgRCBDgEOgQ4BCwAIAA9BDAERwQ4BD0EMARPBCAAQQQgADAEOwQ6BD4EMwQ+BDsETwQgADgE IABABDAENwRABEMESAQwBE4ESQQ1BDkEIAAwBD0EQgQ4BEEEPgRGBDgEMAQ7BEwEPQQ+BDkEIAA/ BEAEPgQ/BDAEMwQwBD0ENARLBCwAIAA/BD4EQgRABDUEMQQ7BDUEPQQ4BDUEIAA6BD4EQgQ+BEAE SwRFBCAANAQ+BDsENgQ9BD4EIAAxBEsEQgRMBCAAGwQVBBMEEAQbBCwEHQQeBCAANAQ+BEEEQgRD BD8EPQQ+BCAAIgQeBBsELAQaBB4EIAAxBD4EOwRMBD0ESwQ8BCAANwQwBDIEOARBBDgEPAQ+BEEE QgRMBE4ELAAgAEIEPgQgAE0EQgQ4BCAAOwQ4BDQENQRABEsEIAA0BD4EOwQ2BD0ESwQgAEEEQgRA BD4EMwQ+BCAAPgRCBDIENQRCBDgEQgRMBCAANwQwBCAAPwRABDUEQQRCBEMEPwQ9BD4ENQQgADEE NQQ3BDQENQQ5BEEEQgQyBDgENQQsACAAMAQgADwESwQgADQEPgQ7BDYEPQRLBCAAMgRLBDEEQAQw BEIETAQgAEEENQQxBDUEIAA9BD4EMgRLBEUEIAA7BDgENAQ1BEAEPgQyBCAAOAQgAD0EPgQyBEME TgQgAE0EOwQ4BEIEQwQhACAAEgRABDUEPAQ1BD0EOAQgADwEMAQ7BD4EIQAgABwESwQsACAAPwQ+ BEIEPgQ8BDoEOAQgABMEOAQ/BDUEQAQxBD4EQAQ1BDgELAAgADQEPgQ7BDYEPQRLBCAANAQwBEIE TAQgAEgEMAQ9BEEEIABHBDUEOwQ+BDIENQRHBDUEQQRCBDIEQwQgADIEPgRBBD8EPgQ7BEwENwQ+ BDIEMARCBEwEQQRPBCAAPQQwBEgEOAQ8BCAAPQQwBEEEOwQ1BDQEOAQ1BDwEIABBBDIEPgQxBD4E NARLBCAAOAQgADIESwQxBEAEMARCBEwEIAA/BEMEQgRMBCAAMgQ+BEEEQQRCBDAEPQQ+BDIEOwQ1 BD0EOARPBCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ+BDkEIAAzBDAEQAQ8BD4EPQQ4BDgELAAgADgE NwQxBDUENgQwBEIETAQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDkEIAA6BDAEQgQwBEEEQgRABD4ERARL BCwAIAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA6BDAEQgQwBEEEQgRABD4ERARLBCAAOgRDBDsE TARCBEMEQARLBCAANwQwBD8EMAQ0BD0EPgQ5BCAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ4BCwAIAAx BDsEOAQ3BDoEPgQ5BCAAPQQwBDwEIAAzBDUEPQQ1BEIEOARHBDUEQQQ6BDgELgAgAB0EQwQ2BD0E PgQgAD8EPgRBBEIEMAQyBDgEQgRMBCAANQRRBCAAPQQwBCAAQAQ1BDsETARBBEsEIAA1BDQEOAQ9 BEEEQgQyBDAEIABBBCAAPQQwBEgEOAQ8BDgEIAA6BD4EPQRGBDUEPwRGBDgETwQ8BDgEIABHBDUE OwQ+BDIENQRHBD0EPgRBBEIEOAQgADoEMAQ6BCAANwQ0BD4EQAQ+BDIETARPBCAANARDBEgEOAQg ADgEIABCBDUEOwQwBCwAIABDBDwEMAQgADgEIABBBDUEQAQ0BEYEMAQsACAANARDBEUEMAQsACAA NwQ0BD4EQAQ+BDIETARPBCwAIAAxBDUENwQ+BD8EMARBBD0EPgQzBD4EIABABD4EQQRCBDAEIAA4 BCAAQQQyBD4EMQQ+BDQESwQgAD0EMARABD4ENAQ+BDIELAAgAEAEPgQ0BD4EMgQgADgEIABBBDUE PAQ1BDkELAAgADMEMARABDwEPgQ9BDgEOAQgAEcENQQ7BD4EMgQ1BDoEMAQgADgEIAA8BDgEQAQw BCwAIAAxBDsEOAQ3BD4EQQRCBEwETgQgADoEIAA4BEEEQgQ4BD0ENQQgADgEIABBBD4ERQRABDAE PQQ1BD0EOARPBCAAQQQyBD4ENQQ5BCAAPwRABDgEQAQ+BDQESwQgADQEOwRPBCAAMgRLBDYEOAQy BDAEPQQ4BE8ELgAgABsEOAQxBDUEQAQwBDsESwQgADQEPgQ7BDYEPQRLBCAAQwQyBDgENAQ1BEIE TAQgADIEPgQ3BDwEPgQ2BD0EPgRBBEIETAQgADgEQQRCBDgEPQQ9BD4EOQQgAEEEMgQ+BDEEPgQ0 BEsEIAA+BEIEIABBBDAEPARLBEUEIABCBE8ENgQ1BDsESwRFBCAAMQQ+BDsENQQ3BD0ENQQ5BCAA PgQxBEkENQRBBEIEMgQwBCAAOAQgAEEEPAQ1BEAEQgQ4BCAAMgQgAD8EQAQ+BEIEOAQyBD4EMgQ1 BEEEIAA/BD4ENARABEsEMgQ9BD4EOQQgACIAQQQyBD4EMQQ+BDQENQQiACAAPgRCBD0EPgRIBDUE PQQ4BDkEIABBBD4EIABBBDIEPgQ1BDkEIAA/BEAEOARABD4ENAQ+BDkELQAgADIEPgQ3BDwEPgQ2 BD0EPgRBBEIETAQgAEAENQQwBDsETAQ9BD4EOQQgAEEEMgQ+BDEEPgQ0BEsEIAA+BEIEIAA/BD4E QAQwBDEEPgRJBDUEPQQ4BE8EIAA4BCAAPwRABDUEMgRABDAESQQ1BD0EOARPBCAAMgQgADYEOAQy BD4EQgQ9BD4ENQQsACAAPwQ+BEEEOwQ1BDQEPgQyBDAEQgQ1BDsETAQ9BD4EMwQ+BCAAQwQ9BDgE NgQ1BD0EOARPBCAAOAQgAEMEPQQ4BEcEQgQ+BDYENQQ9BDgETwQgAEYEOAQyBDgEOwQ4BDcEMARG BDgEOAQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDkEIAAyBDsEMARBBEIETAROBCwAIAAxBD4EOwRMBD0E PgQ5BCAAQQQyBD4EOAQ8BDgEIABBBDwENQRABEIENQQ7BEwEPQRLBDwEOAQgAD8EMARABDAENwQ4 BEIEMAQ8BDgELgAgABAEIAA0BDUEPAQ+BDoEQAQwBEIESwQtACAAMgQ+BDcEPAQ+BDYEPQQ+BEEE QgRMBCAAQAQ1BDAEOwQ4BDcEMARGBDgEOAQgAEEEMgQ+BDUEMwQ+BCAAQQRCBEAENQQ8BDsENQQ9 BDgETwQgADoEIABBBD8EQAQwBDIENQQ0BDsEOAQyBD4EQQRCBDgEIAAyBCAAMgQ4BDQENQQgAEEE PgQxBD4EQAQ9BD4EOQQgADIEOwQwBEEEQgQ4BCwAIABCBD4EIAA1BEEEQgRMBCAAMgQ7BDAEQQRC BDgEIAAyBEEENQRFBCAAQAQ1BDAEOwRMBD0EPgQgAEEEMgQ+BDEEPgQ0BD0ESwRFBCAARwQ7BDUE PQQ+BDIEIAA9BDAEQAQ+BDQEMAQsACAAMgRLBDEEOARABDAETgRJBDgERQQgADsEOAQ0BDUEQAQw BCwAIAAwBCAAPQQ1BCAAPQQ+BDwEOAQ9BDAEOwRMBD0EPgQgAEEEMgQ+BDEEPgQ0BD0ESwRFBCAA OwQ4BDEENQRABDAEOwQ+BDIELAAgADoEPgRCBD4EQARLBEUEIAA9BDAEPAQ9BD4EMwQ+BCAAMQQ+ BDsENQQ1BCAAQQQyBD4EMQQ+BDQEPQQwBE8EIAAyBDUEQARFBEMESAQ6BDAEIABNBDsEOARCBEsE IABBBEcEOARCBDAENQRCBCAAQQQyBD4EOAQ8BDgEIABABDAEMQQwBDwEOAQgADgEIAA9BDUEIAAx BDUENwQgAD4EQQQ9BD4EMgQwBD0EOARPBCwAIABCBDAEOgQgADoEMAQ6BCAANAQ1BDwEPgQ6BEAE MARCBDgETwQgAE0EQgQ+BCAAMgQ7BDAEQQRCBEwEIABCBD4EOwRMBDoEPgQgAEEEMgQ+BDEEPgQ0 BD0ESwRFBCgANAQ1BDwEPgQ6BEAEMARCBDgETwQgAEEEIAAzBEAENQRHBDUEQQQ6BD4EMwQ+BCAA PgQ3BD0EMARHBDAENQRCBCAAMgQ7BDAEQQRCBEwEIAAiADQENQQ8BD4EQQQwBCIALAAgADAEIAA0 BDUEPAQ+BEEEIABNBEIEPgQgAEEEMgQ+BDEEPgQ0BD0ESwQ1BCAAOwROBDQEOAQpACAAOAQgAEME PwRABDAEMgQ7BE8ETgRJBDgEOQQgACIAQQQyBD4EMQQ+BDQEPQRLBDkEIgAgADQENQQ8BD4EQQQg ADIEIAA+BDEESQQ1BEEEQgQyBDUEIAA+BDEEPAQwBD0EMAQgAE0EQgQ+BCAANwQwBDoEQwQ7BDgE QQQ9BDAETwQgAE0EOwQ4BEIEMAQsACAAMAQgAD0ENQQgAD0EMARABD4ENAQuACAAHQQwBEgEIAA8 BDgEQAQgADQEPgQ7BDYENQQ9BCAAPgQxBEAENQRBBEIEOAQgADIEOAQ0BDUEPQQ4BDUEIAA/BEAE MAQyBDgEOwRMBD0EPgQzBD4EIAA4BCAAQQQ/BEAEMAQyBDUENAQ7BDgEMgQ+BDMEPgQgAD4EMQRK BDUEOgRCBDgEMgQ9BD4EMwQ+BCAAPwRABD4ERgQ1BEEEQQQwBCAAMwQ7BD4EMQQwBDsEOAQ3BDAE RgQ4BDgEIAA9BDAEIAA/BEAEOAQ9BEYEOAQ/BDAERQQsACAAPgRCBEAEOARGBDAETgRJBDgERQQg ADEEPgQ7BDUENwQ9BDgEIAA4BCAAQAQwBDEEQQRCBDIEPgQsACAAMgRLBDwESwQyBDAETgRJBDgE RQQgADgERQQgADIEPAQ1BEEEQgQ1BCAAQQQgAD0ENQQ9BDAEMgQ4BEEEQgRMBE4EIAA4BCAAPgQx BDwEMAQ9BD4EPAQgADgENwQgAD4EMQRJBDUEQQRCBDIEMAQsACAAOAQ3BDEEMAQyBDgEQgRMBEEE TwQgAD4EQgQgAEEEPAQ1BEAEQgQ4BCAARwQ1BEAENQQ3BCAAMQQ+BDsETAQgADUEUQQgAD4EQgRA BDgERgQwBD0EOARPBC4AIAAcBEsEIAA0BD4EOwQ2BD0ESwQgADEESwRBBEIEQAQ+BCAAPwRABD4E MQRDBDQEOARCBEwEIABBBDIEPgQ1BCAAQQQ+BDcEPQQwBD0EOAQ1BCAAOAQgADIEPgRBBD8EPgQ7 BEwENwQ+BDIEMARCBEwEQQRPBCAAQQQyBD4EOAQ8BCAAPQQwBEEEOwQ1BDQEOAQ1BDwEKABBBEIE TwQ2BDAEQgRMBCAANARDBEUEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCAAOAQgACAEPgQ0BDAELQAg AEEEQgQ4BEUEOAQ5BCAAQQAgADgEIABPACkALAAgAEcEQgQ+BDEESwQgADIEQQRCBDAEQgRMBCAA OwQ4BEYEPgQ8BCAAOgQgADsEOARGBD4EPAQgADoEIAAyBEAEMAQzBEMEIAA4BCAANAQwBEIETAQg ADUEPARDBCAANAQ+BEEEQgQ+BDkEPQRLBDkEIAA+BEIEPwQ+BEAEIAA9BDAEIAA/BD4EOwQ1BCAA MwQ7BD4EMQQwBDsETAQ9BD4EOQQgADwEOARABD4EMgQ+BDcENwRABDUEPQRHBDUEQQQ6BD4EOQQg ADIEPgQ5BD0ESwQuACAAHQQwBEgEIAA9BDAEQQRCBD4ETwRJBDgEOQQgADgEPQRCBDUEQAQ1BEEE IAA4BCAARgQ1BD0EPQQ+BEEEQgRMBC0AIABNBEIEPgQgAEAENQQwBDsETAQ9BDAETwQgAEEEMgQ+ BDEEPgQ0BDAEIAAyBEEENQQzBD4EIAA8BDgEQAQwBCAAOAQgAEEENQQ5BEcEMARBBCAAPARLBCAA NAQ+BDsENgQ9BEsEIAA0BDAEQgRMBCAANQQ8BEMEIAA4BCAAQQQwBDwEOAQ8BCAAQQQ1BDEENQQg AEgEMAQ9BEEEIABNBEIEQwQgAEYENQQ9BD0EPgRBBEIETAQgADIENQRABD0EQwRCBEwELAAgAE8E MgQ4BDIEIAA9BDAESARDBCAAQARDBEEEQQQ6BEMETgQoADEEOwQwBDMEQwROBCkAIAA7BE4EMQQ+ BDIETAQgADgEIAA/BEAEOARABD4ENARDBCAAMgQ+BCAAQQQ7BDAEMgRDBCAAIAQ+BDQEMAQhAA0A IAAbBDgENAQ1BEAESwQgAEEEQgRABDAEPQQgACAEQwRBBEEEOgQ+BDMEPgQgABwEOARABDAEIQAg AB8EPgRBBDwEPgRCBEAEOARCBDUEIAAyBCAAOwQ4BEYEPgQgADAEOwQ6BD4EMwQ+BDsETgQ6ACAA MgQgADMEOwQwBDcEMAQgAEAEQwRBBEEEOgQ+BDMEPgQgAEcENQQ7BD4EMgQ1BDoEMAQsACAAPgRC BEAEMAQ2BDAETgRJBDgENQQgADIEPgQgADIENwQzBDsETwQ0BDUEIAAxBDUENwRDBDwEOAQ1BCAA OAQgAEEEQgRABDAENAQwBD0EOAQ1BCAAQAQwBDEEMAQsACAAMgQgADMEOwQwBDcEMAQgAEMEPAQ1 BEAESAQ4BEUEIAA4BCAAQwQ8BDgEQAQwBE4ESQQ4BEUEIAA8BDsEMAQ0BDUEPQRGBDUEMgQgADgE IAAyBCAAMwQ7BDAENwQwBCAAMQQ+BDsETAQ9BEsERQQgADQEQwRIBD4EOQQgADgEIABCBDUEOwQ+ BDwELAAgAEAEPgQ2BDQENQQ9BD0ESwRFBCAAMQQ+BDsETAQ9BEsEPAQ4BCAAPAQwBEIENQRABEwE PAQ4BCwAIAAyBCAAMwQ7BDAENwQwBCAAPQQwBEgEOARFBCAAQAQ+BDQEPQRLBEUEIABABEMEQQRB BDoEOARFBCAAOgRABDAEQQQwBDIEOARGBCwAIAA/BD4EQgQ1BEAETwQyBEgEOARFBCAAOgRABDAE QQRDBCAAOAQgADoEPgRBBEMELAAgAEMEPQQ4BDYENQQ9BD0ESwRFBCAAOAQgAD4EMQQ1BEEERwQ1 BEkENQQ9BD0ESwRFBCwAIAA/BD4EOwQ+BDwEMAQ9BD0ESwRFBCAAPwRABD4ERQQ+BDQEOAQ8BEYE MAQ8BDgEIAA4BCAANgQ4BDIEPgRCBD0ESwQ8BDgELAAgADgEIABABEMEQQRBBDoEOARFBCAAPAQ+ BDsEPgQ0BEYENQQyBCwAIAA/BEAENQQyBEAEMARJBDUEPQQ9BEsERQQgADIEIABNBEIEOARFBCAA NgQ4BDIEPgRCBD0ESwRFBDsAIAAyBEEEPAQ+BEIEQAQ4BEIENQRBBEwEIAAyBCAAPAQ4BDsEOwQ4 BD4EPQRLBCAAMwQ7BDAENwQsACAAOgQwBDYENARLBDkEIAAzBD4ENAQgAEMERQQ+BDQETwRJBDgE RQQgAD4EQgQgAD0EMARBBCAAMgQ+BCAAQgRMBDwEQwQhACAAJwRCBD4EIAAyBEsEIAAyBDgENAQ4 BEIENQQgADIEPgQgADIENwQzBDsETwQ0BDUEIABBBDIEPgQ4BEUEIAAgBD4ENAQ4BEcENQQ5BCwA IABDBDwEOARABDAETgRJBDgERQQgAD0EMAQgABIENQQ7BDgEOgQ+BDkEIAASBD4EOQQ9BDUELAAg AD0EMARIBDUEPAQgADIENwQzBDsETwQ0BDUEPwAgABIEIABHBDUEPAQgADIEMARIBCAARwQ1BDsE PgQyBDUERwQ1BEEEOgQ4BDkEIAA+BEIEMgQ1BEIEIABDBD0EOARHBEIEPgQ2BDUEPQQ4BE4EIAA9 BDAESAQ1BDMEPgQgACAEPgQ0BDAEPwAgABgEOwQ4BCAAPQQwBEgEOAQgADwEQwRHBDUEPQQ4BE8E IAA8BDgEPAQ+BCAAMgQwBEgENQQ5BCAAMwQ+BD0EOgQ4BCAAMgQ+BD4EQARDBDYENQQ9BDgEOQQs ACAAPwQ+BDsEOARCBDgERwQ1BEEEOgQ+BDkEIAA4BCAAOAQ9BEQEPgRABDwEMARGBDgEPgQ9BD0E PgQ5BCAAMQQ+BEAETAQxBEsEIAAyBCAAOARCBD4EMwQ1BCAAQQQ+BCAAQQQyBD4EOAQ8BDgEIAA2 BDUEIAAzBEAEMAQ2BDQEMAQ9BDAEPAQ4BD8AIAASBDgENAQ4BEIENQQgADsEOAQgADIESwQgADQE QwRFBCAAQQQ8BDUEQARCBDgEIABABE8ENAQ+BDwEIABBBCAAPQQwBDwEOAQsACAAQwQ2BDUEIABB BEIEPgRHBDgEMgRIBDgEOQQgADgEIABABDAENwQ7BD4ENgQ4BDIESAQ4BDkEIAAyBDAESAQ4BCAA NARDBEgEOAQ/ACAAEgQ4BDQEOARCBDUEIAA7BDgEIAAyBEsEIAAwBDsEOgQ+BDMEPgQ7BEwEIAA6 BDAEOgQgAD4ENAQ4BD0EIAA4BDcEIAAyBEAEMAQ2BDUEQQQ6BDgERQQgADgEPQRCBDUEOwQ7BDUE OgRCBD4EMgQgADIEIAA8BDAEQgRABDgERgQ1BCAAPQQwBEgENQQzBD4EIAA+BDEESQQ1BDMEPgQg AD8EMAQ0BDUEPQQ4BE8EIAAyBCAAPQQ1BDEESwRCBDgENQQsACAAOgQwBDoEIAA6BDgEPQQ2BDAE OwQsACAAPwRABD4EPQQ3BDAETgRJBDgEOQQgAD0EMARIBEMEIAAzBEAEQwQ0BEwELAAgADgEIAA+ BEIEMgQ1BEIEOAQ7BCAAOwQ4BCAAOgRCBD4ELQBCBD4EIAA/BDUEQAQ1BDQEIAAyBDAEPAQ4BCAA NwQwBCAAMwQ1BD0EPgRGBDgENAQgAEAEQwRBBEEEOgQ+BDMEPgQgAD0EMARABD4ENAQwBD8AIAAY BDQEUQRCBDUEIAAyBEsEIAAyBCAAPAQ4BEAEIABHBDUEOwQ+BDIENQQ6BDAEIAA4BDsEOAQgADoE IAAyBEsEQAQ+BDYENAQ1BD0EOAROBCAAOAQgADEESwRBBEIEQAQ+BDkEIABBBDwENQRABEIEOAQg ADgEIAAzBD4EQgQ+BDIESwQgADsEOAQgADIESwQgAEMEPAQ1BEAENQRCBEwEIAAyBDwENQRBBEIE NQQgAEEEIAA9BDAEPAQ4BD8AIAARBD4EOwQ4BEIEIAA7BDgEIAAyBDAESAQwBCAANARDBEgEMAQg ADgEOwQ4BCAAMgRLBCAAMgQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ+BDwEIAA/BDsENQQ9BEME IAA7BD4ENgQ9BD4EOQQgAEEEMgQ+BDEEPgQ0BEsEIAA3BDAEPwQwBDQEMAQ/ACAAIQQyBD4EMQQ+ BDQEPQRLBCAAOwQ4BCAAPwQ+BCAAPQQwBEEEQgQ+BE8ESQQ1BDwEQwQgADIESwQgAEEEMAQ8BDgE IAA4BCAAMgQwBEgEIAAgBD4ENAQgAD4EQgQgABEEHgQbBBgEIAA4BCAAQQQ8BDUEQARCBDgEPwA/ AD8AIAAcBEsELAAgABAEIQRLBCwAIAAeBCEESwQsACAAIAQjBEEESwQsACAAEAQdBD0EQwQ9BDAE OgQ4BCwAIAAQBEAEOAQ4BCwAIAAhBDsEMAQyBE8EPQQ1BCwAIAAgBEMEQQRBBDoEOAQ1BCAAJAQ1 BD0EOAQ6BEEESwQsACAAQgQyBD4EQARGBEsEIAA8BDgEQAQwBCAAJwQ1BDsEPgQyBDUEOgQwBCwA IAAgAD8EQAQ+BEEEPQRRBDwEQQRPBCAAOAQgADIEPgQ3BEAEPgQ0BDgEPARBBE8EIQAgABoEQgQ+ BCAAOAQ3BCAAMgQwBEEEIAA/BD4EPAQ+BDYENQRCBCAANwQwBEkEOARCBDgEQgRMBCAAPQQwBEEE QgQ+BE8ESQRDBE4EIABBBDIEPgQxBD4ENARDBCAAPgRCBCAAPwQwBEAEMAQ3BDgEQgQ+BDIEIAAS BEEENQQ7BDUEPQQ9BD4EOQQ/ACAAGgQiBB4EIAAYBBcEIAASBBAEIQQgAB8EIAQYBBcEEgQQBBsE IAASBCEEIgQQBCIELAQgAB8EIAQeBCIEGAQSBCAAEgQgBBAEEwQQBD8AIQANAA0ADQBJAFYAIAAg ACAAHwRDBEIETAQgAB0EPgQyBD4EOQQgABMEOAQ/BDUEQAQxBD4EQAQ1BDgEDQANACAAIAAgACAA IAAgACAASQBWADAEKQAgACcENQQ7BD4EMgQ1BDoEIAA4BDsEOAQgAEAEPgQxBD4EQgQ/AA0AIAAg ACcENQQ7BD4EMgQ1BEcENQRBBDoEPgQ1BCAAPARLBEgEOwQ1BD0EOAQ1BCAAPwQ+BCAAQQQyBD4E NQQ5BCAAPwRABDgEQAQ+BDQENQQgAD0ENQREBD4EQAQ8BDAEOwRMBD0EPgQgADgEIABEBD4EQAQ8 BDAEOwQ4BDcEQwQ1BEIEIABBBDAEPAQ+BCAAQQQ1BDEETwQgADIEIAA/BEAEPgRGBDUEQQRBBDUE IABABDAENwQyBDgEQgQ4BE8ELAAgADIEIAA+BEIEOwQ4BEcEOAQ1BCAAPgRCBCAAPAQwBEgEOAQ9 BD0EPgQzBD4ELAAgADoEPgRCBD4EQAQ+BDUEIAA/BEAENQQ0BEEEQgQwBDIEOwRPBDUEQgQgADAE OwQzBD4EQAQ4BEIEPAQsACAAQAQ1BDAEOwQ4BDcEQwROBEkEOAQ5BCAARAQ+BEAEPAQwBDsEOAQ3 BDwEIABCBD4EOQQgADgEOwQ4BCAAOAQ9BD4EOQQgAEQEPgRABDwEMAQ7BEwEPQQ+BDkEIABBBDgE QQRCBDUEPARLBCwAIABHBEIEPgQgAEEEOwQ1BDQEQwQ1BEIEIAAgADgENwQgAEIENQQ+BEAENQQ8 BEsEIAATBFEENAQ1BDsETwQuACAAEgQgAEAENQQ3BEMEOwRMBEIEMARCBDUEIABHBDUEOwQ+BDIE NQRHBDUEQQQ6BD4EMwQ+BCAAPwQ+BDcEPQQwBD0EOARPBCAAMgQ+BDcEPQQ4BDoEMAQ1BEIEIAA4 BCAATQQyBD4EOwROBEYEOARPBCAARAQ+BEAEPAQwBDsETAQ9BEsERQQgAEEEOARBBEIENQQ8BCwA IAA+BD8EOARBBEsEMgQwBE4ESQQ4BEUEIABCBEMEIAA4BDsEOAQgADgEPQRDBE4EIAA+BDEEOwQw BEEEQgRMBCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQuACAAEgQgAEEEOwRDBEcEMAQ1BCAANQRBBDsE OAQgADIENQRBBEwEIAA8BDgEQAQgADwEPgQ2BD0EPgQgADEESwQ7BD4EIAAxBEsEIAA+BD8EOARB BDAEQgRMBCAAPQQwBCAAPgRBBD0EPgQyBDUEIAA9BDUEQQQ6BD4EOwRMBDoEOARFBCAAMAQ6BEEE OAQ+BDwELAAgAD4EQQRCBDAEOwQ+BEEETAQgADEESwQgAEIEPgQ7BEwEOgQ+BCAAPwQ+BEEEQgRA BD4EOARCBEwEIAA0BD4EQQRCBDAEQgQ+BEcEPQQ+BCAAPAQ+BEkEPQRLBDUEIAA6BD4EPAQ/BEwE TgRCBDUEQARLBCwAIAA6BD4EQgQ+BEAESwQ1BCAAMgRLBEEERwQ4BEIEMAQ7BDgEIAAxBEsEIAAy BEEENQQgAEEENQQ6BEAENQRCBEsEIAAyBEEENQQ7BDUEPQQ9BD4EOQQuACAAIQQ7BD4ENgQ9BD4E QQRCBDgEIABEBD4EQAQ8BDAEOwRMBD0EPgQzBD4EIAA+BD8EOARBBDAEPQQ4BE8EIAA8BDgEQAQw BCAAPwRABDUEPgQ0BD4EOwQ1BDIEMAROBEIEQQRPBCAAPwRABDgEQAQ+BDQEPgQ5BCAARwQ1BDsE PgQyBDUEOgQwBCAAOAQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQzBD4EIAA/BD4ENARFBD4ENAQw BCAAOgQgAEMEPwRABDAEMgQ7BDUEPQQ4BE4EIAA/BD4ENwQ9BDAEPQQ4BDUEPAQuACAALQRCBEME IABHBDUEOwQ+BDIENQRHBD0EPgRBBEIETAQsACAAQQQwBDwEPgQ1BCAAMQQ+BDsETARIBD4ENQQg ADEEOwQwBDMEPgQgAEYEOAQyBDgEOwQ4BDcEMARGBDgEOAQsACAAPAQ9BD4EMwQ4BDUEIABCBEsE QQRPBEcEOAQgADsENQRCBCAAQAQwBDEEPgQyBDsEMAQ0BDUEOwRMBEYESwQgAD8ESwRCBDAETgRC BEEETwQgAD4EQgQ9BE8EQgRMBCAAQwQgAEEEMgQ+BDgERQQgAEAEMAQxBD4EMgQuAA0AIAAfBEME QgQ1BDwEIAA8BD4EPQQ+BD8EPgQ7BDgENwQwBEYEOAQ4BCAAPAQ4BEAEPgQyBD4EOQQgADIEOwQw BEEEQgQ4BCAAOAQgAEEEQgRABD4EOARCBDUEOwRMBEEEQgQyBDAEIAAzBDsEPgQxBDAEOwRMBD0E PgQ5BCAAQQQ+BEYEOAQwBDsETAQ9BD4EOQQgAD8EOARABDAEPAQ4BDQESwQgAEcENQQ7BD4EMgQ1 BDoEIAA/BEAENQQyBEAEMARJBDAENQRCBEEETwQgADIEIAAxBDgEPgRABD4EMQQ+BEIEMAQsACAA OgQ+BEIEPgRABEsEOQQgAD8EQAQ4BCAATQRCBD4EPAQgADEEPgQ4BEIEQQRPBCAAQwQ8BDUEQAQ1 BEIETAQgADgEIABHBEIEPgQgADUEMwQ+BCAANwQwBDwENQQ9BE8EQgQgADEEPgQ7BDUENQQgAE0E RAREBDUEOgRCBDgEMgQ9BD4EOQQgADwEPgQ0BDUEOwRMBE4ELgAgAB0EMAQgAEEEQgRABD4EOARC BDUEOwRMBEEEQgQyBD4EIABABDAEMQRLBCAANAQ+BDsENgQ9BEsEIAA+BEIENAQwBEIETAQgADIE QQQ1BCAAQQQyBD4EOAQgADEEOwQwBDMEMAQgAC0AIAA4BEEEQgQ+BEAEOAROBCwAIAAyBDsEMARB BEIETAQsACAAPAQwBEIENQRABDgEMAQ7BEwEPQRLBDUEIAAxBDsEMAQzBDAEIAA4BCAARgQ1BD0E PQQ+BEEEQgQ4BCwAIAA2BDgENwQ9BDgELAAgADQENQRCBDUEOQQgADgEIABABD4ENAQsACAAPwQ+ BDsEPgQ2BDgEQgRMBCAAOgQ+BEEEQgQ4BCAAMgQgAEQEQwQ9BDQEMAQ8BDUEPQRCBCAAPAQ4BEAE PgQyBD4EMwQ+BCAAPwQ+BEAETwQ0BDoEMAQgAFIAQQAgAEEEIABEBDgEOwQ+BEEEPgREBDgENQQ5 BCAAQAQwBDcENAQ1BDsENQQ9BDgETwQgADgEIABBBD4ERgQ4BDAEOwRMBD0EPgQ5BCAAPwQ4BEAE MAQ8BDgENARLBC4AIAAdBD4EIAA/BD4ENAQ+BDEEPQQ+BDUEIAA+BDEESQQ1BEEEQgQyBD4EIAA/ BEAEPgQ4BDMEQARLBDIEMAQ1BEIEIAAxBD4EQARMBDEEQwQgAEEEIABGBDgEMgQ4BDsEOAQ3BDAE RgQ4BDUEOQQgAD8EPgQgAEIEOAQ/BEMEIAA1BDQEOAQ9BDUEPQQ4BE8EKABBACkALAAgAEIEMAQ6 BCAAOgQwBDoEIAAyBDUEQARFBEMESAQ6BDAEIAA/BDgEQAQwBDwEOAQ0BEsEIAA3BDAERQQyBDAE QgRLBDIEMAQ1BEIEIAA8BD4EPQQ+BD8EPgQ7BDgETgQgAD0EMAQgADIEOwQwBEEEQgRMBCwAIABH BEIEPgQgAD0ENQRNBEQERAQ1BDoEQgQ4BDIEPQQ+BCAAOAQgADIEQAQ1BDQEOARCBCAAMwQ7BD4E MQQwBDsETAQ9BD4EPARDBCAAQAQ+BEEEQgRDBCAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ4BCAAMgQ/ BDsEPgRCBEwEIAA0BD4EIAA1BFEEIABABDAENwRABEMESAQ1BD0EOARPBC4AIAAtBEIEPgQgAD8E PgQ0BEIEMgQ1BEAENgQ0BDAENQRCBEEETwQgAD8EQAQ4BDwENQRABDAEPAQ4BCAAPwQwBDQENQQ9 BDgETwQgADoEQARDBD8EPQQ1BDkESAQ4BEUEIAA3BDAEPwQwBDQEPQRLBEUEIAA4BDwEPwQ1BEAE OAQ5BCwAIAA9BDUEIAAyBEsENAQ1BEAENgQwBDIESAQ4BEUEIABNBDsEOARCBDAEQAQ4BDcEPAQw BCwAIAA9BDAEQARGBDgEQQRBBDgENwQ8BDAEIAA4BCAAMwQ+BEAENARLBD0EOAQgADoEOwROBEcE NQQyBEsERQQgADsEOARHBD0EPgRBBEIENQQ5BCwAIABBBEIEQAQ+BDgEMgRIBDgERQQgADgEPAQ/ BDUEQAQ4BE4ELAAgAEMEPwRABDAEMgQ7BE8EMgRIBDgERQQgADUEUQQgAEAENQRBBEMEQARBBDAE PAQ4BCAAOAQgADcEMAQ0BDAEMgRIBDgERQQgAEUEPgQ0BCAAQQQ+BDEESwRCBDgEOQQsACAAOgQw BDoEIAAyBCAAQQQ7BEMERwQwBDUEIAASBDgENwQwBD0EQgQ4BDgEIAA4BDsEOAQgACAEOAQ8BEEE OgQ+BDkEIAA4BDwEPwQ1BEAEOAQ4BCwAIAAzBDQENQQgADIEPQRDBEIEQAQ1BD0EPQQ4BDkEIABA BDAEQQQ/BDAENAQgAEEEPgQyBD8EMAQ7BCAAQQQgADgENwQ2BDgEMgQwBD0EOAQ1BDwEIAA6BDsE MARBBEEEOARHBDUEQQQ6BD4EMwQ+BCAAQAQwBDEEQQRCBDIEMAQgADgEIABABDAEQQQ/BDAENAQ+ BDwEIABBBD4EPgRCBDIENQRCBEEEQgQyBEMETgRJBDUEMwQ+BCAAOgRDBDsETARCBEMEQAQ9BD4E MwQ+BCAAQwQ6BDsEMAQ0BDAELgAgACIEMAQ6BD4ENQQgAEMEPwRABDAEMgQ7BDUEPQQ4BDUELAAg ADoEMAQ6BCAAPgRABEMENgQ4BDUELAAgADgEQQQ/BD4EOwRMBDcEPgQyBDAEOwQ+BEEETAQgAD8E QAQ+BEIEOAQyBCAAOAQ8BD8ENQRABDgEOQQgADgEIABGBDAEQARBBEIEMgQgAFgAVgBJAC0AWABY ACAAMgQ1BDoEPgQyBCwAIAAyBCAAQAQ1BDcEQwQ7BEwEQgQwBEIENQQgAEcENQQzBD4EIAA8BDgE QAQgADsEOARIBDgEOwRBBE8EIABABDUEMAQ7BEwEPQQ+BDkEIAA8BD4EPQQwBEAERQQ4BDgEIAA4 BCAAPwQ+BDQEPgQxBDgETwQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8EIABABD4ENAQ+BDwELgAgACEE NQQ5BEcEMARBBCAAPAQ4BEAEPgQ8BCAAPwRABDAEMgQ4BEIEIAA3BDAEOgRDBDsEOARBBDAELAAg ADIESwRBBEIEMAQyBDsETwRPBCAAPwRABDUENwQ4BDQENQQ9BEIEPgQyBCAAPwQ+BDQEOgQ+BD0E QgRABD4EOwRMBD0ESwRFBCAAQQRCBEAEMAQ9BCAAOgQwBDoEIAA+BEIEMgQ1BEIEQQRCBDIENQQ9 BD0ESwRFBCAAPAQ1BD0ENQQ0BDYENQRABD4EMgQsACAAPgRCBDIENQRHBDAETgRJBDgERQQgADcE MAQgAD0EQwQ2BD0EQwROBCAAPwQ+BDsEOARCBDgEOgRDBCAAMwQ+BEEEQwQ0BDAEQARBBEIEMgQs ACAAPwRABD4ENAQyBDgEMwQwBDUEPARDBE4EIAAyBCAAMgQ4BDQENQQgADIEQQRRBCAAQgQ1BEUE IAA2BDUEIAAxBDUEQQRHBDUEOwQ+BDIENQRHBD0ESwRFBCAAPAQ1BEIEPgQ0BD4EMgQgAEEEPgQ6 BEAEMARJBDUEPQQ4BE8EIABABD4ENgQ0BDAENQQ8BD4EQQRCBDgEIAA4BCAAIgA0BDUEMQQ4BDsE OAQ3BDAERgQ4BDgEIgAgAD0EMARBBDUEOwQ1BD0EOARPBCwAIAAxBDUEQQQ6BD4EPQQ1BEcEPQQ+ BDkEIAA2BDUEQARCBDIENQQgADQENQRBBE8EQgQ6BD4EMgQgADgEIABBBD4EQgQ1BD0EIAA8BDgE OwQ7BDgEPgQ9BD4EMgQgADsETgQ0BDUEOQQgADUENgQ1BDMEPgQ0BD0EPgQuACAAJwQ1BDsEPgQy BDUERwQ1BEEEOgQ+BDUEIAA+BDEESQQ1BEEEQgQyBD4ELAAgAD0ENQQgAEEERwQ4BEIEMARPBCAA PwRABDgEPgQxBEkENQQ9BD0ESwRFBCAAOgQgAEIEMAQ5BD0EPgQ8BEMEIAA3BD0EMAQ9BDgETgQs ACAATQRCBD4EIAA+BEAEMwQwBD0EOAQ3BDwELAAgAEcETAROBCAAOgRABD4EMgRMBCAAQQQ/BEME QQQ6BDAETgRCBCAAQwQ8BDUEOwRLBDUEIABABEMEOgQ4BCAAPQQwBEgENQQzBD4EIAA+BDEESQQ1 BDMEPgQgAEEEPgQgADIEQQQ1BDwEIAA8BDgEQAQ+BDwEIAAyBEAEMAQzBDAELgANACAAEgQgABME OAQ/BDUEQAQxBD4EQAQ1BDUEIAA2BDUEIABBBEIEPgQ4BDwEPgRBBEIETAQgAEMEQQQ7BEMEMwQg ADIEOwQwBEEEQgQ4BCAAPAQ4BD0EOAQ8BDAEOwRMBD0EMAQgADcEMAQgAEEERwRRBEIEIAA6BD4E PQQ6BEMEQAQ1BD0ERgQ4BDgEIABABDAENwQ9BEsERQQgADsETgQ0BDUEOQQgADgEIAAzBEAEQwQ/ BD8EIAAyBCAAQwQ/BEAEMAQyBDsENQQ9BDgEOAQuACAAGgRABD4EPAQ1BCAAQgQ+BDMEPgQsACAA TQREBEQENQQ6BEIEOAQyBD0EPgRBBEIETAQgAE0EQgQ+BDMEPgQgAEMEPwRABDAEMgQ7BDUEPQQ4 BE8EIAA8BDAEOgRBBDgEPAQwBDsETAQ9BDAELAAgAEIEMAQ6BCAAOgQwBDoEIABABDAEQQRHBFEE QgQgAEEEQgRABDAEQgQ1BDMEOAQ4BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQgAD8EQAQ+BDcEQAQw BEcENQQ9BCAAOAQgADoEPgQ9BEIEQAQ+BDsEOARABEMENQQ8BCAAMgRBBDUEPAQgAD4EMQRJBDUE QQRCBDIEPgQ8BC4AIAAfBDgEQAQwBDwEOAQ0BDAEIAA0BDUEQAQ2BDgEQgQgADIEQQQ1BCAAQQQy BD4EOAQgAEEENQQ6BEAENQRCBEsEIAA4BCAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAAOAQ9BEQE PgRABDwEMARGBDgETgQgAD4EIABBBDIEPgQ4BEUEIABDBD8EQAQwBDIEOwQ1BD0ERwQ1BEEEOgQ4 BEUEIABABDUESAQ1BD0EOARPBEUEIAA9BDAEIAAyBDUEQARFBEMEIAA4BCAAQQQ6BEAESwQyBDAE NQRCBCAAPgRCBCAAQgQ+BDsEPwRLBC4AIAASBCAATQRCBD4EPAQgAEEEOwRDBEcEMAQ1BCAAPgQx BEkENQRBBEIEMgQ+BCAAPQQ1BCAAPAQ+BDYENQRCBCAAPQQ4BDoEMAQ6BCAAPwQ+BDIEOwQ4BE8E QgRMBCAAPQQwBCAAMwRDBDEEOARCBDUEOwRMBD0EPgQ1BCAAQAQ1BEgENQQ9BDgENQQsACAANQRB BDsEOAQgAD4EPQQ+BCAAPwRABDgEPQRPBEIEPgQgAEEEMgQ1BEAERQRDBC4AIAAeBEIEQQRDBEIE QQRCBDIEOAQ1BCAAPgRCBDIENQRCBEEEQgQyBDUEPQQ9BD4EQQRCBDgEIAA0BDUEOwQwBDUEQgQg AEIEMAQ6BEMETgQgAEEEQgRABEMEOgRCBEMEQARDBCAAMgQ+BD4EMQRJBDUEIAA9BDUEIAA/BEAE OAQzBD4ENAQ9BD4EOQQgADQEOwRPBCAAQAQ1BDAEOwQ4BDcEMARGBDgEOAQgAEAENQQwBDsETAQ9 BD4EMwQ+BCAAPgQxBEkENQRBBEIEMgQ1BD0EPQQ+BDMEPgQgADgEPQRCBDUEQAQ1BEEEMAQuACAA HQQwBDsEOARHBDgENQQgADoEPgQ9BDoEQwRABDUEPQRCBDAEIABBBCAAPgQ0BDgEPQQwBDoEPgQy BEsEPAQgADcEMAQ/BDAEQQQ+BDwEIABABDUEQQRDBEAEQQQ+BDIEIAA4BCAAQQQgAEMEPwRABDAE MgQ7BDUEPQQ4BDUEPAQgAD8EPgQgAEIEOAQ/BEMEIAAQBCwAIAA/BEAEOAQyBD4ENAQ4BEIEIAA6 BCAAMQQwBD0EOgRABD4EQgRBBEIEMgRDBCAAPwQ4BEAEMAQ8BDgENARLBCAAOAQgADAEPQQwBEAE RQQ4BDgELgAgAB8EOARABDAEPAQ4BDQEMAQgADwEPgQ2BDUEQgQgAEAEMARBBEIEOAQgAEIEPgQ7 BEwEOgQ+BCAAMgQgAEEEOwRDBEcEMAQ1BCAAPQQwBDsEOARHBDgETwQgADEEPgQ7BDUENQQgAEEE OwQwBDEESwRFBCAATQQ7BDUEPAQ1BD0EQgQ+BDIELAAgADoEPgRCBD4EQARLBEUEIAA8BD4ENgQ9 BD4EIAA/BD4EQQRCBDAEMgQ4BEIETAQgADIEIAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBEwELgAgABUE QQQ7BDgEIABCBDAEOgQ4BDUEIABNBDsENQQ8BDUEPQRCBEsEIAA6BD4EPQRHBDAETgRCBEEETwQs ACAAPwQ4BEAEMAQ8BDgENAQwBCAAQAQwBEEEQQRLBD8EMAQ1BEIEQQRPBCAANQRBBEIENQRBBEIE MgQ1BD0EPQRLBDwEIAA+BDEEQAQwBDcEPgQ8BCAAPgRCBCAAMgQ9BEMEQgRABDUEPQQ9BDgERQQg ADoEPgQ9BEQEOwQ4BDoEQgQ+BDIEIAA4BDsEOAQgAD4EQgQgADIEPgQ3BDQENQQ5BEEEQgQyBDgE TwQgADoEPgQ9BDoEQwRABDUEPQRCBD4EMgQuAA0AIAAfBDAEQAQwBDcEOARCBDgEQAQ+BDIEMAQ9 BDgENQQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEOARFBCAAMQQ+BDsENQQ3BD0ENQQ5BCAAPQQwBCAA QQRCBDgERQQ4BDgEIABSAEEAIAA4BDcEPQQwBEcEMAQ7BEwEPQQ+BCAAPgRCBEEEQwRCBEEEQgQy BEMENQRCBCAAMgQgADUENAQ4BD0EPgQ8BCAAQwQ/BEAEMAQyBDsENQQ9BDgEOAQsACAAOgQ+BEIE PgRABD4ENQQgAD4EQQRDBEkENQRBBEIEMgQ7BE8ENQRCBEEETwQgAEEEOAQ7BDAEPAQ4BCAAIAQ+ BDQEMAQuACAAIAQ+BDQEPQRLBDUEIAA7BE4ENAQ4BCAAPQQ1BCAANgQ1BEAEQgQyBEMETgRCBCAA QQQyBD4EOARFBCAAOAQgADgERQQgAEcENQQ7BD4EMgQ1BEcEPQQ+BEEEQgRMBCAAQAQwBDQEOAQg ADQEPgRBBEIEOAQ2BDUEPQQ4BE8EIAAyBDsEMARBBEIEOAQgADgEIAA/BEAEOAQgAE0EQgQ+BDwE IAA/BD4EOwRDBEcENQQ9BDgETwQgAD0ENQQ+BD8EQAQwBDIENAQwBD0EPQQ+BCAAPwQ7BD4ERQQ+ BDMEPgQgADoEMARHBDUEQQRCBDIEMAQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8EIAAyBCAAMwQ7BD4E MQQwBDsETAQ9BD4EPAQgAD8EOwQwBD0ENQQuACAAFQQ0BDgEPQQ+BD0EMARHBDAEOwQ4BDUEIABE BD4EQAQ8BDgEQARDBDUEQgQgAEEEOAQ7BEwEPQRLBDkEIABABD4ENAQsACAAQwQ/BEAEMAQyBDsE TwROBEkEOAQ5BCAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ1BDkEIAA4BCAAQwQ8BD0EPgQ2BDAENQRC BCAAOwRDBEcESAQ4BEUEIAA4BDcEIAA9BDUEMwQ+BCwAIABBBD4ENwQ0BDAENQRCBCAANQQ0BDgE PQRDBE4EIAA/BEAEPgRGBDIENQRCBDAETgRJBEMETgQgAEYEOAQyBDgEOwQ4BDcEMARGBDgETgQg ADgEIAAzBD4EQQRDBDQEMARABEEEQgQyBD4EIABBBDIEPgQxBD4ENAQ9BD4EMwQ+BCAARwQ1BDsE PgQyBDUEOgQwBCwAIAA+BDEEOwQwBDQEMAROBEkENQQzBD4EIABBBDIEPgQ4BDwEOAQgAEYENQQ9 BD0ENQQ5BEgEOAQ8BDgEIAA4BDcEPQQwBEcEMAQ7BEwEPQRLBDwEOAQgAEEEMgQ+BDkEQQRCBDIE MAQ8BDgELAAgADoEMAQ6BCAAQQQ+BDIENQRBBEIETAQsACAAPwQ+BEAETwQ0BD4ERwQ9BD4EQQRC BEwELAAgAEEEOAQ7BEsEIAA0BEMERQQwBC0AIAA8BDgEQAQgACcENQQ7BD4EMgQ1BDoEMAQtABEE PgQzBDAEKAAnBDUEQAQyBDsETAQpAC4AIAAnBEIEPgQxBEsEIAA0BD4EQQRCBDgERwRMBCAANQQz BD4ELAAgADwESwQgADIEQQQ1BCwAIAA8BEMEQAQwBDIETAQ4BCAAMgQgADwEQwRABDAEMgQ1BDkE PQQ4BDoENQQsACAANAQ+BDsENgQ9BEsEIAA/BEAEPgQ5BEIEOAQgADwEQwRHBDgEQgQ1BDsETAQ9 BEsEPAQgAD8EQwRCBDUEPAQgAEIEQAQwBD0EQQREBD4EQAQ8BDAERgQ4BDkEIAA6BCAAPQQwBEEE QgQ+BE8ESQQ1BDwEQwQgACcENQQ7BD4EMgQ1BDoEQwQgADgEIABHBDUEOwQ+BDIENQRHBD0EPgRB BEIEOAQuAA0AIAANACAAIAAgACAAIAAgACAASQBWADEEKQAgABIEOgQ7BE4ERwQ1BD0EOAQ1BCAA QAQwBEEEPgQyBD4EMwQ+BCAAQQQ+BDcEPQQwBD0EOARPBA0AIAATBDUEPQRLBCAARwQ1BDsEPgQy BDUEOgQwBCAAPgRCBEAEMAQ2BDAETgRCBCAAQQQyBD4EOQRBBEIEMgQwBCAAPgQ6BEAEQwQ2BDAE TgRJBDUEOQQgADUEMwQ+BCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQuACAAIwQ/BEAEMAQyBDsENQQ9 BDgENQQgADMEOwQ+BDEEMAQ7BEwEPQRLBDwEOAQgAD8EQAQ+BEYENQRBBEEEMAQ8BDgEIABBBCAA PwQ+BDwEPgRJBEwETgQgAEEAIAA4BCAAIAQ+BDQEMAQgAD8EPgQ7BEMERwQwBDUEQgQgADQEPgRB BEIEQwQ/BCAAOgQgAEAEMARBBD4EMgQ+BDwEQwQgAEEEPgQ3BD0EMAQ9BDgETgQtACAAPgRCBEAE MAQ2BDUEPQQ4BE4EIABCBDUERQQgADcEPQQwBD0EOAQ5BCAAOAQgADgEPQRCBDUEQAQ1BEEEPgQy BCwAIAA6BD4EQgQ+BEAESwQ8BDgEIAA9BDAESAQ4BCAAHwRABDUENAQ6BDgEIABABEMEOgQ+BDIE PgQ0BEEEQgQyBD4EMgQwBDsEOARBBEwEIAA0BDUEQQRPBEIEOgQ4BCAAOAQgAEEEPgRCBD0EOAQg AEIESwRBBE8ERwQgADsENQRCBCAAPQQwBDcEMAQ0BC4AIAAVBDQEOAQ9BD4EPQQwBEcEMAQ7BDgE NQQgAD4EQgRABDAENgQwBDUEQgRBBE8EIAAyBCAAOAQ9BEIENQRABDUEQQQwBEUEIAA/BEAENQQ0 BDoEPgQyBCAAOAQgADgEQQRCBD4EQAQ4BDgEIAA/BEAEPgRIBDsEPgQzBD4EIAA4BCAAQgQwBDwE IAA8BD4ENgQ9BD4EIAA+BDEEPQQwBEAEQwQ2BDgEQgRMBCAANQQzBD4EIAA+BDEEQAQwBDcEIAAQ BC4AIAAhBD4ENwQ0BDAEMgQgAD0EMAQgAD8EOwQwBD0ENQRCBDUEIABABDUEMAQ7BEwEPQRDBE4E IAAzBDsEPgQxBDAEOwRMBD0EQwROBCAAQQQ4BEEEQgQ1BDwEQwQgAEMEPwRABDAEMgQ7BDUEPQQ4 BE8EIABBBCAAPwQ+BDwEPgRJBEwETgQgADUENAQ4BD0EPgQ9BDAERwQwBDsEOARPBCAAOAQgAEAE PgQ0BD4EMgQsACAAPAQ+BDYEPQQ+BCAAMQRLBDsEPgQgADEESwQgADgENwQxBDUENgQwBEIETAQg ADwEPQQ+BDMEOARFBCAAPwRABD4EMQQ7BDUEPAQgADgEIAA0BD4EMQQ4BEIETARBBE8EIAAxBDsE MAQzBCwAIAAwBCAAMwQ7BDAEMgQ9BD4ENQQtACAAQQQyBD4EMQQ+BDQESwQgAD4EQgQgADAENARB BDoEPgQzBD4EIABDBD0EOARHBEIEPgQ2BDUEPQQ4BE8EIAA4BCAAPwQ+BEAEMAQxBD4ESQQ1BD0E OARPBCAAPgRBBEIEMAQyBEgENQQzBD4EQQRPBCAAPgRCBD0EPgRBBDgEQgQ1BDsETAQ9BD4EIABB BDIEPgQxBD4ENAQ9BD4EMwQ+BCAAPQQwBEEENQQ7BDUEPQQ4BE8EKABABEMEQQRBBDoEPgQzBD4E IAA9BDAEQAQ+BDQEMAQgADgEIAA/BEAENQQ0BEEEQgQwBDIEOARCBDUEOwQ1BDkEIAA0BEAEQwQz BDgERQQgAD0EMARABD4ENAQ+BDIELQAgAD4ERwQwBDMEPgQyBCAANARDBEUEMAQgAEEAKQAgADIE QQQ1BDwEOAQgAEEEQAQ1BDQEQQRCBDIEMAQ8BDgELgAgAB0EPgQsACAAMgQ9BDUEIAA3BDAEMgQ4 BEEEOAQ8BD4EQQRCBDgEIAA+BEIEIABNBEIEPgQzBD4ELAAgADIEQQRRBCAAPQQwBEEENQQ7BDUE PQQ4BDUEIAA9BDAESAQ1BDkEIAA/BDsEMAQ9BDUEQgRLBCAAMgQ3BDQEPgRFBD0EQwQ7BD4EIAAx BEsEIABBBCAAPgQxBDsENQQzBEcENQQ9BDgENQQ8BCwAIAA/BD4EOwRDBEcEOAQyBCAASAQwBD0E QQQgADIESwQ2BDgEQgRMBCwAIABBBD4EQQRCBD4ETwRCBEEETwQgADoEMAQ6BCAAOwROBDQEOAQs ACAAMgRLBEAEMARBBEIEOARCBEwEIABBBDIEPgQ5BCAAIAQ+BDQEIAA4BCAAPwQ+BDsEQwRHBDgE QgRMBCAAPwRABD4ERwQ4BDUEIAA/BDsEPgQ0BEsEIABBBDIEPgQxBD4ENARLBC4ADQAgABQEOwRP BCAAPwQ+BDEENQQ0BEsEIABBACAAPQQwBDQEIABSAEEAIAA9BDUEIAA9BEMENgQ9BEsEIAAyBD4E OQQ9BEsEIAA4BCAAPQQwBEEEOAQ7BDgENQQsACAAQgQwBDoEIAA6BDAEOgQgAE0EQgQ+BCAAPwQ+ BDEENQQ0BDAEIAA1BDQEOAQ9BD4EPQQwBEcEMAQ7BDgETwQuACAAGgQ7BE4ERwQ1BDIESwQ1BCAA RAQ4BDsEPgRBBD4ERARBBDoEOAQ1BCAAOgQwBEIENQQzBD4EQAQ4BDgEIAA4BCAATwQyBDsENQQ9 BDgETwQsACAAQQQyBE8ENwQwBD0EPQRLBDUEIABBBDwESwRBBDsEPgQ8BCAAQQQgADEEPgQ7BDUE NwQ9BE8EPAQ4BCAAUgBBACAANAQ+BDsENgQ9BEsEIAA/BD4ENAQyBDUEQAQzBD0EQwRCBEwEQQRP BCAANQQ0BDgEPQQ+BDIEQAQ1BDwENQQ9BD0EPgQ8BEMEIAA4BCAAMwQ7BD4EMQQwBDsETAQ9BD4E PARDBCAAMQQ+BDkEOgQ+BEIEQwQgAEEEPgQgAEEEQgQ+BEAEPgQ9BEsEIABFBD4ENwRPBDUEMgQg ADQEQwRFBDAEIABBAC4AIAAQBCAAOgQwBDoEOAQ1BCAAMwQ7BDAEMgQ9BEsENQQgADoEOwROBEcE NQQyBEsENQQgADoEMARCBDUEMwQ+BEAEOAQ4BCAAUgBBAD8AIAAgBDAENwQ0BDUEOwQ1BD0EOAQ1 BCAAPgQxBDsEMAQ0BDAENQRCBCAAPwQ+BCAAMAQ9BDAEOwQ+BDMEOAQ4BCAAQQQgAEEAIAA4BCAA QQBOACAAIgA3BDUEPAQ9BEsEPAQsACAAOwQ4BEcEPQRLBDwEIAAxBD4EMwQ+BDwEIgAgAFIAQQBa AC0AIAAzBEAEMAQ9BEwEIABBAFoAYQAgADgEOwQ4BCAAIgAzBEAEMAQ9BEwEIAA7BDgERwQ9BD4E QQRCBDgEIgAuACAALQRCBDAEIAAzBEAEMAQ9BEwEIAA7BDgERwQ9BD4EQQRCBDgELAAgADoEPgRC BD4EQAQwBE8EIAAyBCAAQQQyBD4ETgQgAD4ERwQ1BEAENQQ0BEwEIAA1BEEEQgRMBCAAMwRABDAE PQQ4BEYEMAQgADwENQQ2BDQEQwQgAD0ENQQxBD4EPAQgADgEIAA3BDUEPAQ7BDUEOQQgADgEIAA6 BD4EQgQ+BEAEMARPBCAAPwRABD4EPQQ4BDoEOwQwBCAAMgQgAEAEQwRBBEEEOgQ4BDkEIAA6BDAE OgQgACIAIAQQBBcEIgAtACAAOwQ4BEcEPQQ+BEEEQgRMBCAAOAQ7BDgEIAA3BDUEPAQ9BDAETwQg AEEEQwRJBD0EPgRBBEIETAQgADMEQAQwBD0EOAQgAFIALgAgAC0EQgQwBCAAOwQ4BEcEPQQ+BEEE QgRMBCAAPwRABD4ETwQyBDsETwQ1BEIEQQRPBCAAMgQgADMARQQgAD4EQQQ9BD4EMgQ9BEsERQQg ADoEMARCBDUEMwQ+BEAEOARPBEUELQAgACAEEAQXBDQENQQ7BDUEPQQ4BDUELAAgACAEEAQXBDIE OARCBDgENQQsACAAIAQQBBcEPwQwBDQELAAgADoEPgRCBD4EQARLBDUEIABBBEMEQgRMBCAANQRR BCAAQQQ4BDwEMgQ+BDsESwQuACAAHQQ1BEEEPAQ+BEIEQARPBCwAIAA9BDAEIAAyBD4EMgQ7BDUE RwQ1BD0EPQQ+BEEEQgRMBCAAUgBBACAAMgQgAD8EQAQ+BEYENQRBBEEEIAAzBDsEPgQxBDAEOwQ4 BDcEMARGBDgEOAQgADgEIAA8BD4EPQQ+BD8EPgQ7BDgETgQgAD0EMAQgADIEOwQwBEEEQgRMBCwA IABABDAENwQ0BDUEOwQ1BD0EOAQ1BCAAOAQgAEAEMARBBD8EMAQ0BCAAMgQgAEEEMgRPBDcEOAQg AEEEIABABDAENwQyBDgEQgQ4BDUEPAQgADoEMARBBDAETgRCBEEETwQgADgEIAA1BFEEIAA/BDAE QAQwBDcEOARCBD4EMgQgADIEIAA/BD4EOwQ9BD4EOQQgADwENQRABDUELgAgAB8EQAQ4BEcENQQ8 BCwAIAA1BEEEOwQ4BCAAOgQ+BD0EQgRABD4EOwQ4BEAEPgQyBDAEQgRMBCAAQAQwBDcENAQ1BDsE NQQ9BDgENQQgADgEIABABDAENwQyBDgEQgQ4BDUEIABDBCAAMwQ7BD4EMQQwBDsEOARBBEIEPgQy BCAAQwQ0BDAENQRCBEEETwQsACAAQgQ+BCAAPwRABD4ERgQ1BEEEQQRLBCAAMQQ1BEEEOgQ+BD0E QgRABD4EOwRMBD0EPgQzBD4EIAA0BDAEMgQ7BDUEPQQ4BE8EIABHBDUEOwQ+BDIENQQ6BDAEIAA9 BDAEIABBBEAENQQ0BEMEIAA4BCAAPQQwBCAAQQQwBDwEPgQzBD4EIABBBDUEMQRPBCAAMgQgAEAE NQQ3BEMEOwRMBEIEMARCBDUEIAA9BDUETQREBEQENQQ6BEIEOAQyBD0EPgQzBD4EIABDBD8EQAQw BDIEOwQ1BD0EOARPBCAAQQRCBDAEOwQ4BCAAQwQ6BDAENwRLBDIEMARCBEwEIAA9BDAEIABABDAE QQQ/BDAENAQuAA0AIAAaBD4EPQRGBDUEPwRGBDgETwQgAEAEMAQ3BDIEOARCBDgETwQgADQEPgQ7 BDYEPQQwBCAAMQRLBEIETAQgAEEEMQQwBDsEMAQ9BEEEOARABD4EMgQwBD0EMAQgADoEPgQ9BEYE NQQ/BEYEOAQ1BDkEIAAxBDsEMAQzBD4EQQRCBD0EPgQzBD4EIAAgBB4EIQQiBBAELgAgABIEQgQ+ BEAEOARHBD0EPgRBBEIETAQgAEAEMAQ3BDQENQQ7BDUEPQQ4BE8EIAA4BCAAPwRABDUEPgQxBEAE MAQ3BD4EMgQwBD0EOAQ5BCAAPwQ1BEAENQQ0BCAAMQQ1BDcEPgQ/BDAEQQQ9BEsEPAQgADUEQQRC BDUEQQRCBDIENQQ9BD0ESwQ8BCAAQAQ+BEEEQgQ+BDwELAAgAEEEPgQzBDsEMARBBEMETgRJBDgE PARBBE8EIABBBCAANwQwBDoEPgQ9BDAEPAQ4BCAAPwRABDgEQAQ+BDQESwQgADgEIABHBDUEOwQ+ BDIENQQ6BDAEIAA+BEcENQQyBDgENAQ9BDAEIQAgACIEPgQ7BEwEOgQ+BCAAPwQ+BEEEQgQwBDIE OAQyBCAAMgQ+BCAAMwQ7BDAEMgRDBCAAQwQzBDsEMAQgACAEHgQ0BCAAOAQgACAEHgRBBEIELAAg ADwEOARABCAAPgQxBEAENQRCBDAENQRCBCAAOgQ+BD0ERgQ1BD8EQgRDBDAEOwRMBD0EQwROBCAA PQQ1BDcEMAQyBDgEQQQ4BDwEPgRBBEIETAQgADgEIAA+BDEESQRDBE4EIABBBDIEPgQxBD4ENARD BCAAPgRCBCAAMQQ1BDcEQwQ8BD0EPgQzBD4EIAAwBDoEQgQwBCAAQAQwBDcENAQ1BDsENQQ9BDgE TwQgADgEIAAxBDUEQQQ/BD4EOwQ1BDcEPQQ+BDkEIAA+BDEEPAQwBD0EPQQ+BDkEIABBBDIEPgQx BD4ENARLBCAAPgRCBCAAQAQ1BDAEOwRMBD0EPgQgAD0EQwQ2BD0ESwRFBCAAMgQ1BEkENQQ5BCAA OAQgAD8EQAQwBDIEOAQ7BEwEPQQ+BDMEPgQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8ELgANACAAEwQ7 BD4EMQQwBDsEOAQ3BDAERgQ4BE8EIAA/BD4ENAQgADUENAQ4BD0EPgQ9BDAERwQwBDsEOAQ1BDwE IABABEMEQQRBBDoEPgQ5BCwAIABBBDIEPgQxBD4ENAQ9BD4EOQQgAEYEOAQyBDgEOwQ4BDcEMARG BDgEOAQgADQEMARBBEIEIAA/BDUEQAQ1BEUEPgQ0BCAAPQQwBCAAPQQ+BDIESwQ5BCAAQwRABD4E MgQ1BD0ETAQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQzBD4EIAAxBEsEQgQ4BE8EIAAxBDUENwQg AD8EQAQ4BDwENQQ9BDUEPQQ4BE8EIAA6BEAEPgQyBDgEIAA4BCAAPQQwBEEEOAQ7BDgETwQsACAA MQQ1BDcEIAA6BD4EMgQ1BEAEOgQwBD0ETARPBCAAOARBBEIEPgRABDgEOAQsACAATwQ3BEsEOgQw BCwAIAA6BEMEOwRMBEIEQwRABEsEIAA4BCAAPQQwBEEEMAQ2BDQENQQ9BDgETwQgADgENAQ1BD4E OwQ+BDMEOARHBDUEQQQ6BDgERQQgAD0EPgRABDwELAAgADEENQQ3BCAAPwQ+BEEEQgQ+BE8EPQQ9 BD4EMwQ+BCAANAQwBDIEOwQ1BD0EOARPBCAAPQQwBCAAPwQ+BC0APQQwBEEEQgQ+BE8ESQQ1BDwE QwQgAEEEMgQ+BDEEPgQ0BD0ESwRFBCAAOwROBDQENQQ5BC4AIAAUBDsETwQgAEIEPgQzBD4EIAA8 BEsEIAAyBEEENQQgADQEPgQ7BDYEPQRLBCAAPgRCBD4EOQRCBDgEIAA+BEIEIAA9BD4EQAQ8BCAA OARBBDoEOwROBEcEOARCBDUEOwRMBD0EPgRBBEIEOAQgAFIAQQAgADgEIABSAEEAWgAwBCwAIAAy BDUENARDBEkEOARFBCAAPQQwBEEEIAA6BCAAQAQwBEEEPwQwBDQEQwQsACAAPwRABD4EMQRDBDQE OARCBEwEIABABD4ENAQ+BDIEPgQ1BCAAQQQ+BDcEPQQwBD0EOAQ1BCAAOAQgAD4EMQRDBDcENAQw BEIETAQgADgEQQRCBD4ERwQ9BDgEOgQ4BCAAQAQwBDcEQARDBEgEOARCBDUEOwRMBD0EPgQzBD4E IAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0EOARPBCwAIAA3BDAESAQ4BEQEQAQ+BDIEMAQ9BD0EPgQz BD4EIAAyBCAATQRCBDgERQQgADEEQwQ6BDIEMARFBC0AQARDBD0EMARFBCwAIABABDAEMgQ9BD4E IAA6BDAEOgQgADgEIAA+BEEENQQ0BDsEMARCBEwEIAA4BEUEIAA/BD4ENwQ4BEIEOAQyBD0ESwQ5 BCAAPwQ+BEIENQQ9BEYEOAQwBDsELgANACAADQAgACAAIAAgACAAIAAgAEkAVgAyBCkAIAAfBD4E MwQ7BD4ESQQ1BD0EOAQ1BCAAOAQ3BDMEPgQ1BDIEIAA4BCAAOgQ+BD0ENQRGBCAAMgQ4BEIEOARP BA0AIAAgABoEMAQ6BCAAMwQ+BDIEPgRABDgEQgRBBE8ELAAgADIEIAA9BDAERwQwBDsENQQgACAE EAQXBCwAIAAwBCAAPwQ+BEIEPgQ8BCAAFAQSBBAELgAgABgEOwQ4BCAAIAQwBDcELAAgAB4EMQQg ADgEIAAeBDEEQAQwBDcELAAgAD8EQAQ4BDwENQRABD0EPgQgAEIEMAQ6BCAAQwRBBEIEQAQ+BDUE PQQgAEEEOwQwBDIETwQ9BEEEOgQ4BDkEIAA/BDAEPQRCBDUEPgQ9BCwAIAAyBCAAOgQ+BEIEPgRA BD4EPAQgACAEMAQ3BCAAOAQzBEAEMAQ1BEIEIABABD4EOwRMBCAAPgQ0BD0EPgQzBD4EIAA4BDcE IAARBD4EMwQ+BDIELAAgAD4EMQQ7BDAENAQwBDUEQgQgADwEQwQ2BEEEOgQ4BDwEIAA9BDAERwQw BDsEPgQ8BCAAOAQgAD8EQAQ+BEIEOAQyBD4EPwQ+BDsEPgQ2BDUEPQQgAB4EMQRDBCwAIAA6BD4E QgQ+BEAESwQ5BCAAPgQxBDsEMAQ0BDAENQRCBCAANgQ1BD0EQQQ6BDgEPAQgAD0EMARHBDAEOwQ+ BDwELgAgABgERQQgAB4EMQRABDAENwQgADIEIAAnBDUEOwQ+BDIENQQ6BDUEIAA4BCAAMgQgADIE OAQ0BDUEIAAnBDUEOwQ+BDIENQQ6BDAEIAA+BDEESgQ1BDQEOAQ9BE8ENQRCBCAAOARFBCwAIAA+ BDEEPQQwBEAEQwQ2BDgEMgQwBE8EIAA4BEUEIABBBD4EMgQ8BDUEQQRCBDgEPAQ+BEEEQgRMBCwA IAAzBDAEQAQ8BD4EPQQ4BE4EIAA4BCAANQQ0BDgEPQQ1BD0EOAQ1BC4AIAAcBDgEQAQgAEIEMAQ6 BCAAQwRBBEIEQAQ+BDUEPQQsACAARwRCBD4EIAA+BD0EIAA4BCAAIAQQBBcEIAA4BCAAFAQSBBAE LAAgAD0EPgQgAEIEPgQ7BEwEOgQ+BCAANQQ0BDgEPQQ+BD0EMARHBDAEOwQ4BDUELAAgADEEPgQ7 BDUENQQgAEEEQgQwBEAESAQ1BDUEIAAyBCAAOAQ1BEAEMARABEUEOAQ4BCAAOgQgAD0EOAQ8BCAA NQRBBEIETAQgAEEEQgQ4BEUEOARPBCAAOAQgAD0EMARHBDAEOwQwBCAAOAQgADUENAQ4BD0EQQRC BDIEMAQuACAAIAQwBDcEIAA4BCAANAQyBDAEIABNBEIEPgQgAD4EMwQ+BD0ETAQgADgEIAAyBD4E NAQwBC0AIAA+BD0EOAQgADwEPgQzBEMEQgQgAEEEQwRJBDUEQQRCBDIEPgQyBDAEQgRMBCAAMgQg AEAEMAQ3BD0ESwRFBCAAQQQ8BEsEQQQ7BDAERQQgADIEPgQgAEQEQAQwBDoEQgQwBDsETAQ9BD4E OQQgAEAENQQwBDsETAQ9BD4EQQRCBDgELAAgAD0ENQQgADQENQQ7BE8ESQQ1BDkEIABBBDAEPARD BCAAQQQ1BDEETwQgAD0EMAQgAD4EQgQ0BDUEOwRMBD0ESwQ1BCAAPgQxBEoENQQ6BEIESwQuACAA HgQ9BDgEIAAyBD4EQQQ/BEAEOAQ9BDgEPAQwBDUEPARLBCAARwQ1BDsEPgQyBDUEOgQ+BDwEIAA4 BCAAQQQ+BDQENQRABDYEMARCBCAAOAQgAEAEMAQ3BDQENQQ7BDUEPQQ4BDUEKAAgBDAENwQpACAA UgBBACwAIAA+BDEESgQ1BDQEOAQ9BDUEPQQ4BDUEKAAeBDEEKQAgAB4EIAA4BCAANQQ0BDgEPQRB BEIEMgQ+BCAAQQAuACAAHwRBBDgERQQ+BDsEPgQzBDgERwQ1BEEEOgQ4BCwAIAA1BEEEOwQ4BCAA IAQwBDcEIAA/BEAENQQ0BEEEQgQwBDIEOwRPBDUEQgQgAD8EQAQwBC0APARDBDYEQQQ6BD4ENQQg AD0EMARHBDAEOwQ+BCwAIABCBD4EIAAyBCAATQRCBDgERQQgAEAEMAQ8BDoEMARFBCAAPgQ9BCAA NAQ+BDsENgQ1BD0EIAAxBEsEQgRMBCAAPwRABDgEMgQ1BDQEUQQ9BCAAMgQgADMEMARABDwEPgQ9 BDgERwQ9BD4ENQQgAEEEPgRBBEIEPgRPBD0EOAQ1BCAAQQQgAD8EPgQ0BDAEMgQ7BDUEPQQ9BEsE PAQgAD8EQAQwBC0ANgQ1BD0EQQQ6BDgEPAQgAD0EMARHBDAEOwQ+BDwEIAAeBC4AIAAaBDAEOgQg ADYENQQgAE0ERAREBDUEOgRCBDgEMgQ9BD4EIAAxBDsEPgQ6BDgEQAQ+BDIEMARCBEwEIAAxBD4E OwQ1BDcEPQQ4BCAAUgBBACAAOAQgAFIAQQBaAD8AIAAxAC4AIAAaBDAEOgQgACAEEAQXBC4AIAAd BDAEIABDBEAEPgQyBD0ENQQgAEEEPARLBEEEOwQ+BD4EMQRABDAENwQ+BDIEMAQ9BDgETwQtACAA QQAgAD8EQAQ1BDQEOwQwBDMEMAQ1BEIEIABSAEEAIAA+BDEESgQ1BDQEOAQ9BDgEQgRMBEEETwQg AEEEIAA9BD4EMgQ+BDkEIAAzBEAEMAQ9BEwETgQgAEEEMAQ8BD4EOQQgAEEENQQxBE8ELQAgAFIA QQBSAEEAKAAiAEEEPAQ1BEAEQgRMBCIAKQAgAEIEPgQgADUEQQRCBEwEIAA/BD4EPwRABD4EQQRC BEMEIABDBDwENQRABDUEQgRMBC4AIAASBDUENARMBCAANQQ0BDgEPQQ+BD0EMARHBDAEOwQ4BDUE IABBBDgEOwRMBD0ENQQ1BCAAUgAsACAAMAQgAD8EPgRNBEIEPgQ8BEMEIABSAEEAIAAiAD0ENQQg ADwEPgQ2BDUEQgQgAD4EQgQ6BDAENwQwBEIETARBBE8EIgAuACAAMgAuACAAGAQgABQEEgQQBC4A IAAUBDAEOwQ1BDUELAAgAEIEPgQgAEcEQgQ+BCAAPgRBBEIEMAQ7BD4EQQRMBCwAIAA+BDEESgQ1 BDQEOAQ9BE8ENQRCBCAAQQQgAEEEPgQxBD4EOQQgAEEALQAgAD8EQAQ+BDgEQQRFBD4ENAQ4BEIE IABBBDgEPQRCBDUENwQuACAAHwQ+BDsEQwRHBDAENQQ8BCAAQQBSAEEAUgBBAC0AIAA/BD4EMQQ1 BDQEQwQgADUENAQ4BD0EPgQ9BDAERwQwBDsEOARPBCAAPQQwBDQEIABSAEEALgAgAEMAIABCBD4E RwQ6BDgEIAA3BEAENQQ9BDgETwQgABMEOAQ/BDUEQAQxBD4EQAQ1BDUEMgQsACAAMgQgAD0EMARH BDAEOwQ1BC0AIAAzBDsEMARBBD0EMARPBCAAMQRDBDoEMgQwBCAAOAQgADcEPQQwBEcEOARCBCAA QwQgAD4EQQQ9BD4EMgQ9BEsERQQgADUAIAAxBEMEOgQyBCAAPQQ1BDoEPgQ1BCAAPwQ1BEAEMgQ1 BD0EQQRCBDIEPgQsACAAPQQ+BCAAPgQ9BDgEIABCBDUEQQQ9BD4EIABBBDIETwQ3BDAEPQRLBCAA QQQgAEEEPgQzBDsEMARBBD0ESwQ8BDgEKAA+BDEEQAQwBDcEPgQyBDAEPQQ4BDUEIAAyAC0AMQRD BDoEMgQ1BD0EPQRLBEUEIABBBDsEPgQzBD4EMgQgAD8EQAQ+BDgEQQRFBD4ENAQ4BEIEIABBBCAA QwRHBDAEQQRCBDgENQQ8BCAAMQAgADMEOwQwBEEEPQQ+BDkEIAA4BCAAMQAgAEEEPgQzBDsEMARB BD0EPgQ5BCkALgAgAB8EQAQ4BEcENQQ8BCwAIABBBD4EMwQ7BDAEQQQ9BEsERQQgADEEQwQ6BDIE IAA9BDAEPAQ9BD4EMwQ+BCAAMQQ+BDsETARIBDUELgAgABMEOwQwBEEEPQRLBDUEIAAxBEMEOgQy BEsEIABPBDIEPQRLBDUEIAA0BD4EPAQ4BD0EMAQ9BEIESwQuACAAHgQ9BDgELAAgADIEIABBBDIE PgQ1BDwEIAA1BDQEOAQ9BEEEQgQyBDUELAAgADcEMAQ0BDAETgRCBCAAQQQ4BD0EQgQ1BDcEIABB ACwAIAA+BDEESgQ1BDQEOAQ9BE8ENQQ8BEsENQQgADUEMwQ+BCgAQQApACAAPwQ1BEAEMgQ+BD0E MARHBDAEOwQ4BDUEPAQgADgEIABBBEIEQARDBDoEQgRDBEAEQwQgAEEEPgQzBDsEMARBBD0ESwRF BCAAMQRDBDoEMgQsACAAOgQ+BEIEPgRABEsENQQgAD4EPwRABDUENAQ1BDsETwROBEIEIAA0BDAE OwRMBD0ENQQ5BEgENQQ1BCAAQAQwBDcEMwRABDAEPQQ4BEcENQQ9BDgENQQoAFIAKQAgADwENQQ2 BDQEQwQgAEEEQgQ4BEUEOARPBDwEOAQgADgELAAgADoEMAQ6BCAAQQQ7BDUENARBBEIEMgQ4BDUE LAAgAEgEOARABD4EQgRDBCAAPwQ+BDcEPQQwBD0EOARPBCAAMwQ4BD8ENQRABDEEPgRABDUENQQy BCwAIAA/BD4EOwQ9BD4EQgRDBCAAOARFBCAAPAQ4BEAEPgQ/BD4EPQQ4BDwEMAQ9BDgETwQgADgE IABBBD4EPgRCBDIENQRCBEEEQgQyBDgENQQgADgERQQgAEQEOAQ7BD4EQQQ+BEQEOAQ4BCAAQQQ+ BDIEQAQ1BDwENQQ9BD0ESwQ8BCAAPwRABDUENARBBEIEMAQyBDsENQQ9BDgETwQ8BC4AIAAhBD4E MwQ7BDAEQQQ9BEsENQQgADEEQwQ6BDIESwQgAEAEMAQ3BDQENQQ7BE8ETgRCBCAAPgQxBEkEOAQ5 BCAAIgAzBDsEMARBBD0ESwQ5BCIAIABBBDwESwRBBDsEIABABDAENwQ9BEsEPAQ4BCAAQQQ7BD4E MgQwBDwEOAQgADgEIABABDUERwRMBE4ELAAgAD4EMQQ7BDAENAQwBE4ESQQ4BDwEOAQgAEMENgQ1 BCAAIgA9BDUEMwQ7BDAEQQQ9BEsEPAQiACAAQQQ8BEsEQQQ7BD4EPAQtACAAQQQ7BD4ENgQ9BEsE RQQgADAEQQQ/BDUEOgRCBD4EMgQgAEAENQQwBDsETAQ9BD4EQQRCBDgELAAgADQEMAQ7BEwEPQQ4 BEUEIAA/BD4EQgQ+BDwEOgQ+BDIEIAA/BE8EQgQ4BCAAPwQ1BEAEMgQ+BD0EMARHBDAEOwRMBD0E SwRFBCAAIgAxBD4EMwQ+BDIEIgAgADIEPwQ7BD4EQgRMBCAANAQ+BCAAQQQwBDwEPgQzBD4EIAAz BDsEMAQyBD0EPgQzBD4EIAA4BCAANQQ0BDgEPQQ+BDMEPgQtACAAQQAuACAAIgQ+BCAANQRBBEIE TAQsACAAOgQ+BCAAMgRBBDUEPARDBCAAPwRABD4ERwQ1BDwEQwQsACAAMwQ7BDAEQQQ9BD4EQQRC BEwEIAA4BCAAQQQ+BDMEOwQwBEEEPQQ+BEEEQgRMBCAAIgBDBEEEOAQ7BDgEMgQwBE4EQgQiACAA NAQ+BDwEOAQ9BDAERgQ4BE4EIABBACAAPQQwBDQEIAAgBCAAOAQgACAEEAQuACAAEAQgACIAPwQ+ BDEENQQ2BDQEMAQ1BEIEIgAgADgERQQgAEEEQgRABDUEPAQ4BEIENQQ7BEwEPQQ+BCwAIABCBDAE OgQgADoEMAQ6BCAAPQQwBEUEPgQ0BDgEQgRBBE8EIABBBCAAPQQ4BDwEOAQgADIEIABBBDwESwRB BDsEPgQyBD4EPAQgAD8EQAQ+BEIEOAQyBD4EQAQ1BEcEOAQ4BCwAIABFBD4EQgRPBCAAOAQgAD0E NQQgAEIEMAQ6BD4EPAQsACAARwRCBD4EMQRLBCAAOARFBCAAPgQxBEoENQQ0BDgEPQQ1BD0EOAQ1 BCAAQQRCBDAEOwQ+BCAAPwRABDgEPQRGBDgEPwQ4BDAEOwRMBD0EPgQgAD0ENQQyBD4ENwQ8BD4E NgQ9BEsEPAQsACAAQwRHBDgEQgRLBDIEMARPBCAAPwRABDUEMgQ+BEEERQQ+BDQEQQRCBDIEPgQg ABAEIAA9BDAENAQgADIEQQQ1BDwEOAQuACAAGAQ3BD0EMARHBDAEOwRMBD0EPgQgAEMEIABSAEEA IAA9BDUEQgQgAEgEMAQ9BEEEPgQyBCAAQwQ/BEAEMAQyBDsETwRCBEwEIAA8BDgEQAQ+BDwEIAAn BDUEOwQ+BDIENQQ6BDAEIAAxBDUEQQQ6BD4EPQQ1BEcEPQQ+BCAANAQ+BDsEMwQ+BC4ADQAgABIE PgRCBCAARwRCBD4EIAA8BD4ENgQ1BEIEIABBBDQENQQ7BDAEQgRMBCAAOgQwBDYENARLBDkEIAA0 BDsETwQgAEEEPgQ/BEAEPgRCBDgEMgQ7BDUEPQQ4BE8ELgAgABcEMAREBDgEOgRBBDgEQAQ+BDIE MARCBEwEIABBBD4EPgRCBDIENQRCBEEEQgQyBDgENQQgADEEQwQ6BDIEIAA+BD8EQAQ1BDQENQQ7 BDUEPQQ9BEsEPAQgAEEEQgQ4BEUEOARPBDwELQAgADwEPQQ+BDYENQRBBEIEMgQwBDwEIAAxBD4E MwQ+BDIELwBPBDIEOwQ1BD0EOAQ5BC8AMARBBD8ENQQ6BEIEPgQyBC8APgQxBEoENQQ6BEIEPgQy BC8ARARABDAEOgRCBDAEOwQ+BDIEIABNBEIEPgQ5BCAANgQ4BDcEPQQ4BCAAOAQgADIEIABBBDsE QwRHBDAENQQgADgEQQQ/BD4EOwRMBDcEPgQyBDAEPQQ4BE8EIABABEMEQQRBBDoEPgQ5BCAAQAQ1 BEcEOAQgADIEIAA7BE4EMQQ+BDwEIAA6BD4EPQRCBDUEOgRBBEIENQQtACAAMgQgAEIEPgQ8BCAA RwQ4BEEEOwQ1BCAAOAQgADIEIAA/BEAEPgRGBDUEQQRBBDUEIAA8BEsESAQ7BDUEPQQ4BE8EIABC BD4ERwQ9BD4EIAA/BD4EPQQ4BDwEMARCBEwEIABBBDwESwRBBDsEPgQyBEMETgQgAD0EMAQzBEAE QwQ3BDoEQwQsACAANwQwBDoEOwROBEcENQQ9BD0EQwROBCAAMgQgADEEQwQ6BDIEMARFBC4AIAAd BDUEIAAyBEEENQQgAEEEOwQ+BDIEMAQgADQEQAQ1BDIEPQQ+BEEEQgQ4BCAAPQQ1BEEEQwRCBCAA PgQ0BD0EPgQ3BD0EMARHBD0ESwQ5BCAAQQQ8BEsEQQQ7BCwAIAA/BD4ETQRCBD4EPARDBCAAPQQ1 BD4EMQRFBD4ENAQ4BDwEPgQgAD8EMARABDAEOwQ7BDUEOwRMBD0EPgQgAD8EPgQ9BDgEPAQwBEIE TAQgAD8EQAQ+BE8EMgQ7BDUEPQQ4BE8EIABBACAAOAQgAE8AIAAyBCAANgQ4BDcEPQQ4BCwAIAAw BCAAMgQ9BDgEPAQwBD0EOAQ1BCAAPQRDBDYEPQQ+BCAAPgQxBEAEMARJBDAEQgRMBCAAPQQwBCAA QQQwBDwESwQ1BCAAPwQ+BD8EQwQ7BE8EQAQ9BEsENQQgADgEIAAyBDAENgQ9BEsENQQgAEEEOwQ+ BDIEMAQtAD0EPgRBBDgEQgQ1BDsEOAQgAEEEPARLBEEEOwQwBC4AIAAiBDAEOgQ2BDUEIAA9BEME NgQ9BD4EIAA9BDUEQQRCBDgEIAA/BEAEMAQyBDgEOwRMBD0EPgQ1BCAAPAQ4BEAEPgQ/BD4EPQQ4 BDwEMAQ9BDgENQQgADIEIABHBEMENgQ4BDUEIABDBDwESwQgADgEIAA/BEAEOAQ7BDAEMwQwBEIE TAQgAEMEQQQ4BDsEOAQ1BCAAOgQgAEEEPgQyBDUEQARIBDUEPQRBBEIEMgQ+BDIEMAQ9BDgETgQg AEEEMgQ+BDUEMwQ+BC4AIAATBDgEPwQ1BEAEMQQ+BEAENQRPBCAAPwQ+BDMEOAQxBDsEMAQgADgE NwQgADcEMAQgAEEEMgQ+BDUEOQQgADMEPgRABDQESwQ9BDgELgAgABMEPgRABDQESwQ9BDgELAAg ADoEPgRCBD4EQAQwBE8EIAAyBD4EPwQ7BD4EQgQ4BDsEMARBBEwELAAgADIEIAA6BD4EPQRGBDUE IAA6BD4EPQRGBD4EMgQsACAAMgQgAEAEMAQ3BDQENQQ7BDUEPQQ4BDUEIABBBCAAMARCBDsEMAQ9 BEIEMAQ8BDgEIAA4BCAAPwRABD4EQgQ4BDIEPgRBBEIEPgRPBD0EOAQ1BCAAQQQgAFIAQQAsACAA QgQ+BCAANQRBBEIETAQgAEEEIABHBDAEQQRCBEwETgQgAEEEMAQ8BDgERQQgAEEENQQxBE8EIAA4 BCAARwQwBEEEQgRMBE4EIABBBDIEPgQ1BDMEPgQgACIANQQ0BDgEPQQ+BD0EMARHBDAEOwQ4BE8E IgAuACAAHwRABD4ESQQ1BCAAMwQ+BDIEPgRABE8ELAAgADgEMwRABDAETwQgAD8EQAQ4BDUEPAQw BDwEOAQgADIEQAQwBDMEMAQsACAAPQQwBEgEOAQgAD8EQAQ1BDQEOgQ4BCAAPwRABD4EOAQzBEAE MAQ7BDgEIAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0ERwQ1BEEEOgQ4BCAAOAQgADoEPgQ9BEYENQQ/ BEIEQwQwBDsETAQ9BD4ELgAgACAEMAQ3BDEEQwQ0BDgEMgQgAEEEMgQ+BDUEIABBBD4ENwQ9BDAE PQQ4BDUELAAgADwESwQgADIEQQRCBDAEPQQ1BDwEIAA9BDAEIABCBD4EPQQ6BEMETgQgADMEQAQw BD0ETAQgADwENQQ2BDQEQwQgAD8EPgRABE8ENAQ6BD4EPAQgADgEIABBBD4EMgQ1BEEEQgRMBE4E LgAgAB4EMQQ7BDAENAQwBE8EIAA0BEMERQQ+BDwEIABBACAAOAQgADQEQwRFBD4EPAQgAD0EMARI BDUEMwQ+BCAAIAQ+BDQEMAQgADgEIAA+BD8ESwRCBD4EPAQgAD8EQAQ1BDQEOgQ+BDIELAAgADwE SwQgAD8EPgRBBEIEQAQ+BDgEPAQgADwEOARABCAAPQQwBCAAPwRABDgEPQRGBDgEPwQwBEUEIAA9 BDAEQQRCBD4ETwRJBDUEOQQgAEEEMgQ+BDEEPgQ0BEsEIAAxBDUENwQgADgENwQzBD4ENQQyBCAA OAQgADEENQQ3BCAAQQQ7BDUEPwRLBEUEIAA6BEMEOwRMBEIEPgQyBC4AIAAtBEIEPgQgADEEQwQ0 BDUEQgQgAD0EMARBBEIEPgRPBEkEMARPBCAANQQ0BDgEPQQwBE8EIABBBDIEPgQxBD4ENAQ9BDAE TwQgAEYEOAQyBDgEOwQ4BDcEMARGBDgETwQuAA0AIAATBDgEPwQ1BEAEMQQ+BEAENQRPBCAAPQQ1 BCAAQQQ+BEUEQAQwBD0EOAQ7BDAEIAAyBCAAQQQ1BDEENQQgADAEQgQ7BDAEPQRCBD4EMgQsACAA OAQgAD4EPQQ4BCAAQQRCBDAEOwQ4BCAAOAQ3BDMEPgRPBDwEOAQtACAAQQQ4BDsETAQ9BEsEPAQ4 BCAAOAQgADIEIAAyBEsEQQRIBDUEOQQgAEEEQgQ1BD8ENQQ9BDgEIAA+BEIENAQ1BDsEUQQ9BD0E SwQ8BDgEIAA+BEIEIAAzBDgEPwQ1BEAEMQQ+BEAENQQ5BEEEOgQ+BDMEPgQgADQEQwRFBDAEIABB ACgAPQQwBDEEOARABDAETgRJBDgEPAQ4BCAAPwQ+BEIENQQ9BEYEOAQwBDsEIAA0BEMERQQwBCAA QQQ1BD8EMARABDAEQgQ4BDcEPAQwBCwAIABABDAENwQ0BDUEOwQ1BD0EOARPBCAAOAQgADIEOwQw BEEEQgQ4BCkALAAgAD0EMARIBCAAIAQ+BDQEIABABDAENwQ0BDUEOwQ4BDsEQQRPBCAAOAQsACAA PQQ1BCAAMgRLBDQENQRABDYEMAQyBCAATQRCBD4EMwQ+BCwAIAA+BEEEOwQwBDEEIAA+BDoEPgQ9 BEcEMARCBDUEOwRMBD0EPgQuACAAEgQ/BDsEPgRCBEwEIAA0BD4EIAA9BDAESAQ1BDMEPgQgADIE QAQ1BDwENQQ9BDgEIAA8BEsELAAgADoEMAQ6BCAAOAQgAD0EMARIBDgEIAA/BEAENQQ0BDoEOAQs ACAAIgAyBEwEUQQ8BEEETwQiACAAMgQgAD8EPgQ4BEEEOgQwBEUEIABABDAETwQtACAAMQQ1BEEE PwQ1BEcEPQQ+BEEEQgQ4BCAAOAQgADEEOwQwBDMEPgQ0BDAEQgQ4BC4AIAASBCAAPwQ+BDgEQQQ6 BDUEIAA8BDUEQQRCBDAELAAgADMENAQ1BCAAPQQ1BCAAPQRDBDYEPQQ+BCAAMQRDBDQENQRCBCAA OgQwBEEEMARCBEwEQQRPBCAANwQ7BDAELAAgADMENAQ1BCAAMQRDBDQENQRCBCAAQgQ+BDsETAQ6 BD4EIAA9BDAESAQwBCAAQARDBEEEQQQ6BDAETwQsACAARwQ1BDsEPgQyBDUERwQ1BEEEOgQwBE8E IAAxBDsEMAQzBD4ENAQwBEIETAQsACAAPQQwBEgEIABBBDsEMAQyBD0ESwQ5BCAANAQ+BDEEQARL BDkEIAA4BCAAQQQ4BDsETAQ9BEsEOQQgAEAEPgQ0BCwAIAAwBCAAQgQwBDoENgQ1BCAANARABEME MwQ4BDUEIABABD4ENAQ9BEsENQQgADgEIAA7BE4EMQQ4BDwESwQ1BCAAPQQwBEAEPgQ0BEsEKAA0 BDAENgQ1BCAAQQQwBDwESwQ1BCAANAQwBDsETAQ9BDgENQQpACwAIAAwBCAAOAQ3BDMEPgQ4BCAA OARBBEcENQQ3BD0EQwRCBCAAQQQgADsEOARGBDAEIAA3BDUEPAQ7BDgELgAgAB0EPgQsACAAPwRL BEIEMARPBEEETAQgADgENwQxBDUENgQwBEIETAQgAEAEMAQxBD4EQgRLBCAAQQQ+BCAANwQ7BD4E PAQsACAAPQQ1BDcEPQQwBD0EOAQ1BDwELAAgAEEEQgRABDUEPARPBEEETAQgADoEIABBBDIEPgQ1 BDwEQwQgADoEPgQ8BEQEPgRABEIEPQQ+BDwEQwQgAEEEQwRJBDUEQQRCBDIEPgQyBDAEPQQ4BE4E IAA4BCAAMQQ1BEEEPwQ1BEcEPQQ+BEEEQgQ4BCwAIAA7BE4ENAQ4BCwAIAAyBCAAOgQ+BD0ERgQ1 BCAAOgQ+BD0ERgQ+BDIELAAgAD4ESAQ4BDEEMAROBEIEQQRPBCAAMwQ7BD4EMQQwBDsETAQ9BD4E LAAgAEIEMAQ6BCAAOgQwBDoEIAA/BEAEOAQgAE0EQgQ+BDwEIAA3BDAEMQRLBDIEMAROBEIEIAA/ BEAEPgQgAD4EQQQ9BD4EMgRDBCAAQQQyBD4ENQQzBD4EIABBBEMESQQ1BEEEQgQyBD4EMgQwBD0E OARPBCAAOAQgAEEEMgQ+BDkEIAA9BDAEQQRCBD4ETwRJBDgEOQQgAEAEMAQ5BC0AIAA0BEMERQQg AEEALAAgAEEENQQyBDUEQAQgADgEIAA0BEAENQQyBD0ETgROBCAAEwQ4BD8ENQRABDEEPgRABDUE TgQuACAAIQQgADQEQAQ1BDIEPQQ+BEEEQgQ4BCAAOAQgADQEPgQgAD0EMARIBDUEMwQ+BCAAMgRA BDUEPAQ1BD0EOAQgAEIEMAQ6BD4ENQQgAD8EPgQyBDUENAQ1BD0EOAQ1BCAAMgRLBDsEOAQyBDAE NQRCBEEETwQgADIEIABABDAENwQ0BDUEOwQ1BD0EOAQ1BCAAOAQgAEAEMAQ3BD4EMQRJBDUEPQQ4 BDUEIAA9BDAEQAQ+BDQEPgQyBCwAIAA6BDAERwQ1BEEEQgQyBCAAOAQgADwENQQ9BEIEMAQ7BDgE QgQ1BEIEMAQgAD4EQgQ0BDUEOwRMBD0ESwRFBCAAOwROBDQENQQ5BCwAIAA/BD4EQgQ1BEAETgQg AEEEMgQ+BDEEPgQ0BEsEIAA4BCwAIAA6BDAEOgQgAEEEOwQ1BDQEQQRCBDIEOAQ1BCwAIAAyBCAA QQQ8BDUEQARCBEwELgAgABgENwQzBD4EOAQgAD0ENQQgADgEQQRHBDUENwQ9BEMEQgQgAEEEMAQ8 BDgEIAA/BD4EIABBBDUEMQQ1BC4AIAAYBEUEIAA8BD4ENgQ9BD4EIABDBEEEQgRABDAEPQQ4BEIE TAQgAEIEPgQ7BEwEOgQ+BCAAPwQ+BEEEOwQ1BDQEPgQyBDAEQgQ1BDsETAQ9BEsEPAQgAD8EPgQ0 BEcEOAQ9BDUEPQQ4BDUEPAQgAEIENQRFBCwAIAA6BEIEPgQgADMEPgQ9BDgEQgQsACAANARDBEUE QwQgAEEEMgQ+BDEEPgQ0BEsEIAA4BCAANQQ0BDgEPQQ1BD0EOARPBCwAIAA4BD0EQgQ1BDMEQAQw BEYEOAQ1BDkEIAAzBD4EPQQ4BDwESwRFBCAAQQQgADMEPgQ9BDgEQgQ1BDsETwQ8BDgEIAA/BEAE PgQ0BD4EOwQ2BDUEPQQ4BDUEPAQgAEAEPgQ0BEEEQgQyBDAELAAgADgEQQQ/BEAEMAQyBDsENQQ9 BDgENQQ8BCAAOwROBDEESwRFBCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ4BEUEIAA+BEgEOAQxBD4E OgQgAEIEPgQ7BEwEOgQ+BCAAMgQgAEEEMgQ+BDUEPAQgADoEQARDBDMEQwQsACAANAQ+BDEEQARL BDwEIAA+BEIEPQQ+BEgENQQ9BDgENQQ8BCwAIABBBD8EQAQwBDIENQQ0BDsEOAQyBD4EQQRCBEwE TgQgADgEIAA8BDgEOwQ+BEEENQRABDQEOAQ1BDwEIAAyBCAAQQQ7BEMERwQwBDUEIABCBE8ENgQ1 BDsESwRFBCAAPgRCBDoEOwQ+BD0ENQQ9BDgEOQQgAD4EQgQgAD0EPgRABDwESwQtACAAMQQ+BDsE NQQ3BD0ENQQ9BD0EPgRBBEIEOAQsACAAPwRABDUEQQRCBEMEPwQ9BD4EMwQ+BCAAOAQ7BDgEIAAx BDUENwQ9BEAEMAQyBEEEQgQyBDUEPQQ9BD4EMwQ+BCAAQQQ6BDsEMAQ0BDAEIAA4BDsEOAQgAD8E PgQyBDUENAQ1BD0EOARPBC4AIAAbBE4EMQQ+BDIETAQgADsETgQ0BDUEOQQgADQEQARDBDMEIAA6 BCAANARABEMEMwRDBCAAOAQgADoEPgQgADIEQQQ1BDwEQwQgADwEOARABEMEIABNBEIEPgQgAD4E QQQ9BD4EMgQwBD0EOAQ1BCAANAQ7BE8EIAA1BDMEPgQgAD4EQQQyBD4EMQQ+BDYENAQ1BD0EOARP BCAAOAQgAEEEPwQwBEEENQQ9BDgETwQuACAAHgQ9BDAELAAgADoEMAQ6BCAAQQQ4BEEEQgQ1BDwE MAQgAD4EQgQ9BD4ESAQ1BD0EOAQ5BCwAIAA7BE8ENgQ1BEIEIAAyBCAAPgRBBD0EPgQyBEMEIAAd BD4EMgQ+BDMEPgQgABwEOARABDAELAAgADQEMAQyBDAETwQgADUEPARDBCAAMQQ7BDAEMwQ+BCAA QQQyBD4EMQQ+BDQESwQgAD4EQgQgADIEOARCBDgETwQgADgEIABABDAENwQ0BDUEOwQ1BD0EOARP BC8AQAQwBDcEQARDBEgENQQ9BDgETwQvAEAEMARBBD8EMAQ0BDAELAAgAD8EQAQ1BDoEQAQwBEIE OAQyBCAAIAQQBBcEMgQ4BEIEOAQ1BCAAIgA+BDEESQQ1BEEEQgQyBDAEIABSAEEAIgAgADgEIAA9 BDAERwQwBDIEIAA1BDQEOAQ9BEEEQgQyBDUEPQQ9BD4EIAAyBDUEQAQ9BD4ENQQgADgEIAAyBD4E NwQ8BD4ENgQ9BD4ENQQgADEEOwQwBDMEPgRBBEIEPQQ+BDUEIAA/BEAENQQxBEsEMgQwBD0EOAQ1 BCAAMgQgAEEALAAgAEIEPgQgADUEQQRCBEwELAAgADgEQQQ/BD4EOwRMBDcEQwRPBCAANQQ0BDgE PQQ1BD0EOAQ1BCwAIABBBD4ENwQ0BDAEMgQwBE8EIAA+BEEEPQQ+BDIEMAQ9BDgETwQgAD8EQAQ+ BEYEMgQ1BEIEMAQ9BDgETwQgAD0ENQQgAEIEPgQ7BEwEOgQ+BCAAOAQgAD0ENQQgAEEEQgQ+BDsE TAQ6BD4EIAAyBCAAIAQQBBcEMgQ4BEIEOAQ4BCAAOAQgAD8EPgQ4BEEEOgQ1BCAAPAQwBEIENQRA BDgEMAQ7BEwEPQRLBEUEIAAxBDsEMAQzBCAAOAQ7BDgEIABHBEMEMgRBBEIEMgQ1BD0EPQQ+BDME PgQgAEMENAQ+BDIEPgQ7BEwEQQRCBDIEOARPBCwAIABBBDoEPgQ7BEwEOgQ+BCAAMgQgAEEEOAQ9 BEIENQQ3BDUEIAA/BD4EIAA9BDAEQQRCBD4ETwRJBDUEPARDBCAAPQRABDAEMgRBBEIEMgQ1BD0E PQQ+BDMEPgQsACAARwQ1BDsEPgQyBDUERwQ9BD4EMwQ+BCAAIgA+BDEESQQ1BEEEQgQyBDAEIABB ACIALgANAA0ADQBWACAAIAAgAB0EPgQyBDAETwQgABMEOAQ/BDUEQAQxBD4EQAQ1BE8EDQANACAA IAAgACAAIAAgACAAVgAwBCkAIAAQBCAEEAQgBBAEIgQNACAAFAQ7BE8EIABBBEIEQAQ+BDgEQgQ1 BDsETARBBEIEMgQwBCAAPQQ+BDIEPgQ5BCAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ4BCAAPQRDBDYE NQQ9BCAAIgA/BDsEPgRCBCIALgAgAB0EPgQsACAAPQQ1BCAAOAQ3BCAANAQ1BEAENQQyBDAELAAg ADAEIABCBD4EQgQgADoEPgRCBD4EQARLBDkEIAA+BEIEQAQwBDYEMAQ1BEIEIAA1BDQEOAQ9BD4E PQQwBEcEMAQ7BDgENQQgADgEIAA/BEAEPgRCBDgEMgQ+BDIENQRBBCAAQQQ+BEYEOAQwBDsETAQ9 BD4EOQQgAD8EOARABDAEPAQ4BDQENQQgACAEEAQtACAAIAQQBCAEEAQuACAAGAQgAD8EPgQ/BDsE SwQyBDUEQgQgAD4EPQQgAD0EMAQgADMEPgRABEMEIAAQBCAEEAQgBBAEIgQtACAAMwQ+BEAEQwQs ACAAQwRCBDIENQRABDYENAQwBE4ESQRDBE4EIAA/BD4EMQQ1BDQEQwQgADUENAQ4BD0EPgQ9BDAE RwQwBDsEOARPBCAAPQQwBDQEIABABDAENwQ0BDUEOwQ1BD0EOAQ1BDwEIAA4BCAAQQQ8BDUEQARC BEwETgQuACAAHwQ4BEAEMAQ8BDgENAQwBCAAPQRDBDYEPQQwBCAANAQ7BE8EIAAyBEsENgQ4BDIE MAQ9BDgETwQgAE0EOwQ4BEIESwQsACAANAQ7BE8EIAAyBEsENgQ4BDIEMAQ9BDgETwQgADIEQQQ1 BEUEIAA7BE4ENAQ1BDkEIAA9BEMENgQ1BD0EIAA4BDwENQQ9BD0EPgQgAD8EOwQ+BEIELgAgACME QQRCBEAEPgQ5BEEEQgQyBD4EIAA/BDsEPgRCBDAELQAgADUENAQ4BD0EMARPBCAAPgRBBD0EPgQy BDAEIAA4BCAAQgQ1BEEEPQRLBDUEIABBBDIETwQ3BDgEIABBBD4EIAAyBEEENQQ8BDgEIABBBDIE PgQ4BDwEOAQgAEcEMARBBEIETwQ8BDgELAAgAD0EMARFBD4ENARPBEkEOAQ8BDgEQQRPBCAAMgQg AD4EPwRABDUENAQ1BDsENQQ9BD0ESwRFBCAAPgRCBD0EPgRIBDUEPQQ4BE8ERQQsACAAPgQxBDUE QQQ/BDUERwQ4BDIEMAROBEkEOARFBCAAMQQ1BDcEPgQ/BDAEQQQ9BD4EQQRCBEwEIAAyBEEENQQz BD4EIAA/BDsEPgRCBDAEIAA4BCAAQQRDBEkENQRBBEIEMgQ+BDIEMAQ9BDgETwQgAEEEMgQ+BDgE RQQgAD4EQgQ0BDUEOwRMBD0ESwRFBCAARwQwBEEEQgQ1BDkELAAgAEEEQgRABDAEPQQgADgEOwQ4 BCAAPQQwBEAEPgQ0BD4EMgQuACAALQRCBDAEIABBBEIEQARDBDoEQgRDBEAEMAQgAD4EQgRABDAE NgQwBDUEQgQgADIESwQ2BDgEMgQwBD0EOAQ1BCAANwQ1BDwEPQQ+BDMEPgQgAEcENQQ7BD4EMgQ1 BEcENQRBBDoEPgQzBD4EIAA8BD0EPgQ2BDUEQQRCBDIEMAQgAD8EQAQ4BCAAMgQ3BDAEOAQ8BD4E NAQ1BDkEQQRCBDIEOAQ4BCAAQQRCBDgERQQ4BDkEIAA9BDUEMQQwBCAAOAQgADcENQQ8BDsEOAQo AD0ENQQ4BDcEMgQ1BEEEQgQ9BD4EQQRCBEwEIAA4BCAAPgRIBDgEMQQ6BDgEIABABDAENwQyBDgE QgQ4BE8EOwAgAD8EQAQ+BD0EOAQ6BD0EPgQyBDUEPQQ4BDUEIAA6BD4EQQQ8BDgERwQ1BEEEOgQ4 BEUEIABNBDsENQQ8BDUEPQRCBD4EMgQgADIEQAQ+BDQENQQgADwENQRCBDUEPgRABDgEQgQ+BDIE IAA4BCAAPwRABD4ERwQ1BDUELQAgAEEATgApACwAIAAyBD4ENAQ9BD4EMwQ+BCAAOAQgADcENQQ8 BD0EPgQzBD4EKAA8BD0EPgQ2BDUEQQRCBDIENQQ9BD0EPgRBBEIETAQgADgEIABBBDgEPQQ1BEAE MwQ4BE8EIAAyBD4ENwQ0BDUEOQRBBEIEMgQ4BDkEIAA9BDAEIABHBDUEOwQ+BDIENQQ6BDAEIABB BD4EIABBBEIEPgRABD4EPQRLBCAAPAQ4BEAEMAQsACAAMQQ4BD4EQQREBDUEQARLBCAAOAQgAEEE MAQ8BD4EMwQ+BCAAQQQ1BDEETwQ7ACAAOgQwBEIEMARBBEIEQAQ+BEQESwQgAEEEIAA/BD4EQgQ+ BD8EMAQ8BDgEIAA4BCAAPwRABD4ERwQ1BDUEIAAtACAARQBOACkAIAA4BCAAPwRABD4ERwQ4BEUE LgAgABIEIABBBDIEPgQxBD4ENAQ9BD4EPAQgAD4EMQRJBDUEQQRCBDIENQQgAEEEPgRGBDgEMAQ7 BEwEPQRLBDkEIAA/BDsEPgRCBCAAQQRCBDAEPQQ+BDIEOARCBEEETwQgADoEOwROBEcENQQyBEsE PAQgAE0EOwQ1BDwENQQ9BEIEPgQ8BCAAQAQwBDcEMgQ4BEIEOARPBCwAIAAyBCAAPgRCBDsEOARH BDgENQQgAD4EQgQgAEAEMAQxBEEEOgQ+BDMEPgQsACAAMwQ0BDUEIAAyBCAAPwQ1BEAEMgRDBE4E IAA+BEcENQRABDUENARMBCAAQQRCBEAEPgQ4BEIEQQRPBCAAPwQ4BEAEMAQ8BDgENAQwBCAANAQ7 BE8EIAAyBEsENgQ4BDIEMAQ9BDgETwQgAE0EOwQ4BEIESwQuACAALQQ7BDUEPAQ1BD0EQgQwBDwE OAQgAEEEPgRGBDgEMAQ7BEwEPQQ+BDMEPgQgAD8EOwQ+BEIEMAQgAEEEOwRDBDYEMARCBCAAPQQw BEAEPgQ0BEsEIAA4BCAAOARFBCAAPgQxBEoENQQ0BDgEPQQ1BD0EOAQ1BCAAPwQ+BCAAPwRABDgE PQRGBDgEPwRDBCAAPgQ0BD0EPgQ5BCAAQQQ1BDwETAQ4BCAAPQQwBEAEPgQ0BD4EMgQgAD0EMAQg ADEEMAQ3BDUEIAAgBEMEQQQ4BCwAIAA6BDAEOgQgAEYEOAQyBDgEOwQ4BDcEMARGBDgEOAQsACAA QAQ1BDAEOwQ4BDcEQwROBEkENQQ5BCAANwQwBDIENQRCBEsEIAAgBD4ENAQwBC4AIAAtBEIEMAQg AEEENQQ8BEwETwQgADUEQQRCBEwEIAA3BDAEOwQ+BDMEIABBBDIEPgQxBD4ENAQ9BD4EMwQ+BCAA PwRABD4ERgQyBDUEQgQwBD0EOARPBCAAMwQ7BD4EMQQwBDsETAQ9BD4EMwQ+BCAAOAQgAD8EPgQ7 BD0EPgRGBDUEPQQ9BD4EMwQ+BCAAPgQxBEkENQRBBEIEMgQwBCwAIAA/BD4EOwQ9BD4ERgQ1BD0E PQQ+BDkEIAAxBD4ENgQ1BEEEQgQyBDUEPQQ9BD4EOQQgAEEEQgQ4BEUEOAQ4BCAAIgAnBDUEOwQ+ BDIENQQ6BCIAKABABEMEPQQwBC8AMQRDBDoEMgQ4BEYEMAQvADEEQwQ6BDIEMAQgACcEKQAgADIE IABEBDgEOwQ+BEEEPgREBDgEOAQgAD0EMARIBDgERQQgAD8EQAQ1BDQEOgQ+BDIELgAgACEENQQ8 BDUEOQQ9BEsEOQQgADoEQARDBDMEIAA9BDAEQAQ+BDQEPgQyBC0AQAQ+BDQEOARHBDUEOQQgADgE IAA3BDUEPAQ7BE8ELAAgADIEIAA6BD4EQgQ+BEAEPgQ5BCAAPgQ9BDgEIAA2BDgEMgRDBEIEIAA/ BD4EIAA3BDAEMgQ1BEIEQwQgACAEPgQ0BDAELAAgADcEMAQ0BDAETgRCBCAAQQREBDUEQARDBCAA NQQ0BDgEPQQ+BDMEPgQgACcENQQ7BD4EMgQ1BDoEMAQoAEEATgApACAAOAQgAEEEPwQwBEEENQQ9 BDgENQQgADUEMwQ+BCAAMgQgADEEQwQ0BEMESQQ1BDwELgAgAC0EQgQ+BCAAPgQxBEAEMAQ3BCAA PQQ+BDIEPgQzBD4EIAA8BDgEQAQwBCwAIAAdBD4EMgQ+BDkEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4 BC4ADQAgAB4EMQRKBDUENAQ4BD0ENQQ9BDgENQQgAD0EMARABD4ENAQ+BDIEIAA0BD4EOwQ2BD0E PgQgAD8EQAQ+BDgEQQRFBD4ENAQ4BEIETAQgAD8EPgRBBEAENQQ0BEEEQgQyBD4EPAQgADIESwRP BDIEOwQ1BD0EOARPBCAAOAQgAEEEPgQzBDsEMARBBD4EMgQwBD0EOARPBCAAPgQxBEkEOARFBCAA OAQ9BEIENQRABDUEQQQ+BDIEIAA/BEAEOAQgAD8EQAQ4BD0ETwRCBDgEOAQgAEMEPwRABDAEMgQ7 BDUEPQRHBDUEQQQ6BDgERQQgAEAENQRIBDUEPQQ4BDkELAAgAD4EMQRKBE8EMgQ7BDUEPQQ4BDUE PAQgADgEPQRCBDUEQAQ1BEEEPgQyBCAAMgRBBDUEMwQ+BCAAPQQwBEAEPgQ0BDAEKAA+BDEESQQ1 BDMEPgQvADMEOwQ+BDEEMAQ7BEwEPQQ+BDMEPgQgAB0EPgQyBD4EOQQgABMEOAQ/BDUEQAQxBD4E QAQ1BDgELAAgADoEMAQ6BCAAQQQ1BDwETAQ4BCAAPQQwBEAEPgQ0BD4EMgQsACAAOAQgAEcEMARB BEIEPQRLBEUEIAA4BD0EQgQ1BEAENQRBBD4EMgQgAD4EQgQ0BDUEOwRMBD0ESwRFBCAAQQRCBEAE MAQ9BCkALAAgAEQEOAQ6BEEEMARGBDgENQQ5BCAAMgQgADIEOAQ0BDUEIAA0BD4EMwQ+BDIEPgRA BD4EMgQgADgEIAA3BDAEOgQ+BD0EPgQyBCAAOAQgADgERQQgAEAENQQwBDsEOAQ3BDAERgQ4BDUE OQQtACAAMgRLBD8EPgQ7BD0ENQQ9BDgENQQ8BCAAPgQxBE8ENwQwBD0EPQQ+BEEEQgQ1BDkEIAA8 BDUENgQ0BEMEPQQwBEAEPgQ0BD0ESwQ8BCAAQwQ/BEAEMAQyBDsENQQ9BDgENQQ8BCAAPwQ+BCAA MwQ7BD4EMQQwBDsETAQ9BEsEPAQgADcEMAQ6BD4EPQQwBDwELgAgABMEOwQ+BDEEMAQ7BEwEPQQ+ BCAAOwROBDQETwQ8BCAANAQ+BDsENgQ9BDAEIAAxBEsEQgRMBCAANAQwBD0EMAQgAEAENQQwBDsE TAQ9BDAETwQgAEEEMgQ+BDEEPgQ0BDAEIAA+BEIEPgQgADsENgQ4BCAAOAQgAD4EMQQ8BDAEPQQw BCAAMQQ+BDsENQQ1BCAAQQQ4BDsETAQ9BEsERQQsACAAQQQyBD4EMQQ+BDQEMAQgAD4EQgQgADIE SwQ8BDgEQAQwBD0EOARPBCwAIABDBD0EOARHBEIEPgQ2BDUEPQQ4BE8EIAAxBDAENwQ+BDIESwRF BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ4BEUEIABGBDUEPQQ9BD4EQQRCBDUEOQQsACAAQQQ/BDAE OAQyBDAEPQQ4BE8EIAA4BCAAPgRCBDoEQAQ+BDIENQQ9BD0EPgQzBD4EIAAzBDUEPQQ+BEYEOAQ0 BDAEIAA9BDAEQAQ+BDQEPgQyBC4AIAAiBDAEOgQ4BDUEIAA8BDUENgQ0BEMEPQQwBEAEPgQ0BD0E SwQ1BCAAQQQ+BDMEOwQwBEEEPgQyBDAEPQQ4BE8EIAA4BCAANAQ+BDMEPgQyBD4EQAQwBCAAPwQ+ BDcEMgQ+BDsETwROBEIEIABBBDgEPQRCBDUENwQ4BEAEPgQyBDAEQgRMBCAAMgRLBEEEPgQ6BD4E PQRABDAEMgRBBEIEMgQ1BD0EPQQ+BDUEIAA+BDEESQQ1BEEEQgQyBD4ELgAgACEEPgRGBDgEMAQ7 BEwEPQRLBDkEIAA/BDsEPgRCBCwAIAAyBCAAPwRABD4EQgQ4BDIEPgQyBDUEQQQgAD8EOARABDAE PAQ4BDQENQQgADQEPgQ7BDYENQQ9BCAAMQRDBDQENQRCBCAAPgQxBDUEQQQ/BDUERwQ4BEIETAQg ADIEQQRRBCAARwQ1BDsEPgQyBDUERwQ1BEEEQgQyBD4EIAAxBDUENwQ+BD8EMARBBD0EPgRBBEIE TAROBCAAMgQgAD8ENQRABDgEPgQ0BCAAMwQ7BD4EMQQwBDsETAQ9BEsERQQgADoEMARCBDAEQQRC BEAEPgREBCAAOAQgAEMEMgQ1BDsEOARHBDgEQgRMBCAASAQwBD0EQQQgAEEEPwQwBEEENQQ9BDgE TwQgAD4EQQQ9BD4EMgQ9BD4EOQQgAEYENQQ9BD0EPgRBBEIEOAQgAEcENQQ7BD4EMgQ1BEcENQRB BDoEPgQzBD4EIAA+BDEESQQ1BEEEQgQyBDAELQAgADYEOAQ3BD0EOAQgAD0EMARABD4ENAQ+BDIE IAA4BCAANARABEMEMwQ4BEUELAAgADwEMARCBDUEQAQ4BDAEOwRMBD0ESwRFBCAAOAQgAD0ENQQ8 BDAEQgQ1BEAEOAQwBDsETAQ9BEsERQQgAEYENQQ9BD0EPgRBBEIENQQ5BCwAIAAyBCAAQgQ+BDwE IABHBDgEQQQ7BDUEIAA6BD4EPQQ6BEAENQRCBD0ESwRFBCAARgQ1BD0EPQRLBEUEIAA4BD0ENAQ4 BDIEOAQ0BEMEQwQ8BD4EMgQgADgEIAAzBEAEQwQ/BD8EIAA7BE4ENAQ1BDkELgANACAAFAQ7BE8E IABBBD4ENwQ0BDAEPQQ4BE8EIAA/BDsEPgRCBDAELAAgAD8EOARABDAEPAQ4BDQESwQgADgEIAAy BD4EPgQxBEkENQQgADIEQQQ1BDMEPgQgAEcENQQzBD4EIABDBDMEPgQ0BD0EPgQsACAAPQRDBDYE NQQ9BCAAMAQ9BDAEOwQ4BDcEIAA3BDAEPwRABD4EQQQwBCAAQQQ+BCAAQQRCBD4EQAQ+BD0ESwQg AD0EMARABD4ENAQ+BDIEIAA9BDAEIAA1BDMEPgQgADoEPgQ9BEQEOAQzBEMEQAQwBEYEOAROBCwA IAA/BD4EOwRDBEcENQQ9BDgENQQgAD4EMQRJBDUEMwQ+BCAAOAQ9BEIENQRABDUEQQQwBCAAOAQg ADUEMwQ+BCAAQAQ1BDAEOwQ4BDcEMARGBDgETwQgADIEIAAyBDgENAQ1BCAAPwRABD4ENQQ6BEIE OARABD4EMgQwBD0EOARPBCwAIABBBEIEQAQ+BDgEQgQ1BDsETARBBEIEMgQwBCAAOAQgAEMEPwRA BDAEMgQ7BDUEPQQ4BE8EIAAtACAAQQQ4BD0EQgQ1BDcEIAA9BDAEIAA+BEEEPQQ+BDIENQQgAD4E MQRJBDUEQQRCBDIENQQ9BD0EPgQzBD4EIAA3BDAEPwRABD4EQQQwBCAAQAQ1BDAEOwRMBD0EPgQ5 BCAAQQRCBEAEQwQ6BEIEQwRABEsEIAA6BDAEOgQgADQEPgQ8BDAEIABBBDIEPgQxBD4ENAQ9BEsE RQQgAD0EMARABD4ENAQ+BDIELgAgAB8EQAQwBDIEOAQ7BEwEPQRLBDkEIAAwBDsEMwQ+BEAEOARC BDwEIABBBD4ENAQ1BEAENgQ4BEIEIAAyBCAAQQQ1BDEENQQgAD4EMQRKBDUENAQ4BD0ENQQ9BDgE NQQgAEEAIAA4BCAAUgBBAC4AIABSAEEALQAgAD0ENQQ+BDEERQQ+BDQEOAQ8BEsEOQQgAE0EOwQ1 BDwENQQ9BEIEIABDBD8EQAQwBDIEOwQ1BD0EOARPBCAAOAQgAEEEOwQ1BDQEQQRCBDIEOAQ1BCAA NAQ4BDAEOwQ1BDoEQgQ4BDoEOAQgAEEALgAgACAEMAQ3BDQENQQ7BDUEPQQ4BDUEIABHBDUEOwQ+ BDIENQRHBDUEQQRCBDIEMAQgAD0EMAQgAEMEQQRCBD4ETwQyBEgEOAQ1BEEETwQgAEEEQgRABDAE PQRLBCwAIAA9BDAEQAQ+BDQESwQsACAAPgRCBDQENQQ7BEwEPQRLBDUEIABABD4ENARLBCAAOAQg ADgEPQQ0BDgEMgQ4BDQEQwRDBDwESwQgAD8EPgQ3BDIEPgQ7BE8ENQRCBCAAQQQ+BDEEQAQwBEIE TAQgAEIEPgRHBD0EQwROBCAAOAQ9BEQEPgRABDwEMARGBDgETgQgAD4EMQQgADgERQQgADgEPQRC BDUEQAQ1BEEEMARFBCAAOAQgAEEEPgQzBDsEMARBBD4EMgQwBEIETAQgAE0EQgQ4BCAAOAQ9BEIE NQRABDUEQQRLBCwAIAA+BDEEQAQwBDcEPgQyBDAEMgQgAD4ENAQ9BEMEIABBBDgEQQRCBDUEPARD BCAAPgQxBEkEOARFBCAAOAQ9BEIENQRABDUEQQQ+BDIELAAgADIEIAA6BD4EQgQ+BEAESwQ1BCAA MgQ/BDgEQQRLBDIEMAROBEIEQQRPBCAARwQwBEEEQgQ9BEsENQQgADgEPQRCBDUEQAQ1BEEESwQu ACAAEgQgADQEMAQ7BEwEPQQ1BDkESAQ1BDwELAAgADoEMAQ6BCAAPQQ1BD4EMQRFBD4ENAQ4BDwE PgQ1BCAAQAQwBDcEMgQ4BEIEOAQ1BCAAPAQ4BEAEMAQtACAAQAQ1BDAEOwQ4BDcEMARGBDgETwQg AE0EQgQ+BDMEPgQgAD4EMQRJBDUEMwQ+BCAAOAQ9BEIENQRABDUEQQQwBC4ADQAgACIEMAQ6BD4E NQQgAEMEPwRABDAEMgQ7BDUEPQQ4BDUEIAA9BDAEQAQ+BDQEMAQ8BDgEIABBBCAAQQQ+BDcENAQw BD0EOAQ1BDwEIAAzBDsEPgQxBDAEOwRMBD0ESwRFBCAAPgRABDMEMAQ9BD4EMgQgADUEQQRCBEwE IAA9BDAENAQzBD4EQQRDBDQEMARABEEEQgQyBDUEPQQ9BDAETwQgAEAENQQwBDsEOAQ3BDAERgQ4 BE8EIAA6BD4EPQRGBDUEPwRGBDgEOAQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDkEIABBBDUEPARMBDgE IAA9BDAEQAQ+BDQEPgQyBCwAIAA/BD4ENAQ+BDEEPQQ+BDkEIAAxBEAEMARCBEEEOgQ+BDwEQwQg AEEEPgROBDcEQwQgAEEEPgQyBDUEQgRBBDoEOARFBCAAQQRCBEAEMAQ9BC4AIAASBCAAQQQ1BDwE TAQ1BCAAMgRBBDUEIAA9BDAEIAA+BDQEPQQ+BDwEIAA/BDsEPgRCBEMELAAgAD4EMQQ+BEEEPgQx BDsENQQ9BD0EPgQ8BCAAPAQ1BEEEQgQ1BCwAIAA6BD4EQgQ+BEAEPgQ1BCAAPQQ1BEEENQRCBEEE TwQgAEAEPgQ0BD4EPAQgADgEIAAyBEEENQQ8BDgEIAA3BDAEOgQ+BD0EMAQ8BDgEIABBBDIEPgQ1 BDkEIAA/BEAEOARABD4ENARLBCAAOgQgAEEEMgQ+BDUEPARDBCAAPwRABD4ERgQyBDUEQgQwBD0E OAROBC4AIAASBEEENQQgAEIEQARDBDQETwRCBEEETwQgAD0EMAQgADEEOwQwBDMEPgQgADsEOARH BD0EPgQzBD4EIABBBD4EMgQ1BEAESAQ1BD0EQQRCBDIEPgQyBDAEPQQ4BE8ELAAgAEEENQQ8BDUE OQQ9BD4EMwQ+BCAAOAQgAEAEPgQ0BD4EMgQ+BDMEPgQgAEAEPgRBBEIEMAQgADgEIABABDAENwQy BDgEQgQ4BE8ELAAgADEENQQ3BD4EPwQwBEEEPQQ+BEEEQgQ4BC4AIAAeBEEEQgQwBEIEOgQ4BCAA PwRABDUENgQ9BDUEOQQgAD0ENQRNBEQERAQ1BDoEQgQ4BDIEPQQ+BDkEIABBBDgEQQRCBDUEPARL BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQgADQEPgQ7BDYEPQRLBCAAMgQ+BCAAQQQ7BDAEMgRDBCAA HQQ+BDIEPgQ5BCAAEwQ4BD8ENQRABDEEPgRABDUEOQQgADIEPwQ4BEEESwQyBDAEQgRMBEEETwQg ADIEIABNBEIEQwQgAEEEQgRABEMEOgRCBEMEQARDBCAAQQQyBD4EOAQ8BDgEIAA+BDEESQQ1BEEE QgQyBDAEPAQ4BCwAIABABDUEQQRDBEAEQQQwBDwEOAQgADgEIAAyBDsEMARBBEIETAROBC4AIAAS BEsEQQRIBDgEOQQgAD4EQAQzBDAEPQQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8EIAAdBD4EMgQ+BDkE IAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCwAIAAyBDcEMAQ4BDwEPgQ0BDUEOQRBBEIEMgRDBE8EIABB BD4EIAAyBEEENQQ8BDgEIAA4BCAAPwRLBEIEMARPBEEETAQgADwEMAQ6BEEEOAQ8BDAEOwRMBD0E PgQgAEEEMQQ7BDgENwQ4BEIETAQgAD0EMARABD4ENARLBCAAPAQ4BEAEPgQyBD4ENwQ3BEAENQQ9 BEcENQRBBDoEOAQgADgEIAA8BDUEPQRCBDAEOwRMBD0EPgQsACAAOgQwBDoEIABBBDsENQQ0BEEE QgQyBDgENQQsACAARAQ+BEAEPAQ4BEAEQwQ1BEIEIAA1BDQEOAQ9BEsEOQQgADwEOARABC0ARgQ4 BDIEOAQ7BDgENwQwBEYEOAROBC4ADQAgAB8EPgQ/BEsEQgQ6BDAEIAA/BD4ENAQ+BDEEPQQ+BDME PgQgAEEEQgRABD4EOARCBDUEOwRMBEEEQgQyBDAEIABABDAEPQRMBEgENQQgAD8EQAQ4BCAAIQQh BCEEIAQgAD0EMARCBD4EOwQ6BD0EQwQ7BDAEQQRMBCAAPQQwBCAAMgRBBDUEPgQxBEoENQQ8BDsE TgRJBEMETgQgAEEEOwQwBDEEPgRBBEIETAQgAEAEQwQ6BD4EMgQ+BDQEQQRCBDIEMAQgADIEIAA+ BDEEOwQwBEEEQgQ4BCAAPAQ4BEAEPgQ/BD4EPQQ4BDwEMAQ9BDgETwQsACAAOARBBEIEPgRABDgE RwQ1BEEEOgQ+BDkELAAgAD8EPgQ7BDgEQgQ4BEcENQRBBDoEPgQ5BCwAIAA0BDgEPwQ7BD4EPAQw BEIEOARHBDUEQQQ6BD4EOQQgADgEIABNBDoEPgQ9BD4EPAQ4BEcENQRBBDoEPgQ5BCAAMwRABDAE PAQ+BEIESwQsACAAOgQwBEcENQRBBEIEMgQgADsEOAQ0BDUEQAQ+BDIEIAA4BCAAQAQwBDEEPgRC BEsEIAAzBDsEPgQxBDAEOwQ4BEEEQgQ+BDIELAAgADEEPgRPBEkEOARFBEEETwQgAEMEPwRDBEEE QgQ4BEIETAQgADMEOwQwBDIEPQRDBE4EIABGBDUEOwRMBCAAQQQyBD4ENQQzBD4EIABDBD8EQAQw BDIEOwQ1BD0EOARPBC0AIABDBD0EOARHBEIEPgQ2BDUEPQQ4BDUEIAAgBEMEQQQ4BCwAIAA6BDAE OgQgAEEEMAQ8BD4EMwQ+BCAAPgQ/BDAEQQQ9BD4EMwQ+BCAAMgRABDAEMwQwBCAAOARFBCAAMwQ1 BDMENQQ8BD4EPQQ4BDgELgAgABMEOAQ/BDUEQAQxBD4EQAQ1BE8EIAAyAC4AMAAtACAATQRCBD4E IAA9BD4EMgQwBE8EIABABDUEMAQ7BEwEPQQ+BEEEQgRMBCAAPwQ7BDAEPQQ1BEIESwQgABcENQQ8 BDsETwQsACAAPwQ7BD4EQgQgAEEEMgQ+BDEEPgQ0BEsEIAA9BDAEIAAQBCAEEAQgBBAEIgQ1BCwA IAA9BD4EMgRLBDkEIAA8BDgEQAQsACAAMgRLBEMERwQ4BDIESAQ4BDkEIABDBEAEPgQ6BDgEIABB BDIEPgQ1BDMEPgQgAD8EQAQ+BEgEOwQ+BDMEPgQgADgEIAA4BEEEPwRABDAEMgQ4BDIESAQ4BDkE IAA1BDMEPgQgAD4ESAQ4BDEEOgQ4BC4ADQANACAAIAAgACAAIAAgACAAVgAxBCkAIAAaBEAEMARF BCAAPwQ4BEAEMAQ8BDgENARLBCAAMARCBDsEMAQ9BEIEPgQyBA0AIAAdBDAESAQ4BCAANgQ4BDcE PQQ4BCAAPwRABDgEPQQwBDQEOwQ1BDYEMARCBCAAPwRABDUEQQRCBEMEPwQ9BEsEPAQgADMEQARD BD8EPwQwBDwELAAgAEcEQgQ+BCAAPwRABD4EPQQ4BDoEOwQ4BCAAPQQwBCAARwQ1BEAENQRBBEcE QwRABCAAMwQ+BEEEQgQ1BD8EQAQ4BDgEPAQ9BEMETgQgACAEQwRBBEwEIABCBEsEQQRPBEcEOAQg ADsENQRCBCAAPQQwBDcEMAQ0BCwAIAA4BCAAMgQgADEEPgQ5BCAAPgQ9BDgEIAA4BDQEQwRCBCAA PQQ1BCAAPwRABD4EQQRCBD4EIABCBDAEOgQsACAAPgRCBDIENQRHBDAETgRCBCAAPwQ1BEAENQQ0 BCAAMQQ+BDsENQQ1BCAAQQQ4BDsETAQ9BEsEPAQ4BCAAOAQgAD4EPwQwBEEEPQRLBDwEOAQgADsE OARHBD0EPgRBBEIETwQ8BDgEIAA4BCAAMgRLBD8EPgQ7BD0ETwRCBCAANwQwBDQEMARHBEMEIAA/ BD4ENAQgAEMEMwRABD4ENwQ+BDkEIABBBDwENQRABEIEOAQgADsETgQxBD4EOQQgAEYENQQ9BD4E OQQuACAAEAQgADgERQQgAEEEQgRABDAERQQgAD8ENQRABDUENAQgADIEPgQ4BD0EMAQ8BDgEIAAg BEMEQQQ4BCAAQQQ8BDUEPQQ4BDsEQQRPBCAAPwRABDUENwRABDUEPQQ4BDUEPAQgADgEIABABDAE NAQ+BEEEQgRMBE4EIAA8BDAEPQRMBE8EOgQwBCwAIAA9BDAEQQRCBDgEMwRIBDUEMwQ+BCAANgQ1 BEAEQgQyBEMELgAgABcEMAQ8BDUESQQ1BD0EOAQ1BCAAPgRBBEIEMARCBDoEPgQyBCAAQARDBEEE QQQ6BD4EMwQ+BCAAPQQwBEAEPgQ0BDAEKABDBDYENQQgAEEENQQ5BEcEMARBBCAAQQQ+BEEEQgQw BDIEOwRPBE4ESQQ1BDMEPgQgADwENQQ9BEwESAQ4BD0EQQRCBDIEPgQpACAAPQQ1BD8ETAROBEkE OAQ8BCAAPQQwBEEENQQ7BDUEPQQ4BDUEPAQgAE4EMwQwBCAAIAQ+BEEEQQQ4BDgEIAA4BCAANQRR BCAAPQQ4BEkEOARFBCAATgQ2BD0ESwRFBCAAQQQ+BEEENQQ0BDUEOQQgADQEPgQ7BDYEPQQ+BCAA NwQwBDoEPgQ9BEcEOARCBEwEQQRPBCAAOgQgADIAMAA0ADUAIAAzBD4ENARDBCAAQQQwBDoEQAQw BDsETAQ9BD4EOQQgAEEEOAQ9BDMEQwQ7BE8EQAQ9BD4EQQRCBDgEIABABD4ENgQ0BDUEPQQ4BDUE PAQgAD0EPgQyBD4EMwQ+BCAAMgQ4BDQEMAQgAEcENQQ7BD4EMgQ1BDoEMAQuACAALQRCBD4EIAAx BDUEQQRBBDwENQRABEIEPQRLBDkEIABHBDUEOwQ+BDIENQQ6BC0AQAQwBDEELAAgAD4EMQRABDAE NwQgADEEOAQ+BDsEPgQzBDgERwQ1BEEEOgQ4BEUEIABABD4EMQQ+BEIEPgQyBCAAMQRDBDQEQwRJ BDUEMwQ+BC4AIAAiBEAEOARDBDwERAQgAEcENQQ7BD4EMgQ1BDoEMAQgAD0EMAQ0BCAAQQQyBD4E NQQ5BCAAPwRABDgEQAQ+BDQEPgQ5BC4ALgAuACAAGAQgAD0EMARIBDAEIABBBDwENQRABEIETAQg AE0EQgQ+BCAAOgQ+BD0ENQRGBCAAQQQ+BDIEQAQ1BDwENQQ9BD0ESwRFBCAAQQRCBEAEMAQ9BCAA OAQgADgEPAQ/BDUEQAQ4BDkEIAA9BDAESAQ1BDMEPgQgAEEEOwQwBDIEPQQ+BDMEPgQgAEAEPgQ0 BDAELAAgAD0EMARHBDAEOwQ+BCAAMwQ7BD4EMQQwBDsETAQ9BD4EMwQ+BCAARgQwBEAEQQRCBDIE MAQgADsENgQ4BC4AIAAaBD4EPQQ1BEYEIABNBEIEPgQgADgEIAA0BDsETwQgABAEQgQ7BDAEPQRC BDgENARLBC4AIAAQBDQEQQQ6BDgENQQgAD4EQgRABD4ENARMBE8ELAAgADgERQQgADYEOAQyBD4E QgQ9BEsENQQsACAANwQ+BDwEMQQ4BCwAIABABD4EMQQ+BEIESwQgADgEIAA/BD4EMwQ+BD0ESQQ4 BDoEOAQgAEAEMAQxBD4EMgQgAEIEPgQ9BEMEQgQgADIEPAQ1BEEEQgQ1BCAAQQQ+BCAAQQQyBD4E NQQ5BCAAPwQ4BEAEMAQ8BDgENAQ+BDkEIAA/BD4EIAA3BDAEOgQ+BD0EQwQgADIEQAQ1BDwENQQ9 BDgEIAAyBCAAPQQ+BDIEPgQ8BCAAPwQ+BEIEPgQ/BDUELgAgABYENQRABEIEMgQwBCAAPAQ4BDsE OwQ4BDAEQAQ0BD4EMgQgADYEOAQ3BD0ENQQ5BCAAPgRCBDoEQAQ+BDUEQgQgAD0EPgQyBEMETgQg ADoEQAQ+BDIEMAQyBEMETgQgAEEEQgRABDAEPQQ4BEYEQwQgAEAENQQwBDsETAQ9BD4EQQRCBDgE LgAgACIENQQsACAAOgRCBD4EIAAyBEsENgQ4BDIENQRCBCwAIAA/BEAEPgQ0BD4EOwQ2BDAEQgQg ACAEPgQ0BCAAOAQgADEEPgRABEwEMQRDBCAANwQwBCAAPQQ1BDMEPgQuAA0AIAAaBEAEMARFBCAA PgRHBDUEQAQ1BDQEPQQ+BDkEIAA/BDgEQAQwBDwEOAQ0BEsEIAAyBDUENARRBEIELAAgADoEMAQ6 BCAAOAQgADIEIABBBDsEQwRHBDAENQQgACAEOAQ8BEEEOgQ+BDkEIAA4BDwEPwQ1BEAEOAQ4BCwA IAA6BCAAQAQwBEEEPwQwBDQEQwQgAEMEQQRCBDAEQAQ1BDIESAQ1BDMEPgQgAEAEMAQxBEEEOgQ+ BDMEPgQgAEMEOgQ7BDAENAQwBCAAOAQgAD8ENQRABDUERAQ+BEAEPAQwBEIEOARABD4EMgQwBD0E OAROBCAAPgQxBEkENQRBBEIEMgQwBC4AIAAcBEsEIAA/BEAEPgRFBD4ENAQ4BDwEIABHBDUEQAQ1 BDcEIAA+BEcENQRABDUENAQ9BD4ENQQgAEMENwQ6BD4ENQQgADMEPgRABDsESwRIBDoEPgQgADgE IAAzBDsEPgQxBDAEOwRMBD0EQwROBCAAOgQwBEIEMARBBEIEQAQ+BEQEQwQgAEEEMgQ+BDUEOQQg AD8EQAQ4BEAEPgQ0BEsELAAgAEEEQgQwBD0EPgQyBDgEPARBBE8EIABHBDUEOwQ+BDIENQQ6BD4E PAQgAEIEQAQ4BDYENARLBCAAQAQwBDcEQwQ8BD0ESwQ8BCAAOAQsACAAMgQgADgEQgQ+BDMENQQg AD8EQAQ1BDIEQAQwBEkEMAQ1BDwEQQRPBCAAMgQgAD0EPgQyBEsEOQQgADIEOAQ0BCAAOwROBDQE NQQ5BC4AIAAeBDEESQQ1BEEEQgQyBD4EIABCBEAEMAQ9BEEERAQ+BEAEPAQ4BEAEQwQ1BEIEQQRP BCAAMgQgADwEMARBBEEEQwQgADsETgQ0BDUEOQQsACAAPwQ+BEIENQRABE8EMgRIBDgERQQgAEEE MgQ+BDgEIABDBDEENQQ2BDQENQQ9BDgETwQsACAAQQQyBD4EOARFBCAAOwQ4BDQENQRABD4EMgQg ADgEIAA6BEMEPAQ4BEAEPgQyBCwAIAAyBDgENARPBEkEOARFBCAAPAQ4BEAEIABCBDAEOgQ4BDwE LAAgADoEMAQ6BD4EOQQgAD4EPQQgADUEQQRCBEwELAAgADEESwQ7BCAAOAQgADEEQwQ0BDUEQgQu ACAAHgRCBDIESwQ6BD0EQwRCBEwEIAA+BEIEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQyBCgAOwQ2BDgE LAAgADAEOwQ6BD4EMwQ+BDsETwQsACAAQQQ1BDoEQQQwBCAAMQQ1BDcEIAA7BE4EMQQyBDgEIAA4 BDsEOAQgADEEOwRPBDQEQQRCBDIEMAQpACwAIAA9BDAEIAA6BD4EQgQ+BEAESwRFBCAANQQzBD4E IAA0BDUEQAQ2BDAEOwQ4BCAAQQQ+BEIEPQQ4BCAAOwQ1BEIEIAAyBD4EMgRBBDUEIAA9BDUEIAA/ BEAEPgRBBEIEPgQuACAAHQQ+BCwAIAA4BDwENQRPBCAAPgRABDgENQQ9BEIEOARABCAAMgQgADIE OAQ0BDUEIAA4BD0EQgQ1BEAENQRBBD4EMgQgACAEPgQ0BDAEIAA4BCAANQQzBD4EIAA9BD4EQQQ4 BEIENQQ7BDUEOQQgADIEPgQgADIEOwQwBEEEQgQ4BCwAIAA7BE4ENARPBDwEIAAxBEMENAQ1BEIE IAA/BEAEPgRBBEIEPgQgAD8EPgQ9BE8EQgRMBCwAIABHBDUEPAQgADwEPgQ2BD0EPgQgADgEIAA9 BEMENgQ9BD4EIABABEMEOgQ+BDIEPgQ0BEEEQgQyBD4EMgQwBEIETARBBE8EIAAyBCAAPQQ+BDIE PgQ8BCAAPAQ4BEAENQQgADgEIAA4BDQEQgQ4BCAAOgQgAEEEMgQ+BDUEPARDBCAAPwRABD4ERgQy BDUEQgQwBD0EOAROBCAAMgQgAD0EUQQ8BC4AIAAQBCAAQARDBDoEPgQyBD4ENARBBEIEMgQ+BDIE MARCBEwEQQRPBCAAPQRDBDYEPQQ+BCAAOwROBDEEPgQyBEwETgQgADoEIAA0BEAEQwQzBDgEPAQg ADsETgQ0BE8EPAQgADgEIAA4BEUEIABBBDUEPARMBE8EPAQsACAAQgQwBDoEIAA6BDAEOgQgAD4E PQQwBCAANAQ1BDsEMAQ1BEIEIABHBDUEOwQ+BDIENQQ6BDAEIABBBDgEOwRMBD0ENQQ1BCAAOwRO BDEESwRFBCAAPQQ1BDIENwQzBD4ENAQgADgEIAA0BDAEQAQ4BEIEIAAyBCAAQgQ+BDwEIABHBDgE QQQ7BDUEIAA0BD4EMgQ1BEAEOAQ1BCwAIAA6BD4EQgQ+BEAEPgQ1BCAAQgQwBDoEIAA9BDUEPgQx BEUEPgQ0BDgEPAQ+BCAANAQ7BE8EIAA6BEMEOwRMBEIEQwRABD0EPgQ5BCAAPgRABDMEMAQ9BDgE NwQwBEYEOAQ4BCAAPwQ+BCAAQgQ4BD8EQwQgABMEOAQ/BDUEQAQxBD4EQAQ1BDgELgANACAAEgQ1 BEAERQRDBEgEOgQwBCAAMwQ7BD4EMQQwBDsETAQ9BD4EOQQgAD8EOARABDAEPAQ4BDQESwQgAD0E NQQgAD8EQAQ+BEUEPgQ0BDgEQgQgADMEPgRABDsESwRIBDoEPgQsACAAOAQgADoEMARCBDAEQQRC BEAEPgREBDAEIAA9BD4EMgQ+BDMEPgQgAEIEOAQ/BDAEIAAyBDUENARRBEIEIAA6BCAANQRRBCAA OwQ+BDMEOARHBDUEQQQ6BD4EPARDBCAAOgQ+BD0ERgRDBC4AIAAbBE4ENAQ4BCAAPgRCBDIENQRH BDAETgRCBCAARQQwBD4EQQQ+BDwEIAA4BCAAOgQwBEIEMARBBEIEQAQ+BEQEPgQ5BCAANwQwBCAA PgRIBDgEMQQ6BDgEIABBBDIEPgQ1BDMEPgQgAD8EQAQ+BEgEOwQ+BDMEPgQuAA0AIAAUBD4EIABC BD4EMwQ+BCwAIAA6BDAEOgQgACAEPgRBBEEEOARPBCAAMgRBBEIEQwQ/BDgEQgQgADIEIAAzBDsE PgQxBDAEOwRMBD0EQwROBCAATwQ0BDUEQAQ9BEMETgQgADIEPgQ5BD0EQwQgAEEEIAAQBDwENQRA BDgEOgQ+BDkELAAgABoEOARCBDAENQQ8BCAAOAQgADwEQwRBBEMEOwRMBDwEMAQ9BDAEPAQ4BCAA OAQgAD8ENQRABDUEQQRCBDAEPQQ1BEIEIABBBEMESQQ1BEEEQgQyBD4EMgQwBEIETAQgADoEMAQ6 BCAARgQ4BDIEOAQ7BDgENwQwBEYEOARPBCAAOAQgABQEHgQgAEIEPgQzBD4EIAA6BDAEOgQgADIE SwQ8BEAENQRCBCAAQARDBEEEQQQ6BDgEOQQgAD0EMARABD4ENAQsACAAMgQwBDYEPQQ+BCAAPwQ+ BD8ESwRCBDAEQgRMBEEETwQgAEEENQQxBE8EIABBBD8EMARBBEIEOAQsACAAPQQwBEAEMARBBEIE OARCBEwEIAAzBDsEPgQxBDAEOwRMBD0ESwQ5BCAAPAQ1BD0EQgQwBDsEOARCBDUEQgQgAEEEMQQ7 BDgENgQ1BD0EOARPBCAAQQQgADgEQQRCBDgEPQQ+BDkEIAA4BDsEOAQsACAANARABEMEMwQ4BDwE OAQgAEEEOwQ+BDIEMAQ8BDgELAAgAEAEPgRBBEIEMAQgAD0EQAQwBDIEQQRCBDIENQQ9BD0EPgRB BEIEOAQgADgEIAA0BEMERQQ+BDIEPQQ+BDMEPgQgAEEEPgQyBDUEQARIBDUEPQRBBEIEMgQ+BDIE MAQ9BDgETwQsACAAOAQgAEMEQQRCBDAEPQQ+BDIEOARCBEwEIAAyBCAAOARCBD4EMwQ1BCAAMwQ7 BD4EMQQwBDsETAQ9BEsEOQQgAEEEMgQ+BDEEPgQ0BD0ESwQ5BCAAQQQ+BDEEPgRABD0ESwQ5BCAA OAQ9BEIENQQ7BDsENQQ6BEIEIAA0BDsETwQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8EIAA+BDEESQQ1 BEEEQgQyBD4EPAQgAD0EPgQyBD4EMwQ+BCAAQgQ4BD8EMAQuACAAHQQwBEgEMAQgAD8EPgQ7BDgE QgQ4BDoEMAQgADIEIAA+BEIEPQQ+BEgENQQ9BDgEOAQgADQEQARDBDMEOARFBCAAQQRCBEAEMAQ9 BCAAOAQgAEEEQgRABEMEOgRCBEMEQAQsACAAPgQxBDsEMAQ0BDAETgRJBDgERQQgAEAENQRBBEME QARBBDAEPAQ4BCAAOAQgADIEOwQwBEEEQgRMBE4ELAAgAEEEIABBBDAEPAQ+BDMEPgQgAD0EMARH BDAEOwQwBCAANAQ+BDsENgQ9BDAEIAA3BDAEOgQ7BE4ERwQwBEIETARBBE8EIAAyBCAAPwQ+BDsE PQQ+BDkEIAA4BD0EQgQ1BDMEQAQwBEYEOAQ4BCAAMgQgADEEOwQ+BDoEIAA/BEMEQgQ1BDwEIABB BD4EMwQ7BDAEQQQ+BDIEMAQ9BDgETwQgADgEPQRCBDUEQAQ1BEEEPgQyBCwAIAA7BDUEMwQwBDsE OAQ3BDAERgQ4BDgEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQyBCwAIAA6BDAEOgQgADAEQQQ/BDUEOgRC BD4EMgQgADIEQAQ1BDQEOARCBDUEOwRMBEEEQgQyBDAEIAA4BCAANwQwBDIEOARBBDgEPAQ+BEEE QgQ4BCwAIAA/BD4EMgRLBEgENQQ9BDgEOAQgAD8EQAQ+BDcEQAQwBEcEPQQ+BEEEQgQ4BCAAPgRC BD0EPgRIBDUEPQQ4BDkELgAgABgEPAQ1BD0EPQQ+BCAAQgQwBDoEMARPBCAANgQ1BCAAPwQ+BDsE OARCBDgEOgQwBCAANAQ+BDsENgQ9BDAEIAAxBEsEQgRMBCAAOAQgADIEIAA+BEIEPQQ+BEgENQQ9 BDgEOAQgAEIENQRFBCwAIAA6BEIEPgQgADEEQwQ0BEMERwQ4BCAAPQQ+BEEEOARCBDUEOwQ1BDwE IAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAMgQ7BDAEQQRCBDgEIAA9BDUEIABBBD4EMgQ1BEAESAQ4 BDsEIABCBE8ENgQ6BDgERQQgAD8EQAQ1BEEEQgRDBD8EOwQ1BD0EOAQ5BCAAOAQ7BDgEIAA4BDwE NQQ1BEIEIAAyBDUEQQQgADIEIAAzBDsEPgQxBDAEOwRMBD0EPgQ8BCAAQwQ/BEAEMAQyBDsENQQ9 BDgEOAQgADgEIAA3BD0EMARHBDgEPAQ+BCAAPwQ+BDwEPgQ2BDUEQgQgAD8EQAQ+BDUEOgRCBEME KABBBD4EMgQ1BEAESAQ4BEIEIABBBCAAPQQwBDwEOAQgAEEENAQ1BDsEOgRDBCkALgAgABIESwRB BEgEOAQ5BCAAPgRABDMEMAQ9BCAAQAQ1BDAEOwQ4BDcEMARGBDgEOAQgAD4EMQRJBDUEQQRCBDIE NQQ9BD0ESwRFBCAAOAQ9BEIENQRABDUEQQQ+BDIEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCAANAQ+ BDsENgQ1BD0EIAAyBDoEOwROBEcEMARCBEwEIABBBDsENQQ0BEMETgRJBDgENQQgADgEPQRBBEIE OARCBEMEQgRLBCAAMgQ3BDAEOAQ8BD4ENAQ1BDkEQQRCBDIEOARPBCAAQQQgAFIAQQA6AA0ALQAg ACEEIAA7BDgERgQwBDwEOAQsACAAOAQ8BDUETgRJBDgEPAQ4BCAAMgQ7BDgETwQ9BDgENQQgAD0E MAQgADoEOwROBEcENQQyBEsENQQgADIEPgQ/BEAEPgRBBEsEIABDBD8EQAQwBDIEOwQ1BD0EOARP BCAAUgBBACgAOwQ4BDQENQRABEsEIABCBDAEOQQ9BEsERQQgAD4EMQRJBDUEQQRCBDIELAAgADIE SwRBBEgENQQ1BCAAPAQwBEEEPgQ9BEEEQgQyBD4ELAAgADMEOwQwBDIESwQgAEAENQQ7BDgEMwQ4 BD4ENwQ9BEsERQQsACAAPwQ+BDsEOARCBDgERwQ1BEEEOgQ4BEUEIAA4BCAARAQ4BD0EMAQ9BEEE PgQyBEsERQQgADoEOwQwBD0EPgQyBCwAIAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA+BDEESQQ1 BEEEQgQyBCwAIAAyBCAAOgQ+BEIEPgRABEsERQQgAE0EQgQ4BCAAOwROBDQEOAQgADcEMAQ9BDgE PAQwBE4EQgQgAD8EPgQ0BEcEOAQ9BDUEPQQ9BD4ENQQvADwEOAQ9BD4EQAQ9BD4ENQQgADwENQRB BEIEPgQpACAANAQ+BDsENgQ1BD0EIAAxBEsEQgRMBCAANwQwBDoEOwROBEcENQQ9BCAANAQ+BDME PgQyBD4EQAQgAD4EIAA/BEAENQQ6BEAEMARJBDUEPQQ4BDgEIAA0BDUEQQRCBEAEQwQ6BEIEOAQy BD0EPgQ5BCAANAQ1BE8EQgQ1BDsETAQ9BD4EQQRCBDgEIAA/BEAEPgRCBDgEMgQgAEcENQQ7BD4E MgQ1BEcENQRBBDoEOARFBCAARgQ1BD0EPQQ+BEEEQgQ1BDkEIAA4BCAAPgRBBEMESQQ1BEEEQgQy BDsENQQ9BDgEOAQgADgERQQgAD8EQAQ+BDcEQAQwBEcEPQQ+BDkEIABABDUEMAQxBDgEOwQ4BEIE MARGBDgEOAQgADgEIAA4BD0EQgQ1BDMEQAQwBEYEOAQ4BCAAMgQgAD0EPgQyBEMETgQgAEYEOAQy BDgEOwQ4BDcEMARGBDgETgQuAA0AEgQgAD4EMQRJBDUEPAQtACAAMgQgAEEEOwRDBEcEMAQ1BCAA TQRCBDgERQQgADsEOARGBCAAPQQ1BD4EMQRFBD4ENAQ4BDwEPgQgAEMEQQRCBDAEPQQ+BDIEOARC BEwEIAA3BDAEOgQ+BD0EPgQ0BDAEQgQ1BDsETAQ9BEsEOQQgADcEMAQ/BEAENQRCBCAAPQQwBCAA MgQ1BDQENQQ9BDgENQQgAD0ENQQ/BEAEPgQ3BEAEMARHBD0EPgQ5BCAANAQ1BE8EQgQ1BDsETAQ9 BD4EQQRCBDgEIAA4BCAANAQ1BE8EQgQ1BDsETAQ9BD4EQQRCBDgELAAgAD0ENQQgADIEPwQ4BEEE SwQyBDAENQQ8BD4EOQQgADIEIABBBDgEQQRCBDUEPARDBCAAOAQ9BEIENQRABDUEQQQ+BDIEIAAT BDgEPwQ1BEAEMQQ+BEAENQQ4BCAAMgAuADAALgANAC0AIAASBCAAPgRCBD0EPgRIBDUEPQQ4BDgE IAA8BDAEQQQ+BD0EPgQyBCAANAQ+BDsENgQ9BDAEIAAxBEsEQgRMBCAAPwRABD4EMgQ1BDQENQQ9 BDAEIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE8ELgAgAB4EPQQ4BCAAMgQgADIEOAQ0BEMEIAA+BEEE PgQxBD4EMwQ+BCAAMgQ7BDgETwQ9BDgETwQgAD0EMAQgAD4EMQRJBDUEQQRCBDIEPgQgAD4EMQRP BDcEMAQ9BEsEIAA+BEIERwQ4BEIESwQyBDAEQgRMBEEETwQgAD8ENQRABDUENAQgAD0EMAQ8BDgE IAA+BCAAPwRABD4ENAQ1BDsEMAQ9BD0EPgQ5BCAAQAQwBDEEPgRCBDUEIAA4BCAAPwRABDgEPQRP BEIESwRFBCAAMgQgAD4EQgQ9BD4ESAQ1BD0EOAQ4BCAARwQ1BDsEPgQyBDUEOgQwBCAAQAQ1BEgE NQQ9BDgETwRFBC4AIAAeBEIERwQ1BEIEIAA0BD4EOwQ2BDUEPQQgADEESwRCBEwEIABBBD4EQQRC BDAEMgQ7BDUEPQQgAD4EIAA7BE4EMQQ+BDwEIABABDgEQgRDBDAEOwQ1BCwAIAA0BDUEOQRBBEIE MgQ4BDgEIAA4BCAAPwRABD4ERwQ4BEUEIABBBD4EMQRLBEIEOARPBEUELAAgAD8EQAQ+BDgENwQ+ BEgENQQ0BEgEOARFBCAAPgRBBD4EMQQ1BD0EPQQ+BCAAPQQwBCAAMgRLBEEESAQ1BDwEIABDBEAE PgQyBD0ENQQuACAAHgRCBEcENQRCBCAANAQ+BDsENgQ1BD0EIAAxBEsEQgRMBCAAQQQ+BEEEQgQw BDIEOwQ1BD0EIAA4BCAAPwQ+BDQEMAQ9BCAAPwQ+BCAAPAQ1BEEEQgRDBCAAQAQ1BDMEOARBBEIE QAQwBEYEOAQ4BCwAIAA9BD4EIAA4BD0ERAQ+BEAEPAQwBEYEOARPBCAANAQ+BDsENgQ9BDAEIAAx BEsEQgRMBCAANAQ+BEEEQgRDBD8EPQQwBCAAMgRBBDUEPARDBCAAPgQxBEkENQRBBEIEMgRDBC4A DQASBCAAPgQxBEkENQQ8BC0AIAA/BEAEPgQ3BEAEMARHBD0ESwQgADQEPgQ7BDYEPQRLBCAAQQRC BDAEQgRMBCAAMgRBBDUEIAA+BDEESQQ1BEEEQgQyBDAELAAgADIEIABCBD4EOQQgADgEOwQ4BCAA OAQ9BD4EOQQgAEEEQgQ1BD8ENQQ9BDgEIAAyBDsEOARPBE4ESQQ4BDUEIAA9BDAEIAA+BDEESQQ1 BEEEQgQyBDUEPQQ9BEMETgQgADYEOAQ3BD0ETAQsACAANAQ7BE8EIAAyBD8EOARBBEsEMgQwBD0E OARPBCAAOARFBCAAOAQ9BEIENQRABDUEQQQ+BDIEIAA4BCAAOAQ9BEIENQQzBEAEMARGBDgEOAQg ADIEIAA+BDEESQQ1BEEEQgQyBD4ELgAgABsEOAQ0BDUEQARLBCAANAQ+BDsENgQ9BEsEIAA/BEAE NQQ0BD4EQQRCBDAEMgQ7BE8EQgRMBCAATwRBBD0ESwQ5BCAAPgRCBEcENQRCBCAAPgQgADQENQRP BEIENQQ7BEwEPQQ+BEEEQgQ4BCAAPgQxBEkENQRBBEIEMgQwBCAAOAQgADgEPQQ0BDgEMgQ4BDQE QwQwBDsETAQ9BD4EIAA4BEUEIABBBDAEPAQ4BEUELgANAC0AIAASBCAAPgRCBD0EPgRIBDUEPQQ4 BDgEIAA1BDIEQAQ1BDkEQQQ6BDgERQQgADoEOwQwBD0EPgQyBCAAQQRDBD8ENQRABDEEPgQzBDAE QgRLBEUEIABBBDUEPAQ1BDkEIAA0BD4EOwQ2BDUEPQQgADEESwRCBEwEIAA0BD4EMwQ+BDIEPgRA BCAAPgQgAD8EQAQ+BDcEQAQwBEcEPQQ+BEEEQgQ4BCAANAQ1BE8EQgQ1BDsETAQ9BD4EQQRCBDgE IAAyBCAAPgRCBD0EPgRIBDUEPQQ4BDgEIAA4BEUEIABABDUEQQRDBEAEQQQ+BDIEIAA4BCAAMgQ7 BDAEQQRCBDgEIAA0BDsETwQgAD0ENQQ0BD4EPwRDBEkENQQ9BDgETwQgADAEPQRCBDgERwQ1BDsE PgQyBDUERwQ1BEEEOgQ4BEUEIAA0BDUEOQRBBEIEMgQ4BDkELAAgAEEEPgQzBDsEMARBBD4EMgQw BD0EPQRLBDkEIAA9BDAEIABDBEAEPgQyBD0ENQQgADIEQQQ1BDMEPgQgAD8EOwQ+BEIEMAQtACAA MQQ7BD4EOgQwBCAAMwQ+BEEEQwQ0BDAEQARBBEIEMgQuAA0AEgQgAD4EMQRJBDUEPAQuACAALQRC BD4EIAA/BEAEMAQyBDgEOwQ+BCAANAQ7BE8EIAA0BDUEPAQ+BD0EPgQ/BD4EOwQ4BDcEMARGBDgE OAQgAEQEOAQ9BDAEPQRBBD4EMgQ+BDkEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAMgQ7BDAEQQRC BDgEIAA0BD4EOwQ2BD0EPgQgADoEMARBBDAEQgRMBEEETwQgADIEQQQ1BEUEIAA+BEAEMwQwBD0E OAQ3BDAERgQ4BDkEIAA4BDsEOAQgAEQEOAQ3BDgERwQ1BEEEOgQ4BEUEIAA7BDgERgQsACAAPgQx BDsEMAQ0BDAETgRJBDgERQQgAEQEOAQ9BDAEPQRBBD4EMgQ+BDkEIAAyBDsEMARBBEIETAROBC4A IAATBDsEPgQxBDAEOwRMBD0ESwQ1BCAAQAQ1BEEEQwRABEEESwQgADQEPgQ7BDYEPQRLBCAAQAQw BDEEPgRCBDAEQgRMBCAAQgQ+BDsETAQ6BD4EIAA9BDAEIAA/BD4ENARKBDUEPAQgAEYEOAQyBDgE OwQ4BDcEMARGBDgEOAQsACAAMAQgAD0ENQQgAD0EMAQgADUENQQgAEMEPwQwBDQEPgQ6BC4ADQAt ACAAGwROBDEESwQ8BCAAIQQcBBgELAAgADoEMAQ6BCAAOAQgADMEPgRBBEMENAQwBEAEQQRCBDIE NQQ9BD0ESwQ8BCAAPwQ+BDsEOARCBDgEOgQwBDwELAAgAD0ENQQ+BDEERQQ+BDQEOAQ8BD4EIAA3 BDAEPwRABDUEQgQ4BEIETAQgADAEPQRCBDgEQQQ+BEYEOAQwBDsETAQ9BEMETgQgAD8EQAQ+BD8E MAQzBDAEPQQ0BEMELQAgAD4EMQQ8BDAEPQQwBCAAOAQgADwEPgRIBDUEPQQ9BDgERwQ1BEEEQgQy BDAELAAgADIEPgQ5BD0ESwQgADgEIAA6BDAEPQQ9BDgEMQQwBDsEOAQ3BDwEMAQsACAAPQQ1BD0E MAQyBDgEQQRCBDgEIAA6BCAAPQQwBEAEPgQ0BEMELAAgADMEOwRDBD8EPgRBBEIEOAQgADgEIABC BDAEOgQ4BEUEIAAxBD4EOwQ1BDcEPQQ1BDkEIAAgADoEMAQ6BCAAPQQwBEAEOgQ+BDwEMAQ9BDgE TwQsACAAMgQ6BDsETgRHBDAETwQgADAEOwQ6BD4EMwQ+BDsEOAQ3BDwELAAgADAEIABCBDAEOgQ2 BDUEIABBBDUEOgRBBCwAIAAxBDsETwQ0BEEEQgQyBD4EIAA4BCAAPwRABDUEPQQ1BDEEQAQ1BDYE NQQ9BDgENQQgAEEENQQ8BEwENQQ5BCwAIAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA4BDcEMgRA BDAESQQ1BD0EOARPBCAAPwRABDgEQAQ+BDQESwQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEOARFBCAA PARDBDYENQRBBEIEMgQ1BD0EPQQ+BEEEQgQ4BCAAOAQgADYENQQ9BEEEQgQyBDUEPQQ9BD4EQQRC BDgELAAgABsEEwQRBCIELgAgABIEQQQ1BCAATQRCBD4EIAA0BD4EOwQ2BD0EPgQgADEESwRCBEwE IAA/BD4EOwQ9BD4EQQRCBEwETgQgADcEMAQ8BDUEPQQ1BD0EPgQgAD0EMAQgAEEEPgRGBDgEMAQ7 BEwEPQRDBE4EIABABDUEOgQ7BDAEPARDBC0AIAA3BDQEPgRABD4EMgQ+BDMEPgQgADgEIAA8BDgE QAQ9BD4EMwQ+BCAAPgQxBEAEMAQ3BDAEIAA2BDgENwQ9BDgELAAgAEEEOAQ7BEwEPQQ+BDkEIABB BDUEPARMBDgEIAA4BCAAQAQ+BDQEMAQsACAAPQQwBEEEQgQ+BE8ESQQ1BDkEIABBBDIEPgQxBD4E NARLBCwAIAA/BD4EQARPBDQEPgRHBD0EPgRBBEIEOAQgADgEIABBBD4EMgQ1BEEEQgQ4BCwAIAA9 BDAEQQRCBD4ETwRJBDUEOQQgADsETgQxBDIEOAQuACAAGwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAA PwRABD4EPwQwBDMEMAQ9BDQESwQgADQEPgQ7BDYEPQQwBCAAPgQxBEoENQQ0BDgEPQRPBEIETAQg ADcEMAQ/BEAENQRCBCAAMAQ8BD4EQAQwBDsETAQ9BD4EOQQgAD8EQAQ+BD8EMAQzBDAEPQQ0BEsE LAAgAD4EPwQ4BEEEMAQ9BD0EPgQ5BCAAMgRLBEgENQQsACAAOAQgADwENQRABEsEIAAyBD0ENQQ0 BEAENQQ9BDgETwQgAEEEPgRGBDgEMAQ7BEwEPQQ+BDkELgANACAAGAQsACAAMgQgAD4EMQRJBDUE PAQsACAAPwQ+BCAAPgRCBD0EPgRIBDUEPQQ4BE4EIAA6BD4EIAAyBEEENQQ8BCAARwQ1BDsEPgQy BDUERwQ1BEEEOgQ4BDwEIAAxBDsEMAQzBDAEPAQsACAANwQwBDQEMAROBEkEOAQ8BCAAQgRDBCAA OAQ7BDgEIAA4BD0EQwROBCAARAQ+BEAEPARDBCAAMgQ7BDAEQQRCBDgELAAgADAELAAgADIEIAA+ BEEEPgQxBDUEPQQ9BD4EQQRCBDgELAAgAEQEPgRABDwESwQgAEEEMAQ8BEsERQQgADwEPgRJBD0E SwRFBCAAQQRABDUENARBBEIEMgQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8ELAAgADQEPgQ7BDYEPQQw BCAAQQRDBEkENQRBBEIEMgQ+BDIEMARCBEwEIAAwBD0EQgQ4BDwEPgQ9BD4EPwQ+BDsETAQ9BDAE TwQgAEEEOwRDBDYEMQQwBCwAIABBBD4ENwQ0BDAEPQQ9BDAETwQgAD0EMAQgAD4EQQQ9BD4EMgQ1 BCAANwQwBDoEPgQ9BD4EMgQgADsENQQzBDAEOwQ4BDcEMARGBDgEOAQgADIEIAA6BD4EPQRBBEIE OARCBEMERgQ4BDgEIABGBDgEMgQ4BDsEOAQ3BDAERgQ4BDgELgAgACEEOwRDBDYEMQQwBCAAOwQ1 BDMEMAQ7BDgENwQwBEYEOAQ4BCAAPAQ+BD0EPgQ/BD4EOwQ4BDkEIAAdBD4EMgQ+BDkEIAATBDgE PwQ1BEAEMQQ+BEAENQQ4BCgAIQQbBBwEHQQTBCkALQAgAEEEOwRDBDYEMQQwBCwAIAA+BEEEQwRJ BDUEQQRCBDIEOwRPBE4ESQQwBE8EIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE4EKAA3BDAEOgQ+BD0E PgQ0BDAEQgQ1BDsETAQ9BD4ENQQgADIEPwQ4BEEESwQyBDAEPQQ4BDUEIAA8BD4EPQQ+BD8EPgQ7 BDgEOAQgADIEIAA+BDEESQQ1BEEEQgQyBD4EKQAgADgEPQQ0BDgEMgQ4BDQEQwRDBDwEPgQyBCAA OAQgADoEPgQ8BD8EMAQ9BDgEOQQsACAAPgQ6BDAENwRLBDIEMAROBEkEOARFBCAAQQRDBEkENQRB BEIEMgQ1BD0EPQQ+BDUEIAAyBDsEOARPBD0EOAQ1BCAAPQQwBCAAMwQ7BD4EMQQwBDsETAQ9BEsE OQQgAEAESwQ9BD4EOgQgADEEOwQwBDMEIAA4BCAAMgQgAD8ENQRABDIEQwROBCAAPgRHBDUEQAQ1 BDQETAQgAEEEMAQ8BEsERQQgAEYENQQ9BD0ESwRFBC0AIAA3BD0EMAQ9BDgEOQQgADgEIAA4BD0E QQRCBEAEQwQ8BDUEPQRCBD4EMgQgAD8EPgQ3BD0EMAQ9BDgETwQsACAAMAQgAEIEMAQ6BDYENQQg ADgENAQ1BD4EOwQ+BDMEOAQ5BCAAOAQgADgENAQ1BD4EOwQ+BDMEPgQyBC8APwQ+BDsEOARCBDgE OgQ+BDIELAAgAEIEPgQyBDAEQAQ+BDIEIAA4BCAAQwRBBDsEQwQzBCgAMgQgAD4EQQQ+BDEENQQ9 BD0EPgRBBEIEOAQgAD4EQARDBDYEOARPBCAAOAQgAD0EMARABDoEPgRCBDgEOgQ+BDIEKQAsACAA NAQ1BD0ENQQzBCAAOAQgAEYENQQ9BD0ESwRFBCAAMQRDBDwEMAQzBC4AIAASBCAAPwRABD4ERgQ1 BEEEQQQ1BCAAOwQ1BDMEMAQ7BDgENwQwBEYEOAQ4BCAANwQwBDoEPgQ9BD4ENAQwBEIENQQ7BEwE PQQ+BCAAQAQwBDcEQAQ1BEgEMAQ1BEIEQQRPBCAAQQRCBEAEPgQzBD4EIAA+BDMEQAQwBD0EOARH BDUEPQQ9BEsEOQQgAD4EMQQ+BEAEPgRCBCAAQgQ1BEUEIAA4BDsEOAQgADgEPQRLBEUEIAAxBDsE MAQzBC4AIAAeBDMEQAQwBD0EOARHBDUEPQQ4BE8ELAAgAD0ENQQgAD8EPgQ3BDIEPgQ7BE8ETgRJ BDgENQQgAEAEMAQ3BEAEMARBBEIEMAQ9BDgETgQgAD4ESAQ4BDEEOgQ4BCAAMgQgADIEOAQ0BDUE IAA8BD4EPQQ+BD8EPgQ7BDgEOQQgADgEOwQ4BCAANARABEMEMwQ4BEUEIAA+BDEEQAQwBDcEPgQy BDAEPQQ4BDkEIAA4BCwAIAAyBCAAQgQ+BCAANgQ1BCAAMgRABDUEPARPBCwAIABABDAENwRABDUE SAQ1BD0EOAQ1BCAAOARFBCwAIAA7BDUEMwQwBDsETAQ9BD4ENQQgAEEEQwRJBDUEQQRCBDIEPgQy BDAEPQQ4BDUEIAA4BCAAOwQ1BDMEMAQ7BEwEPQRLBDkEIAA+BDEEPgRABD4EQgQsACAAPQQ1BCAA PwQ+BDcEMgQ+BDsETwROBEkENQQ1BCAAQAQwBDEEPgRCBDAEQgRMBCAAPwQ+BDQEPwQ+BDsETAQ9 BEsEPAQgAD8EQAQ+BDgENwQyBD4ENAQ4BEIENQQ7BE8EPAQsACAAMgRLBDwESwQyBDAETgRJBDUE NQQgADMEQAQ+BDcEPQQ+BDUEIAA+BEIEQAQ4BEYEMARCBDUEOwRMBD0EPgQ1BCAAPgQxBEkENQRB BEIEMgQ1BD0EPQQ+BDUEIABPBDIEOwQ1BD0EOAQ1BC0AIAA9BDAEQAQ6BD4EPAQwBEQEOAROBC4A IAAXBDAEIABBBEcENQRCBCAAOwQ1BDMEMAQ7BDgENwQwBEYEOAQ4BCAAOAQgADQENQQ8BD4EPQQ+ BD8EPgQ7BDgENwQwBEYEOAQ4BCAAQQRCBDAEQAQwBE8EIABNBDsEOARCBDAEIAA/BD4EOwRDBEcE OARCBCAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgRMBCAAPwQ1BEAENQREBD4EQAQ8BDAEQgQ4BEAEPgQy BDAEQgRMBEEETwQgADgEIAA9BDAERwQwBEIETAQgAEAEMAQxBD4EQgQwBEIETAQgAD0EMAQgADEE OwQwBDMEPgQgAD4EMQRJBDUEQQRCBDIEMAQgAEMENgQ1BCAAMgQgADQEQARDBDMEPgQ8BCAANwQ0 BD4EQAQ+BDIEPgQ8BCAAPAQ4BEAENQQuACAAHQQ+BEEEOARCBDUEOwQ4BCAANgQ1BCAAMgQ7BDAE QQRCBDgEIABSAEEALAAgAEUEPgQ3BE8ENQQyBDAEIABGBDgEMgQ4BDsEOAQ3BDAERgQ4BDgEIAA3 BDAEPwQwBDQEMAQsACAAPwQ+BDsEQwRHBDAEQgQgADIEPgQ3BDwEPgQ2BD0EPgRBBEIETAQgADEE NQRBBDoEQAQ+BDIEPQQ+BCAAQQQ0BDAEQgRMBCAAPwQ+BEEEQgQgADgEIAA/BEAEOAQ8BDUEPQQ4 BEIETAQgAD8EPgRCBD4EPAQgAEEEMgQ+BE4EIAAyBDsEMARBBEIETAQgAD0EMAQgADEEOwQwBDME PgQgAEcENQQ7BD4EMgQ1BEcENQRBBEIEMgQwBCwAIAA9BDUEIABABDAEQQRCBEAEMARCBDgEMgQg ADUENQQgAD8EPgQ/BEMEQQRCBEMEIAA9BDAEIAAxBDUEQQRBBDwESwRBBDsENQQ9BD0ESwQ1BCAA PwQ+BD8ESwRCBDoEOAQgAD8EQAQ+BDoEPgRABDwEOARCBEwEIAA+BDQEPQQ4BEUEIAA3BDAEIABB BEcENQRCBCAANARABEMEMwQ4BEUEIAA4BCAAPQQ1BCAAPwQ+BEIENQRABE8EMgQgADIEIAAyBD4E OQQ9BDUEIABBBDwESwRBBDsEPgQyBCAAQQQgADcEMAQyBDUENAQ+BDwESwQ8BCAAPwQ+BDEENQQ0 BDgEQgQ1BDsENQQ8BCAAQQQyBD4ETgQgADIEOwQwBEEEQgRMBCwAIAAwBCwAIAA8BD4ENgQ1BEIE IAAxBEsEQgRMBCwAIAA3BDAEPgQ0BD0EPgQgADgEIAA2BDgENwQ9BEwELgAgABIEIABABDUENwRD BDsETARCBDAEQgQ1BCwAIAA8BEsEIAAyBCAAPwRABE8EPAQ+BDwEIABBBD4EPgRCBDIENQRCBEEE QgQyBDgEOAQgAEEEIAA0BEMERQQ+BDwEIABBACwAIAA/BEAEPgRPBDIEOAQyBCAAQQQyBD4ETgQg AEUEQAQ4BEEEQgQ4BDAEPQRBBDoEQwROBCAAOwROBDEEPgQyBEwEIAA4BCAAPAQ4BDsEPgRBBDUE QAQ0BDgENQQsACAAMgQ6BDsETgRHBDgEPARBBE8EIAAyBCAANgQ4BDcEPQRMBCAAQQQgAD0EMARI BDgEPAQ4BCAAQQQ4BDsETAQ9BEsEPAQ4BCAAQQQ+BEEENQQ0BE8EPAQ4BC0ARgQ4BDIEOAQ7BDgE NwQwBEYEOARPBDwEOAQsACAAPgQxBEoENQQ0BDgEPQRPBE8EQQRMBCAAOAQgAEEEQgRABD4ETwQg AB0EPgQyBEMETgQgABMEOAQ/BDUEQAQxBD4EQAQ1BE4ELgANACAAJwRCBD4EMQRLBCAAMgRLBEAE MgQwBEIETARBBE8EIAA4BDcEIABABEMESAQwBEkENQQ5BEEETwQgAD8EOARABDAEPAQ4BDQESwQs ACAAPARLBCAANAQ+BDsENgQ9BEsEIAAyBEEEPwQ+BDwEPQQ4BEIETAQgAEEEMgQ+BDUEIABABD4E NARBBEIEMgQ+BCAAOAQgAD4EQgQ9BDUEQQRCBDgEQQRMBCAAOgQgADQEQARDBDMEOAQ8BCAAMgQg AEEEPgQ+BEIEMgQ1BEIEQQRCBDIEOAQ4BCAAQQQgAE0EQgQ4BDwELgAgAB8EPgRNBEIEPgQ8BEME LAAgADIEIAA6BEAEMARCBDoEPgRBBEAEPgRHBD0EPgQ5BCAAPwQ1BEAEQQQ/BDUEOgRCBDgEMgQ1 BCAAIARDBEEETAQgADIEIAA7BDgERgQ1BCAAIAQ+BEEEQQQ4BDgEIAA0BD4EOwQ2BD0EMAQgAEME MgQ1BEAEPQRDBEIETARBBE8EIAA+BEIEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAMgQ+BDkEPQRL BCAAQQQgACEEKAQQBCwAIAAVBCEELAAgABoEOARCBDAENQQ8BCAAOAQgADwEQwRBBEMEOwRMBDwE MAQ9BDAEPAQ4BCwAIAA/BEAEOAQ9BDUEQQRPBCAAOAQ8BCAAMQQ7BDAEMwQwBCAAPgQxBEoENQQ0 BDgEPQQ1BD0EOARPBCAAOAQgADwEOARABDAELAAgADgENwQxBDAEMgQ7BDUEPQQ4BE8EIAA+BEIE IAAzBDUEPgQ/BD4EOwQ4BEIEOARHBDUEQQQ6BD4EMwQ+BCAAPwRABD4EQgQ4BDIEPgRBBEIEPgRP BD0EOARPBCwAIAA9BDAEQwRHBDgEQgRMBCAAQQQyBD4EOAQ8BCAAPwRABDgEPAQ1BEAEPgQ8BCAA MgQ+BDcEPAQ+BDYEPQQ+BEEEQgRPBDwEIABDBD8EQAQwBDIEOwQ1BD0EOARPBCAAMgQgAEEEMgQ+ BDEEPgQ0BD0EPgQ8BCAAPgQxBEkENQRBBEIEMgQ1BC4AIAAfBDAEQAQwBDsEOwQ1BDsETAQ9BD4E LAAgAD8EQAQ1BDQEOwQ+BDYEOAQyBCAANwQwBD8EMAQ0BEMEIAA4BCAAMgQ+BEEEQgQ+BDoEQwQg AEEEPgROBDcELAAgAD0ENQQ+BDEERQQ+BDQEOAQ8BD4EIAA+BDEEQAQwBEIEOARCBEwEIAAzBDsE PgQxBDAEOwRMBD0ESwRFBCAAQwQ/BEAEMAQyBDsENQQ9BEYENQQyBCAAOwQ4BEYEPgQ8BCAAOgQg ADQEPgQzBD4EMgQ+BEAEQwQgADIESwRIBDUELAAgADoEPgRCBD4EQARLBDkEIAAxBEMENAQ1BEIE IAAyBEsEMwQ+BDQENQQ9BCAANAQ7BE8EIABCBDUERQQsACAAOgRCBD4EIABFBD4ERwQ1BEIEIABA BDAENwQyBDgEMgQwBEIETARBBE8EIABBBDIEPgQxBD4ENAQ9BD4EIAA4BCAAOAQzBD0EPgRABDgE QAQ+BDIEMAQ9BDgENQQgAE0EQgQ+BDMEPgQgADQEPgQzBD4EMgQ+BEAEMAQgADEEQwQ0BDUEQgQg AEcEQAQ1BDIEMARCBD4EIABBBDUEQARMBDUENwQ9BEsEPAQ4BCAAPwQ+BEEEOwQ1BDQEQQRCBDIE OARPBDwEOAQuACAAJwQwBEEEQgRMBE4EIAA6BD4EPQRBBEIEOARCBEMERgQ4BDgEIAATBDgEPwQ1 BEAEMQQ+BEAENQQ4BCAANAQ+BDsENgQ1BD0EIABBBEIEMARCBEwEIAA0BD4EMwQ+BDIEPgRABCAA QQQ+BCAAQQRCBEAEMAQ9BDAEPAQ4BCAAFQQyBEAEMAQ3BDgEOAQgADgEIABDBEIEMgQ1BEAENgQ0 BDUEPQQ4BDUEIAA9BDAERwQwBDsEMAQgAEEEQgRABD4EOARCBDUEOwRMBEEEQgQyBDAEIAA9BD4E MgQ+BDMEPgQgADwEOARABD4EMgQ+BDMEPgQgAD8EPgRABE8ENAQ6BDAEIAAyBCAAOgQ+BEAEPgRC BDoEPgQ5BCAAPwQ1BEAEQQQ/BDUEOgRCBDgEMgQ1BCgANAQ+BCAAMQAwACAAOwQ1BEIEKQAsACAA QQRABDUENAQ9BDUEOQQoADEAMAAtADMAMAA7BDUEQgQpACAAOAQgADQEPgQ7BDMEPgRBBEAEPgRH BD0EPgQ5BCgAMwAwAC0AMQAwADAAOwQ1BEIEKQAuACAADQAeBEEEPQQ+BDIEPQRLBDUEIAA/BD4E OwQ+BDYENQQ9BDgETwQgAD0EQwQ2BD0ESwRFBCAANAQ+BDMEPgQyBD4EQAQ+BDIEOgANAC0AIAAh BCgEEAQNACAAEgQgADoEPgRABD4EQgQ6BD4EOQQgAD8ENQRABEEEPwQ1BDoEQgQ4BDIENQQgAD8E QAQ1BDoEQAQwBEIEOARCBEwEIABABDAENwQ2BDgEMwQwBD0EOAQ1BCAAQQRCBEAEMARFBDAEIAA4 BCAAPQQ1BD0EMAQyBDgEQQRCBDgEIAA6BCAAPQQwBEAEPgQ0BDAEPAQsACAAPgQxBEkENQQ1BCAA NAQwBDIEOwQ1BD0EOAQ1BCAAPQQwBCAAPQQ1BDsEOAQxBDUEQAQwBDsETAQ9BEsENQQgAEEEQgRA BDAEPQRLBCwAIAA/BEAEPgQ/BDAEMwQwBD0ENARDBCAAQARDBEEEPgREBD4EMQQ4BDgELgAgACME PwQ+BEAEIAA0BD4EOwQ2BDUEPQQgADEESwRCBEwEIABBBDQENQQ7BDAEPQQgAD0EMAQgADIEQAQ1 BDQEIAAzBDsEPgQxBDAEOwQ4BEEEQgQ+BDIEIAA0BDsETwQgACEEKAQQBCwAIAA/BEAENQQ0BEEE QgQwBDIEOwRPBE4ESQQ4BEUEIAAyBCAAMQQ+BDsETARIBD4EOQQgAEEEQgQ1BD8ENQQ9BDgEIAA9 BDAEQQQ7BDUENAQ9BDgEOgQ+BDIEIAAwBD0EMwQ7BD4EQQQwBDoEQQQ+BDIELgAgABAEPQQzBDsE PgRBBDAEOgRBBEsEIABNBEIEPgQgAD0EMARIBCAAIAQ+BDQEIABSACwAIABCBD4EOwRMBDoEPgQg AD8EPgQ0BDMEQARDBD8EPwQwBCAAUgAxAGIAIAAyBCAAPgRCBDsEOARHBDgENQQgAD4EQgQgAD0E MARIBDUEOQQgAFIAMQBhACwAIAA+BD0EOAQgAD0EMARIBDgEIAAxBDsEOAQ3BDoEOAQ1BCAAQAQ+ BDQEQQRCBDIENQQ9BD0EOAQ6BDgELQAgAEAEPgQ0BD0ESwQ1BCAAMQRABDAEQgRMBE8ELAAgADUE QQQ7BDgEIAA+BEIEPgQ2BDQENQRBBEIEMgQ4BEIETAQgADMEMAQ/BDsEPgQzBEAEQwQ/BD8EQwQg AEEEIABBBDUEPARMBDUEOQQsACAAMAQgAD8EPgQ0BDMEQARDBD8EPwRLBCAAQQQgADQENQRCBEwE PAQ4BC4AIAAfBD4EIAA4BEEEQgQ+BEAEOARHBDUEQQQ6BDgEPAQgADgEIAA+BDEESgQ1BDoEQgQ4 BDIEPQRLBDwEIAA/BEAEOARHBDgEPQQwBDwEIAA+BD0EOAQgADIEPgROBE4EQgQgAEEEIAA9BDAE PAQ4BCAAMgRBBE4EIAA9BD4EMgRDBE4EIAA4BEEEQgQ+BEAEOAROBC4AIAAfBEAEOARIBDsEPgQg ADIEQAQ1BDwETwQgADgEIAAQBDwENQRABDgEOgQ1BCAAQQQgABUEMgRABD4EQQQ+BE4ENwQ+BDwE IAAyBEEEPwQ+BDwEPQQ4BEIETAQgAEEEMgQ+BDUEIABABD4ENARBBEIEMgQ+BCAAOAQgAD8EPgQ8 BDgEQAQ4BEIETARBBE8EIABBBD4EIABBBDIEPgQ4BDwEOAQgADIEPgRBBEIEPgRHBD0ESwQ8BDgE IAAxBEAEMARCBEwETwQ8BDgELgANACAAEgQgAEEEQAQ1BDQEPQQ1BEEEQAQ+BEcEPQQ+BDkELQAg ADsENQRHBDUEPQQ4BDUEIABBBDIEPgQ1BDMEPgQgAD4EMQRJBDUEQQRCBDIEMAQgAD4EQgQgADEE PgQ7BDUENwQ9BDUEOQQsACAAMgRLBDcEMgQwBD0EPQRLBEUEIAA9BDUEPwRABDAEMgQ4BDsETAQ9 BEsEPAQgADMEOwQ+BDEEMAQ7BEwEPQRLBDwEIABDBD8EQAQwBDIEOwQ1BD0EOAQ1BDwEOgAgADgE PQQ0BDgEMgQ4BDQEQwQwBDsEOAQ3BDwEMAQgADgEIAA/BD4EQgRABDUEMQQ4BEIENQQ7BEwEQQRC BDIEMAQsACAAQAQwBDcEQARDBEgENQQ9BDgETwQgAD0EQAQwBDIEQQRCBDIENQQ9BD0ESwRFBCAA RgQ1BD0EPQQ+BEEEQgQ1BDkELQAgAEcENQQ7BD4EMgQ1BEcEPQQ+BEEEQgQ4BCwAIAA7BE4EMQQy BDgEIAA6BCAAMQQ7BDgENgQ9BDgEPAQsACAAQQQ+BDIENQRBBEIEOAQgADgEIABBBDgEOwQgADQE QwRFBDAELAAgADcEMAQyBDgEQQQ4BDwEPgRBBEIETAROBCAAPgRCBCAAOAQ9BEQEPgRABDwEMARG BDgEPgQ9BD0ESwRFBCAAOAQgADwEMARCBDUEQAQ4BDAEOwRMBD0ESwRFBCAATwQ0BD4EMgQgADIE IAAhBBwEGAQgADgEIAA9BDAEIAA/BD4EOwQ6BDAERQQgADwEMAQzBDAENwQ4BD0EPgQyBC4AIAAi BDAEOgQ2BDUEIAAyBCAAQQRABDUENAQ9BDUEQQRABD4ERwQ9BD4EOQQgAD8ENQRABEEEPwQ1BDoE QgQ4BDIENQQgACEEKAQQBCAANAQ+BDsENgQ9BEsEIABBBEIEMARCBEwEIABHBDAEQQRCBEwETgQg AB0EPgQyBD4EOQQgABMEOAQ/BDUEQAQxBD4EQAQ1BDgEIAA4BCAAQwRCBDIENQRABDQEOARCBEwE IAA3BDAEOgQ+BD0ESwQgADsENQQzBDAEOwQ4BDcEMARGBDgEOAQuAA0AIAASBCAANAQ+BDsEMwQ+ BEEEQAQ+BEcEPQQ+BDkELQAgADgENwQxBDAEMgQ4BEIETARBBE8EIAA+BEIEIAAyBDsEOARPBD0E OARPBCAAMwQ7BD4EMQQwBDsETAQ9BEsERQQgAEMEPwRABDAEMgQ7BE8ETgRJBDgERQQgADgEIABF BD4ENwRPBDUEMgQgADIEOwQwBEEEQgQ4BCAAIARBACwAIAAyBEsETwQyBDgEQgRMBCwAIAAyBEsE MgQ1BEEEQgQ4BCAAOARFBCAAPQQwBCAARwQ4BEEEQgRDBE4EIAAyBD4ENARDBCAAOAQgAD8EQAQ4 BDcEMgQwBEIETAQgADoEIAA+BEIEMgQ1BEIEQwQgAD8ENQRABDUENAQgADIEQQQ1BDwEOAQuAA0A LQAgABUEMgRABD4EQQQ+BE4ENwQNACAAEgQgADoEPgRABD4EQgQ6BD4EOQQgAD8ENQRABEEEPwQ1 BDoEQgQ4BDIENQQgAD8EQAQ1BDoEQAQwBEIEOARCBEwEIAA/BD4EQgQyBD4EQARBBEIEMgQ+BDIE MARCBEwEIAA0BDUEQQRCBEAEQwQ6BEIEOAQyBD0EPgQ5BCAAMgQgADMEOwQ+BDEEMAQ7BEwEPQQ+ BDwEIAA/BDsEMAQ9BDUEIAA/BD4EOwQ4BEIEOAQ6BDUEIAAhBCgEEAQgADgEIAA/BD4EQgRABDUE MQQ7BE8EQgRMBCAAMAQ8BDUEQAQ4BDoEMAQ9BEEEOgRDBE4EIAA/BEAEPgQ/BDAEMwQwBD0ENARD BCwAIAAyBD4EQQRBBEIEMAQ9BD4EMgQ4BEIETAQgAD4EQgQ9BD4ESAQ1BD0EOARPBCAAQQQgACAE PgRBBEEEOAQ1BDkELgAgAC0EQgQ+BDwEQwQgADQEPgQ7BDYEPQQ+BCAAQQQ/BD4EQQQ+BDEEQQRC BDIEPgQyBDAEQgRMBCAAPQQwBEgENQQgAEAEPgQ0BEEEQgQyBD4EIAA4BCAAQQQgAD0EMARABD4E NAQwBDwEOAQgABUEMgRABD4EQQQ+BE4ENwQwBC0AIAAxBD4EOwRMBEgEMARPBCAARwQwBEEEQgRM BCAAPQQwBEEENQQ7BDUEPQQ4BE8EIABBBEIEQAQwBD0EIAAVBDIEQAQ+BD8ESwQgAD8EQAQ4BD0E MAQ0BDsENQQ2BDAEQgQgADoEIAAzBDAEPwQ7BD4EMwRABEMEPwQ/BDUEIABSAC4AIAASBCAAQQRA BDUENAQ9BDUEQQRABD4ERwQ9BD4EOQQgADgEIAA0BD4EOwQzBD4EQQRABD4ERwQ9BD4EOQQgAD8E NQRABEEEPwQ1BDoEQgQ4BDIEMARFBC0AIABCBD4EIAA2BDUELAAgAEcEQgQ+BCAAOAQgADQEOwRP BCAAIQQoBBAELgANAC0AIAAaBDgEQgQwBDkEDQAgABIEIAA6BD4EQAQ+BEIEOgQ+BDkEIAA/BDUE QARBBD8ENQQ6BEIEOAQyBDUEIAAaBDgEQgQwBDkEIAA0BD4EOwQ2BDUEPQQgAD4EMQRKBDUENAQ4 BD0EOARCBEwEQQRPBCAAQQQgACAEPgRBBEEEOAQ1BDkEIAA4BCAAFQQyBEAEPgRBBD4ETgQ3BD4E PAQgADgEIAA9BDAERwQwBEIETAQgADsENQQzBDAEOwQ4BDcEMARGBDgETgQgADwEPgQ9BD4EPwQ+ BDsEOAQ5BC4AIAAaBDgEQgQwBDkERgRLBCwAIAA9BDUEQQQ8BD4EQgRABE8EIAA9BDAEIABABDAE NwQ9BDgERgRDBCAAOAQ9BEIENQRABDUEQQQ+BDIEIABBBCAAIAQ+BEEEQQQ4BDUEOQQgADgEIAA1 BEkENQQgADEEPgQ7BEwESARDBE4EIABABDAENwQ9BDgERgRDBCAAQQQgADcEMAQ/BDAENAQ+BDwE LAAgAD0EMARIBDgEIAA0BEMERQQ+BDIEPQRLBDUEIAAxBEAEMARCBEwETwQuACAAHgQ9BDgEIAA/ BD4EIAAxBD4EOwRMBEgENQQ5BCAARwQwBEEEQgQ4BCAAPQQ1BCAAPwRABDgEPQQwBDQEOwQ1BDYE MARCBCAAMwQwBD8EOwQ+BDMEQARDBD8EPwQ1BCAAUgAsACAAPQQ+BCAAOARFBCAAOAQ0BDUEPgQ7 BD4EMwQ4BE8EIAA4BCAAPAQ4BEAEPgQyBD4ENwQ3BEAENQQ9BDgENQQgAEAEPgQ0BEEEQgQyBDUE PQQ9BEsEIAA9BDAESAQ4BDwELAAgAEIEMAQ6BCAAOgQwBDoEIAAyBCAAQQRDBEkENQRBBEIEMgQ1 BD0EPQQ+BDkEIABBBEIENQQ/BDUEPQQ4BCAAPwQ+BDQEPgQxBD0ESwQgADgEPAQuACAAGAQgADME OwQwBDIEPQQ+BDUELAAgAD4EPQQ4BCAAPQQ+BEEEOARCBDUEOwQ4BCAANARDBEUEMAQgAD0ENQQx BDAELQAgAEEALgAgAB0ENQRDBDQEMARHBD0ESwQ1BCAAPwQ+BD8ESwRCBDoEOAQgADQEPgQzBD4E MgQ+BEAEOARCBEwEQQRPBCAAPgQgAD8EPgQ0BD4EMQQ9BD4EPAQgAEEEPgROBDcENQQgAEMENgQ1 BCAAMQRLBDsEOAQsACAAPQQ+BCAAOAQ3BC0ANwQwBCAAPQQ1BD0EMAQ0BDUENgQ9BEsERQQgAD4E QQQ9BD4EMgQwBD0EOAQ5BCAAQgQwBDoEIAA4BCAAPQQ1BCAAMQRLBDsEOAQgAEAENQQwBDsEOAQ3 BD4EMgQwBD0ESwQuACAAEgQgAEEEQAQ1BDQEPQQ1BEEEQAQ+BEcEPQQ+BDkEIAA/BDUEQARBBD8E NQQ6BEIEOAQyBDUEIAAaBDgEQgQwBDkEIAA0BD4EOwQ2BDUEPQQgAD4EQQQyBD4EMQQ+BDQEOARC BEwEQQRPBCAAPgRCBCAAMgQ7BDAEQQRCBDgEIAAgBD4EQgRIBDgEOwRMBDQEPgQyBC8AEQQwBEAE QwRFBD4EMgQsACAAOwQ1BDMEMAQ7BDgENwQ+BDIEMARCBEwEIAA4BEUEIABBBEIEMAQyBDoEQwQg ADIEIAATBD4EPQQzBCAAGgQ+BD0EMwQ1BCAAOAQgAD8EQAQ+BEcEOAQ1BCAAQQRCBEAEQwQ6BEIE QwRABEsEIAAyBD4EIAAyBEEENQQ8BCAAGgQ4BEIEMAQ1BC4AIAAeBD0EOAQgAD8EQAQ4BEgEOwQ4 BCAAPQQ1BCAAPwRABD4EQQRCBD4EIAA6BDAEOgQgAEQEOAQ9BDAEPQRBBDgEQQRCBEsELAAgABoE OARCBDAEOQQgADQEPgQ7BDYENQQ9BCAAQQRCBDAEQgRMBCAAPwQ+BCAAPwQ7BDAEPQRDBCAAOARF BCAAPQQ+BDIEPgQ5BCAAOAQ8BD8ENQRABDgENQQ5BCwAIAAyBEAEPgQ0BDUEIAAhBCgEEAQsACAA PQQ+BCAAQgQ1BD8ENQRABEwEIAAyBCAAFQQyBEAEMAQ3BDgEOAQgADgEIAA+BDQEPQQ+BDIEQAQ1 BDwENQQ9BD0EPgQgADEEMAQ3BD4EOQQgAEQEOAQ9BDAEOwRMBD0EPgQ5BCAAMARCBDAEOgQ4BCAA PQQwBCAAIARDBEEETAQuAA0ALQAgACAEPgRBBEEEOARPBA0AIAAnBEIEPgQgAD0EQwQ2BD0EPgQg AEEENAQ1BDsEMARCBEwEIAAgBD4EQQRBBDgEOAQ/ACAAFQRBBDsEOAQgAEMEIAA9BDUENQQgADUE QQRCBEwEIAAyACAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ4BCwAIAA9BDAEQQQ1BDsENQQ9BD0ESwQ1 BCAAMQRABDAEQgRBBDoEOAQ8BDgEIAA9BDAEQAQ+BDQEMAQ8BDgEIAA4BCAAQQRDBEkENQRBBEIE MgRDBE4ESQQ4BDUEIABBBCAAPQQ1BDkEIAA/BD4EIAA/BEAEOAQ9BEYEOAQ/BEMEIABBBDUEPARM BDgEIAA9BDAEQAQ+BDQEPgQyBCwAIAAgBD4EQQRBBDgEOAQgADwEPgQ2BD0EPgQgADIEPgQ+BDEE SQQ1BCAAPQQ4BEcENQQzBD4EIAA9BDUEIAA0BDUEOwQwBEIETAQsACAAOAQgAD4EPQQ4BCAAQQQw BDwEOAQgAD8EQAQ4BDIENQQ0BEMEQgQgADUENQQgADoEIABBBD8EMARBBDUEPQQ4BE4ELgAgAB0E PgQsACAAQgQwBDoEIAA6BDAEOgQgAD0EOAQ6BEIEPgQgAD8EPgQ8BD4EMwQwBEIETAQgAD0ENQQg AEUEPgRHBDUEQgQgADgEOwQ4BCAAPQQ1BCAAPAQ+BDYENQRCBCwAIAAwBCAAPQQwBCAAQQQyBD4E OARFBCAAMwRABDAEPQQ4BEYEMARFBCAAQwQ2BDUEIAA/BD4ETwQyBDgEOwQ4BEEETAQgAD4ERwQw BDMEOAQgAD0ENQQ9BDAEMgQ4BEEEQgQ4BCAAOAQgADIEPgQ5BD0ESwQsACAAPQRDBDYEPQQ+BCAA MQRLBEEEQgRABD4ELAAgADIEIAA6BEAEMARCBDoEPgRBBEAEPgRHBD0EPgQ5BCAAPwQ1BEAEQQQ/ BDUEOgRCBDgEMgQ1BCAAPwRABDgEMgQ1BEEEQgQ4BCAAQQQ4BDsETAQ9BEsERQQgADwEOARABDAE IAA6BCAAPARLBEEEOwQ4BCAAPgQgAD8EQAQ+BDEEQwQ2BDQENQQ9BDgEOAQgADQEQAQ1BDIEPQQ4 BEUEIAAxBD4EMwQ+BDIELgAgABsEOAQ0BDUEQARLBCAANAQ+BDsENgQ9BEsEIAA0BD4EMwQ+BDIE PgRABDgEQgRMBEEETwQgAD4EIAA8BDUEQAQwBEUEIAA9BDUEOQRCBEAEMAQ7BDgENwQwBEYEOAQ4 BCAAMgRABDAENgQ1BEEEOgQ+BDMEPgQgADIEOwQ4BE8EPQQ4BE8EIAA9BDAEIAAjBDoEQAQwBDgE PQQ1BCAAOAQgADIEPwQ4BEEESwQyBDAEPQQ4BDgEIAAjBDoEQAQwBDgEPQRLBCAAPgQxBEAEMARC BD0EPgQgADIEIAAgBEMEQQRBBDoEOAQ5BCAAHAQ4BEAELAAgAEIEMAQ6BDYENQQgAD4EMQQgADgE QQQ/BEAEMAQyBDsENQQ9BDgEOAQgAD4ESAQ4BDEEPgQ6BCAAPwRABD4ESAQ7BD4EMwQ+BCAAOAQg ADsENQRHBDUEPQQ4BDgEIAAxBD4EOwQ1BDcEPQQ1BDkELAAgADsENQQzBDAEOwQ4BDcEMARGBDgE OAQgADwEPgQ9BD4EPwQ+BDsEOAQ5BCAAOAQgAD8EPgRBBDsENQQ0BEEEQgQyBDgEOQQgADIEQAQ1 BDQEPQQ+BDMEPgQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDMEPgQgAEMEPwRABDAEMgQ7BDUEPQQ4BE8E LgAgACEEIAA7BDgENAQ1BEAEMAQ8BDgEIAA0BEAEQwQzBDgERQQgAEEEQgRABDAEPQQgAD0EQwQ2 BD0EPgQgADQEPgQzBD4EMgQ+BEAEOARCBEwEQQRPBCAAPgQgADwENQRABDAERQQgAD8EQAQ+BEIE OAQyBD4ENAQ1BDkEQQRCBDIEOARPBCAAMwQ7BD4EMQQwBDsETAQ9BEsEPAQgAEMEMwRABD4ENwQw BDwEIAA4BCAAPQQwBEgENQQ5BCAAMQRABDAEQgRBBDoEPgQ5BCAAPwQ+BDQENAQ1BEAENgQ6BDUE IAAyBCAAOARFBCAAMQQ+BEAETAQxBDUELgAgABsENQQzBDAEOwQ4BDcEMARGBDgETwQgADwEPgQ9 BD4EPwQ+BDsEOAQ5BCAANAQ+BDsENgQ9BDAEIAAxBEsEQgRMBCAAPwRABD4EMgQ1BDQENQQ9BDAE IAA9BDAEIAA+BEEEPQQ+BDIENQQgADwEOARABD4EMgQ+BDcENwRABDUEPQQ4BE8EIAA4BCAANARD BEUEMAQgAEEAIAA4BCAAPwRABD4EPwQwBDMEMAQ9BDQESwQgADgENAQ1BD4EOwQ+BDMEOAQ4BCAA QQQ/BDAEQQQ1BD0EOARPBCAAPAQ4BEAEMAQgAD4EQgQgAD8EPgRABDAEMQQ+BEkENQQ9BDgETwQg ADYEQAQ1BEYEMAQ8BDgEIABSAEEALgANAC0AIAA0BEAEQwQzBDgENQQgAEEEQgRABDAEPQRLBCAA OAQgAD0EMARABD4ENARLBA0AIAASBCAANwQwBDIEOARBBDgEPAQ+BEEEQgQ4BCAAPgRCBCAAQQRC BEAEMAQ9BEsEIAA4BCAAPQQwBEAEPgQ0BD4EMgQgAD0EMAQgADUENQQgAEIENQRABEAEOARCBD4E QAQ4BDgELAAgADgENwQxBDAEMgQ7BDUEPQQ4BDUEIAA+BEIEIAAzBDsEPgQxBDAEOwQ4BEEEQgQ+ BDIEIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAQAQ1BDAEOwQ4BDcEPgQyBDAEPQQ+BCAAMQRLBEEE QgRABD4ELgAgACAEPgRBBEEEOARPBCwAIAAaBDgEQgQwBDkEIAA4BCAAQQRCBEAEMAQ9BEsELAAg AD0ENQQgAD8EPgQ0BDIENQRABDMEMAQyBEgEOAQ1BEEETwQgAEMEPwRABDAEMgQ7BDUEPQQ4BE4E IABBBD4EIABBBEIEPgRABD4EPQRLBCAANwQwBD8EMAQ0BDAEIAA/BD4EQQQ7BDUENAQ9BDgENQQg ADEAMAAwAC0AMgAwADAAIAA7BDUEQgQsACAAPAQ+BDMEQwRCBCAAQAQwBEEEQQRHBDgEQgRLBDIE MARCBEwEIAA9BDAEIABNBEQERAQ1BDoEQgQ4BDIEPQRDBE4EIAAxBD4EQARMBDEEQwQgADIEIAA6 BEAEMARCBDoEPgQtACAAOAQgAEEEQAQ1BDQEPQQ1BEEEQAQ+BEcEPQQ+BDkEIAA/BDUEQARBBD8E NQQ6BEIEOAQyBDUEIAA4BCAAPwQ+BDEENQQ0BEMEIAAyBCAANAQ+BDsEMwQ+BEEEQAQ+BEcEPQQ+ BDkELAAgADAEIAAyBD4ENwQ8BD4ENgQ9BD4EIAA4BCAAQAQwBD0ETARIBDUELAAgADUEQQQ7BDgE IABBBDwEPgQzBEMEQgQgADcEMAQ/BD4EOwRDBEcEOARCBEwEIAA9BD4EQQQ4BEIENQQ7BDUEOQQg ADIEOwQwBEEEQgQ4BCAAPQQwBCAAQQQyBD4ETgQgAEEEQgQ+BEAEPgQ9BEMEIAA4BDsEOAQgADcE MARFBDIEMARCBDgEQgRMBCAAOARFBCAAMgQ7BDAEQQRCBEwELgAgACEEQgRABDAEPQRLBCAAFQQy BEAEPgRBBD4ETgQ3BDAELAAgACEEKAQQBCwAIAAQBD0EMwQ7BDgETwQsACAAGgQwBD0EMAQ0BDAE LAAgABAEMgRBBEIEQAQwBDsEOARPBCAAOAQgAEAETwQ0BCAAQAQ1BDMEOAQ+BD0EPgQyBCAAMQRD BDQEQwRCBCAAMgRLBD0EQwQ2BDQENQQ9BEsEIAA8BD0EPgQzBD4EIABBBDgEOwQgAD8EPgRCBEAE MARCBDgEQgRMBCAAPQQwBCAAMQQ+BEAETAQxBEMEIABBBD4EIABBBDIEPgQ1BDkEIAA/BD4EOgQw BDsENQRHBDUEPQQ9BD4EOQQgAD8EQAQ4BEAEPgQ0BD4EOQQsACAARwRCBD4EMQRLBCAAQQRCBDAE QgRMBCAANwQ0BD4EQAQ+BDIESwQ8BDgEIABHBDsENQQ9BDAEPAQ4BCAAPQQ+BDIEPgQ5BCAAMwQ7 BD4EMQQwBDsETAQ9BD4EOQQgAEEENQQ8BEwEOAQuACAADQAgABIEIABBBDsEQwRHBDAENQQgAEEE QgRABDAEPQQtACAATwRABDoEOARFBCAAPwRABD4EQgQ4BDIEPQQ4BDoEPgQyBCAANwQwBD8EMAQ0 BDAEKAAyBCAAPgRBBD0EPgQyBD0EPgQ8BCAAOARBBDsEMAQ8BEEEOgQ4BEUEKQAgADIEPgQ3BDwE PgQ2BD0EMAQgAEEEOAQ7BEwEPQQwBE8EIAA/BD4ENAQ0BDUEQAQ2BDoEMAQuACAAIwQ2BDUEIAA+ BDEEOwQwBDQEMARPBCAAOgQ+BD0ERgQ1BD8EQgRDBDAEOwRMBD0EPgQ5BCAANwQwBEkEOARCBD4E OQQsACAAOAQ8BCAAMQRDBDQENQRCBCAAPQQwBDwEPQQ+BDMEPgQgAD8EQAQ+BEkENQQgAD0ENQRB BEIEOAQgADgENAQ1BDgEIABBBDIEPgQxBD4ENARLBCAAMgQgAEEEMgQ+BDgERQQgAEEEQgRABDAE PQQwBEUELgAgAC0EQgQ+BCAAPwQ1BEAEMgRLBDUEIAA6BDAEPQQ0BDgENAQwBEIESwQgAD0EMAQg ADIEPwQ4BEEESwQyBDAEPQQ4BDUEIAAyBCAAQQQ/BEAEMAQyBDUENAQ7BDgEMgRDBE4EIABBBDgE QQRCBDUEPARDBCAAOAQ9BEIENQRABDUEQQQ+BDIEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCAAOAQg ADEEPgRABEwEMQRDBCAAQQQgADMEOwQ+BDEEMAQ7BDgEQQRCBDAEPAQ4BC4ADQAtACAAQQRCBEAE MAQ9BEsEIAA4BCAAPQQwBEAEPgQ0BEsEIABBBDsEMAQyBE8EPQRBBDoEPgQ5BCAAMwRABEMEPwQ/ BEsEDQAgACEEOwQwBDIETwQ9BDUELAAgADoEMAQ6BCAAPQQwBEAEPgQ0BEsEIABBBDAEPARLBDUE IAAxBDsEOAQ3BDoEOAQ1BCAAOgQgADQEQAQ1BDIEPQQ1BDkEIAATBDgEPwQ1BEAEMQQ+BEAENQQ1 BCAAOAQgAD0ENQRBBEMESQQ4BDUEIAA1BDUEIAA0BEMERQQsACAAPAQ+BDMEQwRCBCAAOAQgADQE PgQ7BDYEPQRLBCAAQQRCBDAEQgRMBCAAMgQgAEEEMgQ+BDgERQQgAEEEQgRABDAEPQQwBEUEIAAx BD4EQARGBDAEPAQ4BCAANwQwBCAAQQQyBD4EMQQ+BDQEQwQsACAAPQQ1BEEEQgQ4BCAAQQQ7BDAE MgRDBCAAOAQgAD8EQAQ+BEYEMgQ1BEIEMAQ9BDgENQQgADIEQQQ1BDwEQwQgADwEOARABEMELgAN AC0AIABABEMEQQRBBDoEOAQ5BCAAPQQwBEAEPgQ0BA0AIAAgBEMEQQRMBCAANQRBBEIETAQgAEYE OAQyBDgEOwQ4BDcEMARGBDgETwQtAD4EQQQ9BD4EMgQwBCwAIAA+BDEEQAQwBDcEQwROBEkEMARP BCAAHQQ+BDIEQwROBCAAEwQ4BD8ENQRABDEEPgRABDUETgQgAD8EPgQgAD8EQAQwBDIEQwQgACAE PgQ0BDAEIAA4BCAAMgQgAEEEOAQ7BEMEIAA0BEMERQQwBCAAQQAuACAAIARDBEEEQQQ6BDgEOQQg AD0EMARABD4ENAQsACAAOgQwBDoEIAAzBDsEMAQyBD0ESwQ5BCAAPwRABDAEMgQ+BD8EQAQ1BDUE PAQ9BDgEOgQgAEEEOwQwBDIETwQ9BCwAIAAwBEAEOAQ1BDIEIAA4BCAAMwQ4BD8ENQRABDEEPgRA BDUENQQyBCwAIAA0BD4EOwQ2BDUEPQQgAD0ENQRBBEIEOAQgADgEIABDBDwEPQQ+BDYEMARCBEwE IAA9BDAEQQQ7BDUENAQ4BDUELAAgADcEMAQyBDUESQQwBD0EPQQ+BDUEIAA/BEAENQQ0BDoEMAQ8 BDgELAAgAE8EMgQ4BEIETAQgAD0EPgQyBEMETgQgADMEOwQ+BDEEMAQ7BEwEPQRDBE4EIAAmBDgE MgQ4BDsEOAQ3BDAERgQ4BE4ELAAgAEEEQgQwBEIETAQgAB8EPgQxBDUENAQ+BD0EPgRBBEYENQQ8 BCwAIAA+BEEEQgRABDgENQQ8BCAAOgQ+BD8ETARPBC0APwRABDAEMgQ0BEsELAAgAD8EQAQ+BEIE SwQ6BDAETgRJBDUEMwQ+BCAAMwQ+BDsEPgQyBEMEIAAjBEAEPgQxBD4EQAQ+BEEEMAQtACAAPQQ1 BD0EMARBBEsEQgQ9BD4EMwQ+BCAANwQ8BDUETwQsACAAPwQ+BDUENAQwBE4ESQQ1BDMEPgQgADgE IABABDAENwRABEMESAQwBE4ESQQ1BDMEPgQgAEEEMAQ8BD4EMwQ+BCAAQQQ1BDEETwQgADgEIAAy BDUEQQRMBCAAPAQ4BEAELgAgABIEPgRBBEEEQgQwBD0EPgQyBDgEMgQgADgEIAA/BEAEOAQ9BE8E MgQgAD0EMARBBDsENQQ0BDgENQQgAD8EQAQ1BDQEOgQ+BDIELAAgADwESwQgADQEPgQ7BDYEPQRL BCAAPwRABDgEMgQ1BEEEQgQ4BCAAQQQ1BDEETwQgADoEIAA9BD4EMgQ+BDwEQwQgADwEOARABD4E MgQ+BDcENwRABDUEPQQ4BE4ELAAgAD4EQQQyBD4EMQQ+BDQEOARCBEwEIAA9BDAESAQ4BCAAQQRC BEAEMAQ9BEsEKAAgBD4EQQRBBDgETwQsACAAIwQ6BEAEMAQ4BD0EMAQgADgEIAARBDUEOwQ+BEAE QwRBBEEEOARPBCkAIAA+BEIEIAA/BD4EQAQ+BEcEPQRLBEUEIAA3BDAEMgQ4BEEEOAQ8BD4EQQRC BDUEOQQgAD4EQgQgADsEPgQ2BD0ESwRFBCAANwQ9BDAEPQQ4BDkELAAgADwEOARABD4EPwQ+BD0E OAQ8BDAEPQQ4BE8EIAA4BCAAOAQ0BDUEPgQ7BD4EMwQ4BDkEIAA4BCAANAQwBEIETAQgAEIEPgQg ADYENQQgAEEEMAQ8BD4ENQQgADIEQQQ1BDwEIAA0BEAEQwQzBDgEPAQgAD0EMARABD4ENAQwBDwE IAA/BDsEMAQ9BDUEQgRLBCwAIAAyBD0ENQQgADcEMAQyBDgEQQQ4BDwEPgRBBEIEOAQgAD4EQgQg AEAEMAQ3BDQENQQ7BDUEPQQ4BE8EIAA4BCAAQQQ7BD4ENgQ9BD4EQQRCBDUEOQQsACAATwQyBDgE MgQgAEIEMAQ6BDgEPAQgAD4EMQRABDAENwQ+BDwEIAA9BDAESAQ4BCAAPQQwBEEEQgQ+BE8ESQQ4 BDUEIABABEMEQQRBBDoEOAQ1BCAAOwROBDEEPgQyBEwEIAA4BCAANARDBEUEIAA0BD4EMQRABDAE IAA4BCAAQQQ/BEAEMAQyBDUENAQ7BDgEMgQ+BEEEQgQ4BC4ADQAgABEENQQ7BD4EQARDBEEEQQQ4 BE8EIAA4BCAAIwQ6BEAEMAQ4BD0EMAQsACAAPQQwBEEENQQ7BDUEPQQ9BEsENQQgAEAEQwRBBEEE OgQ4BDwEOAQgADQEPgQ7BDYEPQRLBCAANwQwBD0ETwRCBEwEIABBBDIEPgQ1BCAAPAQ1BEEEQgQ+ BCAAQARPBDQEPgQ8BCAAQQQgAEAEPgRBBEEEOARPBD0EMAQ8BDgELgAgACMEOgRABDAEOAQ9BDAE IAA0BD4EOwQ2BD0EMAQgADIEPQRPBEIETAQgACAEPgRBBEEEOAQ4BCAAMgQgADUEUQQgAEEEQgRA BDUEPAQ7BDUEPQQ4BDgEIAA6BCAAPAQ4BEAEQwQgADgEIAA1BDQEOAQ9BDUEPQQ4BE4EIAA+BDQE PQQ+BDMEPgQgAEAEQwRBBEEEOgQ+BDMEPgQgAD0EMARABD4ENAQwBCwAIABABDAENwQ0BDUEOwQ1 BD0EPQQ+BDMEPgQgAEEEQgRABDAEPQQwBDwEOAQsACAAPgRBBDsEMAQxBDsENQQ9BD0EPgQzBD4E LAAgADQENQQ3BD4EQAQ4BDUEPQRCBDgEQAQ+BDIEMAQ9BD0EPgQzBD4EIAA4BCAAQwRPBDcEMgQ4 BDwEPgQzBD4EIAA6BCAAMARCBDAEOgQwBDwEIAAyBEAEMAQzBDAELgAgABQESwQ8BCAAOAQ9BEQE PgRABDwEMARGBDgEPgQ9BD0EPgQ5BCAAMgQ+BDkEPQRLBCAAQAQwBEEEQQQ1BDUEQgRBBE8EIAA4 BCAAIwQ6BEAEMAQ4BD0ENQQsACAAPgRHBD0EQwQyBEgENQQ5BEEETwQgADgEIABDBDcEQAQ1BDIE SAQ1BDkEIABBBEMEQgRMBCAAMgQ1BEkENQQ5BCwAIAA/BEAENQQ0BEEEQgQ+BDgEQgQgAD8EQAQ+ BDkEQgQ4BCAAMgRBBDUEIABCBD4EIAA2BDUEIABBBDAEPAQ+BDUELAAgAEcEQgQ+BCAAOAQgACAE PgRBBEEEOAQ4BCwAIAAyBCAAPQQwBEcEMAQ7BDUEIABABDAENwQ+BDEEQAQwBDIEIAA3BDAEMgQw BDsESwQgADIEIABBBDIEPgQ1BDwEIABBBDUEQAQ0BEYENQQgADgEIAA+BEEEPgQ3BD0EMAQyBCAA OwQ+BDYEPQQ+BEEEQgRMBCAANwQwBD8EMAQ0BD0ESwRFBCAARgQ1BD0EPQQ+BEEEQgQ1BDkELQAg AD4EQgQgADsEOAQxBDUEQAQwBDsEOAQ3BDwEMAQsACAAOgQ+BEIEPgRABEsEOQQgADsEOARIBEwE IABBBDsENQQ0BEEEQgQyBDgENQQgAD4ESAQ4BDEEPgRHBD0EPgQzBD4EIAA/BD4EPQQ4BDwEMAQ9 BDgETwQgAEcENQQ7BD4EMgQ1BDoEMAQoADoEMAQ6BCAAOAQ9BDQEOAQyBDgENAQwBCwAIAAzBDsE MAQyBD0EPgQ5BCAARgQ1BD0EPQQ+BEEEQgRMBE4EIAA6BD4EQgQ+BEAEPgQzBD4EIAA1BEEEQgRM BCAAOAQ9BEIENQRABDUEQQRLBCAANQQzBD4EIABCBDUEOwQwBCAAOAQgADsEOARHBD0EPgRBBEIE OAQpACAANAQ+BCAAMQRDBDoEMgQwBDsETAQ9BD4EIABCBDAEOgQ4BEUEIAA0BEAENQQyBD0EOARF BCAAIgBGBDUEPQQ9BD4EQQRCBDUEOQQiACwAIAA6BDAEOgQgAD8EPgQ7BD4EMgRLBDUEIAA4BDcE MgRABDAESQQ1BD0EOARPBCwAIAA/BD4EQgRABDUEMQQ7BDUEPQQ4BDUEIAA9BDAEQAQ6BD4EQgQ4 BDoEPgQyBCAAOAQgAEEEMgQ+BDEEPgQ0BD0EPgQzBD4EIABBBDUEOgRBBDAELAAgAD8EQAQ4BEEE QwRJBDgERQQgADIEQQQ1BDwEQwQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDwEQwQgADwEOARABEMELAAg ADcEMAQgADgEQQQ6BDsETgRHBDUEPQQ4BDUEPAQgADwEQwRBBEMEOwRMBDwEMAQ9BC4ADQANACAA IAAgACAAIAAgACAAVgAyBCkAIAAdBD4EMgQ+BDUEIAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0EOAQ1 BA0AIAAUBDUEPAQ+BD0EPgQ/BD4EOwQ4BDcEMARGBDgETwQgADgEIAA/BEAEPgQ3BEAEMARHBD0E PgRBBEIETAQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDkEIAAyBDsEMARBBEIEOAQsACAANwQ9BDAEPQQ4 BDkEIAA4BCAANAQ1BD0ENQQzBCAAMgQ1BDQEQwRCBCAAPQQ1BCAAQgQ+BDsETAQ6BD4EIAAyBCAA NARABEMEMwRDBE4EIABABDUEMAQ7BEwEPQQ+BEEEQgRMBCwAIAA9BD4EIAA4BCAAOgQgAD0EPgQy BD4EPARDBCAAMwQ7BD4EMQQwBDsETAQ9BD4EPARDBCAAPAQ4BEAEPgQyBD4ENwQ3BEAENQQ9BDgE TgQuACAAJgQ1BD0EOARCBEEETwQgADIEIABCBDAEOgQ+BDwEIAA+BDEESQQ1BEEEQgQyBDUEIAA3 BDQEPgRABD4EMgQwBE8EIABHBDUEOwQ+BDIENQRHBD0EPgRBBEIETAQgADIEIAAyBDgENAQ1BCAA PQQ1BCAAPQQwBDIETwQ3BEsEMgQwBDUEPAQ+BDMEPgQgAD0EMARBBDgEOwRMBD0EPgQgADIENwQw BDgEPAQ+BDIESwQzBD4ENAQ9BD4EMwQ+BCAAQQQ+BEIEQARDBDQEPQQ4BEcENQRBBEIEMgQwBCAA OAQgAEAEMAQ3BEAENQRIBDUEPQQ4BDUEIAA6BD4EPQREBDsEOAQ6BEIEPgQyBCAAPQQwBCAAQwRA BD4EMgQ9BDUEIAA+BDEESQQ1BDkEIABBBDgEQQRCBDUEPARLBCAARgQ1BD0EPQQ+BEEEQgQ1BDkE LgAgABIEQQQ7BDUENARBBEIEMgQ4BDUEIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BDgEIAA9BDAEQAQ6 BD4EQgQ4BDoEPgQyBCAAOAQgADgENwQxBDAEMgQ7BDUEPQQ4BE8EIAA+BEIEIAA4BEUEIAAyBDsE OARPBD0EOARPBCAAPQQwBCAAQwQ8BEsELAAgAEMEIAA8BD0EPgQzBDgERQQgADcEMARABDAEMQQ+ BEIEMAROBEIEIAA8BD4ENwQzBDgEIAA4BCAAPgQxBEkENQQ1BCAAPwRABD4EQQQyBDUEQgQ7BDUE PQQ4BDUELAAgADQENQQ5BEEEQgQyBEMETwQgADIEIABCBDUERwQ1BD0EOAQ1BCAANAQ7BDgEQgQ1 BDsETAQ9BD4EMwQ+BCAAMgRABDUEPAQ1BD0EOAQsACAAPwRABDgEMgQ1BDQENQRCBCAAOgQgAD4E OgQ+BD0ERwQwBEIENQQ7BEwEPQQ+BDwEQwQgAD8ENQRABDUERQQ+BDQEQwQgADoEIABHBDUEOwQ+ BDIENQQ6BEMEIABBBDIENQRABEUEQAQwBDcEQwQ8BD0EPgQ8BEMEIAA4BCAAPQQwBEcEMAQ7BEME IABNBD8EPgRFBDgEIAAyBEEENQQ+BDEESQQ1BDkEIAA9BEAEMAQyBEEEQgQyBDUEPQQ9BD4EQQRC BDgEIAA4BCAAPwRABD4ERgQyBDUEQgQwBD0EOARPBC4AIAAbBDUEMwQwBDsEOAQ3BDAERgQ4BE8E IAA3BDQENQRBBEwELAAgADoEMAQ6BCAAQQQ/BDUERgQ4BDAEOwRMBD0EPgQgAD8EPgQ0BEcEUQRA BDoEOAQyBDAEOwQ+BEEETAQgADIESwRIBDUELAAgAD4ENwQ9BDAERwQwBDUEQgQgAEEEOARBBEIE NQQ8BEMEIAA8BDUEQAQgADIEIAA3BDAEOgQ+BD0ENQQgADgEIAA6BEMEOwRMBEIEQwRABDUELAAg AD0EMAQ/BEAEMAQyBDsENQQ9BD0EQwROBCAAPQQwBCAAMgRLBDwESwQyBDAEPQQ4BDUEIAA9BDAE QAQ6BD4EQgQ4BDoEPgQyBCAAOAQ3BCAAPgQxBEkENQRBBEIEMgQwBC4AIAAbBDUEMwQwBDsEOAQ3 BDAERgQ4BE8EIAA8BD4EPQQ+BD8EPgQ7BDgEOQQgAD4ENwQ9BDAERwQwBDUEQgQgAEEEPgQ+BEIE MgQ1BEIEQQRCBDIENQQ9BD0EPgQgAEIEPgQ2BDUEIABBBDgEQQRCBDUEPARDBCAAPAQ1BEAELAAg AD0EPgQgAD0EMAQ/BEAEMAQyBDsENQQ9BD0EQwROBCAAPQQwBCAAMgRLBDwESwQyBDAEPQQ4BDUE IAAiADwEPgQ9BD4EPwQ+BDsEOAQ5BCIALgAgACIAHQQwBEAEOgQ+BEIEOAQ6BDgEIgAgADIEIABI BDgEQAQ+BDoEPgQ8BCAAQQQ8BEsEQQQ7BDUEIAA3BDQENQRBBEwEIAA+BDcEPQQwBEcEMAQ1BEIE IAA7BE4EMQQ+BDkEIAAwBEEEPwQ1BDoEQgQgADwEOARABDAELAAgAD4EMQQ7BDAENAQwBE4ESQQ4 BDkEIAA0BDIEQwQ8BE8EIABBBDIEPgQ5BEEEQgQyBDAEPAQ4BC0AIAAgAD0EMAQ9BD4EQQQ4BEIE TAQgADEEPgQ7BDUENQQgADgEOwQ4BCAAPAQ1BD0ENQQ1BCAATwQyBD0ESwQ5BCAAMgRABDUENAQg ADQEOwRPBCAAMQQ+BDsETAQ9BD4EMwQ+BCAAPQQwBEAEOgQ+BEIEOARHBDUEQQQ6BD4EOQQgADcE MAQyBDgEQQQ4BDwEPgRBBEIETAROBCAAOAQgADIESwQ3BEsEMgQwBEIETAQgADcEMAQyBDgEQQQ4 BDwEPgRBBEIETAQuACAAEgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAAIgA/BEAEPgQ0BEMEOgRCBEsE IAA/BDgEQgQwBD0EOARPBCIALAAgACIAQwRBBDsEQwQzBDgEIgAgAD4EMQRJBDUEQQRCBDIENQQ9 BD0ESwRFBCAAPgRABDMEMAQ9BDgENwQwBEYEOAQ5BCAAOAQgADcEMAQyBDUENAQ1BD0EOAQ5BCwA IAA4BCAAMgQ+BD4EMQRJBDUELQAgADsETgQxBEsENQQgAE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ4 BDUEIAA4BCAAPQQ1BE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ4BDUEIAAiADEEOwQwBDMEMAQiACwA IAA+BDEEOwQwBDQEMAROBEkEOAQ1BCAATQRCBDgEPAQ4BCAAQQQyBD4EOQRBBEIEMgQwBDwEOAQ6 ACAAMgRLBDcESwQyBDAEQgRMBCAANwQwBDIEOARBBDgEPAQ+BEEEQgRMBCAAOAQgAD0EMAQ9BD4E QQQ4BEIETAQgAEEEOARBBEIENQQ8BDAEQgQ4BEcENQRBBDoEOAQ5BCAAMgRABDUENAQgADcENAQ+ BEAEPgQyBEwETgQuACAAHAQ+BD0EPgQ/BD4EOwQ4BDgEIABCBD4ENgQ1BCAAPwQ+BD8EMAQ0BDAE TgRCBCAAMgQgAE0EQgQ+BCAAPgQ/BEAENQQ0BDUEOwQ1BD0EOAQ1BCwAIABCBD4EOwRMBDoEPgQg ADIEQAQ1BDQEIAA4BCAAPwRABDgEMgRLBDoEMAQ9BDgENQQgAD4EPQQ4BCAAMgRLBDcESwQyBDAE TgRCBCAAQwQgADIEQQQ1BDMEPgQgAD4EMQRJBDUEQQRCBDIEMAQsACAAQQQyBE8ENwQwBD0EPQQ+ BDMEPgQgAEEEIABABEsEPQQ6BD4EPAQsACAAQQRABDAENwRDBCAAPwQ+BEEEOwQ1BCAAPQQwBEcE MAQ7BDAEIAA8BD4EPQQ+BD8EPgQ7BEwEPQQ+BDkEIAA0BDUETwRCBDUEOwRMBD0EPgRBBEIEOAQu ACAAEwQ7BD4EMQQwBDsETAQ9BEsENQQgADwEPgQ9BD4EPwQ+BDsEOAQ4BCgAMgQ7BDAEQQRCBDgE LAAgADcEPQQwBD0EOARPBCwAIAA0BDUEPQQ1BDMELAAgAEEEOAQ7BEsEKQAgADIEQAQ1BDQETwRC BCAAMwQ7BD4EMQQwBDsETAQ9BD4EIAAyBEEENQQ8BC4AIAAeBD0EOAQgAD0ENQQgAEEEOgQ7BD4E PQQ9BEsEIAA6BCAAPwQ+BDIESwRIBDUEPQQ4BE4EIAA6BDAERwQ1BEEEQgQyBDAEIAA/BEAEPgQ4 BDcEMgQ+BDQEQQRCBDIEMAQsACAAQwQyBDUEOwQ4BEcEOAQyBDAETgRCBCAARgQ1BD0EQwQgAD0E MAQgADoEPgQ9BDUERwQ9BEsEOQQgAD8EQAQ+BDQEQwQ6BEIEIAA4BCAAQwQ8BDUEPQRMBEgEMARO BEIEIAA/BEAEPgQ4BDcEMgQ+BDQEQQRCBDIEPgQsACAAQgQ+BEAEPAQ+BDcETwQgAEAEPgRBBEIE IAAyBEEENQQ5BCAATQQ6BD4EPQQ+BDwEOAQ6BDgEIAAyBCAAQQQ7BEMERwQwBDUEIAA6BDsEMARB BEEEOARHBDUEQQQ6BDgERQQgADwEPgQ9BD4EPwQ+BDsEOAQ5BC4AIAASBCAAQQQ7BEMERwQwBDUE IAA8BD4EPQQ+BD8EPgQ7BDgEOAQgAD0EMAQgAD0ENQRNBDoEPgQ9BD4EPAQ4BEcENQRBBDoEOAQ1 BCAAMQQ7BDAEMwQwBCwAIABCBDAEOgQ4BDUEIAA6BDAEOgQgADcEPQQwBD0EOARPBCwAIAA/BEAE MAQyBDQEQwQsACAAIAQ+BDQEIAA4BCAARwQ1BDsEPgQyBDUERwQ9BD4EQQRCBEwELAAgAEAEPgRB BEIEIAA+BDEESQQ1BEEEQgQyBDAEIAA3BDAEPAQ1BD0ETwQ1BEIEQQRPBCAAPwQ+BEAEPgRHBD0E SwQ8BCAAQAQwBDcEMgQ4BEIEOAQ1BDwEIABBBEIEMAQ0BDAEIAAxBDAEQAQwBD0EPgQyBCwAIAAx BDUENwQgADwESwRBBDsENQQ5BCAAOAQgAEEEPgQyBDUEQQRCBDgELAAgAEAEPgQ0BDAEIAA4BCAA PwQ7BDUEPAQ1BD0EOAQsACAAOgQ+BEIEPgRABEsERQQgAD8EPgRBBEIEPgRPBD0EPQQ+BCAAPwRA BDgEPQQ+BEEETwRCBCAAMgQgADYENQRABEIEMgRDBCAAQAQwBDQEOAQgADQEMAQ7BEwEPQQ1BDkE SAQ1BDMEPgQgADEENQRBBEEEPARLBEEEOwQ1BD0EPQQ+BDMEPgQgAEAEMAQ3BDIEOARCBDgETwQs ACAAMgQgADoEPgQ9BDUERwQ9BD4EPAQgADgEQgQ+BDMENQQsACAAQAQwBEEEPwQwBDQEMAQgADgE IABBBDwENQRABEIEOAQuAA0AIAAfBD4EOwQgADIENQQ6BDAEIAA9BDAENwQwBDQEIAA9BDAERwQw BDsEMARBBEwEIAAwBDMEQAQ1BEEEQQQ4BDIEPQQwBE8EIAAwBDsEOgQ+BDMEPgQ7BDgENwQwBEYE OARPBCAAIAQ+BEEEQQQ4BDgEIAA4BCAAQQQ1BDkERwQwBEEEIAAxBD4EOwQ1BDcEPQRMBCAAQAQy BDUEQgQgAD0EMAQgAEcEMARBBEIEOAQgADoEPgQzBDQEMAQtAEIEPgQgAEEEPwQ7BD4ERwQ1BD0E PQRLBDkEIABABEMEQQRBBDoEOAQ5BCAAPQQwBEAEPgQ0BC4AIAAQBDsEOgQ+BDMEPgQ7BEwELQAg ADwEPgRJBD0ESwQ5BCAAPQQwBEAEOgQ+BEIEOAQ6BCwAIABBBEAEMAQyBD0EOAQ8BEsEOQQgAD8E PgQgAEIETwQ2BDUEQQRCBDgEIABBBCAAOgQ+BDoEMAQ4BD0EPgQ8BCAAOAQgADMENQRABD4EOAQ9 BD4EPAQsACAAOAQ0BDUEMAQ7BEwEPQQ+BDUEIAA+BEAEQwQ2BDgENQQgADMENQQ9BD4ERgQ4BDQE MAQgAD0EMARABD4ENAQ+BDIELAAgAEcEQgQ+BCAANAQ+BDoEMAQ3BDAEOwQgADoEPgQ9BDUERgQg AFgAWAAgADIENQQ6BDAEIAAgBD4EQQRBBDgEOAQuACAAEgQgAD8ENQRABDgEPgQ0BCAAQQQgADYA MABFBCAAOAQgADQEPgQgAD0EMARBBEIEPgRPBEkENQQzBD4EIAAyBEAENQQ8BDUEPQQ4BCAAQwRA BD4EMgQ1BD0ETAQgAD8EPgRCBEAENQQxBDsENQQ9BDgETwQgADAEOwQ6BD4EMwQ+BDsETwQgADIE SwRABD4EQQQgAEEEIAA9BDUENwQ9BDAERwQ4BEIENQQ7BEwEPQQ+BDMEPgQgADIEIAAhBCEEIQQg BCAAQQQ1BEAENQQ0BDgEPQRLBCAAMgQ1BDoEMAQgADQEPgQgAEEEPQRPBEIEOARPBCAANwQwBD8E QAQ1BEIEMAQgAD0EMAQgAEIEPgRABDMEPgQyBDsETgQgADAEOwQ6BD4EMwQ+BDsETAQ9BD4EOQQg AD8EQAQ+BDQEQwQ6BEYEOAQ1BDkEIAA0BD4EIAB+ADEANQA7BDgEQgRABD4EMgQgAEcEOARBBEIE PgQzBD4EIABBBD8EOARABEIEMAQgAD0EMAQgAEcENQQ7BD4EMgQ1BDoEMAQgADIEIAAzBD4ENAQg AD8EPgQgAD4ERAQ4BEYEOAQwBDsETAQ9BD4EOQQgADgEIAA0BD4EIAAyADAALQAyADUAOwQ4BEIE QAQ+BDIEIABBBD8EOARABEIEMAQgADIEIAAzBD4ENAQgAEMEIAA0BEAEQwQzBDgERQQgADgEQQRB BDsENQQ0BD4EMgQwBEIENQQ7BDUEOQQ7ACAAMwQ7BDAEMgQ9BD4ENQQoACEAKQAtACAAPQQ1BCAA QQQ8BD4EQgRABE8EIAA9BDAEIAAiADMEQwQ8BDAEPQQ9BEsEOQQgADgEIAA0BDUEPAQ+BDoEQAQw BEIEOARHBDUEQQQ6BDgEOQQgADwEOARABCIALAAgACIAOARBBDoEOwROBEcEOARCBDUEOwRMBD0E PgQgAEEEMgQ+BDEEPgQ0BD0ESwQ5BCIAIAA4BCAAPgRCBEEEQwRCBEEEQgQyBDgENQQgADMEPgRA BE8ERwQ4BEUEIAAyBD4EOQQ9BCAANAQ7BDgEQgQ1BDsETAQ9BD4ENQQgADIEQAQ1BDwETwQgACAA OAQgAD8EQAQuACAAEgQgADwEOARABD0EPgQ1BCAANgQ1BCAAMgRABDUEPARPBCAAMAQ7BDoEPgQz BD4EOwRMBCAAQwQ9BDgERwRCBD4ENgQwBDUEQgQgADEEPgQ7BEwESAQ1BCAAPQQwBEAEPgQ0BEME LAAgAEcENQQ8BCAAMgQgAEEENQRABEwENQQ3BD0EPgQ5BCAAMwQ+BEAETwRHBDUEOQQgADIEPgQ5 BD0ENQQuACAAGgQwBDYENARLBDkEIAAzBD4ENAQgADwESwQgAD8ENQRABDUENgQ4BDIEMAQ1BDwE IABCBEAEMAQzBDUENAQ4BE4ELAAgAE0EOgQyBDgEMgQwBDsENQQ9BEIEPQRDBE4EIABFBD4EOwQ+ BDoEPgRBBEIEQwQsACAAQgQyBD4EQAQ4BDwEPgQ8BEMEIABEBDAESAQ4BEEEQgQwBDwEOAQgADIE IAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAMgQ7BDAEQQRCBDgELgAgAB8EPgQgAEEEMAQ8BEsEPAQg AEEEOgRABD4EPAQ9BEsEPAQgAD8EPgQ0BEEERwQ1BEIEMAQ8BCwAIAA/BEAEOAQgAEIENQQ6BEME SQQ1BDwEIABDBEAEPgQyBD0ENQQgAD8EPgRCBEAENQQxBDsENQQ9BDgETwQsACAAPgQ9BCAAQwQx BDgEMgQwBDUEQgQgAD4EOgQ+BDsEPgQgADAALgA1ADwEOwQ9BC4AIABHBDUEOwQ+BDIENQQ6BCAA PQQwBCAAQgQ1BEAEQAQ4BEIEPgRABDgEOAQgAEEEPgQyBEAENQQ8BDUEPQQ9BD4EOQQgACAEPgRB BEEEOAQ4BCAANQQ2BDUEMwQ+BDQEPQQ+BCgAMAQgADcEMAQgADUAMAAgADsENQRCBCAAPwQ+BDsE QwRHBDAENQRCBEEETwQgAD4EOgQ+BDsEPgQgADIANQA8BDsEPQR+ACAAMgAwACUAPQQwBEEENQQ7 BDUEPQQ4BE8EIABBBDUEMwQ+BDQEPQRPBEgEPQQ1BDkEIAAgBD4EQQRBBDgEOAQpACwAIABNBEIE PgQgADoEPgQ7BDgERwQ1BEEEQgQyBD4EIAA9BDUEIAA/BEAENQQ0BEEEQgQwBDIEOAQ8BD4EIAA/ BD4EIAA8BDAEQQRIBEIEMAQxBDAEPAQgAEEEPgQyBEAENQQ8BDUEPQQ9BEsERQQgADMEPgRABE8E RwQ4BEUEIAAyBD4EOQQ9BC4AIAAtBEIEPgQgAEcEQwQ0BD4EMgQ4BEkEPQQwBE8EIAA6BDAENwQ9 BEwELQAgADYENQRABEIEMgQwBCAAQARDBEEEQQQ6BDgERQQgADsETgQ0BDUEOQQgAD0ENQQ9BDAE QQRLBEIEPQQ+BDwEQwQgADQENQQ8BD4EPQRDBCwAIAA9BDUEPQQwBDIEOAQ0BE8ESQQ1BDwEQwQg AD0EMARBBCAAOAQgADwENQRHBEIEMAROBEkENQQ8BEMEIAA4BEEEQgRABDUEMQQ4BEIETAQsACAA RwRCBD4EMQRLBCAAPQQ1BCAAPAQ1BEgEMAQ7BDgEIAA1BDwEQwQgAEEEQgRABD4EOARCBEwEIAA/ BDgEQAQwBDwEOAQ0BEMEIAA4BDcEIABBBDIEPgQ4BEUEIABABDAEMQQ+BDIEIAA4BCAAQAQwBDEE PgQyBDsEMAQ0BDUEOwRMBEcENQRBBDoEPgQ5BCAAMgQ7BDAEQQRCBDgELgAgABAEOwQ6BD4EMwQ+ BDsETAQgADEENQRBBEEEPwQ+BEAEPQQ+BCAAPgQ/BEAEMAQyBDQESwQyBDAENQRCBCAAQQQyBD4E TgQgAE0ERAREBDUEOgRCBDgEMgQ9BD4EQQRCBEwELQAgADcEMAQgAD8EPgQ7BCAAMgQ1BDoEMAQg ACAEPgRBBEEEOARPBCAAQQQ/BDsEMAQyBDgEOwQwBEEETAQgADIEIAA6BD4EPAQgABgEMgQwBD0E PgQyBC0AMQQwBEAEMAQ9BD4EMgQgADEENQQ3BCAAQAQ+BDQEMAQgADgEIAA/BDsENQQ8BDUEPQQ4 BCwAIAA+BDEENQRBBEEEOAQ7BDgEOwQwBCAAOAQgAD8EQAQ1BDIEQAQwBEIEOAQ7BDAEQQRMBCAA MgQgAD0EOARJBEMETgQgAEEEQgRABDAEPQRDBCwAIABDBD8EPgRCBEAENQQxBDsETwROBEkEQwRO BCAANQRJBDUEIAAxBD4EOwRMBEgENQQgAD0EMARABDoEPgRCBDgEOgQ+BDIELAAgAEIEPgQzBD4E IAA2BDUEIAAwBDsEOgQ+BDMEPgQ7BE8ELAAgAEIEMAQxBDAEOgQwBCwAIAAwBDwEPgRABDAEOwRM BD0EPgQ5BCAAPwRABD4EPwQwBDMEMAQ9BDQESwQsACAAMgRLBDcESwQyBDAETgRJBDUEOQQsACAA OgQwBDoEIAA0BEAEQwQzBDgENQQgAD0EMARABDoEPgRCBDgEOgQ4BCwAIAAyBEAENQQ0BCAAOAQg ADcEMAQyBDgEQQQ4BDwEPgRBBEIETAQsACAAQQQ9BDgENgQwBE4ESQQ4BEUEIABEBDUEQARCBDgE OwRMBD0EPgRBBEIETAQsACAAQwQxBDgEMgQwBE4ESQQ4BEUEIAAxBEMENARDBEkEOARFBCAANAQ1 BEIENQQ5BC4AIAAcBEsEIABBBDAEPAQ4BCAANAQ1BEIEOAQgAEMENgQ1BCAAMQQ+BDsETAQ9BEsE RQQgAEAEPgQ0BDgEQgQ1BDsENQQ5BCwAIAA6BDAEOwQ1BDoEOAQsACAAOwQ4BEgEUQQ9BD0ESwQ1 BCAAOgRABDAEQQQ+BEIESwQsACAAQQQ4BDsESwQsACAAMwQ+BEAENAQ+BEEEQgQ4BCAAOAQgAEcE NQRBBEIEOAQuACAAHARLBCAAPwQ+BEIENQRABE8EOwQ4BCAAPAQ9BD4EMwQ+BCAAMgRBBDUEMwQ+ BCwAIABCBE8ENgQ1BDsEPgQgADEEPgQ7BEwEPQRLBCAAOAQgAD4EMQRPBDcEMAQ9BEsEIAA9BDAE RwQwBEIETAQgADsENQRHBDUEPQQ4BDUELAAgAEcEQgQ+BDEESwQgAD0ENQQgADgEQQRHBDUENwQ9 BEMEQgRMBCAAOAQ3BCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQgADIEIABCBDUERwQ1BD0EOAQ1BCAA MgQ1BDoEMAQuACAAHgQ0BD0EMAQ6BD4ELAAgAD0ENQRBBDwEPgRCBEAETwQgAD0EMAQgAE0ERARE BDUEOgRCBDgEMgQ9BD4EQQRCBEwEIAAwBDsEOgQ+BDMEPgQ7BEwEPQQ+BDMEPgQgADMENQQ9BD4E RgQ4BDQEMAQsACAAOARBBD8EPgQ7BEwENwRDBE4EQgRBBE8EIAAyBEEENQQgADIEPgQ3BDwEPgQ2 BD0ESwQ1BCAAQQQ/BD4EQQQ+BDEESwQgADgEQQRCBEAENQQxBDgEQgRMBCAAPQQwBEEELQAgAEAE MAQ3BDYEOAQzBDAEPQQ4BDUEIAA9BDUEPQQwBDIEOARBBEIEOAQsACAAQwQ9BDgERwRCBD4ENgQ1 BD0EOAQ1BCAAQAQ+BDQEMAQgADgEIABBBDUEPAQ1BDkEPQRLBEUEIABGBDUEPQQ9BD4EQQRCBDUE OQQsACAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ4BCAAOAQgAEEEOARBBEIENQQ8BD0EPgQ1BCAANwQw BDwEQwRBBD4EQAQ4BDIEMAQ9BDgENQQgAEIENQQ7BDAEIAA4BCAAQAQwBDcEQwQ8BDAELgAgAB8E PgQ/BEsEQgQ6BDgEIAA4BDcEMQQwBDIEOARCBEwEQQRPBCAAPgRCBCAANARDBEgENQQzBEMEMQQ6 BDgEIAA9BDAEQgQwBDsEOgQ4BDIEMAROBEIEQQRPBCAAPQQwBCAAPgRABDMEMAQ9BDgENwQ+BDIE MAQ9BD0EPgQ1BCAAPwRABD4EQgQ4BDIEPgRBBEIEPgRPBD0EOAQ1BCAAMwQ7BD4EMQQwBDsETAQ9 BD4EOQQgADIEOwQwBEEEQgQ4BDoAIABEBDgEPQQwBD0EQQQ4BEEEQgQ+BDIELAAgAD8EPgQ7BDgE QgQ4BDoEPgQyBCwAIAA/BEAEPgRHBDgERQQgADsETgQ0BDUEOQQgADIEPgQgADIEOwQwBEEEQgQ4 BCwAIAA4BDwENQROBEkEOARFBCAAMwQ7BD4EMQQwBDsETAQ9BEMETgQgAD8EPgQ0BDQENQRABDYE OgRDBCwAIAA4BEEEPwQ+BDsEPQRPBE4ESQQ4BEUEIAA0BDgEQAQ1BDoEQgQ4BDIEQwQgAD8EPgQg ADgEQQRCBEAENQQxBDsENQQ9BDgETgQgAD0EMARBBDsENQQ0BD0EOAQ6BD4EMgQgABMEOAQ/BDUE QAQxBD4EQAQ1BDgELgAgABUEQQRCBEwEIAA/BDsEMAQ9BCwAIAAyBEsEPwQ+BDsEPQQ4BEIETAQg ADUEMwQ+BCAAMgQ7BDAEQQRCBDgEIAA3BDAEPwQwBDQEPQQ+BDkEIABGBDgEMgQ4BDsEOAQ3BDAE RgQ4BDgEIAA/BD4EQQRCBDAEQAQwBE4EQgRBBE8EIAAyBD4EIABHBEIEPgQgADEESwQgAEIEPgQg AD0EOAQgAEEEQgQwBDsEPgQuACAAIAQ+BEEEQQQ4BE8EIABBBEIEQAQwBEgEPQRLBDkEIAAyBEAE MAQzBC0AIAA8BEsEIAA9BDUEPgQ0BD0EPgQ6BEAEMARCBD0EPgQgADQENQQ8BD4EPQRBBEIEQAQ4 BEAEPgQyBDAEOwQ4BCAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgRMBCAAPwQ+BDEENQQ2BDQEMARCBEwE LAAgADIESwQ2BDgEMgQwBEIETAQgADIEIABBBDAEPARLBEUEIABCBEAEQwQ0BD0ESwRFBCAAQwRB BDsEPgQyBDgETwRFBCAAOAQgAD4EQQRCBDAEMgQ7BE8EQgRMBCAAMgRLBDYEOAQyBEgEOARFBCAA IAA/BEAEPgRCBDgEMgQ9BDgEOgQ+BDIEIAA9BDgEIABBBCAARwQ1BDwELgANACAAIgRLBEEETwRH BDgEIAA7BDUEQgQgADIEPgQ5BD0ESwQgAEEEIAAzBDsEPgQxBDAEOwQ4BEEEQgQwBDwEOAQgADgE IAA4BEUEIAA9BDAEQAQ+BDQEMAQ8BDgELQA8BDAEQAQ4BD4EPQQ1BEIEOgQwBDwEOAQgADIESwQ8 BD4EQgQwBDsEOAQgAD0ENQQgAEIEPgQ7BEwEOgQ+BCAAIAQ+BEEEQQQ4BE4ELAAgAD0EPgQgADgE IAAyBDUEQQRMBCAAPAQ4BEAELAAgAD8EPgRBBEIEMAQyBDsENQQ9BD0ESwQ5BCAAPQQwBCAAMwRA BDAEPQRMBCAAMwQ7BD4EMQQwBDsETAQ9BD4EOQQgADoEMARCBDAEQQRCBEAEPgREBEsEIABHBDUE OwQ+BDIENQRHBDUEQQQ6BD4EOQQgADoEQwQ7BEwEQgRDBEAESwQsACAAPQQwBCAANgQ1BEAEQgQy BDUEPQQ9BEsEOQQgADAEOwRCBDAEQARMBCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ+BDwEQwQgADoE QwQ7BEwEQgRDBCAAMgQ7BDAEQQRCBDgEIAA4BCAAQAQwBDcENAQ1BDsENQQ9BDgETwQuACAAGgRD BDsETARCBEMEQAQ9BD4ENQQgAD8EPgRABDAEMQQ+BEkENQQ9BDgENQQgADgEIAA9BDAEQQQ4BDsE TARBBEIEMgQ1BD0EPQQwBE8EIABFBEAEOARBBEIEOAQwBD0EOAQ3BDAERgQ4BE8EIAA/BEAEOAQy BDUEOwQ4BCAAPQQwBEEEIAA6BCAAPwQ7BDAERwQ1BDIEPQQ+BDwEQwQgAEEEPgRBBEIEPgRPBD0E OAROBC4AIAAlBEAEOARBBEIEOAQwBD0EQQQ6BDAETwQgADgENAQ1BD4EOwQ+BDMEOARPBCAAQwRB BDgEOwQ4BDsEMAQgADgEIAAxBDUENwQgAEIEPgQzBD4EIAA/BDUERwQwBDsETAQ9BEsEOQQgAE0E RAREBDUEOgRCBCAAMAQ7BDoEPgQzBD4EOwQ4BDcEMARGBDgEOAQsACAAMAQgAEAEMAQ3BDQENQQ7 BDUEPQQ9BD4ENQQgADgEIAA+BDEEPAQwBD0EQwRCBD4ENQQgADwEOARABD4EMgQ+BDcENwRABDUE PQQ4BDUEIAA/BEAEOAQyBD4ENAQ4BEIEIAA9BDAEQQQgADIEIABBBD4EQQRCBD4ETwQ9BDgENQQs ACAAMgQgADoEPgRCBD4EQAQ+BDwEIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE8EIAA9BDAEQAQ6BD4E QgQ4BDoEPgQyBCwAIAAyBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA8BD4EPQQ+BD8EPgQ7BDgEOQQg AD0ENQQgADIEPgQ3BDwEPgQ2BD0EMAQgADIEIAA/BEAEOAQ9BEYEOAQ/BDUELgAgABcEMAQ/BDAE NAQ9BDAETwQgADsEPgQzBDgEOgQwBCAAPwRABDUENAQ7BDAEMwQwBDUEQgQgADQENQQ7BDgEQgRM BCAAMgRBBFEEIAA9BDAEIAA0BD4EMQRABD4EIAA4BCAANwQ7BD4EIAA4BCwAIAA/BD4ETQRCBD4E PARDBCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BCwAIAA9BDAEIABABDAENwRABDUESAQ4 BEIETAQgADgEOwQ4BCAANwQwBD8EQAQ1BEIEOARCBEwELgAgABIEMARABDgEMAQ9BEIEIAAiADsE NQQzBDAEOwQ4BDcEPgQyBDAEQgRMBCIAIAAyBEEENQQzBDQEMAQgAEEEOgRABEsEQgQsACAARQQ+ BEIETwQgAD8EQAQwBDIEOAQ7BEwEPQQwBE8EIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE8EIAAwBDsE OgQ+BDMEPgQ7BE8EIAA/BEAEOAQyBDUENAQ1BEIEIAA6BCAANQQzBD4EIAA4BEEERwQ1BDcEPQQ+ BDIENQQ9BDgETgQgADgENwQgADYEOAQ3BD0EOAQgAD4EMQRJBDUEQQRCBDIEMAQgADIEIABCBDUE RwQ1BD0EOAQ1BCAANAQyBEMERQQgAD8EPgQ6BD4EOwQ1BD0EOAQ5BC4AIAAfBEAEMAQyBDgEOwRM BD0EMARPBCAAOwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAAPQQ1BDsENQQzBDAEOwRMBD0ESwRFBCAA PQQwBEAEOgQ+BEIEOAQ6BD4EMgQgADIENQQ0BDUEQgQgADoEIAAwBDIEQgQ+BDwEMARCBDgERwQ1 BEEEOgQ+BDwEQwQgADgEQQRHBDUENwQ9BD4EMgQ1BD0EOAROBCAAOARFBCAAPwQ+BDQEPwQ+BDsE TAQ9BD4EMwQ+BCAAQARLBD0EOgQwBC4AIAAbBDUEMwQwBDsEOAQ3BDAERgQ4BE8EIAA9BDAENwQy BDAEPQQ9BEsERQQgAD8EQAQ1BEEEQgRDBD8EPQQ4BDoEMAQ8BDgEIAAcIDsENQQzBDAEOwRMBD0E SwQ8BDgEHSAgADAEOwQ6BD4EMwQ+BDsETwQgADgEIAAwBEEEPgRGBDgEMAQ7BEwEPQQ+BDkEIAA/ BEAEPgQ/BDAEMwQwBD0ENARLBCAAMgRLBDwESwQyBDAENQRCBCAAOARFBCAAOAQ3BCAAQgQ1BDsE MAQgACAEQwRBBDgEIAA4BCAANAQwBFEEQgQgADUEOQQgAD0EPgQyBD4ENQQgAEAEPgQ2BDQENQQ9 BDgENQQuACAAEAQgAD8EQAQwBDIEOAQ7BEwEPQQwBE8EIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE8E IAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIAAyBDsEMARBBEIEOAQg ADQEMARRBEIEIAA/BEMEQgRMBCAAMgQgAB0EPgQyBEsEOQQgABwEOARABC4ADQANACAAIAAgACAA IAAgACAAVgAzBCkAIAAdBDAERwQwBDsEPgQgAD0EPgQyBD4EMwQ+BCAARwQ1BDsEPgQyBDUERwQ1 BEEEQgQyBDAEDQAgABoEMAQ6BCAAMgQgADQEQAQ1BDIEPQQ4BEUEIABABEMEQQRBBDoEOARFBCAA QQQ6BDAENwQ6BDAERQQsACAAIgA8BDUEQARCBDIEMARPBCAAMgQ+BDQEMAQiACAATQQ3BD4EQgQ1 BEAEOARHBDUEQQQ6BD4EMwQ+BCAANwQ9BDAEPQQ4BE8EIAA/BEAEOARABD4ENARLBCAAOAQgADgE QQRCBDgEPQRLBCwAIAA6BD4EPQRGBDUEPwRGBDgEOAQgADwEOARABD4EPwQ+BEAETwQ0BDoEMAQs ACAAMAQ7BEwEQgQ1BEAEPQQwBEIEOAQyBD0EPgQzBD4EIAA0BDUEOwQ1BD0EOAROBCwAIABABDAE NwRABEMESAQ1BD0EOAROBCAAOAQgAEAEMARBBD8EMAQ0BEMEIABSAEEALAAgAD4EQQQ9BD4EMgQw BD0EPQQ+BDMEPgQgAD0EMAQgAEEEPgQxBD4EQAQ9BD4EQQRCBDgEIAA4BCAANQQ0BDgEPQQ1BD0E OAQ4BCAAMgRBBDUEMwQ+BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ+BDMEPgQgAEAEPgQ0BDAELAAg AEEEQAQwBEEEQgQ4BDsEMAQgADAEQgQ+BDwEOAQ3BDgEQAQ+BDIEMAQ9BD0EPgQ1BCwAIABABDAE QQRCBDUEQAQ3BDAEPQQ9BD4ENQQsACAAPAQ1BEAEQgQyBD4ENQQgACIAQgQ1BDsEPgQiACAAIARD BEEEOAQgADgEIABBBD8EOwQ+BEIEOAQ7BDAEIABBBDIEPgQ5BCAAPQQwBEAEPgQ0BCwAIAA0BDAE MgQgADUEPARDBCAAPQQwBDQENQQ2BDQEQwQgADoEMAQ6BCAANwQwBDsEPgQzBCAAMQQ+BEAETAQx BEsEIABBBCAAQAQwBDEEPgQyBDsEMAQ0BDUEOwRMBEYEMAQ8BDgEIAA4BCAAMQRDBDQEQwRJBDUE MwQ+BCAAPgRBBDIEPgQxBD4ENgQ0BDUEPQQ4BE8ELgAgABQEQwRFBCAANQQ0BDgEPQRBBEIEMgQw BCgAQQApACwAIAA/BEAEPgQxBEMENgQ0BDAETgRJBDgEOQQgAEAEPgQ0BD4EMgQ+BDUEIABBBD4E NwQ9BDAEPQQ4BDUEIAAgBEMEQQQ4BCAAOAQgAD4EMQRKBDUENAQ4BD0ETwROBEkEOAQ5BCAAQARD BEEEQQQ6BDgERQQgADIEPgQ6BEAEQwQzBCAAOAQ0BDUEOAQgADMEOwQ+BDEEMAQ7BDgENwQwBEYE OAQ4BCAAPwQ+BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ4BCAAOAQgADIEPgQ6BEAEQwQzBCAAQQQy BD4EOARFBCAAOwQ4BDQENQRABD4EMgQsACAAOgQ+BEIEPgRABEsENQQgADIESwRABDAENgQwBE4E QgQgAE0EQgRDBCAAOgQ+BD0ERgQ1BD8ERgQ4BE4ELAAgADoEMAQ6BCAAIgA2BDgEMgQwBE8EIAAy BD4ENAQwBCIAIAAyBD4EQQQ6BEAENQRIBDAENQRCBCAATQRCBD4EIABCBDUEOwQ+BCAAOAQgAEEE MAQ8BEMEIAAgBEMEQQRMBC4AIAANACAAFAQ7BE8EIAA9BDAEQQQgADgEIAAyBEEENQRFBCAAOwRO BDQENQQ5BCAATQRCBD4EQgQgADQEQwRFBCAAPgQ0BD0EPgQyBEAENQQ8BDUEPQQ9BD4EIAA4BCAA QQQ/BDAEQQQ1BD0EOAQ1BCAAOAQgAD4EQARDBDYEOAQ1BCAAPwRABD4EQgQ4BDIEIABBBDIEPgQ1 BDMEPgQgADoEPgQ9BEYENQQ/BEIEQwQwBDsETAQ9BD4EMwQ+BCAAMgRABDAEMwQwBC4AIAAiBDAE OgQgADoEMAQ6BCAAMgRABDAEMwQgAD8EMARABDAENAQ+BDoEQQQwBDsETAQ9BEsEPAQgAD4EMQRA BDAENwQ+BDwEIABPBDIEOwRPBDUEQgRBBE8EIABHBDAEQQRCBEwETgQgABAELAAgAE0EQgQ+BEIE IAA0BEMERQQoACIANQQ0BDgEPQRBBEIEMgQwBCAAPwRABD4EQgQ4BDIEPgQ/BD4EOwQ+BDYEPQQ+ BEEEQgQ1BDkEIgApACAAPwQ+BDEENQQ2BDQEMAQ1BEIELAAgAD8EPgQxBDUENgQ0BDAETwQgAEEE MgQ+BDgEIABBBDsEMAQxBD4EQQRCBDgELAAgAEEEMAQ8BD4EMwQ+BCAAQQQ1BDEETwQuACAAEgQg AEAENQQwBDsETAQ9BD4EQQRCBDgEIABNBEIEPgQgAD4EQgRABDAENgQ1BD0EPgQgADoEMAQ6BCAA PwQ+BDEENQQ0BDAEIABBBDIEPgQ4BDwEOAQgAEEEPgQxBEEEQgQyBDUEPQQ9BEsEPAQ4BCAAQwQ9 BDgEOgQwBDsETAQ9BEsEPAQ4BCAAPAQ1BEIEPgQ0BDAEPAQ4BCAAQQQyBD4EOARFBCAARwQ1BDsE PgQyBDUERwQ1BEEEOgQ4BEUEIABBBDsEMAQxBD4EQQRCBDUEOQQsACAAQQRCBEAEPgQzBDgEOQQg ADoEPgQ9BEIEQAQ+BDsETAQgACAEEAQsACAANwQwBDwENQQ9BDAEIAAgAD4EMQQ8BDAEPQQwBCAA OAQgAD8EQAQ+BD8EMAQzBDAEPQQ0BEsEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQyBCAAOAQgADwEPgQ9 BD4EPwQ+BDsEOAQ5BCAAPQQwBCAAPgQxBEoENQQ0BDgEPQQ1BD0EOAQ1BCAANwQ9BDAEPQQ4BE8E KAA1BDMEPgQgAD4EMQQ7BDAEQQRCBDUEOQQsACAAPQQ+BEEEOARCBDUEOwQ1BDkEIAA4BCAAPwRA BD4ERgQ1BEEEQQQ+BDIEIAA/BD4ENwQ9BDAEPQQ4BE8EKQAsACAAQQQyBD4EMQQ+BDQEQwQgADQE PgRBBEIEQwQ/BDAEIAA6BCAATQRCBD4EPARDBCAANwQ9BDAEPQQ4BE4EIABDBCAAMgRBBDUERQQg ADsETgQ0BDUEOQQgADgEIABBBD4ERgQ4BDAEOwRMBD0EQwROBCAAQAQ1BDoEOwQwBDwEQwQgAD0E QAQwBDIEQQRCBDIENQQ9BD0EPgRBBEIEOAQsACAAQQQwBDwEPgRBBD4EMgQ1BEAESAQ1BD0EQQRC BDIEPgQyBDAEPQQ4BE8ELAAgADcENAQ+BEAEPgQyBEwETwQgADgEIAA/BEAEPgRGBDIENQRCBDAE PQQ4BE8ELgAgAB8EQAQ4BCAATQRCBD4EPAQgAD0EPgRBBDgEQgQ1BDsEOAQgADcEPQQwBD0EOARP BCwAIAAiAD8EPgQxBDUENgQ0BDAETwQgAEEEMAQ8BDgEIABBBDUEMQRPBCIALAAgAEIEQAQwBD0E QQREBD4EQAQ8BDgEQARDBE4EQgQgAEEEMAQ8BD4EIAA3BD0EMAQ9BDgENQQsACAAPQQ1BD4EMQRF BD4ENAQ4BDwEPgQ1BCAANAQ7BE8EIAA9BD4EMgQ+BDMEPgQgADwEOARABDAELAAgAD8EQAQ1BEEE NQQ6BDAETgRCBCAAMQQ1BEEEOgQ+BD0ENQRHBD0ESwQ5BCAAMAQ9BDAEOwQ4BDcEIABABDAENwQ0 BDUEOwQ1BD0EPQQ+BDMEPgQgADcEPQQwBD0EOARPBCAAQAQwBDcENAQ1BDsENQQ9BD0EPgQzBD4E IAA8BDgEQAQwBCwAIAA4BDQEQwRCBCAAMgQgAEEEQgQ+BEAEPgQ9BEMEIAA/BD4EOwQ9BD4ERgQ1 BD0EPQQ+BDMEPgQgAEEEOAQ9BEIENQQ3BDAELAAgADIESwRABDAEMQQ+BEIEOgQ1BCAARgQ1BDsE PgRBBEIEPQQ+BDMEPgQgADwEOARABD4EPwQ+BD0EOAQ8BDAEPQQ4BE8EIAA4BCAAQAQ1BDAEOwQ4 BDcEMARGBDgEOAQgAEEEMgQ+BDgERQQgADgENAQ1BDkEIAA9BDAEIAA+BEEEPQQ+BDIENQQgADgE PQRCBDUEQAQ1BEEEPgQyBCAAMgRBBDUEMwQ+BCAAPgQxBEkENQRBBEIEMgQwBCAAOAQgADIEIABA BEMEQQQ7BDUEIAA6BD4EPQRGBDUEPwRGBDgEOAQgAEAEQwRBBEEEOgQ+BDkEIAAzBDsEPgQxBDAE OwQ4BDcEMARGBDgEOAQtACAAQwRCBDIENQRABDYENAQ1BD0EOAROBCAAOAQgAEAEPgRBBEIEQwQg AD0EPgQyBD4EMwQ+BCAARwQ1BDsEPgQyBDUEOgQwBC4ADQAgABUEQQQ7BDgEIAAyBEsEIAA/BEAE PgRHBDgEQgQwBDsEOAQgAE0EQgRDBCAAQQRCBDAEQgRMBE4EIAA+BEIEIAA9BDAERwQwBDsEMAQg ADQEPgQgADoEPgQ9BEYEMAQsACAAQgQ+BCAAMgRLBCAAPwQ+BD0EOAQ8BDAENQRCBDUELAAgAEcE QgQ+BCAAOAQ8BDUEPQQ9BD4EIAA1BEEEQgRMBCAAOgQ7BE4ERwQgADoEIAATBDgEPwQ1BEAEMQQ+ BEAENQQ1BC4AIAAtBEIEPgQgADcEPQQwBEcEOARCBCwAIABHBEIEPgQgADIESwQgADIEOwQ+BDYE OAQ7BDgEIABBBDIEPgRRBCAAMgRABDUEPARPBCwAIABBBDUEQAQ0BEYENQQgADgEIAA0BEMESARD BCAAMgQgAD4ENwQ9BDAEOgQ+BDwEOwQ1BD0EOAQ1BCAAOAQgAD8EPgQ9BDgEPAQwBD0EOAQ1BCAA PwRABD4EMQQ7BDUEPAQgAD0EMARBBEIEPgRPBEkENQQ5BCAAQQRCBDAEQgRMBDgELgAgABgEIAA/ BD4EIAA6BDAEOgQ4BDwEIAAxBEsEIAA/BEAEOARHBDgEPQQwBDwEIAA9BDgEIAAxBEsEOwQwBCAA EgQwBDwEIAA4BD0EQgQ1BEAENQRBBD0EMAQgAEIENQQ8BDAEIAA0BDAEPQQ9BD4EOQQgAEEEQgQw BEIETAQ4BCwAIAA/BEAEOAQ8BDgEQgQ1BCAAPQQwBEgEQwQgADEEOwQwBDMEPgQ0BDAEQAQ9BD4E QQRCBEwEIAA3BDAEIAAyBDAESAQ4BCAAQwRBBDgEOwQ4BE8EIAA4BCAAQwRHBDAEQQRCBDgENQQu ACAAEgRLBCAAQgQ+BDYENQQgADwEPgQ2BDUEQgQ1BCAAPgRCBDEEOwQwBDMEPgQ0BDAEQAQ4BEIE TAQgAD0EMARBBCAAQQQyBD4EOAQ8BCAAQwRHBDAEQQRCBDgENQQ8BCAAMgQgAE0EQgQ+BDwEIAA9 BDUEOwQ1BDMEOgQ+BDwEIABABDAEQgQ9BD4EPAQgADQENQQ7BDUELAAgADgEIAASBEsELAAgADoE PgQ9BDUERwQ9BD4ELAAgADQEPgRBBEIEPgQ5BD0ESwQgADgEPAQ1BEIETAQgAD8EQAQ+BEcEOARC BDAEPQQ9BD4ENQQsACAAOgQwBDoEIABHBDAEQQRCBEwEIABBBDIEPgQ1BDMEPgQgADcEPQQwBD0E OARPBCAAOAQsACAAMgQ+BDcEPAQ+BDYEPQQ+BCwAIAA6BDAEOgQgAEcEMARBBEIETAQgABIEMARI BDUEMwQ+BCAAPAQ4BEAEPgQyBD4ENwQ3BEAENQQ9BDgETwQgADgEIABEBD4EQAQ8BDAEQgQgABIE MARIBDUEMwQ+BCAAPgRCBD0EPgRIBDUEPQQ4BE8EIAA6BCAANARABEMEMwQ4BDwEIAA7BE4ENARP BDwEIAA4BCAAPgQxBEkENQRBBEIEMgQwBDwELAAgAE0EQgQ+BEIEIABBBDAEPARLBDkEIAA6BDsE TgRHBC4AIAAdBDAEIABBBDAEPAQ+BDwEIAA0BDUEOwQ1BCwAIABNBEIEPgQgAD0ENQQgAD4ENAQ4 BD0EIAA6BDsETgRHBCwAIAA4BEUEIAA9BDUEQQQ6BD4EOwRMBDoEPgQsACAATQRCBD4EIAA6BDsE TgRHBDUEMgRLBDUEIAA6BDAEQgQ1BDMEPgRABDgEOAQgADEESwRCBDgETwQsACAAQAQwBDcEMgQ4 BEIEOARPBCAAOAQgADgEQQRCBD4EQAQ4BDgEIABHBDUEOwQ+BDIENQQ6BDAEIABBBCAANAQ+BDgE QQRCBD4EQAQ4BEcENQRBBDoEOARFBCAAMgRABDUEPAQ1BD0ELAAgAD8EQAQ1BDQEQQRCBDAEMgQ7 BDUEPQQ9BEsENQQgADIEIAA0BDAEPQQ9BD4EOQQgAEEEQgQwBEIETAQ1BC4AIAAdBDAESAQ1BCAA PwQ+BD0EOAQ8BDAEPQQ4BDUEIABABDUEMAQ7BEwEPQQ+BEEEQgQ4BCAAOAQgADQEPgQ6BDAENwQw BEIENQQ7BEwEQQRCBDIEMAQgAEEEQwRJBDUEQQRCBDIEPgQyBDAEPQQ4BE8EIAA4BCAAPgQ/BDgE QQQwBD0EOAQ1BCAAQQRDBEIEOAQgADoEOwROBEcENQQ5BCAAPwRABDUENARBBEIEMAQyBDsENQQ9 BEsEIAAyBCAAQQRCBDAEQgRMBDUELgAgAC0EQgQ+BCAAPAQ1BEIEPgQ0BCAAQARDBEEEOwQwBCwA IAA6BDAEOgQgADIEMAQ2BD0ENQQ5BEgEOAQ5BCAAOAQ9BEEEQgRABEMEPAQ1BD0EQgQgAD8EPgQ4 BEEEOgQwBCAANwQ9BDAEPQQ4BE8EIAAyBCAAQAQwBDwEOgQwBEUEIAA6BD4EPQRGBDUEPwRGBDgE OAQgADUENAQ4BD0ENQQ9BDgETwQgAEAEMARGBDgEPgQ9BDAEOwRMBD0ESwRFBCAAOAQgADgEQARA BDAERgQ4BD4EPQQwBDsETAQ9BEsERQQgADgEQQRCBD4ERwQ9BDgEOgQ+BDIEIAA4BD0ERAQ+BEAE PAQwBEYEOAQ4BCwAIAA/BEAEPgRGBDUEQQRBBD4EMgQgADUEUQQgAD8EPgQ7BEMERwQ1BD0EOARP BCwAIAA/BDUEQAQ1BDQEMARHBDgELAAgAD4EMQRABDAEMQQ+BEIEOgQ4BCAAOAQgAEEEOAQ9BEIE NQQ3BDAEIAA3BD0EMAQ9BDgETwQuACAAGgQwBEIENQQzBD4EQAQ4BDcEMARGBDgETwQgAEEEQgRA BDAEPQQgADgEIAA9BDAEQAQ+BDQEPgQyBCAANAQ+BD8EPgRCBD4EPwQ9BD4EMwQ+BCAAPQQ1BD4E OwQ4BEIEMAQgADIEIABCBDUEQAQ8BDgEPQQwBEUEIAA0BEAENQQyBD0EOARFBCAAQQRDBD8ENQRA BEYEOAQyBDgEOwQ4BDcEMARGBDgEOQQgABMEOAQ/BDUEQAQxBD4EQAQ1BDgEIAA4BCAAEARCBDsE MAQ9BEIEOAQ0BEsELAAgADoEMAQ6BCAAMQQ+BDsENQQ1BCAAPAQ4BEQEOARHBDUEQQQ6BD4EMwQ+ BCAAPgQxBEkENQRBBEIEMgQwBCAAPQQwBCAAQQQwBDwEPgQ8BCAANAQ1BDsENQQgAEEEQwRJBDUE QQRCBDIEPgQyBDAEMgRIBDgERQQgADgENwQzBD4ENQQyBCAAOAQgAD0EMARABD4ENAQ+BDIEIAA/ BD4ENAQgADgERQQgAEMEPwRABDAEMgQ7BDUEPQQ4BDUEPAQsACAAQAQwBDEEPgQyBCAAQAQ1BDYE OAQ8BDAELAAgAD8EQAQ1BDgEPARDBEkENQRBBEIEMgQ1BD0EPQQ+BCAATgQ2BD0ESwRFBCAAPQQw BEAEPgQ0BD4EMgQuACAALQRCBD4EIAA+BDEESQQ4BDUEIAAwBDsERAQwBDIEOARCBCwAIABEBDgE OwQ+BEEEPgREBDgETwQsACAAQAQwBDcEMgQ4BEIEOAQ1BCAAOAQgADoEQwQ7BEwEQgRDBEAEMAQg AD0EMARABD4ENAQ+BDIEIAA0BDIEQwRFBCAAPwQ1BEAEOAQ+BDQEPgQyBC0AIAA9BDAEQAQ+BDQE PgQyBCAAQQQ1BDIENQRABDAEIAA4BCAAQAQwBDEEPgQyBCAAEARCBDsEMAQ9BEIEOAQ0BEsEIAA6 BDAEPAQ1BD0EPQQ+BDMEPgQgADIENQQ6BDAEIAA4BCAAPQQwBEAEPgQ0BD4EMgQgAEEEPgQyBEAE NQQ8BDUEPQQ9BD4EQQRCBDgELAAgAD4EPwRABDUENAQ1BDsETwQ1BDwESwRFBCAANAQ+BDwEOAQ9 BDAEPQRCBD0ESwQ8BCAAPgRCBEYEPgQyBEEEOgQ4BDwEIABBBDgEOwRMBD0ESwQ8BCAAOAQgAD8E QAQ1BDgEPARDBEkENQRBBEIEMgQ1BD0EPQQ+BCAAPQQwBEEEOwQ1BDQEQwROBEkENQQ8BCAAMwQ1 BD0EPgQ8BCAAMQQ1BDsEPgQ5BCAAQAQwBEEESwQsACAAMwQwBD8EOwQ+BDMEQARDBD8EPwRLBCAA KABSACwASQAsAE4ALABPACkALAAgAEIEPgQgADUEQQRCBEwEIAAyBEEENQQ8BDgEIAA0BD4EPAQ4 BD0EMAQ9BEIEPQRLBDwEOAQgAEAEPgQ0BDAEPAQ4BCAAMQQ1BDsEPgQzBD4EIABHBDUEOwQ+BDIE NQQ6BDAEIAA/BDsETgRBBCAATgQ2BD0ESwRFBCAAPQQwBEAEPgQ0BD4EMgQsACAAMgQ+BDIEOwQ1 BEcENQQ9BD0ESwRFBCAAMgQgAE0EQgQ9BD4EMwQ1BD0ENQQ3BCAAQQQgAD0EOAQ8BDgEIAA/BD4E QQQ7BDUEIAA/BD4EQgQ+BD8EMAQuACAALQRCBD4EIABNBDIEPgQ7BE4ERgQ4BE8EIAA+BDEESQQ4 BEUEIAAzBDgEPwQ1BEAEMQQ+BEAENQQ5BEEEOgQ4BEUEIABNBDsENQQ8BDUEPQRCBD4EMgQgADoE QwQ7BEwEQgRDBEAESwQgADIEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAOgRDBDsETARCBEMEQAQ1 BCAAOAQsACAAMwQ7BDAEMgQ9BD4ENQQsACAAIAQ+BDQEIAAgBEMEPQQsACAAOARBBD8EPgQ7BEwE NwRDBDUEPARLBDkEIAAyBCAAEwQ4BD8ENQRABDEEPgRABDUENQQsACAAQgQwBCAAQQRDBEIETAQg ADgEIAA4BEEEQgQ4BD0ESwQsACAANwQwBDsEPgQ2BDUEPQQ9BEsENQQgADIEIABBBDAEPARDBCAA QgQ1BEUEPQQ+BDsEPgQzBDgETgQgADUEMwQ+BCAAQQQ+BDcENAQwBD0EOARPBC0AIAA9BDUEMgQ4 BDQEOAQ8BEsEOQQsACAAQQQ6BEAESwRCBEsEOQQgADoEOwROBEcELgAgAC0EQgQ+BCAAOgQ+BD0E RgQ1BD8ERgQ4BE8EIAA/BDAEQAQwBDQEPgQ6BEEEMAQ7BEwEPQQ+BDkELAAgAD8EQAQ+BEIEOAQy BD4EQAQ1BEcEOAQyBD4EOQQgADEEPgRABEwEMQRLBCAAOAQgAEQEOAQ7BD4EQQQ+BEQEQQQ6BD4E MwQ+BCAANQQ0BDgEPQRBBEIEMgQwBCAAPAQ1BDYENARDBCAAQQAgADgEIABSAEEALgAgAC0EQgQ+ BCAAQQQyBE8ENwRMBCAAOAQgAD8EQARPBDwEMARPBCAANwQwBDIEOARBBDgEPAQ+BEEEQgRMBCAA NAQ+BD8EPgRCBD4EPwQ9BD4EOQQgADgEQQRCBD4EQAQ4BDgEIAA4BCAAOARBBEIEPgRABDgEOAQg AD8EPgRBBDsENQQ/BD4EQgQ+BD8EPQQ+BDMEPgQgAD0ENQQ+BDsEOARCBDAEIAA4BCAAQQQ+BDIE QAQ1BDwENQQ9BD0EPgQ5BCAAOARBBEIEPgRABDgEOAQuACAALQRCBD4EIABBBD4EMgRABDUEPAQ1 BD0EPQQ+BDUEIAA/BD4EOwQ+BDYENQQ9BDgENQQgADQENQQ7BCwAIAA6BDAEOgQgADoEMgQ4BD0E QgRNBEEEQQQ1BD0ERgQ4BE8EIABCBEsEQQRPBEcENQQ7BDUEQgQ9BDgERQQgAD8EQAQ+BEYENQRB BEEEPgQyBCAAOAQgAEEEPgQyBEAENQQ8BDUEPQQ9BD4ENQQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDUE IABDBD8EQAQwBDIEOwQ1BD0EOAQ1BCAAMwQ7BD4EMQQwBDsETAQ9BEsEPAQ4BCAAQAQ1BEEEQwRA BEEEMAQ8BDgELAAgAD8EQAQ+BEYENQRBBEEEMAQ8BDgEIAA4BCAAPAQ4BEAEPgQ8BCAAMgQ+BD4E MQRJBDUELAAgADIEIABCBD4EPAQgAEcEOARBBDsENQQgADMEOwQ+BDEEMAQ7BEwEPQQwBE8EIABB BD4ERgQ4BDAEOwRMBD0EMARPBCAAPwQ4BEAEMAQ8BDgENAQwBCAAOAQgADUEUQQgADAEOwRMBEIE NQRABD0EMARCBDgEMgQwBC4AIAAYBCwAIAA9BDAEOgQ+BD0ENQRGBCwAIAA9BDAESAQ1BCAAPQQw BEEEOwQ1BDQEOAQ1BCwAIAA9BD4EMgQ+BDUEIAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0EOAQ1BCAA OAQgADAEOwQzBD4EQAQ4BEIEPAQgAD8EPgQxBDUENARLBCAAMgQgADIEOAQ0BDUEIAA/BEMEQgQ4 BCAANARDBEUEMAQgAEEALAAgADQEQwRFBDAELAAgAEEEMgRPBDcESwQyBDAETgRJBDUEMwQ+BCAA QwQ8BCAAOAQgAEEENQRABDQERgQ1BCAAMgQgADUENAQ4BD0ESwQ5BCAAPwQ7BD4EQgQgADgEIABE BEMEPQQ0BDAEPAQ1BD0EQgQgAD0EPgQyBD4EMwQ+BCAAQQQyBD4EMQQ+BDQEPQQ+BDMEPgQgADME PgRBBEMENAQwBEAEQQRCBDIEMAQsACAAPwQ+BDEENQQ2BDQEMAROBEkENQQzBD4EIABBBDIEPgQ4 BDwEOAQgAEEEOAQ7BDAEPAQ4BCAAUgBBACwAIABCBD4EIAA1BEEEQgRMBCAAQAQwBDcENAQ1BDsE NQQ9BDgENQQgAEcENQQ7BD4EMgQ1BDoEMAQgADgEIAA4BEEEQgQ4BD0ESwQgADgEIAA9BDUEQQRD BEkENQQzBD4EIABBBDIEPgQxBD4ENARDBCwAIAAyBCAAPwRABD4ERgQ1BEEEQQQ1BCAAQAQ+BEEE QgQwBCAAOARBBEIEOAQ9BD0EPgRBBEIEOAQgADcEPQQwBD0EOARPBCAAOAQgAEEEMgQ+BDEEPgQ0 BEsELgAgABUEQQRCBEwEIAA4BCAANARABEMEMwQ4BDUEIABBBDoEQARLBEIESwQ1BCAAOgQ7BE4E RwQ4BCwAIAA6BD4EQgQ+BEAESwQ1BCAAPwQ+BDsEQwRHBDgEQgQgAD4EMQQ7BDAENAQwBE4ESQQ4 BDkEIAA8BDgEPQQ4BDwEMAQ7BEwEPQRLBDwEIABDBEAEPgQyBD0ENQQ8BCAAPQRABDAEMgRBBEIE MgQ1BD0EPQQ+BEEEQgQ4BCAAOAQgADwEOARABD4EPwQ+BD0EOAQ8BDAEPQQ4BE8ELgAgAC0EQgQ+ BCAAQQQ6BD4EQAQ1BDUEIAA0BDAENgQ1BCAAOgQ7BE4ERwQ4BCAAPgRCBCAAMgQwBEgENQQzBD4E IABBBDUEQAQ0BEYEMAQsACAAQgQwBDoEIAA6BDAEOgQgACAAPQQ1BCAANwQ9BDAETwQsACAARwRC BD4EIABCBDAEOgQ+BDUEIAAnBDUEOwQ+BDIENQQ6BCgARwQpACwAIAA+BEIEOgRDBDQEMAQgAB4E PQQgADIENwRPBDsEQQRPBCAAOAQgADoEMAQ6BDgEPAQgAD4EMQRABDAENwQ+BDwEIABBBEMESQQ1 BEEEQgQyBEMENQRCBCwAIABHBDUEOwQ+BDIENQQ6BCAAPQQ1BCAAPwQ+BEEEQgRABD4EOARCBCAA PAQ4BEAEIAA9BDAEIABBBDIEPgQ1BDkEIAAxBEAENQQ9BD0EPgQ5BCAANwQ1BDwEOwQ1BCwAIAAw BCAAPwQwBDQEUQRCBC4AIAAhBDAEPARLBDUEIAA2BDUEIABBBDgEOwRMBD0ESwQ1BCAAOAQ3BCAA PQQwBEEEIAA+BEIEOgRABD4ETgRCBCAAMgRABDAEQgQwBCAAHQQ+BDIEPgQ5BCAAEwQ4BD8ENQRA BDEEPgRABDUEOAQuAA0AIAASBEAENQQ8BDUEPQQ4BCAAPAQwBDsEPgQuACAAHgRCBCAAPQQwBEEE IABBBCAAMgQwBDwEOAQgADcEMAQyBDgEQQQ4BEIEIAAxBEMENARDBEkENQQ1BCAAPQQwBEgENQQz BD4EIABABD4ENAQwBCAAOAQgADwEOARABDAELgAgAB8EPgQgAD4EMQRKBDUEOgRCBDgEMgQ9BEsE PAQgAD8EQAQ4BEcEOAQ9BDAEPAQgAEEERwQ1BEIEIAAyBEAENQQ8BDUEPQQ4BCAAOAQ0BFEEQgQg AEMENgQ1BCAAPQQ1BCAAPQQwBCAAQQQ+BEIEPQQ4BCAAOAQgADQENQRBBE8EQgQ6BDgEIAA7BDUE QgQsACAAOgQwBDoEIABNBEIEPgQgADEESwQ7BD4EIAA+BDEESwRHBD0EPgQgADIEIAA4BEEEQgQ+ BEAEOAQ4BCAAPQQwBEgENQQ5BCAATQRABEsELAAgADAEIAA9BDAEIAAzBD4ENARLBCAAOAQgADwE NQRBBE8ERgRLBCAAQQQgAEIENQQ9BDQENQQ9BEYEOAQ1BDkEIAAxBEsEQQRCBEAEPgQzBD4EIABD BDwENQQ9BEwESAQ1BD0EOARPBCAARQQwBEAEMAQ6BEIENQRABD0ESwRFBCAAPwQ1BEAEOAQ+BDQE PgQyBCAAPwRABD4EQgQ1BDoEMAQ9BDgETwQgAEEEPgRGBDgEMAQ7BEwEPQRLBEUEIAA/BEAEPgRG BDUEQQRBBD4EMgQuACAAIgQ+BDsETAQ6BD4EIAA/BD4ERwRDBDIEQQRCBDIEPgQyBDAEMgQgAEEE NQQxBE8EIAA/BD4EIAA9BDAEQQRCBD4ETwRJBDUEPARDBCAAQQQyBD4EMQQ+BDQEPQRLBDwEOAQg ADgEIABBBD8EPgRBBD4EMQQ9BEsEPAQ4BCAAPQQwBCAAMgRBBFEEIABABDAENAQ4BCAAQQQyBD4E MQQ+BDQESwQgADgEIAAxBDAEPQQwBDsETAQ9BD4EIABBBD8EMARBBDUEPQQ4BE8EIABBBDIEPgQ4 BEUEIAA2BDgENwQ9BDgEIAA4BCAANgQ4BDcEPQQ1BDkEIABBBDUEPARMBDgEIAA4BCAAMQQ7BDgE NwQ6BDgERQQsACAAPARLBCAAPAQ+BDYENQQ8BCAAPgRCBDoEQARLBEIETAQgADQEOwRPBCAAQQQ1 BDEETwQgAEEEOgRABEsEQgQ+BDUEIAA3BD0EMAQ9BDgENQQsACAAMAQgADMEOwQwBDIEPQQ+BDUE LAAgAD4EMQRABDUEQQRCBDgEIAA9BDAEQQQ7BDUENAQ4BDUEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4 BCwAIABHBEIEPgQgAD0ENQQ8BDgEPQRDBDUEPAQ+BCAAPwRABDgEMgQ1BDQEUQRCBCAAPQQwBEEE IAA6BCAAHQQ+BDIEPgQ5BCAAEwQ4BD8ENQRABDEEPgRABDUENQQuACAAGAQgADwESwQsACAAQARD BEEEQQQ6BDgEOQQgAD0EMARABD4ENAQsACAANAQ+BDsENgQ9BEsEIAA0BDsETwQgAE0EQgQ+BDME PgQgAD4EQgQ6BEAESwRCBEwEIAAzBDsEMAQ3BDAEIAA4BCAAQQQ6BEAESwRCBD4ENQQgADcEPQQw BD0EOAQ1BCAAQQQgAD8EPgQ8BD4ESQRMBE4EIABBBDIEPgQ1BDkEIABHBDUEOwQ+BDIENQRHBDUE QQQ6BD4EOQQgAD8EQAQ4BEAEPgQ0BEsELAAgAEEEQgQ4BEUEOAQ5BCAAQwQ8BDAEIAA4BCAAQQQ1 BEAENARGBDAELAAgAEIENQQ7BDAELAAgADQEQwRFBDAEIAA4BCAANARDBEgEOAQsACAAOgQwBDoE IAA+BEAEMwQwBD0EPgQyBCAANQQ0BDgEPQQ+BDMEPgQgACcENQQ7BD4EMgQ1BDoEMAQuACAAHwQ+ BDcEPQQwBEIETAQgADMEQAQwBD0EOAQgAEEEMgQ+BDUEMwQ+BCAAPQQ1BDcEPQQwBD0EOARPBCAA OAQgAD0EMAQ5BEIEOAQgADoEOwROBEcEOAQgAD4EQgQgAD0EPgQyBD4EMwQ+BCAAIgAmBDAEQARB BEIEMgQwBCAAHQQ1BDEENQRBBD0EPgQzBD4EIAA9BDAEIAAXBDUEPAQ7BDUEIgAsACAAPQQwBEgE NQQzBD4EIAA9BDAEQQQ7BDUENARBBEIEMgQwBCAAOAQgADIENQQ7BDgERwQwBDkESAQ1BDkEIABG BDUEPQQ9BD4EQQRCBDgEIAAyBEEENQRFBCAAMgRABDUEPAQ1BD0EIAA4BCAAPQQwBEAEPgQ0BD4E MgQuACAAHARLBCwAIAA9BDUEQQRPBCAAMgQgADMENQQ9BDAERQQgAEEEOAQ7BEMEIAA8BD4ESQQ9 BDUEOQRIBDUEOQQgAEYEOAQyBDgEOwQ4BDcEMARGBDgEOAQgADwEOARABDAELAAgAEEEOgQ+BEAE PgQgAD8EQAQ+BEEEPQRRBDwEQQRPBCAAOAQgADcEMAQyBDUEQARIBDgEPAQgADwEOARBBEEEOARO BCAAEARABDgENQQyBC0AIABPBDIEOAQ8BCAAPQQwBEEEQgQ+BE8ESQQ1BDMEPgQgAEEEMgQ+BDEE PgQ0BD0EPgQzBD4EIAAgACcENQQ7BD4EMgQ1BDoEMAQhAA0ADQAgACAAIAAgACAAIAAgACAAIAAg ACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACEEGwQQBBIEEAQgABUEHAQjBCAAIQAhACEADQANACAAIAAgACAAIAAgACAAIAAgACAAIAAg ACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IQQ7BDAEMgQwBCAAIARDBEEEOAQgACEAIQAhACEAIQAgAA0ADQAgACAAIAAgACAAIAAgACAAIAAg ACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACEEOwQwBDIEMAQgACAEPgQ0BEMEIAAhACEAIQAhACEAIQAhAA0ADQANAA0ADQANAA0ADQAN AA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AKgAgACAAKgAgACAAKgAgACAAKgAgACAAKgAgACAA KgAgACAAKgANAA0AKgAqACoAKgAqACoAKgAqACoADQANAA0ADQANAA0AHgQzBDsEMAQyBDsENQQ9 BDgENQQNAA0ADQANACAAHgQxBEAEMARJBDUEPQQ4BDUEIAA6BCAARwQ4BEIEMARCBDUEOwROBCAA IAAgAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAgACAAIAAxAA0ASQAgACAAIAAkBDAEOgRCBEsELAAgADwEOAREBEsE IAA4BCAAMwQ7BD4EMQQwBDsETAQ9BD4ENQQgADgEQQRCBD4EQAQ4BEcENQRBBDoEPgQ1BCAAQARD BEEEOwQ+BCAAIAAgAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4AIAAgACAAMwANAEkASQAgACAAIAAo BEMEPAQ1BEAESwQsACAAQQQ7BDAEMgRPBD0ENQQgADgEIAAwBDsERAQwBDIEOARCBCAAIAAgAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAgACAAIAA3AA0ASQBJAEkAIAAg ACAAQQAgADgEIAAgBEEAIAAgACAALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4AIAAgACAAMQAzAA0ASQBWACAAIAAgAB8EQwRCBEwE IAAdBD4EMgQ+BDkEIAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCAAIAAgAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAgACAAIAAyADAADQBWACAAIAAgAB0E PgQyBDAETwQgABMEOAQ/BDUEQAQxBD4EQAQ1BE8EIAAgACAALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAgACAAIAAyADIADQAgAB4EMwQ7BDAEMgQ7BDUEPQQ4BDUEIAAgACAALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAgACAAIAAyADkADQAN AA0ADQANAA0ADQANAA0ADQANAA0ADQAiABIEPgQ3BEAEPgQ2BDQENQQ9BDgENQQgACAEQwRBBDgE LgAgAB0EPgQyBDAETwQgABMEOAQ/BDUEQAQxBD4EQAQ1BE8ELgAiAA0ADQANACAEQwRBBEwELAAg ADAEPwRABDUEOwRMBCAAMgAwADEANQAgADMEPgQ0BDAEIAA+BEIEIAAgBC4AJQQuAA0ADQANAA0A EgQfBB0EEwQNAA0AKgAqACoAKgAqAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPxQ AwAOUQMAMlEDADRRAwBCUQMAXlEDAGBRAwBkUQMAclEDAIBRAwCKUQMAjFEDAI5RAwCQUQMAnlED AKBRAwCiUQMApFEDAKZRAwCoUQMAqlEDAOBRAwDiUQMAQFIDAEJSAwBaUgMAXFIDANBSAwDSUgMA +PDo8ODY8NDwyPC9sqebjpuFeW5lhV1VXVVdSQAAFhZovGMeAENKFABhShQAbUgJBHNICQQADhZo qD1wAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAARFmgFYjwAPioBQ0oUAGFKFAAUFWg3R/YAFmi8 Yx4AQ0oUAGFKFAAAFxVoWyjaABZovGMeAD4qAUNKFABhShQAERZovGMeAD4qAUNKFABhShQAGRZo vGMeAD4qAUNKFABhShQAbUgJBHNICQQXFWhPQTsAFmi8Yx4APioBQ0oUAGFKFAAUFWhOFzkAFmi8 Yx4AQ0oUAGFKFAAAFBVoSQIIABZovGMeAENKFABhShQAABQVaN8n0QAWaN8n0QBDShQAYUoUAAAO FmjbWEgAQ0oUAGFKFAAADhZonWCYAENKFABhShQAAA4WaNcBqwBDShQAYUoUAAAOFmh7AQYAQ0oU AGFKFAAADhZo8V+/AENKFABhShQAAA4WaH1JOABDShQAYUoUAAAOFmg3R/YAQ0oUAGFKFAAc0lID ANRSAwAkUwMAJlMDAChTAwAqUwMALFMDAIBTAwCWUwMA4lMDAORTAwDmUwMA6FMDAPhTAwD6UwMA /lMDAEBUAwBCVAMAflQDAIBUAwDgVAMA4lQDAORUAwDmVAMA6FQDAGZVAwBoVQMAjlUDAJBVAwDe VQMA9FUDABRWAwAmVgMA2lYDAOpWAwBUVwMA0lkDANRZAwDWWQMA2FkDANpZAwAkWgMAJloDACha AwAqWgMAQFoDAPXt4dbh1u3O7eHW4e3h1u3W7dbt4dbh1u3W7dbtzu3G7b7ttqqfqraTg5ODdwAA AAAAAAAAABcVaEllgwAWaEllgwA2CIFDShQAYUoUAB8VaEllgwAWaPUe+gA2CIFDShQAYUoUAG1I CQRzSAkEFxVoSWWDABZo9R76ADYIgUNKFABhShQAFBVox3IwABZo9R76AENKFABhShQAABYWaPUe +gBDShQAYUoUAG1ICQRzSAkEAA4WaPUe+gBDShQAYUoUAAAOFmhZCSAAQ0oUAGFKFAAADhZoDjaH AENKFABhShQAAA4WaH1JOABDShQAYUoUAAAUFWjQYdsAFmi8Yx4AQ0oUAGFKFAAAFhZovGMeAENK FABhShQAbUgJBHNICQQADhZovGMeAENKFABhShQAABQVaN0oewAWaLxjHgBDShQAYUoUAC1AWgMA VFoDAPRaAwD2WgMAEmEDAB5hAwBkYQMAbmEDAPxhAwD+YQMAAmIDABhiAwBaYgMAmGMDAKRjAwA+ aQMAdmkDAOZpAwDsaQMA7mkDAPBpAwAiawMAJGsDAAhsAwAKbAMATGwDAE5sAwBQbAMAUmwDACZu AwAqbgMAcm8DAIxvAwCscAMArnADAOJwAwDkcAMAoHEDAKJxAwD48OXw3fDV8Mm+8LbwrvC28Lbw tvCu8KPwmI22hXqF3YVvhW+FYwAAAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAUFWgQYOMAFmi8 Yx4AQ0oUAGFKFAAAFBVowQywABZovGMeAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAUFWj2UpkA Fmi8Yx4AQ0oUAGFKFAAAFBVopSweABZo9R76AENKFABhShQAABQVaM5FcgAWaPUe+gBDShQAYUoU AAAOFmioPXAAQ0oUAGFKFAAADhZoN0f2AENKFABhShQAABQVaO9deQAWaPUe+gBDShQAYUoUAAAX FWjvXXkAFmj1HvoANQiBQ0oUAGFKFAAOFmj1fZYAQ0oUAGFKFAAADhZo1wGrAENKFABhShQAABQV aMdyMAAWaPUe+gBDShQAYUoUAAAOFmj1HvoAQ0oUAGFKFAAADhZoSWWDAENKFABhShQAJqJxAwD8 cQMA/nEDAAxyAwAOcgMAEHIDABJyAwA8cwMAPnMDAEBzAwBCcwMAonMDALhzAwC8cwMAvnMDAKR0 AwCodAMAeHUDAJh1AwCgdQMADHcDAEx3AwBOdwMAVHcDAFZ3AwAYeAMAGngDAMJ4AwAYeQMAGnkD ADB5AwA0eQMANnkDAGh5AwCQeQMAknkDANh5AwDaeQMA6nkDAB57AwAkewMAjnwDAJJ8AwCgfAMA onwDAKR8AwCmfAMA+PD48Pjw+ODXzPjE+MT4vPi0xLSstKSstKy0rKSspKykxLSspJysxKz4kYV4 hQAAAAAAABkWaLxjHgA+KgFDShQAYUoUAG1ICQRzSAkEFxVoT0E7ABZovGMeAD4qAUNKFABhShQA FBVoThc5ABZovGMeAENKFABhShQAAA4WaKgq9ABDShQAYUoUAAAOFmjgNxgAQ0oUAGFKFAAADhZo qz0BAENKFABhShQAAA4WaPFfvwBDShQAYUoUAAAOFmioPXAAQ0oUAGFKFAAADhZo1wGrAENKFABh ShQAABQVaGdjIwAWaLxjHgBDShQAYUoUAAARFmi8Yx4ANQiBQ0oUAGFKFAAfFWhnYyMAFmi8Yx4A NQiBQ0oUAGFKFABtSAkEc0gJBA4WaDdH9gBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAupnwDAKh8 AwCqfAMArHwDAK58AwC+fAMAwnwDAMR8AwDMfAMA3HwDAOZ8AwDqfAMABH0DABR9AwDSfQMA2n0D AOx9AwDyfQMAQn4DAGh+AwB6fgMAfH4DAI5+AwCQfgMAnH4DAJ5+AwDKfgMAzH4DANh+AwDafgMA 4H4DAOJ+AwDqfgMA7H4DACKAAwBUgAMABIEDAAqBAwD26t/R9sS4p7iWuI6Gjn6Ofo5+jn6Oc45z jmiOaI5ojmiOho5gAAAADhZo21hIAENKFABhShQAABQVaD4u7QAWaLxjHgBDShQAYUoUAAAUFWju F1QAFmi8Yx4AQ0oUAGFKFAAADhZo5wwoAENKFABhShQAAA4WaKgq9ABDShQAYUoUAAAOFmi8Yx4A Q0oUAGFKFAAAIBVowGY/ABZovGMeAD4qAUIqBkNKFABhShQAcGj/ZgAAACAVaMBmPwAWaLxjHgA+ KgFCKg9DShQAYUoUAHBoMzOZAAAXFWgMVjkAFmi8Yx4APioBQ0oUAGFKFAAZFmi8Yx4APioBQ0oU AGFKFABtSAkEc0gJBBoVaM0YxAAWaLxjHgA1CIE+KgFDShQAYUoUAAAUFWg3R/YAFmi8Yx4AQ0oU AGFKFAAAFxVoWyjaABZovGMeAD4qAUNKFABhShQAERZovGMeAD4qAUNKFABhShQAACUKgQMALoID AEiCAwCaggMAnIIDAK6CAwCwggMAAoMDAByDAwAugwMAXIMDAOqDAwD0gwMACIQDAEaEAwAMhQMA EIUDAGCGAwB2hgMAGocDACaHAwCihwMApIcDAKaHAwBYiQMAWokDAI6JAwCQiQMALooDAGaKAwBo igMAaooDAJqKAwDgigMA4ooDAOSKAwD8igMAHosDACCLAwBGiwMASIsDAHaLAwCCiwMAqosDALCL AwDmiwMA6IsDAOqLAwD48Pjl+OX43dXd+M34xfi5+NX4sfihlviL+MX4xd3F3fjF+N34gPiA+Hj4 1fh4+AAOFmh5EH4AQ0oUAGFKFAAAFBVo6jj3ABZovGMeAENKFABhShQAABQVaNQgRAAWaLxjHgBD ShQAYUoUAAAUFWhrf6AAFmi8Yx4AQ0oUAGFKFAAAHxVoa3+gABZovGMeADUIgUNKFABhShQAbUgJ BHNICQQOFmhZCSAAQ0oUAGFKFAAAFhZovGMeAENKFABhShQAbUgJBHNICQQADhZo9E18AENKFABh ShQAAA4WaKgq9ABDShQAYUoUAAAOFmiQUyoAQ0oUAGFKFAAADhZowGY/AENKFABhShQAABQVaJBT KgAWaJBTKgBDShQAYUoUAAAOFmjZC2EAQ0oUAGFKFAAADhZovGMeAENKFABhShQAL+qLAwDuiwMA CowDAAyMAwA2jAMAOIwDADqMAwA8jAMABo0DAAqNAwAQjQMAHo0DACCNAwAkjQMAKI0DACqNAwBa jQMAXI0DAJiNAwCajQMAnI0DAMyNAwDQjQMA0o0DANSNAwDWjQMA2o0DAOyNAwAIjgMACo4DAAyO AwAcjgMAHo4DAC6OAwAyjgMARI4DAEaOAwDkjgMA9I4DAPaOAwD4jgMA/I4DAAKPAwAEjwMAZo8D AGyPAwCQkQMAnpEDAKCRAwCikQMApJEDAPjw6PD48Ojw3PDRxbXFqsWhxaHR8Nzw0ZmR8JHw0fDR 8JHw0fD4mfCZ8JnwmfCJgfCBAAAAAA4WaEUIwQBDShQAYUoUAAAOFmhnM/QAQ0oUAGFKFAAADhZo 21hIAENKFABhShQAAA4WaJFnZQBDShQAYUoUAAARFmi8Yx4APioBQ0oUAGFKFAAUFWjAZj8AFmi8 Yx4AQ0oUAGFKFAAAHxVob2IjABZovGMeAD4qAUNKFABhShQAbUgJBHNICQQXFWhvYiMAFmi8Yx4A PioBQ0oUAGFKFAAUFWhvYiMAFmi8Yx4AQ0oUAGFKFAAAFhZovGMeAENKFABhShQAbUgJBHNICQQA DhZowGY/AENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmh5EH4AQ0oUAGFKFAAypJEDACiSAwAs kgMADJMDADaTAwCOlQMAkJUDAECWAwBClgMAaJYDAGqWAwB+lgMAjpYDAJCWAwColgMAqpYDAL6W AwDAlgMAyJYDAMqWAwCglwMAopcDACSZAwAmmQMAfJkDAKSZAwCwmgMAuJoDANSaAwDWmgMA4poD APiaAwBAmwMARJsDAEabAwBUmwMAVpsDAFqbAwBcmwMAXpsDAGCbAwCamwMA+Oz45Pjc+OTQ5Nz4 5PjI+OTQ5PjA+MD4uPi4+Lj4sPiw+KWZiYCZdYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBVo YlJhABZovGMeAENKFABhShQAABEWaLxjHgA+KgFDShQAYUoUAB8VaG9iIwAWaLxjHgA+KgFDShQA YUoUAG1ICQRzSAkEFxVob2IjABZovGMeAD4qAUNKFABhShQAFBVob2IjABZovGMeAENKFABhShQA AA4WaHhkLABDShQAYUoUAAAOFmiuGO0AQ0oUAGFKFAAADhZo/DhRAENKFABhShQAAA4WaI5toABD ShQAYUoUAAAXFWioKvQAFmioKvQANgiBQ0oUAGFKFAAOFmh5EH4AQ0oUAGFKFAAADhZoqCr0AENK FABhShQAABYWaLxjHgBDShQAYUoUAG1ICQRzSAkEAA4WaLxjHgBDShQAYUoUACmamwMAnJsDABCc AwAUnAMAGJwDAAKdAwAEnQMAGJ0DABqdAwCqnQMArJ0DAECgAwBCoAMATqADAFCgAwBqoAMAqKAD ACqhAwAyoQMA5qMDAASkAwAQpAMAJqQDACikAwA0pAMASKQDAFakAwDGpAMAGqUDABylAwA+pQMA QKUDAFClAwBSpQMAqqUDAKylAwAOpgMAJKYDAPymAwA+pwMAcKcDAJinAwCopwMAxqcDAMqnAwDO pwMAAqgDAH6oAwCQqQMApKkDAA6rAwAkqwMAOKsDADqrAwDoqwMA7qsDAPSrAwAgrAMAOqwDAPXt 4fXt9e317dnt9e317dntzu3Gvu3G7b7tvsazxrOr2avG7dnt2e2+2b7Zvu2+7aPtm+2b7ZuTm5MO FmjiCEIAQ0oUAGFKFAAADhZoWQkgAENKFABhShQAAA4WaK4Y7QBDShQAYUoUAAAOFmiyIjcAQ0oU AGFKFAAAFBVoWSpQABZoWSpQAENKFABhShQAAA4WaA0BZABDShQAYUoUAAAOFmhZKlAAQ0oUAGFK FAAAFBVoWxHwABZovGMeAENKFABhShQAAA4WaHhkLABDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABt SAkEc0gJBAAOFmi8Yx4AQ0oUAGFKFAAAFBVo0nX9ABZovGMeAENKFABhShQAOn6oAwAyqQMATKwD AJKuAwAMtwMAnsADABTKAwD+zgMAKtIDACzSAwBS0gMAUN8DACzjAwDg+AMAMAQEADIEBAA0BAQA agQEAGwEBACqBAQAqgoEACAXBABmHgQA4iMEAOYjBAA2JAQA8ioEANAyBAAWNgQA+gAAAAAAAAAA AAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6 AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAA AAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAA AAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAA AAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA +gAAAAAAAAAAAAAAAAAAAAAABwAAAyQBYSQBZ2S8Yx4AAAQAAGdkvGMeAAAcOqwDAEisAwD4rQMA Dq4DABquAwAergMAQK4DAI6uAwBisAMAbLADAHKyAwCEsgMAhrIDAKayAwCosgMA5LIDAACzAwAQ swMAFLMDAByzAwAiswMAOrMDAD6zAwBAswMAYLMDAGSzAwCCswMA6LMDAHi0AwB6tAMAeLUDAIa1 AwAItgMASLYDAFC2AwBetgMAbrYDAHq2AwCAtgMAgrYDAJS2AwCWtgMACLcDAK63AwCwtwMA0rcD ANS3AwD2twMA+LcDAKS4AwCmuAMAqLgDAKq4AwDCuAMAxrgDACC5AwAmuQMAGroDABy6AwAWuwMA cLsDAHy7AwCAuwMAjrsDAJK7AwDkuwMA7LsDAPa7AwD4uwMA+rsDAPjw6PDo8Ojw4PDg8ODw4Njg 2ODY4NDg0ODQ4NDg8Ojw6PDgyPDI6MjoyPDA8MDwwPC48LjIwPCw8MDwyPC48MjwwPDIwAAAAA4W aNtYSABDShQAYUoUAAAOFmiuGO0AQ0oUAGFKFAAADhZoPwdPAENKFABhShQAAA4WaOgIhABDShQA YUoUAAAOFmicPrkAQ0oUAGFKFAAADhZoiTSUAENKFABhShQAAA4WaHhkLABDShQAYUoUAAAOFmhJ ZYMAQ0oUAGFKFAAADhZovGMeAENKFABhShQAAA4WaFkJIABDShQAYUoUAEX6uwMADLwDAA68AwAS vAMAGLwDAC68AwAwvAMAMrwDADS8AwDYvAMA2rwDAG69AwByvQMAdsADAIbAAwBOwQMAXsEDAGDB AwCQwQMAEsIDABTCAwAewgMAIMIDAJLCAwCUwgMAssIDALTCAwDOwgMA0MIDANzCAwDewgMAPsMD AEDDAwAWxAMAGMQDABrEAwAoxAMAKsQDAKjFAwC2xQMAusYDALzGAwDyxgMAKscDAFzHAwBgxwMA dMcDAHrHAwCoxwMArMcDAOLHAwD2xwMANMgDADbIAwCQygMAosoDAJDMAwCSzAMAPM0DAD7NAwBw zQMAls0DAKzNAwD48Ojw6PD44Pjw+OD44PjY+Nj4zfjN+M34zfjN+M34wvjot6/o+OD4p/in+PD4 8Pjw+Kf48Pjw+PD48Pif+AAAAAAOFmgiZzcAQ0oUAGFKFAAADhZoISlnAENKFABhShQAAA4WaGsN 8gBDShQAYUoUAAAUFWhrDfIAFmhrDfIAQ0oUAGFKFAAAFBVokQrHABZovGMeAENKFABhShQAABQV aK4Y7QAWaK4Y7QBDShQAYUoUAAAOFmiyIjcAQ0oUAGFKFAAADhZo6AiEAENKFABhShQAAA4WaK4Y 7QBDShQAYUoUAAAOFmg/B08AQ0oUAGFKFAAADhZovGMeAENKFABhShQAPqzNAwDkzQMA2M4DAPrO AwBK0AMAYNADAHbQAwCq0AMAxtADANbQAwDa0AMABNIDABrSAwAc0gMAJNIDACbSAwAq0gMALNID ADrSAwA80gMAQNIDAELSAwBE0gMARtIDAFLSAwBU0gMAYtIDAHbSAwCM0gMAptIDAK7SAwDM0gMA 2NIDANrSAwD00gMA/tIDAALTAwAI0wMAEtMDAPjw6PD46PDo8Ojw4NXJ1fC+s6eXjqeDjvB7c2t7 a3tza3N7c3tjAAAAAA4WaAlYcgBDShQAYUoUAAAOFmiAfO8AQ0oUAGFKFAAADhZo+npnAENKFABh ShQAAA4WaI5toABDShQAYUoUAAAUFWi5fMEAFmi8Yx4AQ0oUAGFKFAAAERZovGMeAD4qAUNKFABh ShQAHxVob2IjABZovGMeAD4qAUNKFABhShQAbUgJBHNICQQXFWhvYiMAFmi8Yx4APioBQ0oUAGFK FAAUFWhvYiMAFmi8Yx4AQ0oUAGFKFAAAFBVoISlnABZoTzU3AENKFABhShQAABcVaCEpZwAWaLxj HgA1CIFDShQAYUoUABQVaNJ1/QAWaLxjHgBDShQAYUoUAAAOFmhiUmEAQ0oUAGFKFAAADhZoISln AENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmgiZzcAQ0oUAGFKFAAmEtMDABbTAwAw0wMANNMD ADbTAwBM0wMATtMDAFDTAwAG1AMAFNQDACbUAwAo1AMATNQDAHTUAwDG1AMA1tQDAJzVAwCm1QMA tNUDALjVAwDk1QMA+NUDAAzWAwAO1gMAENYDABLWAwA61gMAPNYDAJLWAwCk1gMA4NYDAOLWAwDq 1gMA7NYDAMrXAwDc1wMA8tcDAPbXAwD41wMAKtgDADTYAwBO2AMAoNgDALbYAwBm2QMAaNkDACza AwAu2gMArtoDALDaAwAm2wMAUtsDAF7bAwD48Ojd6PDo8NXw1fDN8M3wxfDF8MXwvfC98L3wtfCq 8KrwvfC98L3wvfDF8KLwl/CM8ISiDhZomF3YAENKFABhShQAABQVaDxibAAWaLxjHgBDShQAYUoU AAAUFWg8YmwAFmiANnAAQ0oUAGFKFAAADhZoR3TIAENKFABhShQAABQVaPkg1gAWaLxjHgBDShQA YUoUAAAOFmjYRBgAQ0oUAGFKFAAADhZo7xGiAENKFABhShQAAA4WaCBCawBDShQAYUoUAAAOFmhr R3QAQ0oUAGFKFAAADhZoshNyAENKFABhShQAABQVaFMaXgAWaFMaXgBDShQAYUoUAAAOFmhTGl4A Q0oUAGFKFAAADhZovGMeAENKFABhShQAAA4WaI5toABDShQAYUoUADRe2wMAwN0DAOLdAwBS3gMA nN4DABLfAwBO3wMAUt8DAGLfAwBo3wMAPOADAEbgAwBI4AMAUOADAFLgAwBk4AMAnuADAKLgAwCm 4AMAxuADAMjgAwD+4AMAGOEDABrhAwAe4QMAKuMDACzjAwAu4wMAMuMDAETjAwBK4wMATOMDAFLj AwBU4wMAWOMDANbkAwDk5AMAcuUDAHjlAwDo5gMA+uYDACjqAwAq6gMA+PD46OD42PjY+OD42OD4 4PjQ+OD44PjI+L2xpZ2VjZ34hfh9+H34dfhtAAAAAA4WaGtHdABDShQAYUoUAAAOFmiLRzkAQ0oU AGFKFAAADhZo3yzaAENKFABhShQAAA4WaCBCawBDShQAYUoUAAAPFWiXdtIAFmiXdtIANQiBDxVo l3bSABZogHzvADUIgQ8VaJd20gAWaLxjHgA1CIEXFWiXdtIAFmggQmsANQiBQ0oUAGFKFAAXFWiX dtIAFmi8Yx4ANQiBQ0oUAGFKFAAUFWh4ZZsAFmi8Yx4AQ0oUAGFKFAAADhZoKGbnAENKFABhShQA AA4WaCEpZwBDShQAYUoUAAAOFmgiQeUAQ0oUAGFKFAAADhZo2VQ8AENKFABhShQAAA4WaLl8wQBD ShQAYUoUAAAOFmgKUUoAQ0oUAGFKFAAADhZovGMeAENKFABhShQAKirqAwDi7AMA5OwDABDuAwAS 7gMAIO4DACLuAwBe7gMAiO4DAOTuAwDm7gMAOu8DADzvAwBS7wMAeO8DAMjvAwDi7wMA5O8DAPLx AwAc8gMAUvIDAF7yAwDE8gMAxvIDANLyAwDU8gMAKvMDACzzAwAu8wMAQPMDAELzAwBO8wMAcvMD ALjzAwC+8wMAePYDAHr2AwB89gMAfvYDAID2AwCC9gMAhPYDAPjw+OX45fjd+NX45c343fjd+MX4 ufiu+K743aPdo/ib+M34k/iDem96AAAAAAAAAAAAAAAAABQVaEst2gAWaLxjHgBDShQAYUoUAAAR Fmi8Yx4ANQiBQ0oUAGFKFAAfFWhLLdoAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBA4WaM5cyABD ShQAYUoUAAAOFmgyZAMAQ0oUAGFKFAAAFBVo3yzaABZo3yzaAENKFABhShQAABQVaKBE2AAWaLxj HgBDShQAYUoUAAAXFWicPrkAFmi8Yx4APioBQ0oUAGFKFAAOFmicPrkAQ0oUAGFKFAAADhZo21hI AENKFABhShQAAA4WaEUFqwBDShQAYUoUAAAOFmjfLNoAQ0oUAGFKFAAAFBVogHzvABZogHzvAENK FABhShQAAA4WaIA2cABDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAphPYDAIb2AwCM+AMAoPgDAKz4 AwDA+AMA3vgDAOD4AwDi+AMAPvkDAE75AwBQ+QMAUvkDAFb5AwAG+gMAHvoDAE76AwBW+gMAXvoD AGL6AwBu+gMAcvoDALD6AwC0+gMAvvoDAOj6AwAW+wMAHPsDAB77AwAm+wMAKvsDACz7AwBg+wMA ePsDAKz7AwDq+wMADvwDAPLq4trS4se8tKi8tKC04rSYtJi0mLSYtJC0hLR8cHy0aLSQYAAAAAAA AAAADhZo2XiWAENKFABhShQAAA4WaGZb5ABDShQAYUoUAAAXFWhbbmsAFmhbbmsANQiBQ0oUAGFK FAAOFmhbbmsAQ0oUAGFKFAAAFxVoW25rABZobHcuADUIgUNKFABhShQADhZo7jLIAENKFABhShQA AA4WaMQ0ngBDShQAYUoUAAAOFmiJN2AAQ0oUAGFKFAAAFxVomhveABZobHcuAD4qAUNKFABhShQA DhZobHcuAENKFABhShQAABQVaGx3LgAWaGx3LgBDShQAYUoUAAAUFWhJAggAFmi8Yx4AQ0oUAGFK FAAADhZoa0d0AENKFABhShQAAA4WaM5cyABDShQAYUoUAAAOFmiRN2MAQ0oUAGFKFAAADhZovGMe AENKFABhShQAABkWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEACQO/AMAEPwDACj8AwAq/AMALvwD AHD8AwBy/AMAkPwDAJL8AwDE/AMA0vwDANT8AwDo/AMAGP0DADb9AwBG/QMATv0DAK79AwC2/QMA jP4DAI7+AwC8/gMA1v4DANj+AwAm/wMAav8DAH7/AwC4/wMAxv8DAOr/AwAyAAQAhgAEAKYABACo AAQAqgAEAOIABADkAAQA+AAEAPwABAAcAQQAZgEEAGgBBAD2AQQADgIEACoCBABGAgQAUAIEAPXt 5d3l3eXt5dXN1c3Fzb3Nxc3dta2ltZ2lna2dlZ2tnd2djZ2NnYWdfc21zXUOFmj1fZYAQ0oUAGFK FAAADhZo8Aj0AENKFABhShQAAA4WaIpZiABDShQAYUoUAAAOFmjbWEgAQ0oUAGFKFAAADhZokTdj AENKFABhShQAAA4WaA0BZABDShQAYUoUAAAOFmhrR3QAQ0oUAGFKFAAADhZoiTdgAENKFABhShQA AA4WaLpTBgBDShQAYUoUAAAOFmhCCmwAQ0oUAGFKFAAADhZoPF6LAENKFABhShQAAA4WaMQ0ngBD ShQAYUoUAAAOFmg9daQAQ0oUAGFKFAAADhZo7jLIAENKFABhShQAAA4WaGx3LgBDShQAYUoUAAAO FmjZeJYAQ0oUAGFKFAAAFBVo2XiWABZo2XiWAENKFABhShQALlACBABeAgQAcAIEAHYCBAB8AgQA fgIEAIACBAAgAwQAigMEAMoDBADcAwQA3gMEAOADBADkAwQA5gMEAOoDBADsAwQA8gMEAPQDBAAC BAQALgQEADAEBAAyBAQANAQEADgEBAA6BAQAPgQEAGoEBABsBAQAegQEAHwEBAB+BAQAgAQEAIIE BACEBAQA+PD48Ojd6PDV8MrDvMO8w7zDvMO1raKak4+TrYR4a2J4VxQVaOd26gAWaLxjHgBDShQA YUoUAAARFmi8Yx4APioBQ0oUAGFKFAAZFmi8Yx4APioBQ0oUAGFKFABtSAkEc0gJBBcVaG9iIwAW aLxjHgA+KgFDShQAYUoUABQVaG9iIwAWaLxjHgBDShQAYUoUAAAGFmgrF/gAAAwVaMkbTAAWaLxj HgAADxVoKxf4ABZovGMeADUIgRQVaHhlmwAWaIpZiABDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAA DBVoi0c5ABZovGMeAAAMFWiLRzkAFmgOFSoAAAwVaItHOQAWaIpZiAAAFBVoilmIABZoilmIAENK FABhShQAAA4WaKIJ9wBDShQAYUoUAAAUFWhrR3QAFmhrR3QAQ0oUAGFKFAAADhZoa0d0AENKFABh ShQAAA4WaIk3YABDShQAYUoUAAAOFmjENJ4AQ0oUAGFKFAAihAQEAKoEBADaBAQA+gQEAMYJBADI CQQA5gkEACoKBABQCgQAagoEAHQKBAB2CgQAkAoEAKYKBACoCgQAqgoEABALBAAmCwQATgsEAJQL BADWCwQAKgwEAC4MBAAwDAQAAg0EABwNBABUDQQAeA0EAHwNBADaDQQA3A0EAGoOBABsDgQAbg4E AHAOBADwDgQADg8EABAPBAAcDwQAMA8EADQPBAA+DwQAQA8EAIgPBAD27ubu3u7e7tbu1u7W7s7u xu7mvubuvu62xu6q7p+Xj3+Pl3eXb5dvl293AAAADhZo2gALAENKFABhShQAAA4WaI9dJgBDShQA YUoUAAAfFWgnKSQAFmgnKSQANQiBQ0oUAGFKFABtSAkEc0gJBA4WaNBicABDShQAYUoUAAAOFmiV UIkAQ0oUAGFKFAAAFBVolVCJABZolVCJAENKFABhShQAABYWaLxjHgBDShQAYUoUAG1ICQRzSAkE AA4WaJhd2ABDShQAYUoUAAAOFmg/DCAAQ0oUAGFKFAAADhZolmsOAENKFABhShQAAA4WaMBVEwBD ShQAYUoUAAAOFmglDroAQ0oUAGFKFAAADhZo30B0AENKFABhShQAAA4WaMxZ5wBDShQAYUoUAAAO Fmi8Yx4AQ0oUAGFKFAAAERZovGMeAD4qAUNKFABhShQAACuIDwQAig8EAM4PBABCEAQARBAEAFwQ BACCEAQA/hAEAAIRBAAOEgQAMBIEAFYSBABYEgQAhBIEAJASBACSEgQA4hIEAOgSBADqEgQA7hIE APASBACAFAQAjBQEAFQVBABWFQQAbBUEAG4VBACCFQQAhBUEAP4VBAAAFgQAIBcEADoXBABAFwQA zBcEANYXBACeGgQAoBoEAJobBAAuHAQAMBwEAIQcBACGHAQAIB0EACIdBAB0HQQAdh0EAIYdBACI HQQA+PDo4Ojg6Njo0OjI2MjYyLyxvLHIqcie0J7IltDI0PjQ+I74qfiGeoaphqmGqYapFxVoGHLU ABZoGHLUADUIgUNKFABhShQADhZo0GJwAENKFABhShQAAA4WaDJkAwBDShQAYUoUAAAOFmjHBCwA Q0oUAGFKFAAAFBVowFUTABZowFUTAENKFABhShQAAA4WaBhy1ABDShQAYUoUAAAUFWgPCvEAFmgP CvEAQ0oUAGFKFAAAFhZoDwrxAENKFABhShQAbUgJBHNICQQADhZoDwrxAENKFABhShQAAA4WaMBV EwBDShQAYUoUAAAOFmgnKSQAQ0oUAGFKFAAADhZoTB4wAENKFABhShQAAA4WaNZkeQBDShQAYUoU AAAOFmiPXSYAQ0oUAGFKFAAADhZolVCJAENKFABhShQAMIgdBACUHQQAlh0EAGQeBABmHgQAeB4E ALIeBAC0HgQAxh4EAMgeBADMHgQAbB8EAM4gBAAYIQQAaCEEAGwhBACCIQQAhiEEAKQhBAC6IQQA nCIEAJ4iBACgIgQA4iMEAOQjBADmIwQA9CMEAPYjBAD4IwQA+iMEAPwjBAD+IwQANiQEAAYlBAAI JQQAECUEAPjw+Oj44Njg+Mz46PjoxOjE6MTo8Lnoseimmo2EmnmE6GlhAAAAAAAAAAAAAAAAAAAA DhZoW25rAENKFABhShQAAB8VaKcC5gAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEFBVorwhwABZo vGMeAENKFABhShQAABEWaLxjHgA+KgFDShQAYUoUABkWaLxjHgA+KgFDShQAYUoUAG1ICQRzSAkE FxVob2IjABZovGMeAD4qAUNKFABhShQAFBVob2IjABZovGMeAENKFABhShQAAA4WaN9AdABDShQA YUoUAAAUFWiOLPYAFmi8Yx4AQ0oUAGFKFAAADhZo21hIAENKFABhShQAABYWaNBicABDShQAYUoU AG1ICQRzSAkEAA4WaDJkAwBDShQAYUoUAAAOFmjAVRMAQ0oUAGFKFAAADhZovGMeAENKFABhShQA AA4WaBhy1ABDShQAYUoUAAAOFmjQYnAAQ0oUAGFKFAAjECUEABYlBAAYJQQAKCUEALglBADOJQQA 3iUEAO4lBADyJQQANiYEADgmBABQJgQAaiYEAHgmBAB8JgQAjCYEALImBAD2JgQA+CYEAOgoBABI KQQASikEAGIpBABkKQQAkCkEAJIpBADMKQQAzikEAIYqBACIKgQAiioEAJwqBACmKgQAsCoEALQq BADGKgQACisEAAwrBAAWKwQAGisEABwrBAD17eXt3e3V3e3l7eXt5e3V5cntvbS9ou2a7Zrtmu2a 7ZLtiu1+7XJnAAAUFWiCXUkAFmi8Yx4AQ0oUAGFKFAAAFhZovGMeAENKFABhShQAbUgJBHNICQQA FxVogl1JABZovGMeADUIgUNKFABhShQADhZoSF0cAENKFABhShQAAA4WaPV9lgBDShQAYUoUAAAO Fmitc/4AQ0oUAGFKFAAAIhVorXP+ABZovGMeADUIgTYIgUNKFABhShQAbUgJBHNICQQAERZonD65 ADYIgUNKFABhShQAFxVorXP+ABZovGMeADYIgUNKFABhShQAFxVonD65ABZonD65ADUIgUNKFABh ShQADhZoPwwgAENKFABhShQAAA4WaFtuawBDShQAYUoUAAAOFmicPrkAQ0oUAGFKFAAADhZovGMe AENKFABhShQAABQVaKcC5gAWaLxjHgBDShQAYUoUACgcKwQADCwEACAsBAAiLAQAJiwEAI4sBACc LAQAniwEAMosBADMLAQAziwEANAsBAAYLQQAHC0EAGQtBABmLQQAaC0EAGwtBABwLQQAci0EAHQt BACCLQQAhC0EAJ4tBACgLQQApi0EAKotBAC2LQQAvC0EAMYtBADILQQA5C0EAOYtBABALgQAWC4E AMYuBADILgQAzi4EANAuBAAaLwQAHC8EACAvBAAqLwQA0i8EAOAvBAAoMAQAKjAEAC4wBAAwMAQA XDAEAIgwBAD48Pjk+Nz43PjMwfjk+LGmm4ybpoH4gfjkgfjk+IH4gfjc+IH4gfix+Nz43PiB5IH4 3AAAAAAUFWjCQYgAFmi8Yx4AQ0oUAGFKFAAAHBVorXP+ABZorXP+AENKFABhShQAbUgJBHNICQQA FBVorXP+ABZorXP+AENKFABhShQAABQVaK1z/gAWaLxjHgBDShQAYUoUAAAfFWjCQYgAFmi8Yx4A NQiBQ0oUAGFKFABtSAkEc0gJBBQVaIJdSQAWaLxjHgBDShQAYUoUAAAfFWiCXUkAFmi8Yx4ANQiB Q0oUAGFKFABtSAkEc0gJBA4WaGBuaQBDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAO Fmg/DCAAQ0oUAGFKFAAADhZovGMeAENKFABhShQAMogwBAD2MAQACjEEANIxBADyMQQALDIEADIy BADQMgQARDMEAGYzBABcNAQArDQEALA0BACyNAQAtjQEAI41BACQNQQAoDUEABQ2BAAWNgQACDgE AAo4BACMOAQArjgEALA4BAC0OAQAtjgEALo4BADAOAQALjkEAD45BAC0OQQAvjkEANY5BADyOQQA AjoEAAo6BAAgOgQAMjoEADQ6BAA6OgQASDoEAEo6BAD48Pjo+Oj44NTgzMS8xMyxqczg+KH4ofiV iviV+IL46PjoguiC6IL4d2sXFWhvYiMAFmi8Yx4APioBQ0oUAGFKFAAUFWhvYiMAFmi8Yx4AQ0oU AGFKFAAADhZo0hCuAENKFABhShQAABQVaCY1wAAWaLxjHgBDShQAYUoUAAAWFmi8Yx4AQ0oUAGFK FABtSAkEc0gJBAAOFmgCTCMAQ0oUAGFKFAAADhZorXP+AENKFABhShQAABQVaK1z/gAWaK1z/gBD ShQAYUoUAAAOFmjbWEgAQ0oUAGFKFAAADhZo9X2WAENKFABhShQAAA4WaEk3VABDShQAYUoUAAAX FWgyZAMAFmgyZAMAPioBQ0oUAGFKFAAOFmgyZAMAQ0oUAGFKFAAADhZoPwwgAENKFABhShQAAA4W aGBuaQBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAqFjYEADY6BAA6OgQAkjoEAAZNBAAQVgQAVmUE AFhlBABaZQQAhGUEAIZlBACqZQQAzHEEAIp5BABSfwQABIUEANCIBADSiAQAFokEACCRBACAmAQA 0pkEANyhBAASpQQAcqYEAKypBACUqwQAXq0EAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAA AAAAAAD6AAAAAAAAAAAAAAAA6gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA +gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAA AAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAA AAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoA AAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAAAAAAAAAAcAAAMkAWEkAWdkvGMe AAAHAAADJANhJANnZLxjHgAABAAAZ2S8Yx4AABtKOgQATDoEAE46BABQOgQAUjoEAJA6BACSOgQA 1joEAFo8BABcPAQALD0EAI4/BACuPwQAsj8EALQ/BAC2PwQA1j8EANg/BADuPwQA8D8EAPI/BAD2 PwQAQkAEAEpABAAIQQQAEEEEAC5BBAAwQQQAMkEEADZBBAByQQQAgkEEAIZBBADy6d3S6ca+tr62 vq6irr6ulouAcIBoYGhgaGBUaL5gogAAAAAXFWitc/4AFmitc/4ANQiBQ0oUAGFKFAAOFmitc/4A Q0oUAGFKFAAADhZoCTLUAENKFABhShQAAB8VaMNvegAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkE FBVow296ABZovGMeAENKFABhShQAABQVaFoG+AAWaFoG+ABDShQAYUoUAAAXFWhaBvgAFmhaBvgA NQiBQ0oUAGFKFAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAOFmhaBvgAQ0oUAGFKFAAADhZoMHbs AENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWh5PYsAFmi8Yx4APioBQ0oUAGFKFAAUFWivCHAA Fmi8Yx4AQ0oUAGFKFAAAFxVob2IjABZovGMeAD4qAUNKFABhShQAERZovGMeAD4qAUNKFABhShQA GRZovGMeAD4qAUNKFABhShQAbUgJBHNICQQAIIZBBACIQQQAjEEEAJJBBACWQQQAnEEEAOhBBADq QQQAAkIEAAZCBAAkQgQAJkIEAFhCBABgQgQAZEIEAHBCBAByQgQAdEIEAHZCBADeQgQA4EIEAPhC BAD8QgQAAEMEACZDBAAoQwQALEMEADJDBABsQwQAbkMEAJZDBACYQwQAnEMEAL5DBADCQwQA1EME AN5DBADiQwQAEkQEABZEBAAYRAQAGkQEABxEBAAeRAQAlEYEAJZGBACyRgQAtEYEALxGBAD17eHt 1u3G7eHtu+3hu+277bvtxu3hu+277bDtpe2Vpe2l7eGl7eGl1uHW7YXteu0UFWjbOIYAFmi8Yx4A Q0oUAGFKFAAAHxVo2ziGABZovGMeADUIgUNKFABhShQAbUgJBHNICQQfFWjLAYEAFmi8Yx4ANQiB Q0oUAGFKFABtSAkEc0gJBBQVaMsBgQAWaLxjHgBDShQAYUoUAAAUFWilLB4AFmi8Yx4AQ0oUAGFK FAAAFBVo/TIXABZovGMeAENKFABhShQAAB8VaP0yFwAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkE FBVoYTpaABZovGMeAENKFABhShQAABYWaLxjHgBDShQAYUoUAG1ICQRzSAkEAA4WaLxjHgBDShQA YUoUAAAUFWjDb3oAFmi8Yx4AQ0oUAGFKFAAwvEYEAL5GBADARgQAOkcEADxHBABuRwQAcEcEALRH BAC2RwQA0kgEANRIBADiSAQA5EgEAERJBABGSQQAWEkEAFpJBAC0SQQAtkkEAMRJBADSSQQA8kkE APRJBAD+SQQAAEoEAExKBABOSgQAuEoEALpKBADMSgQAzkoEAORKBADmSgQA6EoEAPBKBADySgQA /EoEAO/k3NHcwdzR3NHc0dzR3NHcudy53K7crtye3JPck9yDeNxvZAAAAAAAAAAAAAAAAAAAAAAU FWgBYlwAFmgBYlwAQ0oUAGFKFAAAERZoAWJcADUIgUNKFABhShQAFBVo5iNOABZovGMeAENKFABh ShQAAB8VaOYjTgAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEFBVowh9yABZovGMeAENKFABhShQA AB8VaGxZQgAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEFBVobFlCABZovGMeAENKFABhShQAAA4W aGBuaQBDShQAYUoUAAAfFWhYYBMAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBBQVaFhgEwAWaLxj HgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFBVoDT+1ABZovGMeAENKFABhShQAAB8VaGE6WgAW aLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEACT8SgQAAEsEAAJLBAAESwQABksEABhLBAAaSwQAHEsE ACBLBAA6SwQALkwEAGBMBABiTAQAdkwEAJRMBACYTAQAmkwEAARNBAAGTQQAFk0EABhNBABATQQA ZE0EAPRNBAD2TQQABE4EAAZOBAAWTgQAGE4EAChOBAAqTgQAVk8EAHhPBADITwQAzE8EANhPBADa TwQAGlAEACRQBAAqUAQALFAEAEBQBABCUAQARFAEAPXp4dbh1uHO1uHOws7httbh1uHO4a7ho+Gj m5Dho+Gu4YjhiOGuzuGI4XgAAAAAAAAAAAAAAAAAAAAAAAAAAAAfFWhbGmwAFmi8Yx4ANQiBQ0oU AGFKFABtSAkEc0gJBA4WaGoLygBDShQAYUoUAAAUFWhgbmkAFmhgbmkAQ0oUAGFKFAAADhZoYG5p AENKFABhShQAABQVaMNvegAWaLxjHgBDShQAYUoUAAAOFmhkbmUAQ0oUAGFKFAAAFhZovGMeAENK FABhShQAbUgJBHNICQQAFxVoAWJcABZoAWJcADUIgUNKFABhShQADhZoAWJcAENKFABhShQAABQV aLIZKAAWaLxjHgBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAAFxVoshkoABZovGMeADUIgUNKFABh ShQAFBVoAWJcABZovGMeAENKFABhShQAK0RQBABGUAQASlAEAExQBABcUAQAUFIEAFJSBABwUgQA clIEAMxSBADQUgQADlMEABBTBAAeUwQALFMEAC5TBABGUwQATFMEAOBTBAAAVAQAnFQEAJ5UBACg VAQAolQEALxUBAC+VAQAwFQEAOxUBAAsVQQAflUEAKhVBACqVQQArFUEAK5VBADOVQQA0lUEANxV BAAMVgQADlYEABBWBABgVgQAYlYEANBWBADSVgQADlcEABBXBAD17d317dXt1e3J1e3V7fXt9e3B 7bntue2pnu3V7Za57bnt1e3V7Yvtg+3B7XMAHxVowh9yABZovGMeADUIgUNKFABhShQAbUgJBHNI CQQOFmhqC8oAQ0oUAGFKFAAAFBVow296ABZovGMeAENKFABhShQAAA4WaBszdwBDShQAYUoUAAAU FWiER1wAFmi8Yx4AQ0oUAGFKFAAAHxVohEdcABZovGMeADUIgUNKFABhShQAbUgJBHNICQQOFmhk bmUAQ0oUAGFKFAAADhZoAWJcAENKFABhShQAABYWaLxjHgBDShQAYUoUAG1ICQRzSAkEAA4WaNtY SABDShQAYUoUAAAfFWhbGmwAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBA4WaLxjHgBDShQAYUoU AAAUFWhbGmwAFmi8Yx4AQ0oUAGFKFAAtEFcEABJXBABIVwQAXlcEAIhXBACKVwQAlFcEAJ5XBAAE WAQACFgEAD5YBABAWAQAQlgEAExYBABkWAQAZlgEAGhYBABqWAQAblgEAHBYBAB2WAQAeFgEAKhY BACuWAQA7FkEAPpZBACKWgQAyloEANxaBADyWgQAclsEAHRbBACSWwQAlFsEAEBcBABUXAQAaFwE AGpcBAB8XAQAolwEAKZcBAA0XQQATl0EALBdBADwXQQA8l0EAPZdBAAAXgQAAl4EAAZeBABCXgQA mGAEAPXt5e317d3t9e3V7dXt1e317c3t9e3F7dXt1e297dXt1e3V7a3topftj+3V7dXt1e2D7QAA ABcVaAFiXAAWaLxjHgA+KgFDShQAYUoUAA4WaAIg4wBDShQAYUoUAAAUFWgRF94AFmi8Yx4AQ0oU AGFKFAAAFBVotQRrABZovGMeAENKFABhShQAAB8VaBEX3gAWaLxjHgA1CIFDShQAYUoUAG1ICQRz SAkEDhZoU2oxAENKFABhShQAAA4WaNtYSABDShQAYUoUAAAOFmgbM3cAQ0oUAGFKFAAADhZoG15V AENKFABhShQAAA4WaPV9lgBDShQAYUoUAAAOFmgBYlwAQ0oUAGFKFAAADhZovGMeAENKFABhShQA ABQVaMIfcgAWaLxjHgBDShQAYUoUADOYYAQAmmAEADRhBABAYQQAQmEEAGBhBAAwYgQAQGIEAKRi BACmYgQAumIEALxiBAD0YgQA9mIEAAZjBAAIYwQADGMEAA5jBACOYwQAkGMEAJJjBACiYwQApGME ADplBAA8ZQQATmUEAFBlBABSZQQAVGUEAFplBABcZQQAXmUEAGJlBABoZQQAgmUEAIRlBACGZQQA 9e3l7d3t3e3S7dLtx+3Hu8ftq6Ptm+2Q7YCQ5e10bWltZW3tAAAAAAAAAAAAAAAAAAAAAAAABhZo vGMeAAAGFmgrF/gAAAwVaMkbTAAWaLxjHgAAFxVoKxf4ABZovGMeADUIgUNKHABhShwAHxVogD5G ABZovGMeADUIgUNKFABhShQAbUgJBHNICQQUFWiAPkYAFmi8Yx4AQ0oUAGFKFAAADhZoG15VAENK FABhShQAAA4WaAFiXABDShQAYUoUAAAfFWjRBrMAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBBYW aLxjHgBDShQAYUoUAG1ICQRzSAkEABQVaP1hRAAWaLxjHgBDShQAYUoUAAAUFWjRBrMAFmi8Yx4A Q0oUAGFKFAAADhZo21hIAENKFABhShQAAA4WaBszdwBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFKFAAA FBVoXXmDABZovGMeAENKFABhShQAJIZlBACUZQQAlmUEAJhlBACaZQQAnGUEAJ5lBACqZQQAAGYE AAJmBAAKZgQADGYEAA5mBAAQZgQAemYEAH5mBAC+ZgQAwmYEAMZmBADOZgQA0GYEAP5mBAAKZwQA 9mcEAP5nBAB2aAQAhGgEAH5pBACwaQQA0GkEANRpBAAYagQAGmoEAJRqBACWagQAomoEAKZqBADm agQA9ejf08jA37ituK24rbiluJq4mq24jriCuHq4crhyuGe4crhyuAAAAAAAAAAAAAAAAAAAAAAA FBVo40ESABZovGMeAENKFABhShQAAA4WaM1l6gBDShQAYUoUAAAOFmhkbmUAQ0oUAGFKFAAAFxVo 71k+ABZovGMeADUIgUNKFABhShQAFxVohgj1ABZohgj1AD4qAUNKFABhShQAFBVohgj1ABZohgj1 AENKFABhShQAAA4WaIYI9QBDShQAYUoUAAAUFWj9MhcAFmi8Yx4AQ0oUAGFKFAAADhZovGMeAENK FABhShQAAA8VaCsX+AAWaLxjHgA+KgEUFWjnduoAFmi8Yx4AQ0oUAGFKFAAAFxVob2IjABZovGMe AD4qAUNKFABhShQAERZovGMeAD4qAUNKFABhShQAGRZovGMeAD4qAUNKFABhShQAbUgJBHNICQQU FWhvYiMAFmi8Yx4AQ0oUAGFKFAAl5moEAOhqBABoawQAbGsEAEpsBABMbAQAjGwEAJBsBACUbAQA Jm4EADJuBACIbgQAjm4EAJJuBACUbgQAom4EAKRuBAC8bgQAvm4EAPZvBAD4bwQABnAEAApwBAAS cAQAFHAEACJwBAAkcAQAMHAEADJwBAA0cAQArHAEALZwBADKcAQAzHAEAD5xBABCcQQAgHEEAI5x BACocQQArnEEAPXt4e317dbh7c7twrnCua7tpu2b7ZDtkO2Q7YSQ7XztfO3h7c50aAAAAAAAAAAA ABcVaNcZQQAWaLxjHgA+KgFDShQAYUoUAA4WaNcZQQBDShQAYUoUAAAOFmjbWEgAQ0oUAGFKFAAA FxVojxMLABZovGMeADUIgUNKFABhShQAFBVojxMLABZovGMeAENKFABhShQAABQVaP9ECAAWaP9E CABDShQAYUoUAAAOFmjNZeoAQ0oUAGFKFAAAFBVohiCOABZovGMeAENKFABhShQAABEWaLxjHgA1 CIFDShQAYUoUABcVaIYgjgAWaLxjHgA1CIFDShQAYUoUAA4WaGBuaQBDShQAYUoUAAAUFWjjQRIA Fmi8Yx4AQ0oUAGFKFAAAFhZovGMeAENKFABhShQAbUgJBHNICQQADhZovGMeAENKFABhShQAABQV aIUkxwAWaLxjHgBDShQAYUoUACeucQQAsnEEAMhxBAAicwQAJHMEADpzBAA8cwQAXHMEAF5zBACC cwQAhHMEAIh0BACMdAQAoHQEAKR0BAD4dAQANnUEADx1BAA+dQQA2nYEAOZ2BAC0dwQAzncEANR3 BADgdwQAiHkEAIp5BACMeQQAzHoEAM56BADiewQA5HsEAEJ8BABEfAQARnwEAEp8BABOfAQAUnwE AFZ8BABYfAQA8+ff1N/M38zfzN/E38TfxN+838TftN+036me35Pfi997k99vZG9kABQVaIEPLgAW aLxjHgBDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAfFWidTvkAFmi8Yx4ANQiBQ0oU AGFKFABtSAkEc0gJBA4WaLMtiQBDShQAYUoUAAAUFWidTvkAFmi8Yx4AQ0oUAGFKFAAAFBVo2ziG ABZovGMeAENKFABhShQAABQVaKUsHgAWaLxjHgBDShQAYUoUAAAOFmj/RAgAQ0oUAGFKFAAADhZo 9zXpAENKFABhShQAAA4WaEllgwBDShQAYUoUAAAOFmiqJFoAQ0oUAGFKFAAAFBVo6C+vABZovGMe AENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWjXGUEAFmi8Yx4APioBQ0oUAGFKFAAXFWjXGUEA FmhgbmkAPioBQ0oUAGFKFAAAJ1h8BACWfAQAmHwEAMZ8BADIfAQAynwEALB+BACyfgQA+oAEAASB BAASgQQAFoEEAFSBBABggQQAKIIEADiCBABKggQAZoIEAIaEBACehAQA1IQEANyEBADghAQA4oQE AOiEBAAChQQAKoUEAESFBACOhwQAlIcEADSIBABCiAQAzogEANCIBADSiAQA4IgEAOKIBADkiAQA +O343dL4x/i/+L/4t/iv+L/4p/ifr5+vn/iX+K/4i/iA+HVoXwARFmi8Yx4APioBQ0oUAGFKFAAZ Fmi8Yx4APioBQ0oUAGFKFABtSAkEc0gJBBQVaG9iIwAWaLxjHgBDShQAYUoUAAAUFWjfVW0AFmi8 Yx4AQ0oUAGFKFAAAFxVohgj1ABZovGMeAD4qAUNKFABhShQADhZoSWWDAENKFABhShQAAA4WaHYb jABDShQAYUoUAAAOFmj/RAgAQ0oUAGFKFAAADhZo9zXpAENKFABhShQAAA4WaAk6gQBDShQAYUoU AAAOFmjbWEgAQ0oUAGFKFAAAFBVooXe3ABZovGMeAENKFABhShQAABQVaJ1O+QAWaLxjHgBDShQA YUoUAAAfFWiBDy4AFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBBQVaIEPLgAWaLxjHgBDShQAYUoU AAAOFmi8Yx4AQ0oUAGFKFAAl5IgEAOaIBADoiAQAFIkEABaJBABciQQAaokEAI6JBACeiQQAZIoE AGaKBAB6igQAfIoEAJCKBAD6igQA/ooEAKiMBADOjAQA0IwEANKMBADkjAQA5owEAAiNBAAYjQQA KI0EACyNBACQjQQAko0EACSOBAAojgQARo4EAE6OBABcjwQAcI8EAHqPBAB8jwQAsI8EAOqPBADu jwQAZpAEAHSQBAB8kAQAgJAEAIKQBAC6kAQA8pAEAPyQBABSkQQA8JEEABKSBAAUkgQANpIEAECS BADWkgQA4pIEAPPo39PLw8u7y7PDs6vLo8ury6vLq8ury7vLq8ury7PLm8ubu8uzy5PLk8uTy4vL m8uby5vLmwAAAAAOFmj1fZYAQ0oUAGFKFAAADhZo21hIAENKFABhShQAAA4WaCUYiQBDShQAYUoU AAAOFmgFE3sAQ0oUAGFKFAAADhZo/0QIAENKFABhShQAAA4WaLtR9ABDShQAYUoUAAAOFmj3NekA Q0oUAGFKFAAADhZoDQOTAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAXFWhTHrIAFmi8Yx4APioB Q0oUAGFKFAARFmi8Yx4APioBQ0oUAGFKFAAUFWjXfNYAFmi8Yx4AQ0oUAGFKFAAAFxVob2IjABZo vGMeAD4qAUNKFABhShQAADbikgQALpMEAEaTBABskwQAbpMEACSUBABKlAQATJQEAIKUBADOlAQA 0JQEANSUBAAMlQQAIpUEACaVBAA6lwQAUpcEAMiXBADglwQAApgEAAqYBAAgmAQAIpgEAH6YBACA mAQAgpgEAOSYBADmmAQAVpkEAF6ZBABsmQQAbpkEANCZBADSmQQARpoEAFqaBABmmgQAhJoEANia BAAemwQA+psEAPybBACEnAQA0pwEABydBADUoQQA2KEEAPjw+OX43dXd+N348Pjd+M34xfjN+L34 sqefxZ+Xn5efp/jN+M34j/jw+IOn+HcAAAAAFhZovGMeAENKFABhShQAbUgJBHNICQQAFxVoyT4l ABZovGMeAD4qAUNKFABhShQADhZoAwWyAENKFABhShQAAA4WaA0DkwBDShQAYUoUAAAOFmjnFvQA Q0oUAGFKFAAAFBVo5xb0ABZo5xb0AENKFABhShQAABQVaPV9lgAWaLxjHgBDShQAYUoUAAAOFmiq JFoAQ0oUAGFKFAAADhZosB0TAENKFABhShQAAA4WaMk+JQBDShQAYUoUAAAOFmj3NekAQ0oUAGFK FAAADhZoYElrAENKFABhShQAABQVaGJCIwAWaLxjHgBDShQAYUoUAAAOFmglGIkAQ0oUAGFKFAAA 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 pvCm1fCe8J7wwfCTAAAAAAAAAAAAABQVaD8ugQAWaLxjHgBDShQAYUoUAAAOFmj7XwEAQ0oUAGFK FAAADhZo4ilgAENKFABhShQAAA4WaM1kJgBDShQAYUoUAAAUFWhURb4AFmi8Yx4AQ0oUAGFKFAAA FhZovGMeAENKFABhShQAbUgJBHNICQQADhZo9X2WAENKFABhShQAABQVaLM/ogAWaLxjHgBDShQA YUoUAAAOFmi7UG4AQ0oUAGFKFAAADhZoAwWyAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmiq JFoAQ0oUAGFKFAA4sNQEALLUBADC1gQAxNYEAMjXBADK1wQAzNcEAEzYBABO2AQABtkEADLZBABI 2QQAStkEAFjZBADs2gQAJtsEACjbBAAq2wQAZtwEAJTcBACW3AQAmtwEAH7eBACA3gQAgt4EAJ7e BAAc3wQAHt8EAF7fBABg3wQAbt8EAHDfBAAW4AQAGOAEAHDgBABy4AQAdOAEAHbgBABU4QQAWOEE AGrhBABs4QQABuIEAAjiBABw4gQAcuIEAILiBACG4gQAvOUEAOzlBAB26AQAeOgEAPXt4e3Rxu2+ 7bbtq7bto+3G7Zu2m+227bbttu2j7aPtm+227bbto+2j7Yvtg+3h7ZvttgAAAA4WaNtYSABDShQA YUoUAAAfFWhFF1IAFmi8Yx4ANQiBQ0oUAGFKFABtSAkEc0gJBA4WaOIpYABDShQAYUoUAAAOFmj7 XwEAQ0oUAGFKFAAAFBVooEohABZooEohAENKFABhShQAAA4WaKBKIQBDShQAYUoUAAAOFmh1GTYA Q0oUAGFKFAAAFBVo3mrOABZovGMeAENKFABhShQAAB8VaN5qzgAWaLxjHgA1CIFDShQAYUoUAG1I CQRzSAkEFhZovGMeAENKFABhShQAbUgJBHNICQQADhZovGMeAENKFABhShQAABQVaI19OQAWaLxj HgBDShQAYUoUADN46AQA0ugEANroBACA6QQAwOkEAJjqBACa6gQAeOsEAHrrBAC06wQAtusEACjs BAAq7AQAVu0EAFjtBADk8AQA7PAEAIDxBACC8QQAJPMEACbzBAB+9gQAgPYEAJL2BACU9gQAfvcE AJD3BACW9wQApPcEAKb3BACo9wQAqvcEAKz3BADS9wQA1PcEADb4BAD48Pjo+Oj43fjV+MX41fi9 +LL4p/in+Kf48Picj4Z6b4Zj+AAAAAAAAAAAAAAAAAAAAAAAAAAXFWhTHrIAFmi8Yx4APioBQ0oU AGFKFAAUFWivCHAAFmi8Yx4AQ0oUAGFKFAAAFxVob2IjABZovGMeAD4qAUNKFABhShQAERZovGMe AD4qAUNKFABhShQAGRZovGMeAD4qAUNKFABhShQAbUgJBHNICQQUFWhvYiMAFmi8Yx4AQ0oUAGFK FAAAFBVojX05ABZovGMeAENKFABhShQAABQVaDkGXQAWaLxjHgBDShQAYUoUAAAOFmjXGUEAQ0oU AGFKFAAAHxVoFhDpABZovGMeADUIgUNKFABhShQAbUgJBHNICQQOFmjiKWAAQ0oUAGFKFAAAFBVo Z36zABZovGMeAENKFABhShQAAA4WaKokWgBDShQAYUoUAAAOFmigSiEAQ0oUAGFKFAAADhZovGMe AENKFABhShQAIzb4BABM+AQAePgEAJ74BAAk+QQANvkEAAz6BABK+gQAyPoEAM76BABm/AQAaPwE AIr8BACO/AQA0vwEANT8BAAQ/QQAJv0EALj9BADK/QQASP4EAEr+BABc/gQAXv4EAGL+BABk/gQA dv4EAHj+BAC4/gQAuv4EABj/BAAa/wQAJv8EACz/BABa/wQAYv8EALT/BAC2/wQAuP8EAMj/BADg /wQA/P8EAP7/BAAeAAUAIAAFACIABQAkAAUAJgAFADIABQA0AAUA4gAFAOQABQDuAAUA8AAFAPjw 6PD48ODw+PDV8PjJ+PD48PjwvvC+8LPws/DV8LPw+PCn8Jvwkpvw1fDV8NWz8LPwh/CHABQVaMYg cAAWaLxjHgBDShQAYUoUAAARFmjyaqkANQiBQ0oUAGFKFAAXFWjGIHAAFmi8Yx4ANQiBQ0oUAGFK FAAXFWiOAZMAFmi8Yx4ANQiBQ0oUAGFKFAAUFWjyaqkAFmjyaqkAQ0oUAGFKFAAAFBVojBiAABZo vGMeAENKFABhShQAABcVaPJqqQAWaPJqqQA+KgFDShQAYUoUABQVaI4BkwAWaLxjHgBDShQAYUoU AAAOFmigSiEAQ0oUAGFKFAAADhZo21hIAENKFABhShQAAA4WaLxjHgBDShQAYUoUAAAOFmjyaqkA Q0oUAGFKFAA18AAFACoBBQAsAQUAbgIFAJoCBQCmAgUA8gIFAPQCBQCGAwUAcAUFAHoFBQDKBQUA 3AUFAN4FBQDwBQUA+gUFAPwFBQDkBgUA9AYFABgHBQAaBwUAQgcFAF4HBQDGCAUA2AgFADAJBQA0 CQUATAkFAE4JBQBQCQUAUgkFAKIKBQCkCgUAgAsFAIILBQC2CwUAuAsFAPjt+OX43fjl+NX4zfjB +M34tviu+Kb4nviS+If4rvh8+HH4ZgAAAAAAAAAAAAAAAAAAAAAAAAAAFBVodDuDABZovGMeAENK FABhShQAABQVaPJqqQAWaPJqqQBDShQAYUoUAAAUFWjacrQAFmi8Yx4AQ0oUAGFKFAAAFBVoPnAp ABZoPnApAENKFABhShQAABYWaLxjHgBDShQAYUoUAG1ICQRzSAkEAA4WaNcZQQBDShQAYUoUAAAO FmjSMdUAQ0oUAGFKFAAADhZoPnApAENKFABhShQAABQVaNtuvQAWaLxjHgBDShQAYUoUAAAXFWjb br0AFmi8Yx4APioBQ0oUAGFKFAAOFmgNA5MAQ0oUAGFKFAAADhZo9X2WAENKFABhShQAAA4WaGRu ZQBDShQAYUoUAAAOFmjyaqkAQ0oUAGFKFAAAFBVo4RlvABZovGMeAENKFABhShQAAA4WaLxjHgBD ShQAYUoUACS4CwUA9AsFAPYLBQD6CwUA/AsFACoMBQAuDAUAhAwFAIYMBQCSDAUAGg0FACoNBQA4 DQUAAg4FAKwOBQCuDgUAWA8FAFoPBQAyEAUAfhAFAOAQBQDiEAUAKBMFACoTBQBgEwUAdhMFAKIT BQDQEwUA9hMFAFgUBQBaFAUACBUFAOAVBQDoFQUAZhgFAGoYBQB+GwUAhhsFAC4cBQAyHAUA7B8F AO4fBQAQIAUAEiAFAEAgBQBIIAUAjCAFAI4gBQCmIAUAqCAFALggBQDCIAUA8+jg6PPo4Ojg89fz 1+DP4MTg8+DP4LzgvOC84LTgtOC04KngoeCW4I7gjuCO4IPgg+ChAAAAFBVosSOxABZovGMeAENK FABhShQAAA4WaNcZQQBDShQAYUoUAAAUFWjvWT4AFmi8Yx4AQ0oUAGFKFAAADhZoij26AENKFABh ShQAABQVaNIx1QAWaNIx1QBDShQAYUoUAAAOFmhzM7cAQ0oUAGFKFAAADhZo4ilgAENKFABhShQA ABQVaEs1pgAWaLxjHgBDShQAYUoUAAAOFmjSMdUAQ0oUAGFKFAAAERZoPnApAD4qAUNKFABhShQA DhZovGMeAENKFABhShQAABQVaHQ7gwAWaLxjHgBDShQAYUoUAAAXFWjyaqkAFmi8Yx4APioBQ0oU AGFKFAAAM8IgBQDMIQUAziEFAHIiBQC6IgUAvCIFANAiBQDSIgUA6iIFAOwiBQB+IwUA7CMFAP4j BQAAJAUAAiQFAAwkBQAOJAUAFCQFABYkBQAYJAUAJiQFACgkBQAqJAUALCQFAC4kBQBiJAUAZCQF AGYkBQCkJAUApiQFAL4kBQDAJAUAXiUFAGAlBQCcJQUAoCUFAIImBQD48Pjw5fDl8N3w+NX4zfjN +ML4t6qhlYqhfnP4c/hz+HP4Z/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZovGMeAENKFABhShQA bUgJBHNICQQAFBVoyRpdABZovGMeAENKFABhShQAABcVaMkaXQAWaLxjHgA+KgFDShQAYUoUABQV aK8IcAAWaLxjHgBDShQAYUoUAAAXFWhvYiMAFmi8Yx4APioBQ0oUAGFKFAARFmi8Yx4APioBQ0oU AGFKFAAZFmi8Yx4APioBQ0oUAGFKFABtSAkEc0gJBBQVaG9iIwAWaLxjHgBDShQAYUoUAAAUFWix I7EAFmi8Yx4AQ0oUAGFKFAAADhZo21hIAENKFABhShQAAA4WaIo9ugBDShQAYUoUAAAOFmjROrsA Q0oUAGFKFAAAFBVo0jHVABZo0jHVAENKFABhShQAAA4WaD5wKQBDShQAYUoUAAAOFmi8Yx4AQ0oU AGFKFAAkGCQFAGQkBQAcKQUA9DAFAAhIBQDoTwUA6k8FAFZQBQBYUAUAzFAFAM5QBQBEUQUARlEF AEhRBQBKUQUATFEFAE5RBQBQUQUAUlEFAFRRBQBWUQUAWFEFAFpRBQBcUQUAXlEFAGBRBQBiUQUA ZFEFAGZRBQBoUQUA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAA AAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAA AAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAA AAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA +gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAA AAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAABAAAZ2S8 Yx4AAB2CJgUAhCYFAIwmBQCOJgUAeicFAHwnBQB+JwUAvigFAMAoBQDUKAUA1igFADgpBQBGKQUA TioFAFAqBQBmKgUAaCoFAJ4qBQCgKgUAyioFAOgqBQAmKwUANisFADgrBQA+KwUASisFAEwrBQCe KwUArCsFAMYrBQDYKwUA3CsFAAIsBQAGLAUAFCwFACAsBQAiLAUAOiwFADwsBQAqLgUALC4FAFAu BQBSLgUAdjEFAHgxBQA+MwUAfjMFAGQ1BQCCNQUAhjYFAKo2BQDENgUAxjYFAPXt9e3d0u3S7dLt yu2+7bPts+2r7aPto+2j7Zujm+2j7aPto+2j7ZDtkO2r7avthO2rm6sXFWjXZ8wAFmi8Yx4APioB Q0oUAGFKFAAUFWiyHtgAFmi8Yx4AQ0oUAGFKFAAADhZoij26AENKFABhShQAAA4WaNcZQQBDShQA YUoUAAAOFmjROrsAQ0oUAGFKFAAAFBVoxD5lABZovGMeAENKFABhShQAABcVaCZ8uwAWaCZ8uwA1 CIFDShQAYUoUAA4WaNtYSABDShQAYUoUAAAUFWgmd+IAFmi8Yx4AQ0oUAGFKFAAAHxVoM2JSABZo vGMeADUIgUNKFABhShQAbUgJBHNICQQOFmi8Yx4AQ0oUAGFKFAAAFBVo80I8ABZovGMeAENKFABh ShQANMY2BQBONwUAUDcFAJ43BQCgNwUAmDgFANY4BQDqOAUA7DgFAKo5BQCuOQUAzjkFANA5BQA+ OgUAeDoFABI9BQAUPQUAFj0FABg9BQAaPQUAHD0FAB49BQAgPQUAND0FADY9BQCoPgUAtj4FALo+ BQDCPgUAxD4FAMg+BQA8PwUAfD8FAAhABQAUQAUAUkAFAFRABQBWQAUAWkAFAF5ABQDGQgUA6kIF AJJDBQCUQwUAlkMFAJhDBQAWRAUA+PD45fjw+PD43fjd+PD40cbRxtHG0fjG+L74vra++K74tvjR o/jR+PD4k4h9+AAAAAAAAAAAAAAAAAAAAAAUFWgOUuQAFmi8Yx4AQ0oUAGFKFAAAFBVoMS8AABZo vGMeAENKFABhShQAAB8VaDEvAAAWaLxjHgA1CIFDShQAYUoUAG1ICQRzSAkEFBVoIQWzABZovGMe AENKFABhShQAAA4WaKokWgBDShQAYUoUAAAOFmjsX34AQ0oUAGFKFAAADhZo4ErfAENKFABhShQA ABQVaE5vPwAWaLxjHgBDShQAYUoUAAAWFmi8Yx4AQ0oUAGFKFABtSAkEc0gJBAAOFmjROrsAQ0oU AGFKFAAAFBVohz5zABZovGMeAENKFABhShQAAA4WaN5x7QBDShQAYUoUAAAOFmi8Yx4AQ0oUAGFK FAAuFkQFACxEBQAuRAUAREQFAH5EBQCCRAUAlEQFAJZEBQAqRgUAxEYFAMZGBQBURwUAlEcFAJxH BQAGSAUACEgFAIBNBQCCTQUAvE0FAL5NBQDATQUAwk0FAMpNBQDOTQUALE4FAC5OBQBiTgUAZE4F ABJPBQBGTwUASE8FAJhPBQCaTwUApE8FALpPBQC8TwUA0E8FANJPBQDoTwUA6k8FABRQBQAiUAUA OFAFAPjw+PDk8Nnw0cXRvdHw2fC18LXwta218KLwovCakvCK8IJ6gnqCcoJyggAAAAAAAAAAAAAA AAAADhZoBQn7AENKFABhShQAAA4WaKJJeABDShQAYUoUAAAOFmgXZRAAQ0oUAGFKFAAADhZo0xBL AENKFABhShQAAA4WaKkqHABDShQAYUoUAAAOFmiqJFoAQ0oUAGFKFAAAFBVoxGIuABZovGMeAENK FABhShQAAA4WaGsN8gBDShQAYUoUAAAOFmjsX34AQ0oUAGFKFAAADhZo2iQZAENKFABhShQAABcV aGEIKgAWaEtmRwA1CIFDShwAYUocAA4WaEtmRwBDShQAYUoUAAAUFWgOUuQAFmi8Yx4AQ0oUAGFK FAAAFhZovGMeAENKFABhShQAbUgJBHNICQQADhZovGMeAENKFABhShQAAA4WaNtYSABDShQAYUoU ACo4UAUAOlAFADxQBQBEUAUARlAFAEhQBQBOUAUAUFAFAFRQBQBWUAUAWFAFAJBQBQCcUAUAolAF AKRQBQCoUAUAvFAFAL5QBQDAUAUAyFAFAMxQBQDOUAUA1FAFAAhRBQAUUQUAHlEFADJRBQA0UQUA NlEFAEJRBQBEUQUARlEFAPny6/Lk6/Ld8tXOys7Gwrest6G3mpKHf4d0aXRedFYAAAAAAAAAAAAA AAAADhZoIkHlAENKHABhShwAABQVaJk07AAWaAUJ+wBDSiIAYUoiAAAUFWiZNOwAFmgGZtYAQ0oi AGFKIgAAFBVomTTsABZovGMeAENKIgBhSiIAAA4WaAUJ+wBDShwAYUocAAAUFWiNNGMAFmi8Yx4A Q0ocAGFKHAAADhZookl4AENKHABhShwAAAwVaI00YwAWaAZm1gAAFBVomTTsABZoBQn7AENKHgBh Sh4AABQVaJk07AAWaAZm1gBDSh4AYUoeAAAUFWiZNOwAFmi8Yx4AQ0oeAGFKHgAABhZookl4AAAG Fmi8Yx4AAAYWaAUJ+wAADBVojTRjABZovGMeAAAOFmgGZtYAQ0oUAGFKFAAADBVomTTsABZoBQn7 AAAMFWiZNOwAFmhhCCoAAAwVaJk07AAWaAZm1gAADBVomTTsABZovGMeAAAMFWiZNOwAFmgXZRAA H0ZRBQBKUQUAUFEFAFJRBQBmUQUAaFEFAGpRBQBsUQUAblEFAHBRBQByUQUAdFEFAHZRBQB6UQUA fFEFAIBRBQCCUQUAhlEFAIhRBQCMUQUAjlEFAJJRBQCUUQUAllEFAJhRBQCaUQUAnFEFAJ5RBQD4 8Pjw+PD46NfGuqm6mLqHupi6qbrXe3BkWEwAAAAAAAAAAAAAAAAAFxVooFkiABZo1zslADUIgUNK bgBhSm4AFxVooFkiABZooFkiADUIgUNKQgBhSkIAFxVooFkiABZooFkiADUIgUNKOgBhSjoAFBVo 1zslABZomTTsAENKLABhSiwAABcVaNMQSwAWaCsX+AA1CIFDSigAYUooACAVaJk07AAWaNMQSwA1 CIFCKgRDSmQAYUpkAHBoAP8AAAAgFWiZNOwAFmjTEEsANQiBQioGQ0osAGFKLABwaP8AAAAAIBVo mTTsABZo0xBLADUIgUIqAkNKCgBhSgoAcGgAAP8AABcVaNMQSwAWaNMQSwA1CIFDSigAYUooACAV aJk07AAWaNMQSwA1CIFCKgVDSigAYUooAHBo/wD/AAAgFWiZNOwAFmjTEEsANQiBQioFQ0oCAGFK AgBwaP8A/wAADhZo0xBLAENKHABhShwAAA4WaKJJeABDShwAYUocAAAOFmjsX34AQ0ocAGFKHAAb aFEFAGpRBQBsUQUAblEFAJZRBQCYUQUArFEFAK5RBQCwUQUAslEFALRRBQC2UQUAzFEFAM5RBQDQ UQUA0lEFAMRSBQCCUwUAaFQFAHxVBQBoVgUAZFcFAHJYBQB0WAUAdlgFAHhYBQB6WAUA+gAAAAAA AAAAAAAAAPoAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAAAOUAAAAAAAAAAAAA AADlAAAAAAAAAAAAAAAA5QAAAAAAAAAAAAAAAOUAAAAAAAAAAAAAAADlAAAAAAAAAAAAAAAA5QAA AAAAAAAAAAAAAOUAAAAAAAAAAAAAAADlAAAAAAAAAAAAAAAA4wAAAAAAAAAAAAAAAOMAAAAAAAAA AAAAAADjAAAAAAAAAAAAAAAA4wAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAADjAAAAAAAAAAAAAAAA 4wAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAADjAAAAAAAAAAAAAAAA4wAAAAAAAAAAAAAAAOMAAAAA AAAAAAAAAADjAAAAAAAAAAAAAAAA4wAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAB AAAABwAAAyQBYSQBZ2S8Yx4AAAcAAAMkAWEkAWdk0xBLAAAEAABnZJk07AAABAAAZ2S8Yx4AABqe UQUAoFEFAKJRBQCkUQUAplEFAKhRBQCqUQUArFEFALZRBQC4UQUAzFEFAM5RBQDQUQUA0lEFANRR BQD8UQUAtFIFALZSBQDCUgUAxFIFAMZSBQDIUgUAzFIFACJTBQCAUwUAglMFAIZTBQCIUwUAjFMF AL5TBQBmVAUAaFQFAG5UBQBwVAUAdFQFAPPn89vPw7evpJmVkYqRf3t3e3Bke5F/e3Bke5F/e3Bk e5EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcVaNc7JQAWaCsX+AA1CIFtSAkEc0gJBAwVaCsX +AAWaCsX+AAABhZooFkiAAAGFmgrF/gAABQVaKBZIgAWaCsX+ABDShwAYUocAAAMFWjXOyUAFmjX OyUAAAYWaNc7JQAABhZoW0J3AAAUFWigWSIAFmi8Yx4AQ0ogAGFKIAAAFBVooFkiABZovGMeAENK JABhSiQAAA4WaNc7JQBDShwAYUocAAAXFWjXOyUAFmjXOyUANQiBQ0qQAGFKkAAXFWigWSIAFmig WSIANQiBQ0o6AGFKOgAXFWigWSIAFmigWSIANQiBQ0pCAGFKQgAXFWigWSIAFmjXOyUANQiBQ0pu AGFKbgAXFWigWSIAFmjXOyUANQiBQ0qaAGFKmgAXFWigWSIAFmjXOyUANQiBQ0qEAGFKhAAAInRU BQB2VAUAfFQFAH5UBQCAVAUAaFUFAGpVBQBwVQUAelUFAHxVBQCAVQUAglUFAIZVBQCwVQUAWFYF AFpWBQBcVgUAZlYFAGhWBQBqVgUAbFYFAHBWBQCQVgUAWFcFAGJXBQBkVwUAZlcFAHpXBQByWAUA fFgFAIJYBQCKWAUAjFgFANJYBQDUWAUA1lgFANhYBQDaWAUAGFkFABxZBQAeWQUAKFkFAPPo4Ojc 2NzUzcHc1Ojc2NzUzcHc1Ojc1NzU6NzUvdSxprGXj4R5ddRtAAAAAAAAAAAADhZoZ1hoAENKHABh ShwAAAYWaJR/5gAAFBVoSi+fABZo1zslAENKHABhShwAABQVaEovnwAWaFE+jABDShwAYUocAAAO FmhKL58AQ0ocAGFKHAAAHBVoSi+fABZo1zslAENKHABhShwAbUgJBHNICQQAFBVoSi+fABZoSi+f AENKHABhShwAABYWaEovnwBDShwAYUocAG1ICQRzSAkEAAYWaGdYaAAAFxVo1zslABZoKxf4ADUI gW1ICQRzSAkEDBVoKxf4ABZoKxf4AAAGFmjXOyUAAAYWaKBZIgAABhZoKxf4AAAOFmiUf+YAQ0oc AGFKHAAAFBVooFkiABZoKxf4AENKHABhShwAABcVaKBZIgAWaCsX+AA1CIFDShwAYUocAAApelgF AHxYBQB+WAUAgFgFAIJYBQCEWAUAhlgFAIhYBQCKWAUA1lgFANhYBQDaWAUAGFkFABpZBQAcWQUA HlkFAChZBQAqWQUANlkFAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0A AAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAA AAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAA AO0AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA7QAAAAAAAAAAAAAAAOUAAAAAAAAAAAAAAADtAAAA AAAAAAAAAAAA7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BwAAAyQCYSQCZ2RnWGgAAAcAAAMkAWEkAWdk1zslAAAHAAADJAFhJAFnZEovnwAAAQAAABIoWQUA KlkFACxZBQAuWQUAMFkFADJZBQA0WQUANlkFAPXp3dHd6cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERZo ij26ADUIgUNKFgBhShYAFxVooFkiABZooFkiADUIgUNKQgBhSkIAFxVooFkiABZooFkiADUIgUNK LABhSiwAFxVooFkiABZooFkiADUIgUNKFgBhShYAFBVooFkiABZo1zslAENKFgBhShYABywAMZBo AR+wgi4gsMZBIbClBiKwUgMjkG4EJJBuBCWwAAAXsMQCGLDEAgyQxAIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAEQA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA0Mnqefm6zhGMggCqAEupCwIAAAADAAAA4Mnqefm6zhGMggCqAEupC1AAAABoAHQAdABw AHMAOgAvAC8AdgBrAC4AYwBvAG0ALwBjAGwAdQBiADcANQAwADEANwA1ADkAOAAAAHlYgfQ7HX9I ryyCXcSFJ2MAAAAApasAAFsBFiQBFyQBSWYBAAAAAZZiACF2AAdoATXWBQABA3MBNdYFAQIDhAc1 1gUCAwPvBDXWBQMEAwgJNdYFBAUDbgQ11gUFBgPdAjXWBQYHA8gGI3YAAXMBI3YBAoQHI3YCA+8E I3YDBAgJI3YEBW4EI3YFBt0CI3YGB8gGOlYLAAKWbAAHlEABFPYDnyQVNgEY9gMAACzWAwAHAjXW BQABA08ANdYFAQIDkAo11gUCAwNPBzXWBQMEA6UGNdYFBAUDgwY11gUFBgMJBDXWBQYHA18GOdYD AAcBL9YLAAEP////////4P8v1gsBBwEAAAD/BAEAAC/WCwEHCv///////+D/L9YLAQcEAAAA/wgB AABh9gNiAHDWRgAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAAA/wAAAP8AAAAAAP8AAAD/AABJARYkARckAUlmAQAAAAGWYgAhdgAGaAE11gUAAQNzATXW BQECA4QHNdYFAgMD7wQ11gUDBAMICTXWBQQFA0sHNdYFBQYDyAYjdgABcwEjdgEChAcjdgID7wQj dgMECAkjdgQFSwcjdgUGyAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2AwAALNYDAAYCNdYFAAEDTwA1 1gUBAgOQCjXWBQIDA08HNdYFAwQDpQY11gUEBQODBjXWBQUGA18GOdYDAAYBL9YLAAEIAAAA/wQB AAAv1gsBBg/////////g/y/WCwABAf///////+D/L9YLAAEC////////4P8v1gsAAQT////////g /2H2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/ AAAAAAD/AAAA/wAALQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYFAAEDcwE11gUBAgOEBzXWBQID A+8ENdYFAwQDCAk11gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBAgJI3YEBUsH I3YFBsgGOlYLAAKWbAAHlJcDFPYDnyQVNgEY9gMAACzWAwAGAjXWBQABA08ANdYFAQIDkAo11gUC AwNPBzXWBQMEA6UGNdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwABDQAAAP8EAQAAL9YLAQYP//// ////4P8v1gsAAQL////////g/2H2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAA AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAASQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYF AAEDcwE11gUBAgOEBzXWBQIDA+8ENdYFAwQDCAk11gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQH I3YCA+8EI3YDBAgJI3YEBUsHI3YFBsgGOlYLAAKWbAAHlDYBFPYDnyQVNgEY9gMAACzWAwAGAjXW BQABA08ANdYFAQIDkAo11gUCAwNPBzXWBQMEA6UGNdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwAB CAAAAP8EAQAAL9YLAQYP////////4P8v1gsAAQH////////g/y/WCwABAv///////+D/L9YLAAEE ////////4P9h9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAA AAD/AAAA/wAAAAAA/wAAAP8AAEkBFiQBFyQBSWYBAAAAAZZiACF2AAZoATXWBQABA3MBNdYFAQID hAc11gUCAwPvBDXWBQMEAwgJNdYFBAUDSwc11gUFBgPIBiN2AAFzASN2AQKEByN2AgPvBCN2AwQI CSN2BAVLByN2BQbIBjpWCwAClmwAB5Q2ART2A58kFTYBGPYDAAAs1gMABgI11gUAAQNPADXWBQEC A5AKNdYFAgMDTwc11gUDBAOlBjXWBQQFA4MGNdYFBQYDXwY51gMABgEv1gsAAQgAAAD/BAEAAC/W CwEGD////////+D/L9YLAAEB////////4P8v1gsAAQL////////g/y/WCwABBP///////+D/YfYD YgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAA AP8AAAD/AABJARYkARckAUlmAQAAAAGWYgAhdgAGaAE11gUAAQNzATXWBQECA4QHNdYFAgMD7wQ1 1gUDBAMICTXWBQQFA0sHNdYFBQYDyAYjdgABcwEjdgEChAcjdgID7wQjdgMECAkjdgQFSwcjdgUG yAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2AwAALNYDAAYCNdYFAAEDTwA11gUBAgOQCjXWBQIDA08H NdYFAwQDpQY11gUEBQODBjXWBQUGA18GOdYDAAYBL9YLAAEIAAAA/wQBAAAv1gsBBg/////////g /y/WCwABAf///////+D/L9YLAAEC////////4P8v1gsAAQT////////g/2H2A2IAcNY8AAAA/wAA AP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAewEW JAEXJAFJZgEAAAABlmIAIXYACGgBNdYFAAEDcwE11gUBAgOfBjXWBQIDA+UANdYFAwQD7wQ11gUE BQOEBDXWBQUGA4QENdYFBgcDSwc11gUHCAPIBiN2AAFzASN2AQKfBiN2AgPlACN2AwTvBCN2BAaE BCN2BgdLByN2BwjIBjpWCwAClmwAB5Q2ART2A58kFTYBGPYDAAAs1gMACAI11gUAAQNPADXWBQEC A/oJNdYFAgMDlgA11gUDBANPBzXWBQQGA6UGNdYFBgcDgwY11gUHCANfBjnWAwAIAS/WCwABCAAA AP8EAQAAL9YLAQgP////////4P8v1gsAAQH////////g/y/WCwABAv///////+D/L9YLAAEE//// ////4P9h9gNiAHDWUAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/ AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAASQEWJAEXJAFJZgEAAAABlmIAIXYA BmgBNdYFAAEDcwE11gUBAgOEBzXWBQIDA+8ENdYFAwQDCAk11gUEBQNLBzXWBQUGA8gGI3YAAXMB I3YBAoQHI3YCA+8EI3YDBAgJI3YEBUsHI3YFBsgGOlYLAAKWbAAHlDYBFPYDnyQVNgEY9gMAACzW AwAGAjXWBQABA08ANdYFAQIDkAo11gUCAwNPBzXWBQMEA6UGNdYFBAUDgwY11gUFBgNfBjnWAwAG AS/WCwABCAAAAP8EAQAAL9YLAQYP////////4P8v1gsAAQH////////g/y/WCwABAv///////+D/ L9YLAAEE////////4P9h9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8A AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAEkBFiQBFyQBSWYBAAAAAZZiACF2AAZoATXWBQABA3MB NdYFAQIDhAc11gUCAwPvBDXWBQMEAwgJNdYFBAUDSwc11gUFBgPIBiN2AAFzASN2AQKEByN2AgPv BCN2AwQICSN2BAVLByN2BQbIBjpWCwAClmwAB5Q2ART2A58kFTYBGPYDAAAs1gMABgI11gUAAQNP ADXWBQECA5AKNdYFAgMDTwc11gUDBAOlBjXWBQQFA4MGNdYFBQYDXwY51gMABgEv1gsAAQgAAAD/ BAEAAC/WCwEGD////////+D/L9YLAAEB////////4P8v1gsAAQL////////g/y/WCwABBP////// /+D/YfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAAAAAP8AAAD/AABJARYkARckAUlmAQAAAAGWYgAhdgAGaAE11gUAAQNzATXWBQECA4QHNdYF AgMD7wQ11gUDBAMICTXWBQQFA0sHNdYFBQYDyAYjdgABcwEjdgEChAcjdgID7wQjdgMECAkjdgQF SwcjdgUGyAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2AwAALNYDAAYCNdYFAAEDTwA11gUBAgOQCjXW BQIDA08HNdYFAwQDpQY11gUEBQODBjXWBQUGA18GOdYDAAYBL9YLAAEIAAAA/wQBAAAv1gsBBg// ///////g/y/WCwABAf///////+D/L9YLAAEC////////4P8v1gsAAQT////////g/2H2A2IAcNY8 AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAASQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYFAAEDcwE11gUBAgOEBzXWBQIDA+8ENdYFAwQD CAk11gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBAgJI3YEBUsHI3YFBsgGOlYL AAKWbAAHlDYBFPYDnyQVNgEY9gMAACzWAwAGAjXWBQABA08ANdYFAQIDkAo11gUCAwNPBzXWBQME A6UGNdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwABCAAAAP8EAQAAL9YLAQYP////////4P8v1gsA AQH////////g/y/WCwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDWPAAAAP8AAAD/AAAA AAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAEkBFiQBFyQB SWYBAAAAAZZiACF2AAZoATXWBQABA3MBNdYFAQIDhAc11gUCAwPvBDXWBQMEAwgJNdYFBAUDSwc1 1gUFBgPIBiN2AAFzASN2AQKEByN2AgPvBCN2AwQICSN2BAVLByN2BQbIBjpWCwAClmwAB5Q2ART2 A58kFTYBGPYDAAAs1gMABgI11gUAAQNPADXWBQECA5AKNdYFAgMDTwc11gUDBAOlBjXWBQQFA4MG NdYFBQYDXwY51gMABgEv1gsAAQgAAAD/BAEAAC/WCwEGD////////+D/L9YLAAEB////////4P8v 1gsAAQL////////g/y/WCwABBP///////+D/YfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAA AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AABpARYkARckAUlmAQAAAAGWYgAh dgAHaAE11gUAAQNzATXWBQECA4QHNdYFAgMD7wQ11gUDBAMICTXWBQQFA24ENdYFBQYD3QI11gUG BwPIBiN2AAFzASN2AQKEByN2AgPvBCN2AwQICSN2BAVuBCN2BQbdAiN2BgfIBjpWCwAClmwAB5Q2 ART2A58kFTYBGPYDAAAs1gMABwI11gUAAQNPADXWBQECA5AKNdYFAgMDTwc11gUDBAOlBjXWBQQF A4MGNdYFBQYDCQQ11gUGBwNfBjnWAwAHAS/WCwABCAAAAP8EAQAAL9YLAQcP////////4P8v1gsA AQH////////g/y/WCwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDWRgAAAP8AAAD/AAAA AAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/ AABJARYkARckAUlmAQAAAAGWYgAhdgAGaAE11gUAAQNzATXWBQECA4QHNdYFAgMD7wQ11gUDBAMI CTXWBQQFA0sHNdYFBQYDyAYjdgABcwEjdgEChAcjdgID7wQjdgMECAkjdgQFSwcjdgUGyAY6VgsA ApZsAAeUNgEU9gOfJBU2ARj2AwAALNYDAAYCNdYFAAEDTwA11gUBAgOQCjXWBQIDA08HNdYFAwQD pQY11gUEBQODBjXWBQUGA18GOdYDAAYBL9YLAAEIAAAA/wQBAAAv1gsBBg/////////g/y/WCwAB Af///////+D/L9YLAAEC////////4P8v1gsAAQT////////g/2H2A2IAcNY8AAAA/wAAAP8AAAAA AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAASQEWJAEXJAFJ ZgEAAAABlmIAIXYABmgBNdYFAAEDcwE11gUBAgOEBzXWBQIDA+8ENdYFAwQDCAk11gUEBQNLBzXW BQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBAgJI3YEBUsHI3YFBsgGOlYLAAKWbAAHlDYBFPYD nyQVNgEY9gMAACzWAwAGAjXWBQABA08ANdYFAQIDkAo11gUCAwNPBzXWBQMEA6UGNdYFBAUDgwY1 1gUFBgNfBjnWAwAGAS/WCwABCAAAAP8EAQAAL9YLAQYP////////4P8v1gsAAQH////////g/y/W CwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA /wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAEkBFiQBFyQBSWYBAAAAAZZiACF2 AAZoATXWBQABA3MBNdYFAQIDhAc11gUCAwPvBDXWBQMEAwgJNdYFBAUDSwc11gUFBgPIBiN2AAFz ASN2AQKEByN2AgPvBCN2AwQICSN2BAVLByN2BQbIBjpWCwAClmwAB5Q2ART2A58kFTYBGPYDAAAs 1gMABgI11gUAAQNPADXWBQECA5AKNdYFAgMDTwc11gUDBAOlBjXWBQQFA4MGNdYFBQYDXwY51gMA BgEv1gsAAQgAAAD/BAEAAC/WCwEGD////////+D/L9YLAAEB////////4P8v1gsAAQL////////g /y/WCwABBP///////+D/YfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/ AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AABJARYkARckAUlmAQAAAAGWYgAhdgAGaAE11gUAAQNz ATXWBQECA4QHNdYFAgMD7wQ11gUDBAMICTXWBQQFA0sHNdYFBQYDyAYjdgABcwEjdgEChAcjdgID 7wQjdgMECAkjdgQFSwcjdgUGyAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2AwAALNYDAAYCNdYFAAED TwA11gUBAgOQCjXWBQIDA08HNdYFAwQDpQY11gUEBQODBjXWBQUGA18GOdYDAAYBL9YLAAEIAAAA /wQBAAAv1gsBBg/////////g/y/WCwABAf///////+D/L9YLAAEC////////4P8v1gsAAQT///// ///g/2H2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8A AAD/AAAAAAD/AAAA/wAASQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYFAAEDcwE11gUBAgOEBzXW BQIDA+8ENdYFAwQDCAk11gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBAgJI3YE BUsHI3YFBsgGOlYLAAKWbAAHlDYBFPYDnyQVNgEY9gMAACzWAwAGAjXWBQABA08ANdYFAQIDkAo1 1gUCAwNPBzXWBQMEA6UGNdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwABCAAAAP8EAQAAL9YLAQYP ////////4P8v1gsAAQH////////g/y/WCwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDW PAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAFsBFiQBFyQBSWYBAAAAAZZiACF2AAdoATXWBQABA3MBNdYFAQIDhAc11gUCAwPvBDXWBQME A4QENdYFBAUDhAQ11gUFBgNLBzXWBQYHA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBYQEI3YFBksH I3YGB8gGOlYLAAKWbAAHlDYBFPYDnyQVNgEY9gMAACzWAwAHAjXWBQABA08ANdYFAQIDkAo11gUC AwNPBzXWBQMFA6UGNdYFBQYDgwY11gUGBwNfBjnWAwAHAS/WCwABCAAAAP8EAQAAL9YLAQcP//// ////4P8v1gsAAQH////////g/y/WCwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDWRgAA AP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8A AAAAAP8AAAD/AABJARYkARckAUlmAQAAAAGWYgAhdgAGaAE11gUAAQNzATXWBQECA4QHNdYFAgMD 7wQ11gUDBAMICTXWBQQFA0sHNdYFBQYDyAYjdgABcwEjdgEChAcjdgID7wQjdgMECAkjdgQFSwcj dgUGyAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2AwAALNYDAAYCNdYFAAEDTwA11gUBAgOQCjXWBQID A08HNdYFAwQDpQY11gUEBQODBjXWBQUGA18GOdYDAAYBL9YLAAEIAAAA/wQBAAAv1gsBBg////// ///g/y/WCwABAf///////+D/L9YLAAEC////////4P8v1gsAAQT////////g/2H2A2IAcNY8AAAA /wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAA SQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYFAAEDcwE11gUBAgOEBzXWBQIDA+8ENdYFAwQDCAk1 1gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBAgJI3YEBUsHI3YFBsgGOlYLAAKW bAAHlDYBFPYDnyQVNgEY9gMAACzWAwAGAjXWBQABA08ANdYFAQIDkAo11gUCAwNPBzXWBQMEA6UG NdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwABCAAAAP8EAQAAL9YLAQYP////////4P8v1gsAAQH/ ///////g/y/WCwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDWPAAAAP8AAAD/AAAAAAD/ AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAEkBFiQBFyQBSWYB AAAAAZZiACF2AAZoATXWBQABA3MBNdYFAQIDhAc11gUCAwPvBDXWBQMEAwgJNdYFBAUDSwc11gUF BgPIBiN2AAFzASN2AQKEByN2AgPvBCN2AwQICSN2BAVLByN2BQbIBjpWCwAClmwAB5Q2ART2A58k FTYBGPYDAAAs1gMABgI11gUAAQNPADXWBQECA5AKNdYFAgMDTwc11gUDBAOlBjXWBQQFA4MGNdYF BQYDXwY51gMABgEv1gsAAQgAAAD/BAEAAC/WCwEGD////////+D/L9YLAAEB////////4P8v1gsA AQL////////g/y/WCwABBP///////+D/YfYDYgBw1jwAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8A AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AABJARYkARckAUlmAQAAAAGWYgAhdgAG aAE11gUAAQNzATXWBQECA4QHNdYFAgMD7wQ11gUDBAMICTXWBQQFA0sHNdYFBQYDyAYjdgABcwEj dgEChAcjdgID7wQjdgMECAkjdgQFSwcjdgUGyAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2AwAALNYD AAYCNdYFAAEDTwA11gUBAgOQCjXWBQIDA08HNdYFAwQDpQY11gUEBQODBjXWBQUGA18GOdYDAAYB L9YLAAEIAAAA/wQBAAAv1gsBBg/////////g/y/WCwABAf///////+D/L9YLAAEC////////4P8v 1gsAAQT////////g/2H2A2IAcNY8AAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAASQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYFAAEDcwE1 1gUBAgOEBzXWBQIDA+8ENdYFAwQDCAk11gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8E I3YDBAgJI3YEBUsHI3YFBsgGOlYLAAKWbAAHlDYBFPYDnyQVNgEY9gMAACzWAwAGAjXWBQABA08A NdYFAQIDkAo11gUCAwNPBzXWBQMEA6UGNdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwABCAAAAP8E AQAAL9YLAQYP////////4P8v1gsAAQH////////g/y/WCwABAv///////+D/L9YLAAEE//////// 4P9h9gNiAHDWPAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAAA/wAAAP8AAEkBFiQBFyQBSWYBAAAAAZZiACF2AAZoATXWBQABA3MBNdYFAQIDhAc11gUC AwPvBDXWBQMEAwgJNdYFBAUDSwc11gUFBgPIBiN2AAFzASN2AQKEByN2AgPvBCN2AwQICSN2BAVL ByN2BQbIBjpWCwAClmwAB5Q2ART2A58kFTYBGPYDAAAs1gMABgI11gUAAQNPADXWBQECA5AKNdYF AgMDTwc11gUDBAOlBjXWBQQFA4MGNdYFBQYDXwY51gMABgEv1gsAAQgAAAD/BAEAAC/WCwEGD/// /////+D/L9YLAAEB////////4P8v1gsAAQL////////g/y/WCwABBP///////+D/YfYDYgBw1jwA AAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/ AABbARYkARckAUlmAQAAAAGWYgAhdgAHaAE11gUAAQNzATXWBQECA4QHNdYFAgMD7wQ11gUDBAOE BDXWBQQFA4QENdYFBQYDSwc11gUGBwPIBiN2AAFzASN2AQKEByN2AgPvBCN2AwWEBCN2BQZLByN2 BgfIBjpWCwAClmwAB5Q2ART2A58kFTYBGPYDAAAs1gMABwI11gUAAQNPADXWBQECA5AKNdYFAgMD Twc11gUDBQOlBjXWBQUGA4MGNdYFBgcDXwY51gMABwEv1gsAAQgAAAD/BAEAAC/WCwEHD/////// /+D/L9YLAAEB////////4P8v1gsAAQL////////g/y/WCwABBP///////+D/YfYDYgBw1kYAAAD/ AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAA AAD/AAAA/wAASQEWJAEXJAFJZgEAAAABlmIAIXYABmgBNdYFAAEDcwE11gUBAgOEBzXWBQIDA+8E NdYFAwQDCAk11gUEBQNLBzXWBQUGA8gGI3YAAXMBI3YBAoQHI3YCA+8EI3YDBAgJI3YEBUsHI3YF BsgGOlYLAAKWbAAHlDYBFPYDnyQVNgEY9gMAACzWAwAGAjXWBQABA08ANdYFAQIDkAo11gUCAwNP BzXWBQMEA6UGNdYFBAUDgwY11gUFBgNfBjnWAwAGAS/WCwABCAAAAP8EAQAAL9YLAQYP//////// 4P8v1gsAAQH////////g/y/WCwABAv///////+D/L9YLAAEE////////4P9h9gNiAHDWPAAAAP8A AAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAPEA FiQBFyQBSWYBAAAAAZZiACF2AAVoATXWBQABA3MBNdYFAQIDcww11gUCAwMICTXWBQMEA0sHNdYF BAUDyAYjdgABcwEjdgECcwwjdgIDCAkjdgMESwcjdgQFyAY6VgsAApZsAAeUNgEU9gOfJBU2ARj2 AwAALNYDAAUCNdYFAAEDTwA11gUBAgNPBzXWBQIDA6UGNdYFAwQDgwY11gUEBQNfBjnWAwAFAS/W CwAFD////////+D/YfYDYgBw1jIAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA /wAAAAAA/wAAAP8AAFUBFiQBFyQBSWYBAAAAAZZiACF2AAhoATXWBQABA3wBNdYFAQIDtwE11gUC AwPwAzXWBQMEA4gENdYFBAUDFAU11gUFBgN0BDXWBQYHA3QENdYFBwgDjAUjdgABfAEjdgECtwEj dgID8AMjdgMEiAQjdgQFFAUjdgUHdAQjdgcIjAU6VgsAApZsAAeUBAEJ1gIAARLWCgAAAP////8A AAAU9gM7HhU2ARj2AwAALNYDAAgCNdYFAAEDfAE11gUBAgO3ATXWBQIDA/gCNdYFAwQDiAQ11gUE BQMUBTXWBQUHA3QENdYFBwgDjAU51gMACAEv1gsACA/////////g/2H2A2IAcNZQAAAA/////wAA AAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAA AP8AAAAAAP8AAAD/AADrAWtkCSUAABYkARckAUlmAQAAAAKWbAAHlAQBCNa0AAj2/3IBKQMZB6EL tRApFZ0ZKR8AJ3wB/////////////////////wAntwH/////////////////////ACf4Av////// //////////////8AJ4gE/////////////////////wAnFAX/////////////////////ACd0BP// //////////////////8AJ3QE/////////////////////wAnjAX/////////////////////CdYC AAES1goAAAD/////AAAAFPYDOx4VNgEX9gMAABj2AwAAGtYg//////////////////////////// //////////////8b1iD//////////////////////////////////////////xzWIP////////// ////////////////////////////////HdYg//////////////////////////////////////// //801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWUAAAAP////8AAAAAAAD/AAAA/wAAAAAA/wAAAP8A AAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAAAAD/AAAA/wAA7wEWJAEX JAFJZgEAAAABlmIAIXYACGgBNdYFAAEDfAE11gUBAgO3ATXWBQIDA/ADNdYFAwQDiAQ11gUEBQMU BTXWBQUGA3QENdYFBgcDdAQ11gUHCAOMBSN2AAF8ASN2AQK3ASN2AgPwAyN2AwSIBCN2BAUUBSN2 BQd0BCN2BwiMBTpWCwAClmwAB5RAAQnWEAAAAAEAAQABAAEAAQABAAES1lAAAAD/AAAA/wAAAAAA /////wAAAAAAAP////8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/////AAAA AAAA/////wAAABT2AzseFTYBGPYDAAAs1gMACAI11gUAAQN8ATXWBQECA7cBNdYFAgMD+AI11gUD BAOIBDXWBQQFAxQFNdYFBQcDdAQ11gUHCAOMBTnWAwAIAS/WCwABD////////+D/L9YLAQIEAAAA /wgBAAAv1gsCCA/////////g/y/WCwECAf///////+D/L9YLAQIC////////4P8v1gsBAgj///// ///g/2H2A2IAcNZQAAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP// //8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAA/AmtkTSgAABYkARckAUlmAQAAAAKW bAAHlEABCNa0AAj2/3IBKQMZB6ELtRApFZ0ZKR8AJ3wB/////////////////////wAntwH///// /////wgBAAD/////ACf4Av////////////////////8AJ4gE/////////////////////wAnFAX/ ////////////////////ACd0BP////////////////////8AJ3QE/////////////////////wAn jAX/////////////////////CdYQAAAAAQABAAEAAQABAAEAARLWUAAAAP8AAAD/AAAAAAD///// AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/ ////AAAAFPYDOx4VNgEX9gMAABj2AwAAGtYg//////////////////////////////////////// //8b1iD//////////////////////////////////////////xzWIP////8AAAD///////////// ////////////////////HdYg//////////////////////////////////////////801gYAAQUD AAA01gYAAQoDbABh9gNiAHDWUAAAAP8AAAD/AAAAAAD/////AAAAAAAA/////wAAAAAAAP////8A AAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/////AAAA7wEWJAEXJAFJZgEAAAAB lmIAIXYACGgBNdYFAAEDfAE11gUBAgO3ATXWBQIDA/ADNdYFAwQDiAQ11gUEBQMUBTXWBQUGA3QE NdYFBgcDdAQ11gUHCAOMBSN2AAF8ASN2AQK3ASN2AgPwAyN2AwSIBCN2BAUUBSN2BQd0BCN2BwiM BTpWCwAClmwAB5SaAQnWEAAAAAEAAQABAAEAAQABAAES1lAAAAD/AAAA/wAAAAAA/////wAAAAAA AP////8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/////AAAAAAAA/////wAA ABT2AzseFTYBGPYDAAAs1gMACAI11gUAAQN8ATXWBQECA7cBNdYFAgMD+AI11gUDBAOIBDXWBQQF AxQFNdYFBQcDdAQ11gUHCAOMBTnWAwAIAS/WCwACD////////+D/L9YLAgMPAAAA/wgBAAAv1gsD BA/////////g/y/WCwQFBwAAAP8IAQAAL9YLBQgP////////4P8v1gsEBQj////////g/2H2A2IA cNZQAAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/ ////AAAAAAAA/////wAAAAAAAP////8AAAA/AmtkfywAABYkARckAUlmAQAAAAKWbAAHlJoBCNa0 AAj2/3IBKQMZB6ELtRApFZ0ZKR8AJ3wB/////////////////////wAntwH///////////////// ////ACf4AggBAAAIAQAACAEAAAgBAAAAJ4gE/////////////////////wAnFAUIAQAACAEAAAgB AAD/////ACd0BP////////////////////8AJ3QE/////////////////////wAnjAX///////// ////////////CdYQAAAAAQABAAEAAQABAAEAARLWUAAAAP8AAAD/AAAAAAD/////AAAAAAAA//// /wAAAAAAAP////8AAAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/////AAAAFPYD Ox4VNgEX9gMAABj2AwAAGtYg//////////8AAAD//////wAAAP////////////////8b1iD///// /////wAAAP//////AAAA/////////////////xzWIP//////////AAAA//////8AAAD///////// ////////HdYg//////////8AAAD///////////////////////////801gYAAQUDAAA01gYAAQoD bABh9gNiAHDWUAAAAP8AAAD/AAAAAAD/////AAAAAAAA/////wAAAAAAAP////8AAAAAAAD///// AAAAAAAA/////wAAAAAAAP////8AAAAAAAD/////AAAA0wEWJAEXJAFJZgEAAAABlmIAIXYACGgB NdYFAAEDfAE11gUBAgO3ATXWBQIDA/ADNdYFAwQDiAQ11gUEBQMUBTXWBQUGA3QENdYFBgcDdAQ1 1gUHCAOMBSN2AAF8ASN2AQK3ASN2AgPwAyN2AwSIBCN2BAUUBSN2BQd0BCN2BwiMBTpWCwAClmwA B5QOAQnWEAAAAAEAASAAAAIAAgACAAIS1lAAAAD/AAAA/wAAAAAA/////wAAAAAAAP////8AAAAA AAD/MzMzAAAAAAAA/8DAwAAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/8DAwAAAABT2AzseFTYB GPYDAAAs1gMACAI11gUAAQN8ATXWBQECA7cBNdYFAgMD+AI11gUDBAOIBDXWBQQFAxQFNdYFBQcD dAQ11gUHCAOMBTnWAwAIAS/WCwADD////////+D/L9YLAwQPAAAA/wgBAAAv1gsEBw/////////g /y/WCwcIDwAAAP8EAQAAYfYDYgBw1lAAAAD/AAAA/wAAAAAA/////wAAAAAAAP////8AAAAAAAD/ MzMzAAAAAAAA/8DAwAAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/8DAwAAAAD8Ca2SxMAAAFiQB FyQBSWYBAAAAApZsAAeUDgEI1rQACPb/cgEpAxkHoQu1ECkVnRkpHwAnfAH///////////////// ////ACe3Af////////////////////8AJ/gC/////////////////////wAniAQIAQAACAEAAAgB AAAIAQAAACcUBf////////////////////8AJ3QE/////////////////////wAndAT///////// ////////////ACeMBQQBAAAEAQAABAEAAAQBAAAJ1hAAAAABAAEgAAACAAIAAgACEtZQAAAA/wAA AP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/zMzMwAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA /8DAwAAAAAAAAP/AwMAAAAAU9gM7HhU2ARf2AwAAGPYDAAAa1iD///////////////8AAAD///// ////////////AAAA/xvWIP///////////////wAAAP////////////////8AAAD/HNYg//////// ////////AAAA/////////////////wAAAP8d1iD///////////////8AAAD///////////////// AAAA/zTWBgABBQMAADTWBgABCgNsAGH2A2IAcNZQAAAA/wAAAP8AAAAAAP////8AAAAAAAD///// AAAAAAAA/zMzMwAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/8DAwAAAAAAAAP/AwMAAAADvARYk ARckAUlmAQAAAAGWYgAhdgAIaAE11gUAAQN8ATXWBQECA7cBNdYFAgMD8AM11gUDBAOIBDXWBQQF AxQFNdYFBQYDdAQ11gUGBwN0BDXWBQcIA4wFI3YAAXwBI3YBArcBI3YCA/ADI3YDBIgEI3YEBRQF I3YFB3QEI3YHCIwFOlYLAAKWbAAHlGgBCdYQAAAAAQABAALgAQACAAIAAhLWUAAAAP8AAAD/AAAA AAD/////AAAAAAAA/////wAAAAAAAP/AwMAAAAAAAAD/gICAAAAAAAAA/8DAwAAAAAAAAP/AwMAA AAAAAAD/wMDAAAAAFPYDOx4VNgEY9gMAACzWAwAIAjXWBQABA3wBNdYFAQIDtwE11gUCAwP4AjXW BQMEA4gENdYFBAUDFAU11gUFBwN0BDXWBQcIA4wFOdYDAAgBL9YLAAQP////////4P8v1gsEBQ8A AAD/CAEAAC/WCwUGD////////+D/L9YLBgcPAAAA/wQBAAAv1gsHCAv////////g/y/WCwcIBAAA AP8IAQAAYfYDYgBw1lAAAAD/AAAA/wAAAAAA/////wAAAAAAAP////8AAAAAAAD/wMDAAAAAAAAA /4CAgAAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/8DAwAAAAD8Ca2THNAAAFiQBFyQBSWYBAAAA ApZsAAeUaAEI1rQACPb/cgEpAxkHoQu1ECkVnRkpHwAnfAH/////////////////////ACe3Af// //////////////////8AJ/gC/////////////////////wAniAT/////////////////////ACcU BQgBAAAIAQAACAEAAAgBAAAAJ3QE/////////////////////wAndAQEAQAABAEAAAQBAAAEAQAA ACeMBf//////////CAEAAP////8J1hAAAAABAAEAAuABAAIAAgACEtZQAAAA/wAAAP8AAAAAAP// //8AAAAAAAD/////AAAAAAAA/8DAwAAAAAAAAP+AgIAAAAAAAAD/wMDAAAAAAAAA/8DAwAAAAAAA AP/AwMAAAAAU9gM7HhU2ARf2AwAAGPYDAAAa1iD/////////////////////AAAA//////8AAAD/ /////xvWIP////////////////////8AAAD//////wAAAP//////HNYg//////////////////// /wAAAP//////AAAA/wAAAP8d1iD/////////////////////AAAA//////8AAAD//////zTWBgAB BQMAADTWBgABCgNsAGH2A2IAcNZQAAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/8DA wAAAAAAAAP+AgIAAAAAAAAD/wMDAAAAAAAAA/8DAwAAAAAAAAP/AwMAAAADhARYkARckAUlmAQAA AAGWYgAhdgAIaAE11gUAAQN8ATXWBQECA7cBNdYFAgMD8AM11gUDBAOIBDXWBQQFAxQFNdYFBQYD dAQ11gUGBwN0BDXWBQcIA4wFI3YAAXwBI3YBArcBI3YCA/ADI3YDBIgEI3YEBRQFI3YFB3QEI3YH CIwFOlYLAAKWbAAHlHIBCdYQAAAAAQABAAIAAuABAAAAARLWUAAAAP8AAAD/AAAAAAD/////AAAA AAAA/////wAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/5aWlgAAAAAAAP8AAAD/AAAAAAD///// AAAAFPYDOx4VNgEY9gMAACzWAwAIAjXWBQABA3wBNdYFAQIDtwE11gUCAwP4AjXWBQMEA4gENdYF BAUDFAU11gUFBwN0BDXWBQcIA4wFOdYDAAgBL9YLAAUP////////4P8v1gsFBg8AAAD/CAEAAC/W CwYHD////////+D/L9YLBwgF////////4P8v1gsHCAoAAAD/CAEAAGH2A2IAcNZQAAAA/wAAAP8A AAAAAP////8AAAAAAAD/////AAAAAAAA/8DAwAAAAAAAAP/AwMAAAAAAAAD/lpaWAAAAAAAA/wAA AP8AAAAAAP////8AAAA/Amtk+TgAABYkARckAUlmAQAAAAKWbAAHlHIBCNa0AAj2/3IBKQMZB6EL tRApFZ0ZKR8AJ3wB/////////////////////wAntwH/////////////////////ACf4Av////// //////////////8AJ4gE/////////////////////wAnFAX/////////////////////ACd0BAgB AAAIAQAACAEAAAgBAAAAJ3QE/////////////////////wAnjAX/////CAEAAP////8IAQAACdYQ AAAAAQABAAIAAuABAAAAARLWUAAAAP8AAAD/AAAAAAD/////AAAAAAAA/////wAAAAAAAP/AwMAA AAAAAAD/wMDAAAAAAAAA/5aWlgAAAAAAAP8AAAD/AAAAAAD/////AAAAFPYDOx4VNgEX9gMAABj2 AwAAGtYg//////////////////////////8AAAD///////////8b1iD///////////////////// /////wAAAP//////AAAA/xzWIP//////////////////////////AAAA////////////HdYg//// //////////////////////8AAAD//////wAAAP801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWUAAA AP8AAAD/AAAAAAD/////AAAAAAAA/////wAAAAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/5aWlgAA AAAAAP8AAAD/AAAAAAD/////AAAALQIWJAEXJAFJZgEAAAABlmIAIXYACGgBNdYFAAEDfAE11gUB AgO3ATXWBQIDA/ADNdYFAwQDiAQ11gUEBQMUBTXWBQUGA3QENdYFBgcDdAQ11gUHCAOMBSN2AAF8 ASN2AQK3ASN2AgPwAyN2AwSIBCN2BAUUBSN2BQd0BCN2BwiMBTpWCwAClmwAB5RoAQnWCgAAAAEA AQACAAIS1jIAAAD/AAAA/wAAAAAA/////wAAAAAAAP////8AAAAAAAD/wMDAAAAAAAAA/8DAwAAA ABT2AzseFTYBGPYDAAAs1gMACAI11gUAAQN8ATXWBQECA7cBNdYFAgMD+AI11gUDBAOIBDXWBQQF AxQFNdYFBQcDdAQ11gUHCAOMBTnWAwAIAS/WCwACD////////+D/L9YLAgMPAAAA/wQBAAAv1gsD BAP////////g/y/WCwMEDAAAAP8EAQAAL9YLBAUFAAAA/wQBAAAv1gsEBQr////////g/y/WCwUG A////////+D/L9YLBQYMAAAA/wgBAAAv1gsGBwEAAAD/CAEAAC/WCwYHDAAAAP8EAQAAL9YLBwgD ////////4P8v1gsGBwL////////g/y/WCwcIDAAAAP8IAQAAYfYDYgBw1lAAAAD/AAAA/wAAAAAA /////wAAAAAAAP////8AAAAAAAD/wMDAAAAAAAAA/8DAwAAAAAAAAP8AAAD/AAAAAAD/AAAA/wAA AAAA/wAAAP8AABsCa2QdPQAAFiQBFyQBSWYBAAAAApZsAAeUaAEI1rQACPb/cgEpAxkHoQu1ECkV nRkpHwAnfAH/////////////////////ACe3Af////////////////////8AJ/gCBAEAAAQBAAAE AQAABAEAAAAniAT//////////wQBAAAEAQAAACcUBQQBAAD/////BAEAAP////8AJ3QE//////// //8IAQAACAEAAAAndAQIAQAA/////wQBAAAEAQAAACeMBf//////////CAEAAAgBAAAJ1goAAAAB AAEAAgACEtYyAAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/8DAwAAAAAAAAP/AwMAA AAAU9gM7HhU2ARf2AwAAGPYDAAAa1iD//////////wAAAP//////AAAA//////8AAAD//////xvW IP//////////AAAA////////////////////////////HNYg//////////8AAAD/AAAA/wAAAP8A AAD/AAAA/wAAAP8d1iD//////////wAAAP8AAAD//////wAAAP8AAAD/AAAA/zTWBgABBQMAADTW BgABCgNsAGH2A2IAcNZQAAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/8DAwAAAAAAA AP/AwMAAAAAAAAD/AAAA/wAAAAAA/wAAAP8AAAAAAP8AAAD/AAAdAhYkARckAUlmAQAAAAGWYgAh dgAIaAE11gUAAQN8ATXWBQECA7cBNdYFAgMD8AM11gUDBAOIBDXWBQQFAxQFNdYFBQYDdAQ11gUG BwN0BDXWBQcIA4wFI3YAAXwBI3YBArcBI3YCA/ADI3YDBIgEI3YEBRQFI3YFB3QEI3YHCIwFOlYL AAKWbAAHlJoBCdYMAAAAAQABAAIAAgABEtY8AAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAA AAAA/8DAwAAAAAAAAP/AwMAAAAAAAAD/////AAAAFPYDOx4VNgEY9gMAACzWAwAIAjXWBQABA3wB NdYFAQIDtwE11gUCAwP4AjXWBQMEA4gENdYFBAUDFAU11gUFBwN0BDXWBQcIA4wFOdYDAAgBL9YL AAMP////////4P8v1gsDBAwAAAD/BAEAAC/WCwQFB////////+D/L9YLAwQB////////4P8v1gsD BAL////////g/y/WCwQFCAAAAP8IAQAAL9YLBQYL////////4P8v1gsFBwQAAAD/CAEAAC/WCwYI A////////+D/L9YLBwgMAAAA/wwBAAAv1gsGBwgAAAD/DAEAAGH2A2IAcNZQAAAA/wAAAP8AAAAA AP////8AAAAAAAD/////AAAAAAAA/8DAwAAAAAAAAP/AwMAAAAAAAAD/////AAAAAAAA/wAAAP8A AAAAAP8AAAD/AAAnAmtkaUEAABYkARckAUlmAQAAAAKWbAAHlJoBCNa0AAj2/3IBKQMZB6ELtRAp FZ0ZKR8AJ3wB/////////////////////wAntwH/////////////////////ACf4Av////////// //////////8AJ4gE//////////8EAQAABAEAAAAnFAX///////////////8IAQAAACd0BP////// ////CAEAAP////8AJ3QE//////////8IAQAADAEAAAAnjAX//////////wwBAAAMAQAACdYMAAAA AQABAAIAAgABEtY8AAAA/wAAAP8AAAAAAP////8AAAAAAAD/////AAAAAAAA/8DAwAAAAAAAAP/A wMAAAAAAAAD/////AAAAFPYDOx4VNgEX9gMAABj2AwAAGtYg//////////////////////////// //////////////8b1iD//////////////////////////////////////////xzWIP////////// /////wAAAP//////AAAA/wAAAP8AAAD/HdYg////////////////AAAA/wAAAP//////AAAA/wAA AP801gYAAQUDAAA01gYAAQoDbABh9gNiAHDWUAAAAP8AAAD/AAAAAAD/////AAAAAAAA/////wAA AAAAAP/AwMAAAAAAAAD/wMDAAAAAAAAA/////wAAAAAAAP8AAAD/AAAAAAD/AAAA/wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAIYCEAASAAEAnAAPAAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAEDx/wIAQgAMBAAAvGMeAAAA BwAeBDEESwRHBD0ESwQ5BAAAAgAAABgAQ0oYAF9IAQRhShgAbUgZBHNIGQR0SBkEAAAAAAAAAAAA AAAAAAAAAAAAQgBBQPL/oQBCAAwFAAAAAAAAAAAVAB4EQQQ9BD4EMgQ9BD4EOQQgAEgEQAQ4BEQE QgQgADAEMQQ3BDAERgQwBAAAAABYAGlA8/+zAFgADAUAAAAAAAAAAA8AHgQxBEsERwQ9BDAETwQg AEIEMAQxBDsEOARGBDAEAAAcABf2AwAANNYGAAEKA2wANNYGAAEFAwAAYfYDAAACAAsAAAAuAGtA 9P/BAC4AAAUAAAAAAAAAAAoAHQQ1BEIEIABBBD8EOARBBDoEMAQAAAIAAAAAAAAAOgBVQKIA8QA6 AAwEAAC/EtwAAAALABMEOAQ/BDUEQARBBEEESwQ7BDoEMAQAAAwAPioBQioCcGgAAP8AAAAAAF4P AgASAADSBQAUAP////8AAAAAAgAAACYAAAAnAAAARgAAAEcAAABIAAAAUgAAAFMAAAB1AAAAuAEA AE8EAADFBwAAMhEAAIoWAADVGAAAwBkAAMEZAADCGQAAwxkAAMUZAADJGQAA9xkAAPgZAABQGgAA tBoAAC0bAAAuGwAALxsAAD0bAAA+GwAAbhsAAG8bAACUGwAAQygAAFAuAACINwAANT0AAHZEAAAA WwAASGcAAElnAABjZwAAHmwAAB9xAAAgcQAAbXEAAAd3AAAIdwAAKncAADWCAABDhgAARIYAAEWG AABkhgAAZYYAAIeGAAA/iQAAZ4kAAJaJAADPiQAA+YkAACuKAABligAAfIoAAJSKAACiigAAq4oA AOSKAAD6igAACIsAAC+LAABBiwAAbIsAAIeLAACviwAA04sAADeMAABBjAAAVowAAKSMAAC5jAAA /owAADKNAAA6jQAAVo0AAG6NAAB9jQAAko0AALaNAAC+jQAAy40AANyNAAAUjgAAQ44AAGuOAAB9 jgAAjo4AAMiOAADZjgAAAY8AAEWPAABxjwAAfY8AAMyPAADTjwAA4ZAAAAORAAAlkQAAN5EAAEGR AABZkQAAhZEAAI+RAACzkQAAvJEAAOWRAADukQAADJIAACySAAAzkgAAPJIAAEmSAACCkgAAkZIA AKeSAADBkgAA2JIAAPOSAAAEkwAAHpMAACaTAAA1kwAAT5MAAGyTAAB5kwAAjpMAAD+UAAAOlQAA P5YAALKWAAAQlwAAbJcAAKeXAADRlwAA+pcAAMaYAAA+mQAAjJkAANicAABWngAAV54AAH2eAAAI oAAAF6AAAHigAADHoAAAZKEAAMqiAAAqowAArqMAAPKjAABKpAAAdqQAAJikAADNpAAABaYAADWm AAA8pgAAxqYAAM2mAADrqAAAlakAAEWrAABGqwAAWqsAAMesAACwrQAAsq0AAMWtAADPrQAA260A AOStAADlrQAA8q0AAPOtAAD1rQAANq4AAGquAACyrgAA5K4AABavAAAXrwAAGa8AADCvAABBrwAA U68AAJCvAADDrwAAxK8AAMavAADbrwAAA7AAABmwAAAqsAAAUbAAAFKwAABUsAAAbrAAAIewAACj sAAAwrAAAPKwAADzsAAA9bAAAB6xAAA+sQAAUrEAAH+xAACfsQAAoLEAAKKxAACqsQAAq7EAAL6x AADGsQAAx7EAAOCxAAADsgAABLIAAAayAAAbsgAAJLIAAEOyAABQsgAAeLIAAHmyAAB7sgAAk7IA AKCyAADFsgAAzLIAAOqyAADrsgAA7bIAAAmzAAAPswAAQbMAAFKzAABqswAAa7MAAG2zAAB6swAA f7MAAKGzAACsswAAyrMAAMuzAADNswAA4rMAAOazAAD4swAABrQAAA60AAAPtAAAEbQAACS0AAA/ tAAATLQAAFO0AABUtAAAZLQAAGW0AABntAAAd7QAAIS0AACTtAAAprQAAL20AAC+tAAAwLQAANy0 AADmtAAA+rQAAA21AAAftQAAILUAACK1AAA3tQAAUrUAAJG1AADDtQAAAbYAAAK2AAAEtgAAHLYA AEe2AABhtgAAe7YAAIi2AACJtgAAi7YAAJe2AAC0tgAA17YAAOG2AAD2tgAA97YAAPm2AAANtwAA ErcAACy3AAAttwAAN7cAAE63AABPtwAAUbcAAGq3AACGtwAAqrcAAMm3AADXtwAA2LcAANq3AADz twAA/bcAAB64AAAzuAAASLgAAEm4AABLuAAAXLgAAGO4AAB2uAAAibgAAK64AACvuAAAsbgAAM+4 AADfuAAA67gAAPi4AAAIuQAACbkAAAu5AAA5uQAATbkAAHO5AACYuQAAoLkAAKG5AACjuQAAr7kA AM65AADiuQAA8bkAAA66AAAPugAAEboAABu6AAAkugAAKboAACq6AABGugAAaboAAGq6AABsugAA eboAAIW6AACYugAAoroAALu6AAC8ugAAvroAANu6AAD0ugAADbsAACW7AAAmuwAAOLsAAHi7AADK uwAABrwAAM+8AAArvQAAcb0AALq9AADBvQAA8r0AAAa+AAAlvgAAOr4AAFe+AABvvgAAjb4AAKK+ AAC8vgAA3b4AAP2+AAAlvwAAN78AAD6/AABpvwAAib8AALO/AAD/vwAAN8AAAE/AAACWwAAA1MAA ADLBAAB3wQAAycEAAAjCAAAkwgAAT8IAAHjCAADIwgAA3sIAABrDAAB8wwAAwsMAAP7DAAAkxAAA TsQAAIbEAADHxAAAGMUAAHHFAAByxQAAf8UAAIDFAACixQAA8MUAAILIAACJyAAAGMkAAFnJAACt yQAAtMkAAJvMAAA21QAAXdUAAF/VAABj1QAAa9UAAG3VAABv1QAAcdUAAHPVAAB11QAAdtUAAHjV AAB61QAAfNUAAH7VAACB1QAAg9UAAIXVAACH1QAAiNUAAIvVAACO1QAAkdUAAJbVAACa1QAAnNUA AKLVAACj1QAApNUAAKbVAACo1QAAq9UAALTVAAC91QAAxdUAAM3VAADV1QAA1tUAANjVAADb1QAA 3dUAAObVAADx1QAA+tUAAAPWAAAM1gAADdYAAA/WAAAR1gAAE9YAABvWAAAk1gAALdYAADXWAAA9 1gAAPtYAAEDWAABD1gAARdYAAE7WAABY1gAAYdYAAGvWAAB01gAAddYAAHfWAAB51gAAf9YAAIfW AACQ1gAAmNYAAKDWAACp1gAAqtYAAB/YAAAm2wAAO9sAAEzbAABj2wAAetsAAJDbAAA93QAAYd8A AAriAAAN4wAAQeMAAJbjAACo5AAAFeUAAHLlAACu5QAA1OUAABrmAADf5gAABOkAADHsAADK7gAA W/MAAFzzAACE8wAAVfUAAMP6AABG/wAAmgUBAEIIAQCKCwEAiwsBALQLAQBtDgEA7xMBAOoYAQBr HgEACyEBAAwhAQA4IQEA5yQBAEopAQBLKQEAkCkBAJ0sAQBkMAEAZjABAJAwAQAYMwEAWjMBAJo1 AQACNwEAXDcBAOk4AQAMOgEAST4BABJDAQDNRwEAQkoBANhLAQDZSwEA7EsBAGtSAQBZVAEAM18B ANtkAQDcZAEA3WQBAPhkAQD5ZAEAGGUBABhoAQBTbgEA9nEBALR0AQC2dAEA3nQBADx4AQArfAEA zn0BAN5/AQDgfwEADIABAEaJAQDLjQEAbpUBAG+VAQBwlQEAhZUBAIaVAQCYlQEAqZsBAIifAQBs ogEARaUBACunAQAspwEATqcBAFOrAQADrwEArK8BALGzAQBMtQEA/LUBAJm3AQCNuAEAcrkBAGC6 AQDmvAEAlMMBAOrGAQAPxwEAFccBAHPJAQAMywEAossBAK3LAQAbzQEAI80BAFjQAQBh0AEACNQB ACHUAQCA1gEAo9cBAMfXAQBw2AEAgNgBAITbAQCN3gEAjt4BAK3eAQBj5gEAdvABAM70AQDP9AEA 9fQBAFH3AQA9+wEAxwYCALcKAgC4CgIA7goCAO8KAgApCwIAKgsCAGULAgBmCwIAZwsCAGgLAgBp CwIAagsCAGsLAgBsCwIAbQsCAG4LAgBvCwIAcAsCAHELAgByCwIAcwsCAHQLAgB1CwIAdgsCAHcL AgB4CwIAeQsCAHoLAgCOCwIAjwsCAJkLAgCaCwIAmwsCAJwLAgCdCwIAngsCAKkLAgCqCwIAqwsC AKwLAgAlDAIAhAwCAPcMAgCBDQIA9w0CAHUOAgD8DgIA/Q4CAP4OAgD/DgIAAA8CAAEPAgACDwIA Aw8CAAQPAgAFDwIABg8CAAcPAgAIDwIALg8CAC8PAgAwDwIATw8CAFAPAgBRDwIAUg8CAFcPAgBY DwIAYA8CAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY QAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY QAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAKkAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpAAAAADAAAAAAAAAAgAAAAIABAADQAAAA ACAAqQAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKkAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAA IACpAAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqQAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAg AKkAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZAAAAADAAAAAAAAAAgAAAAIABAADUAAAAACAA qUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACp AAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqQAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlA AAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAmUAA AAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpAAAA ADAAAAAAAAAAgAAAAIABAADQAAAAACAAqQAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKkAAAAA MAAAAAAAAACAAAAAgAEAANAAAAAAIACpAAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqQAAAAAw AAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAA AAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAA AAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAA AAAAAIAAAACAAQAA0AAAAAAgAKkAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZQAAAADAAAAAA AAAAgAAAAIABAADUAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAA AACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAA AIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpAAAAADAAAAAAAAAA gAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAAAAAAAACA AAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAA AACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAA AIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAA gAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACA AQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIAB AADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEA ANAAAAAAIACpAAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA 0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQ AAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAA AAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAA AAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZQAAAADAAAAAAAAAAgAAAAIABAADUAAAA ACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAA IACpAAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAg AKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAA mUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACp QAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKkA AAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAA AAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAA ADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAA MAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAw AAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZQAAAADAA AAAAAAAAgAAAAIABAADUAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAA AAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAA AAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAA AAAAgAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAAAAAA AACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAA AIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAA gAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACA AAAAgAEAANAAAAAAIACZQAAAADAAAAAAAAAAgAAAAIABAADUAAAAACAAqUAAAAAwAAAAAAAAAIAA AACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAA AIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAA gAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACA AQAA1AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIAB AADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEA ANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA 0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQ AAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAA AAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAA AAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZQAAAADAAAAAAAAAAgAAAAIABAADUAAAA ACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKkAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAA IACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAg AKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAA mUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACp QAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlA AAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAA AAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAA ADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAA MAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAw AAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAA AAAAAAAAgAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAA AAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAA AAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAA AAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAA AACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqQAAAAAwAAAAAAAA AIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAA gAAAAIABAADQAAAAACAAqQAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACA AAAAgAEAANAAAAAAIACZQAAAADAAAAAAAAAAgAAAAIABAADUAAAAACAAqUAAAAAwAAAAAAAAAIAA AACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAA AIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAA gAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACA AQAA1AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIAB AADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEA ANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA 0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQ AAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAA AAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqQAAAAAwAAAAAAAAAIAAAACAAQAA0AAA AAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZQAAAADAAAAAAAAAAgAAAAIABAADUAAAA ACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAA IACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAg AKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAA mUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACp QAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlA AAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAA AAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACZQAAA ADAAAAAAAAAAgAAAAIABAADUAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAA MAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAw AAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAA AAAAAAAAgAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAKlAAAAAMAAA AAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAA AAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAA AAAAgAAAAIABAADQAAAAACAAmUAAAAAwAAAAAAAAAIAAAACAAQAA1AAAAAAgAJhAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY QAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAA AACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAA AIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAA gAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACA AQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIAB AADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEA ANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA 0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQ AAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQA AAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAA AAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAA ACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAA IACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAg AJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAA qUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACp QAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlA AAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAA AAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAA ADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAA MAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAw AAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAA AAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAA AAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAA AAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAA AAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAA AACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAA AIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACpQAAAADAAAAAAAAAA gAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACA AAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAA AACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAA AIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAA gAEAANQAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACA AQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEAANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIAB AADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA0AAAAAAgAKlAAAAAMAAAAAAAAACAAAAAgAEA ANAAAAAAIACpQAAAADAAAAAAAAAAgAAAAIABAADQAAAAACAAqUAAAAAwAAAAAAAAAIAAAACAAQAA 0AAAAAAgAJlAAAAAMAAAAAAAAACAAAAAgAEAANQAAAAAIACYQAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY QAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmEAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJhAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYQAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJhAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAASAAAAFIAAABT AAAAdQAAAE8EAADFBwAAMhEAAIoWAADVGAAAxRkAAPcZAAD4GQAAUBoAALKtAADFrQAAz60AANut AADkrQAA5a0AAPKtAADzrQAA9a0AADauAABqrgAAsq4AAOSuAAAWrwAAF68AABmvAAAwrwAAQa8A AFOvAACQrwAAw68AAMSvAADGrwAA268AAAOwAAAZsAAAKrAAAFGwAABSsAAAVLAAAG6wAACHsAAA o7AAAMKwAADysAAA87AAAPWwAAAesQAAPrEAAFKxAAB/sQAAn7EAAKCxAACisQAAqrEAAKuxAAC+ sQAAxrEAAMexAADgsQAAA7IAAASyAAAGsgAAG7IAACSyAABDsgAAULIAAHiyAAB5sgAAe7IAAJOy AACgsgAAxbIAAMyyAADqsgAA67IAAO2yAAAJswAAD7MAAEGzAABSswAAarMAAGuzAABtswAAerMA AH+zAAChswAArLMAAMqzAADLswAAzbMAAOKzAADmswAA+LMAAAa0AAAOtAAAD7QAABG0AAAktAAA P7QAAEy0AABTtAAAVLQAAGS0AABltAAAZ7QAAHe0AACEtAAAk7QAAKa0AAC9tAAAvrQAAMC0AADc tAAA5rQAAPq0AAANtQAAH7UAACC1AAAitQAAN7UAAFK1AACRtQAAw7UAAAG2AAACtgAABLYAABy2 AABHtgAAYbYAAHu2AACItgAAibYAAIu2AACXtgAAtLYAANe2AADhtgAA9rYAAPe2AAD5tgAADbcA ABK3AAAstwAALbcAADe3AABOtwAAT7cAAFG3AABqtwAAhrcAAKq3AADJtwAA17cAANi3AADatwAA 87cAAP23AAAeuAAAM7gAAEi4AABJuAAAS7gAAFy4AABjuAAAdrgAAIm4AACuuAAAr7gAALG4AADP uAAA37gAAOu4AAD4uAAACLkAAAm5AAALuQAAObkAAE25AABzuQAAmLkAAKC5AAChuQAAo7kAAK+5 AADOuQAA4rkAAPG5AAAOugAAD7oAABG6AAAbugAAJLoAACm6AAAqugAARroAAGm6AABqugAAbLoA AHm6AACFugAAmLoAAKK6AAC7ugAAvLoAAL66AADbugAA9LoAAA27AAAluwAAJrsAADi7AAB4uwAA yrsAAInIAAAYyQAAWckAAK3JAAC0yQAAm8wAADbVAABd1QAAX9UAAGPVAABr1QAAbdUAAG/VAABx 1QAAc9UAAHXVAAB21QAAeNUAAHrVAAB81QAAftUAAIHVAACD1QAAhdUAAIfVAACI1QAAi9UAAI7V AACR1QAAltUAAJrVAACc1QAAotUAAKPVAACk1QAAptUAAKjVAACr1QAAtNUAAL3VAADF1QAAzdUA ANXVAADW1QAA2NUAANvVAADd1QAA5tUAAPHVAAD61QAAA9YAAAzWAAAN1gAAD9YAABHWAAAT1gAA G9YAACTWAAAt1gAANdYAAD3WAAA+1gAAQNYAAEPWAABF1gAATtYAAFjWAABh1gAAa9YAAHTWAAB1 1gAAd9YAAHnWAAB/1gAAh9YAAJDWAACY1gAAoNYAAKnWAACq1gAAH9gAACbbAACQ2wAAPd0AAGHf AAAK4gAADeMAAEHjAACW4wAAqOQAAN/mAAAE6QAAMewAAIsLAQALIQEADCEBADghAQBKKQEASykB AJApAQBmMAEAM18BAHCVAQCFlQEAhpUBAJiVAQCInwEAx9cBAHDYAQCA2AEAjd4BAKkLAgAlDAIA hAwCAPcMAgCBDQIA9w0CAGAPAgDKkQAwADAAAAAAAAABAAAAUgAAAAEAAAAg0SQHytEAMAAwAAAA AAAAAQAAAFEAAAAAAAAAAAAAB8rRADAAMAAAAAAAAAEAAABQAAAAAAAAAAAAAAfK0QAwADAAAAAA AAACAAAATgAAAAAAAAAAAAAHytEAMAQwAAAAAAAAAQAAAE4BAAAFAAAACAceB8rRADAEMAAAAAAA AAEAAABNAQAAAAAAAAAAAAfK0QAwBDAAAAAAAAACAAAASwEAAAAAAAAAAAAHytEAMAUwAAAAAAAA AQAAAEcBAAAAAAAAAAAAB5pAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAAfK0QAwBTAAAAAAAAAB AAAARwEAAAYAAAAkBx4HytEAMAAwAAAAAAAAAgAAAAIAAAAAAAAAAAAAB8jRADAAMAAAAAAAAAIA AAACAAAAAAAAAAAAAAHK0QAwADAAAAAAAAACAAAAAgAAAAAAAAAAAAAHytEAMAAwAAAAAAAAAgAA AAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAACAAAA AgABAAAAAAAAAAgHytEAMAAwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAIAAAAC AAEAAAAAAAAACAfK0QAwADAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAAwAAAAAAAAAgAAAAIA AQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK0QAwAjAAAAAAAAACAAAAAgAB AAAAAAAAACAHytEAMAIwAAAAAAAAAgAAAAIAAQAAAAAAAAAgB8rRADACMAAAAAAAAAIAAAACAAEA AAAAAAAAIAfK0QAwAjAAAAAAAAACAAAAAgABAAAAAAAAACAHytEAMAIwAAAAAAAAAgAAAAIAAQAA AAAAAAAIB8rRADACMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAABAAAAAAABAAAE AAAAACAHytEAMAQwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAEMAAAAAAAAAIAAAACAAEAAAAA AAAACAfK0QAwBDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAQwAAAAAAAAAgAAAAIAAQAAAAAA AAAIB8rRADAEMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwBDAAAAAAAAACAAAAAgABAAAAAAAA AAgHytEAMAAwAAAAAAAAAQAAAAAAAQAABAAAAAAgB8rRADAGMAAAAAAAAAIAAAACAAEAAAAAAAAA CAfK0QAwBjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAYwAAAAAAAAAgAAAAIAAQAAAAAAAAAI B8rRADAGMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwBjAAAAAAAAACAAAAAgABAAAAAAAAAAgH ytEAMAYwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK 0QAwCDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rR ADAIMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwCDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEA MAgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAIMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAw ADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMAowAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAK MAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwCjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAow AAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAKMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwCjAA AAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAAwAAAAAAAAAQAAAAAAAQAABAAAAAAgB8rRADAMMAAA AAAAAAIAAAACAAEAAAAAAAAACAfK0QAwDDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAwwAAAA AAAAAgAAAAIAAQAAAAAAAAAIB8rRADAMMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwDDAAAAAA AAACAAAAAgABAAAAAAAAAAgHytEAMAwwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAMMAAAAAAA AAIAAAACAAEAAAAAAAAACAfK0QAwDDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAAwAAAAAAAA AQAAAAAAAQAABAAAAAAgB8rRADAOMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwDjAAAAAAAAAC AAAAAgABAAAAAAAAAAgHytEAMA4wAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAOMAAAAAAAAAIA AAACAAEAAAAAAAAACAfK0QAwDjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMA4wAAAAAAAAAgAA AAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK0QAwEDAAAAAAAAACAAAA AgABAAAAAAAAAAgHytEAMBAwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAQMAAAAAAAAAIAAAAC AAEAAAAAAAAACAfK0QAwEDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBAwAAAAAAAAAgAAAAIA AQAAAAAAAAAIB8rRADAQMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAABAAAAAAAB AAAEAAAAACAHytEAMBIwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADASMAAAAAAAAAIAAAACAAEA AAAAAAAACAfK0QAwEjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBIwAAAAAAAAAgAAAAIAAQAA AAAAAAAIB8rRADASMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwEjAAAAAAAAACAAAAAgABAAAA AAAAAAgHytEAMAAwAAAAAAAAAQAAAAAAAQAABAAAAAAgB8rRADAUMAAAAAAAAAIAAAACAAEAAAAA AAAACAfK0QAwFDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBQwAAAAAAAAAgAAAAIAAQAAAAAA AAAIB8rRADAUMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwFDAAAAAAAAACAAAAAgABAAAAAAAA AAgHytEAMBQwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAA IAfK0QAwFjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBYwAAAAAAAAAgAAAAIAAQAAAAAAAAAI B8rRADAWMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwFjAAAAAAAAACAAAAAgABAAAAAAAAAAgH ytEAMBYwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAWMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK 0QAwADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMBgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rR ADAYMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwGDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEA MBgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAYMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAw GDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAA MAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK0QAwGjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBow AAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAaMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwGjAA AAAAAAACAAAAAgABAAAAAAAAAAgHytEAMBowAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAaMAAA AAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMBwwAAAA AAAAAgAAAAIAAQAAAAAAAAAIB8rRADAcMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwHDAAAAAA AAACAAAAAgABAAAAAAAAAAgHytEAMBwwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAcMAAAAAAA AAIAAAACAAEAAAAAAAAACAfK0QAwHDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAAwAAAAAAAA AQAAAAAAAQAABAAAAAAgB8rRADAeMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwHjAAAAAAAAAC AAAAAgABAAAAAAAAAAgHytEAMB4wAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAeMAAAAAAAAAIA AAACAAEAAAAAAAAACAfK0QAwHjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMB4wAAAAAAAAAgAA AAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK0QAwIDAAAAAAAAACAAAA AgABAAAAAAAAAAgHytEAMCAwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAgMAAAAAAAAAIAAAAC AAEAAAAAAAAACAfK0QAwIDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMCAwAAAAAAAAAgAAAAIA AQAAAAAAAAAIB8rRADAgMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAABAAAAAAAB AAAEAAAAACAHytEAMCIwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAiMAAAAAAAAAIAAAACAAEA AAAAAAAACAfK0QAwIjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMCIwAAAAAAAAAgAAAAIAAQAA AAAAAAAIB8rRADAiMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwIjAAAAAAAAACAAAAAgABAAAA AAAAAAgHytEAMAAwAAAAAAAAAQAAAAAAAQAABAAAAAAgB8rRADAkMAAAAAAAAAIAAAACAAEAAAAA AAAACAfK0QAwJDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMCQwAAAAAAAAAgAAAAIAAQAAAAAA AAAIB8rRADAkMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwJDAAAAAAAAACAAAAAgABAAAAAAAA AAgHytEAMCQwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAkMAAAAAAAAAIAAAACAAEAAAAAAAAA CAfK0QAwADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMCYwAAAAAAAAAgAAAAIAAQAAAAAAAAAI B8rRADAmMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwJjAAAAAAAAACAAAAAgABAAAAAAAAAAgH ytEAMCYwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAmMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK 0QAwJjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAAwAAAAAAAAAQAAAAAAAQAABAAAAAAgB8rR ADAoMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwKDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEA MCgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAoMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAw KDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMCgwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAA MAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK0QAwKjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMCow AAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAqMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwKjAA AAAAAAACAAAAAgABAAAAAAAAAAgHytEAMCowAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAqMAAA AAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMCwwAAAA AAAAAgAAAAIAAQAAAAAAAAAIB8rRADAsMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwLDAAAAAA AAACAAAAAgABAAAAAAAAAAgHytEAMCwwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAsMAAAAAAA AAIAAAACAAEAAAAAAAAACAfK0QAwLDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMAAwAAAAAAAA AQAAAAAAAQAABAAAAAAgB8rRADAuMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwLjAAAAAAAAAC AAAAAgABAAAAAAAAAAgHytEAMC4wAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAuMAAAAAAAAAIA AAACAAEAAAAAAAAACAfK0QAwLjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMC4wAAAAAAAAAgAA AAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAfK0QAwMDAAAAAAAAACAAAA AgABAAAAAAAAAAgHytEAMDAwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAwMAAAAAAAAAIAAAAC AAEAAAAAAAAACAfK0QAwMDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMDAwAAAAAAAAAgAAAAIA AQAAAAAAAAAIB8rRADAwMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwADAAAAAAAAABAAAAAAAB AAAEAAAAACAHytEAMDIwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAyMAAAAAAAAAIAAAACAAEA AAAAAAAACAfK0QAwMjAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMDIwAAAAAAAAAgAAAAIAAQAA AAAAAAAIB8rRADAyMAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwMjAAAAAAAAACAAAAAgABAAAA AAAAAAgHytEAMDIwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADAAMAAAAAAAAAEAAAAAAAEAAAQA AAAAIAfK0QAwNDAAAAAAAAACAAAAAgABAAAAAAAAAAgHytEAMDQwAAAAAAAAAgAAAAIAAQAAAAAA AAAIB8rRADA0MAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwNDAAAAAAAAACAAAAAgABAAAAAAAA AAgHytEAMDQwAAAAAAAAAgAAAAIAAQAAAAAAAAAIB8rRADA0MAAAAAAAAAIAAAACAAEAAAAAAAAA CAfK0QAwADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMDYwAAAAAAAAAgAAAAIAAQAAAAAAAAAI B8rRADA2MAAAAAAAAAIAAAACAAEAAAAAAAAACAfK0QAwNjAAAAAAAAACAAAAAgABAAAAAAAAACAH ytEAMDYwAAAAAAAAAgAAAAIAAQAAAAAAAAAgB8rRADA2MAAAAAAAAAIAAAACAAEAAAAAAAAAIAfK 0QAwADAAAAAAAAABAAAAAAABAAAEAAAAACAHytEAMM4wAAAAAAAAAgAAAE0AAAAAAAAAAAAAB5pA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAAfK0QAwADAAAAAAAAABAAAABAAAAAAAAAAAAAAHytEA MAAwAAAAAAAAAQAAAAQAAAABAAAAAAA5B5pAAAAAMAAAAAAAAACAAAAAgAAAACgAAAAAAAfK0QAw ATAAAAAAAAACAAAAAQAAAAAAAAAAAAAHytEAMAMwAAAAAAAAAQAAAAQAAAAAAAAAAAAAB8rRADDV MAAAAAAAAAEAAAAbAAAA1gAAAFwdIQfK0QAw1TAAAAAAAAABAAAAGgAAAAAAAAAAAAAHytEAMNUw AAAAAAAAAgAAABgAAAAAAAAAAAAAB8rRADAGMAAAAAAAAAEAAAAEAAAAANAAAAAAAAfK0QAwADAA AAAAAAACAAAAAgABAAAAAAAAAAcDytEAMAAwAAAAAAAAAgAAAAIAAQAAAAAAAAAHB8rRADAAMAAA AAAAAAIAAAACAAEAAAAAAAAABwfI0QAwADAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMAAwAAAA AAAAAgAAAAIAAQAAAAAAAAAHA8jRADAAMAAAAAAAAAIAAAACAAEAAAAAAAAABwPI0QAwADAAAAAA AAACAAAAAgABAAAAAAAAAAcDyNEAMAAwAAAAAAAAAgAAAAIAAQAAAAAAAAAHA8rRADAAMAAAAAAA AAEAAAAAAAEAAAQAAAAAIAHI0QAwAjAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMAIwAAAAAAAA AgAAAAIAAQAAAAAAAAAHA8jRADACMAAAAAAAAAIAAAACAAEAAAAAAAAABwPI0QAwAjAAAAAAAAAC AAAAAgABAAAAAAAAAAcDyNEAMAIwAAAAAAAAAgAAAAIAAQAAAAAAAAAHA8jRADACMAAAAAAAAAIA AAACAAEAAAAAAAAABwPI0QAwAjAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMAIwAAAAAAAAAgAA AAIAAQAAAAAAAAAHA8jRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAHK0QAwBDAAAAAAAAACAAAA AgABAAAAAAAAAAcHyNEAMAQwAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcjRADAEMAAAAAAAAAIAAAAC AAEAAAAAAAAAIAHI0QAwBDAAAAAAAAACAAAAAgABAAAAAAAAACAByNEAMAQwAAAAAAAAAgAAAAIA AQAAAAAAAAAgAcjRADAEMAAAAAAAAAIAAAACAAEAAAAAAAAAIAHK0QAwBDAAAAAAAAACAAAAAgAB AAAAAAAAACAHytEAMAQwAAAAAAAAAgAAAAIAAQAAAAAAAAAgB8jRADAAMAAAAAAAAAEAAAAAAAEA AAQAAAAAIAHK0QAwBjAAAAAAAAACAAAAAgABAAAAAAAAACAByNEAMAYwAAAAAAAAAgAAAAIAAQAA AAAAAAAgAcjRADAGMAAAAAAAAAIAAAACAAEAAAAAAAAAIAHI0QAwBjAAAAAAAAACAAAAAgABAAAA AAAAAAcDyNEAMAYwAAAAAAAAAgAAAAIAAQAAAAAAAAAHA8jRADAGMAAAAAAAAAIAAAACAAEAAAAA AAAABwPI0QAwBjAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMAYwAAAAAAAAAgAAAAIAAQAAAAAA AAAgAcjRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAHK0QAwCDAAAAAAAAACAAAAAgABAAAAAAAA ACAByNEAMAgwAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcjRADAIMAAAAAAAAAIAAAACAAEAAAAAAAAA IAHI0QAwCDAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMAgwAAAAAAAAAgAAAAIAAQAAAAAAAAAH A8jRADAIMAAAAAAAAAIAAAACAAEAAAAAAAAABwPI0QAwCDAAAAAAAAACAAAAAgABAAAAAAAAACAB yNEAMAgwAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcjRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAHK 0QAwCjAAAAAAAAACAAAAAgABAAAAAAAAACAByNEAMAowAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcjR ADAKMAAAAAAAAAIAAAACAAEAAAAAAAAAIAHI0QAwCjAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEA MAowAAAAAAAAAgAAAAIAAQAAAAAAAAAHA8jRADAKMAAAAAAAAAIAAAACAAEAAAAAAAAABwPI0QAw CjAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMAowAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcjRADAA MAAAAAAAAAEAAAAAAAEAAAQAAAAAIAHK0QAwDDAAAAAAAAACAAAAAgABAAAAAAAAACAByNEAMAww AAAAAAAAAgAAAAIAAQAAAAAAAAAgAcjRADAMMAAAAAAAAAIAAAACAAEAAAAAAAAAIAHI0QAwDDAA AAAAAAACAAAAAgABAAAAAAAAAAcDytEAMAwwAAAAAAAAAgAAAAIAAQAAAAAAAAAHB8jRADAMMAAA AAAAAAIAAAACAAEAAAAAAAAABwPI0QAwDDAAAAAAAAACAAAAAgABAAAAAAAAACAByNEAMAwwAAAA AAAAAgAAAAIAAQAAAAAAAAAgAcjRADAAMAAAAAAAAAEAAAAAAAEAAAQAAAAAIAHK0QAwDjAAAAAA AAACAAAAAgABAAAAAAAAACAByNEAMA4wAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcrRADAOMAAAAAAA AAIAAAACAAEAAAAAAAAAIAfI0QAwDjAAAAAAAAACAAAAAgABAAAAAAAAAAcDyNEAMA4wAAAAAAAA AgAAAAIAAQAAAAAAAAAHA8jRADAOMAAAAAAAAAIAAAACAAEAAAAAAAAAIAHI0QAwDjAAAAAAAAAC AAAAAgABAAAAAAAAACABytEAMA4wAAAAAAAAAgAAAAIAAQAAAAAAAAAgAcrRADAAMAAAAAAAAAEA AAAAAAEAAAQAAAAAIAHK0QAwBjAAAAAAAAABAAAABAAAAAAAAAAAAAAHytEAMCIxAAAAAAAAAQAA ABsAAAAAAAAAAAAAB8rRADAiMQAAAAAAAAIAAAAYAAAAAAAAAAAAAAfK0QAwBjAAAAAAAAABAAAA BAAAAAAAAAAAAAAHytEAMAYwAAAAAAAAAQAAAAQAAAAAAAAAAAAAB8rRADAGMAAAAAAAAAEAAAAE AAAAAAAAAAAAAAfK0QAwBjAAAAAAAAABAAAABAAAAAAAAAAAAAAHytEAMAYwAAAAAAAAAQAAAAQA AAAAAAAAAAAAAcrRADAGMAAAAAAAAAEAAAAEAAAAAAAAAAAAAAfK0QAwBjAAAAAAAAABAAAABAAA AAAAAAAAAAAHytEAMAYwAAAAAAAAAQAAAAQAAAAAAAAAAAAAB8rRADAGMAAAAAAAAAEAAAAEAAAA AAAAAAAAAAfK0QAwBjAAAAAAAAABAAAABAAAAAAAAAAAAAAHytEAMAYwAAAAAAAAAQAAAAQAAAAA AAAAAAAABwpAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcKQAAAADAAAAAAAAAAAAAAAAAAAAAA AAAAAAAHCkAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAABwpAAAAAMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAcKQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHytEAMA4wAAAAAAAAAQAAAAUAAAAPAAAA AAAPB8rRADAOMAAAAAAAAAIAAAACAAAAAAAAAAAAAAfK0QAwBjAAAAAAAAABAAAABQAAAAcAAAAA AA8HytEAMBEwAAAAAAAAAQAAAAUAAAASAAAAAACaB8rRADARMAAAAAAAAAEAAAAEAAAAAAAAAAAA gAfK0QAwETAAAAAAAAACAAAAAgAAAAAAAAAAAIAHmkAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA B5pAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAAfK0QAwFjAAAAAAAAABAAAABgAAAAAAAAAAAAAH ytEAMBYwAAAAAAAAAQAAAAUAAAAAAAAAAAAAB8rRADAWMAAAAAAAAAEAAAAEAAAAAAAAAAAAAAfK 0QAwFjAAAAAAAAABAAAAAwAAAAAAAAAAAAAHmkAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAB8rR ADBCMQAAAAAAAAEAAAAFAAAAQwEAAMApsAfK0QAwQjEAAAAAAAABAAAABAAAAAAAAAAAAIAHytEA MEIxAAAAAAAAAgAAAAIAAAAAAAAAAACAB5pAAAAAMAAAAAAAAACAAAAAgAAAALAAAAAAAAcKQAAA ADAAAAAAAAAAAAAAAAAAAACwAAAAAAAHmgAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAABwAGAAAk CAAAUAgAAOYIAADSCwAAKhMAAOQcAABqJAAAqiwAABw2AACAOwAAejwAAPA+AADsRwAAolQAAHRc AAAyZgAAomwAACZ1AACifwAAeosAAB6XAAAmoQAAzLAAAG7BAACqzQAAetQAAJjZAACq5wAAKvUA ABQDAQCSFAEABhcBANYaAQCIHAEAXh0BABYfAQC0IAEAsCIBAIIjAQAGJgEAHisBAAgxAQCYNgEA YjkBAF5BAQBKRQEAMEgBAFxMAQDcUAEAKlcBAIxeAQDiYQEAsmMBAAxlAQDAawEAlHEBAFZ4AQCa ewEA8H4BAEKCAQDsgwEAWIUBAJSGAQAIiAEATokBAOyLAQD8jAEAtI4BAFiQAQCqkgEA4JMBAISV AQCslgEAupkBAG6dAQCwpAEAUK4BAAqzAQBEswEASLQBAPy0AQCwtQEAwrgBAGK7AQBQvgEANL8B AJjDAQDMxwEATs0BAPzOAQDu0AEALNMBAL7VAQAK2gEAUOIBAJDtAQDs8wEAPvoBAIoGAgB4DQIA tBYCAPxQAwDSUgMAQFoDAKJxAwCmfAMACoEDAOqLAwCkkQMAmpsDADqsAwD6uwMArM0DABLTAwBe 2wMAKuoDAIT2AwAO/AMAUAIEAIQEBACIDwQAiB0EABAlBAAcKwQAiDAEAEo6BACGQQQAvEYEAPxK BABEUAQAEFcEAJhgBACGZQQA5moEAK5xBABYfAQA5IgEAOKSBADYoQQAMrcEABDHBACw1AQAeOgE ADb4BADwAAUAuAsFAMIgBQCCJgUAxjYFABZEBQA4UAUARlEFAJ5RBQB0VAUAKFkFADZZBQAMAQAA DwEAABABAAARAQAAEgEAABMBAAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAbAQAAHAEAAB0BAAAe AQAAHwEAACABAAAhAQAAIgEAACMBAAAkAQAAJQEAACYBAAAnAQAAKAEAACkBAAAqAQAAKwEAACwB AAAtAQAALgEAADABAAAxAQAAMgEAADMBAAA0AQAANQEAADcBAAA4AQAAOQEAADsBAAA9AQAAPgEA AD8BAABAAQAAQQEAAEIBAABDAQAARAEAAEYBAABHAQAASAEAAEkBAABMAQAAUwEAAF8BAABoAQAA bQEAAHMBAAB1AQAAdgEAAHcBAAB4AQAAeQEAAHoBAAB8AQAAfQEAAH4BAAB/AQAAgAEAAIEBAACC AQAAgwEAAIQBAACGAQAAhwEAAIgBAACJAQAAiwEAAI0BAACOAQAAkAEAAJEBAACSAQAAkwEAAJQB AACVAQAAlgEAAJcBAACYAQAAmQEAAJoBAACbAQAAnAEAAJ0BAACeAQAAoAEAAKEBAACiAQAAowEA AKQBAACtAgAArgIAAK8CAACwAgAAsQIAALICAACzAgAAtAIAALUCAAC3AgAAuAIAALkCAAC6AgAA uwIAALwCAAC9AgAAvgIAAL8CAADAAgAAwQIAAMICAADDAgAAxAIAAMUCAADHAgAAyAIAAMkCAADK AgAAywIAAMwCAADNAgAAzgIAAM8CAADQAgAA0QIAANICAADTAgAA1AIAANYCAADXAgAA2AIAANkC AADaAgAA2wIAANwCAADdAgAA3wIAAOACAADhAgAA4gIAAOMCAADlAgAA5gIAAOgCAAAABgAAWj4A AMgUAQBIIQEAwikBANguAQCUUAEA5GMBAGxkAQAyZgEAiGcBAKJoAQCEaQEApGoBAFZrAQAGbAEA CGwBAPBsAQCYbQEAgm4BAP5uAQDEbwEAInABAMhwAQDucAEAgHEBAEByAQACdAEA9nQBAK51AQAk dgEAnHYBANR2AQC0dwEAkngBAFx5AQDweQEA5noBAJx7AQA2fAEA0nwBAPJ8AQB8fQEAlH8BAGSK AQBamwEAIrMBABi0AQBAtQEAtu4BAH6oAwAWNgQAXq0EABgkBQBoUQUAelgFADZZBQANAQAAGgEA AC8BAAA2AQAAOgEAADwBAABFAQAASgEAAEsBAABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABUAQAA VQEAAFYBAABXAQAAWAEAAFkBAABaAQAAWwEAAFwBAABdAQAAXgEAAGABAABhAQAAYgEAAGMBAABk AQAAZQEAAGYBAABnAQAAaQEAAGoBAABrAQAAbAEAAG4BAABvAQAAcAEAAHEBAAByAQAAdAEAAHsB AACFAQAAigEAAIwBAACPAQAAnwEAALYCAADGAgAA1QIAAN4CAADkAgAA5wIAAAAGAAA2WQUADgEA AD4BAABpAQAAhQEAAF4PAgATWBT/FYD//wQAAAAJAE8ATABFAF8ATABJAE4ASwAxAAkATwBMAEUA XwBMAEkATgBLADIACQBPAEwARQBfAEwASQBOAEsAMwAJAE8ATABFAF8ATABJAE4ASwA0ABpQAQAa UAEAbW0BAG1tAQBgDwIAAAAAAAEAAAACAAAAAwAAABtQAQAbUAEAbm0BAG5tAQBgDwIA//8MAAAA BgB8ZW8AEAABAJRJOAAGAH1lbwARAAEAVEc4AAYAfmVvABEAAQBUSDgABgB/ZW8AEAABANRIOAAG AIBlbwARAAEAlEc4AAYAgWVvABAAAQAUPzgABgCCZW8AEQABAJRIOAAGAINlbwAQAAEA1D44AAYA hGVvABEAAQAUSDgABgCFZW8AEAABANRJOAAGAIZlbwARAAEA1EY4AAYAh2VvABAAAQBUSTgAfIoA AHyKAACUigAAlIoAAFaMAABWjAAAFI4AABSOAAB9jwAAfY8AAMigAADUoAAAYA8CAAAAAAACAAEA AAACAAIAAAACAAMAAAACAAQAAAACAAUAAAACAAYAAAACAAcAAAACAAgAAAACAAkAAAACAAoAAAAB AAsAAAABAH+KAAB/igAAl4oAAJeKAABYjAAAWIwAABeOAAAXjgAAgI8AAICPAADKoAAA2KAAAGAP AgAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAADAAAAOAAA AAgAAAAqgHVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOnNtYXJ0dGFncwSAQ2l0eQCA OQAAAAwAAAAqgHVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOnNtYXJ0dGFncwWAcGxh Y2UAgDkAAAALAAAAKoB1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpzbWFydHRhZ3MF gFN0YXRlAIAMAAABKBNfAwAAAAAMAAAAAAALAAAAAAALAAAAAAAMAAAAAAAIAAAAAAAMAAAAAAAL AAAAAAAMAAAAAAALAAAAAAAMAAAAAAAIAAAAAAAMAAAAAAAAAAAA2QAAAOkAAAA2AQAAOAEAAO4I AAD1CAAADQkAABQJAACJCQAAkgkAAPkKAAD+CgAARQwAAE8MAAAaDgAAIQ4AAJ0PAAClDwAA7hAA APgQAAClEgAAsBIAAFMWAABbFgAAFxkAABkZAAC6GQAAvBkAACgaAAA4GgAAdhsAAHgbAABcHQAA ZB0AAI8gAACVIAAAxCEAAMohAADpKQAA8CkAAD4tAABRLQAAYDcAAG03AABWSQAAXUkAAINJAACO SQAASkoAAFFKAADXWwAA4VsAABhvAAAibwAAJG8AAC9vAADabwAA328AAMpwAADUcAAAZHIAAGpy AAA3dQAAQ3UAAD57AABIewAAaX0AAHB9AADEhQAA0IUAAGyGAABvhgAAoZcAAKWXAAD1lwAA+JcA ACOZAAAmmQAAXp4AAGGeAABrngAAfJ4AAPSfAAAFoAAAKKAAACugAABRoAAAVqAAAPWgAAD9oAAA b6IAAICiAAA0pAAAN6QAAG+kAAB1pAAA2KQAAOGkAAAhpQAAJqUAAGulAAB0pQAA66UAAO+lAADy pQAA+qUAAFamAABhpgAAgKYAAISmAACzpgAAv6YAAGCnAABxpwAAsqcAAMOnAAB3qQAAfakAAEqq AABPqgAA9KoAAAWrAAAhqwAAK6sAAE2rAABQqwAAcqwAAIOsAADFrQAAzq0AAM+tAADarQAA260A AOOtAAA2rgAAPK4AAGOuAABprgAA8q4AAPyuAAD9rgAACK8AAJivAACirwAA268AAOGvAADjrwAA 668AAHKwAAB2sAAAIrEAACSxAAAbsgAAHbIAADWyAABCsgAAK7QAADG0AAB3tAAAfbQAANy0AADl tAAAQ7UAAEm1AAA1tgAAPLYAAEK2AABGtgAApLYAAKm2AACrtgAAs7YAAGq3AABwtwAA57cAAPK3 AADPuAAA1rgAABu6AAAjugAAeboAAHu6AACJvAAAlbwAACm+AAA0vgAAPr4AAEe+AAB+vgAAg74A AK++AAC2vgAAwL4AAM++AADQvgAA174AAOG+AADsvgAA7b4AAPy+AAAVvwAAG78AACm/AAAxvwAA Mr8AADa/AABVvwAAYL8AAHi/AACBvwAAgr8AAIi/AACOvwAAmr8AALi/AAC/vwAAxr8AANG/AADT vwAA3r8AAN+/AADqvwAAEMAAABvAAAAowAAALsAAAEjAAABOwAAAZcAAAHHAAABywAAAfcAAAKnA AAC1wAAAxcAAAMrAAADwwAAA9sAAABjBAAAewQAAOMEAAEHBAABLwQAAVsEAAFfBAABdwQAAh8EA AJTBAACVwQAAoMEAAKHBAACnwQAA2cEAAOTBAADlwQAA8cEAAPLBAAABwgAADsIAABPCAAAqwgAA NsIAADfCAABCwgAASMIAAE7CAABgwgAAacIAAG/CAAB3wgAAfsIAAInCAACKwgAAk8IAAJTCAACf wgAAzsIAANTCAAD0wgAAAMMAAAHDAAANwwAADsMAABnDAAAhwwAAKcMAACrDAAA2wwAAN8MAAEHD AABCwwAATcMAAE7DAABZwwAAmMMAAKDDAAChwwAAp8MAAKjDAACzwwAA0sMAAN7DAAD5wwAA/cMA ABrEAAAjxAAAQsQAAE3EAABWxAAAXMQAAGjEAAB1xAAAdsQAAHzEAACYxAAAosQAAKPEAACpxAAA qsQAALXEAADAxAAAxsQAANbEAADbxAAA5MQAAPLEAAD1xAAA/8QAACrFAAAwxQAAOsUAAEDFAABN xQAAUsUAAFPFAABexQAAX8UAAGTFAABlxQAAa8UAAGzFAABwxQAAiMUAAInFAACLxQAAOsYAAETG AABYyAAAacgAAP7IAAAIyQAALckAADXJAACMzAAAmMwAAI7PAACfzwAAFdIAABvSAADK0wAA2tMA AI7VAACQ1QAAndUAAKDVAABA1gAAQdYAAEXWAABH1gAAUNYAAFHWAABY1gAAWtYAAGHWAABj1gAA a9YAAG3WAAB31gAAeNYAAHrWAAB91gAAf9YAAIHWAACJ1gAAitYAAJDWAACS1gAAltYAAJfWAACY 1gAAmtYAAKDWAACi1gAAsdYAALLWAAC01gAAudYAAL7WAADE1gAAGtcAAC7XAAAr2AAAMtgAADXY AAA+2AAAedgAAH7YAACA2AAAgtgAAIvYAACb2AAAoNgAALHYAAB43gAAgd4AAMLhAADS4QAAc+MA AHnjAAB+4wAAgOMAADHlAAAy5QAAV+UAAGPlAACj5QAArOUAAMrlAADT5QAA1OUAANnlAAD25QAA /eUAABHoAAAd6AAAWOkAAGXpAABn6gAAcuoAAMnqAADQ6gAA/+0AAAPuAABk8wAAZfMAAGfzAABD 9gAATPYAAOn6AAD7+gAA/PoAAAH7AAAs+wAANfsAAGn7AAB7+wAAlvwAAKL8AACv/QAAuP0AAGIE AQBtBAEAxgoBANUKAQCTCwEAlAsBAJYLAQDBCwEAzwsBABQMAQAeDAEAyQ8BANQPAQAXEQEAHBEB AH4RAQCMEQEAGBoBACQaAQA2GgEAOxoBAKAcAQCnHAEApx0BALgdAQAUIQEAFSEBABchAQAHJgEA FSYBAFUpAQBWKQEAaS0BAHotAQDfLQEA4y0BAPktAQACLgEA9jYBAAA3AQD0NwEAATgBACE6AQAu OgEAxUIBANRCAQANRAEAHEQBAKNEAQCyRAEASkYBAFVGAQBfTgEAa04BAAhPAQASTwEAzFQBANFU AQBYVgEAZlYBAANkAQAGZAEACGQBAAtkAQANZAEAEWQBABNkAQAbZAEAgmgBAItoAQCibAEAqmwB AG5tAQB5bQEAJXQBACt0AQCeeQEAoXkBAIZ6AQCQegEAknoBAJp6AQCcegEAonoBABp9AQAdfQEA IH0BACR9AQDLgAEAzoABAOSCAQDvggEAR4MBAFKDAQCkgwEAtYMBACSGAQAxhgEAK4gBADSIAQCj jAEAs4wBADSUAQA8lAEA4pQBAOqUAQD2pAEABqUBAN2mAQDkpgEAQa0BAEmtAQCsuAEAuLgBAKO6 AQCxugEATbsBAFW7AQCVyAEAoMgBAOrJAQD5yQEAycwBANTMAQAYzgEAI84BAI/PAQCUzwEAC9kB ABDZAQC52QEAwtkBAN31AQDs9QEAm/8BAKv/AQA/AQIASgECADADAgA+AwIAYA8CAAcAHAAHABwA BwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAH ABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAH ABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAH ABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAGwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAH ABwABwAcAAcAHAAHABwABwAcAAcAHAAHABsAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAHAAHABsAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABsAHAAH ABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAAAAA ABQAAAAZAAAA3AAAAN4AAAC7AgAAvQIAAMUKAABpDAAAAw4AAAUOAADhDwAA4w8AADYRAAA4EQAA WREAAFsRAAC5EQAAuxEAADESAADDEwAASRYAAEsWAAD7FgAAPRgAANYYAAC/GQAAKxoAAC0aAADQ GgAA1hoAAHYbAAB4GwAAJhwAACgcAAAIHQAACh0AAJYdAACYHQAA6B4AAOoeAABgHwAAYh8AANUg AADXIAAAXCIAAF4iAAA7IwAAPSMAAMsjAADNIwAAiCQAAIokAACtJQAAryUAAN8mAADhJgAAgywA AIUsAACqLQAArC0AAOsuAADtLgAAcy8AAHUvAAAlMQAALjEAAKoyAACsMgAAGjMAABwzAAASNAAA FDQAAHc0AAB5NAAAbDcAAG43AABQOAAAUjgAALo5AAC8OQAAvTkAAL85AADBOwAAxDsAALQ8AAC7 PAAA+z0AAP09AACuPgAAsD4AAOQ/AADmPwAAGUIAABtCAABQQwAAUkMAAEREAABGRAAA6EQAAO9E AAAJRgAALkYAACVHAAAnRwAAQUgAAPRIAAD1SAAAAEoAAEhKAABKSgAAlUsAABRNAAAiTQAAKk0A AONQAADlUAAAx1MAALxVAACJWQAAi1kAAM5bAADWWwAAd1wAAH9cAAASXQAAFl0AAI1gAAC4YAAA E2IAAB5iAABwYwAAcmMAAMBmAADCZgAA32gAAOFoAADgaQAA4mkAABBrAAASawAAH2wAALJsAAAW bwAAGG8AAKNwAAClcAAAJ3EAADhxAAAYcgAAGnIAAAB1AAACdQAAvHUAAMF1AACedgAAoHYAAOd4 AADpeAAAJ3oAACl6AABtewAAdXsAAFV8AABXfAAAR30AAEl9AACjfQAApX0AAJN/AACVfwAA1IEA ANaBAAAVhAAAF4QAAJOFAACVhQAAboYAAG+GAAAyhwAANIcAAJCIAACSiAAAzIgAAM6IAAAaiQAA HIkAAEOJAABIiQAAgYkAAIiJAAAEkQAABpEAACaRAAAokQAAQpEAAESRAABakQAAXJEAAIaRAACI kQAAkJEAAJKRAAC9kQAAv5EAAOaRAADnkQAA75EAAPGRAAANkgAAD5IAAEqSAABMkgAAg5IAAIWS AADCkgAAxJIAANmSAADbkgAA9JIAAPaSAAAfkwAAIZMAACeTAAApkwAANpMAADiTAABckwAAXpMA AG6TAABwkwAA3pMAAOCTAABtlAAAeZQAAFOVAABglQAAy5UAAM2VAABClgAAsZYAAL2WAAC/lgAA GJcAABqXAABvlwAAeJcAAMmYAADQmAAAhZkAAIeZAADLnAAAzZwAAF6eAAB8ngAAp54AAKieAACp ngAArp4AAOWfAADnnwAAGKAAABqgAAB5oAAAfKAAAMigAADLoAAA7aEAAO+hAAAqowAAK6MAAK6j AAC0owAA8qMAAPijAABMpAAATqQAAHmkAAB7pAAAmqQAAJykAADSpAAA1KQAAKulAACupQAACqYA AAymAAA+pgAAQKYAAI+nAACRpwAAXagAAF+oAABJqQAAU6kAAJapAAAFqwAAT6sAAFCrAAAgrAAA IqwAAPqsAAD8rAAAwa0AAMStAADFrQAAzq0AAM+tAADarQAA260AAOOtAADwrQAA8a0AAD+uAABB rgAAx7EAANOxAADrsgAA7LIAAL2zAADJswAAYbQAAGO0AAAbtQAAHrUAABm2AAAbtgAA7bYAAPW2 AAA7uAAAR7gAABO5AAAVuQAAeLsAAHu7AADKuwAAzbsAAAa8AAAJvAAAz7wAANK8AAArvQAALr0A AHG9AAB0vQAA870AAPS9AAAHvgAACb4AACa+AAAovgAAO74AAD2+AABYvgAAWr4AAHC+AAByvgAA jr4AAJC+AACjvgAApb4AAL2+AAC/vgAA3r4AAOC+AAD+vgAAAL8AACa/AAAovwAAQL8AAEK/AACL vwAAjb8AALW/AAC3vwAAAcAAAAPAAABFwAAAR8AAAFHAAABTwAAApsAAAKjAAAAdwQAAH8EAADXB AAA3wQAApsEAAKjBAAAAwgAAAsIAABPCAAAVwgAAJ8IAACnCAAB7wgAAfcIAAMvCAADNwgAA4cIA AOPCAAAewwAAIMMAALLDAAC0wwAAxsMAAMjDAAAXxAAAGcQAAD/EAABBxAAAU8QAAFXEAACRxAAA l8QAAM3EAADPxAAAIcUAACPFAACKxQAAi8UAAH/GAACBxgAArsYAALDGAABExwAARscAAI/IAACR yAAAP88AAEHPAAB00gAAdtIAALvVAAC81QAAvdUAAL7VAADL1QAAzNUAAPHVAADy1QAAFdYAABrW AAAu1gAAL9YAADbWAAA31gAAf9YAAIbWAAB91wAAf9cAAOHXAADj1wAAStgAAEzYAADv2AAA8dgA AFbZAABY2QAAsNkAALLZAAA82wAAPtsAAFzbAABf2wAAc9sAAHbbAACJ2wAAi9sAALXbAAAR3AAA dt4AAHjeAADq4AAAreEAACfiAAAp4gAAGOMAABnjAACJ4wAAi+MAANDjAADS4wAAbuQAAHDkAADj 5AAA5eQAAC/lAAAx5QAAuOUAALrlAAD85QAA/uUAALDnAACy5wAAN+gAADnoAACX6wAAMOwAAGns AABr7AAAC+8AAA3vAAAK8QAAFPEAAB7xAAC48gAAY/MAAIPzAAD89AAA/vQAAKn1AACr9QAAZPcA AGz3AADr+AAA7fgAAFz6AABe+gAAxPoAAMn6AAAL/AAADfwAALr9AADD/QAAjP4AAI7+AACs/wAA rv8AAC4BAQCLAQEAjwMBAJEDAQCSAwEAlAMBAL4DAQDAAwEAwgcBAOEHAQCQCQEAkgkBAJULAQCW CwEADAwBABMMAQDiDAEA5AwBADMNAQCxDQEAWA4BAFoOAQBPEAEAfRABAHIRAQB0EQEAzBMBAM4T AQDQFQEA0hUBAJsWAQCdFgEAQBkBAEIZAQDoGgEA6hoBAGocAQBsHAEAFiEBABchAQAAIgEAAiIB AJMjAQCVIwEAMSQBADMkAQCFJQEAhyUBAPsnAQAKKAEAUikBAI8pAQDiLQEA5C0BAHAwAQBxMAEA GTEBABsxAQCuMQEAsDEBAF03AQBfNwEA6jgBAOw4AQB/OwEAgTsBAP5FAQAERgEAYEgBAGdIAQAb SgEAHUoBAMJLAQDESwEA4EsBAOtLAQCLTAEAokwBAMtNAQCATgEAp04BAKlOAQCCTwEAhE8BAO1S AQD1UgEAaFQBAGpUAQA+VQEA5lYBAO9ZAQDxWQEAs1oBALVaAQDZXQEA210BAAlfAQALXwEAUF8B AMtgAQDnZAEA7GQBAAJlAQADZQEA5W0BAPBtAQDZcAEA23ABABB0AQASdAEAvXQBAN10AQDZdgEA 23YBAIN6AQCFegEAI38BACR/AQDpfwEA6n8BAPCBAQDygQEAk4IBAJWCAQBqhAEAbIQBAHeHAQB5 hwEAO4gBADyIAQDyiAEA9IgBACOKAQAligEAp4sBAM6LAQAVjgEAMY4BANePAQDZjwEA7pMBAPGT AQB0lQEAeZUBACOWAQAllgEA65YBAO2WAQAVmAEAF5gBABmZAQC4mQEAxpoBAMiaAQCXmwEAnJsB AEycAQBOnAEAR6IBAEmiAQCmpAEAq6QBAFymAQBepgEAuKgBALqoAQBlqgEAbKoBABytAQAerQEA oq4BAKeuAQCtrwEAUrEBACOzAQAlswEAsbMBAEu1AQBStQEAVLUBAJ+3AQChtwEAQbgBAFq4AQC7 ugEAvboBAPu7AQD9uwEAFL4BABa+AQCuxgEAsMYBAILJAQCEyQEAGssBABzLAQCTzAEAlcwBAPTN AQCDzgEAAtIBAAPSAQD70gEA/NIBAI/UAQC61QEAjtYBAJDWAQD01wEA/tcBAMHZAQDD2QEAdNoB AHbaAQBT3QEAVd0BAE3iAQBP4gEAC+MBAA3jAQBR5AEAU+QBAObmAQDo5gEAa+cBAIToAQCL6AEA jegBAEvqAQBN6gEAwOsBAMLrAQAh7gEAI+4BALjvAQDD7wEA7u8BAPDvAQDl8gEA5/IBAPT3AQD2 9wEAlfsBAJb7AQDa+wEA5vsBAN/8AQDn/AEAyP8BANn/AQBSAAIAyAECAH4CAgCAAgIAEwMCAB0D AgC3BAIAuwQCACMGAgAlBgIAjwYCAMYGAgDeCAIA3wgCAI4KAgCQCgIA6QoCAOsKAgAhCwIAIwsC AFwLAgBeCwIACA8CAC0PAgBgDwIABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAzAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAMwAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAzAAcA MwAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAMwAHADMABwAzAAcAGgAHABoABwAzAAcAMwAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAMwAHADMABwAzAAcAMwAHADMABwAzAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAzAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAMwAHAAAAAAAUAAAAJwAAAEgAAADEGAAA1hgAAMMZ AADFGQAAyRkAAPgZAAChIgAA3iIAANNcAAAOXQAAtl0AAL9dAABJZwAAZGcAAA93AAArdwAAQH4A AG9+AACwrQAA9a0AABevAABTrwAAxK8AANuvAAADsAAAKrAAAFKwAADCsAAA87AAAB6xAAA+sQAA UrEAAKCxAADgsQAABLIAAA+zAABBswAAUrUAAJG1AADDtQAAArYAABy2AABHtgAAtLYAANe2AAD9 twAAHrgAAAu5AAA5uQAATbkAAJi5AAA4uwAAb74AAI2+AACivgAAvL4AAHLFAACHxQAAXdUAAKrW AADj2gAAJtsAAK7hAADa4QAAPRABAEYQAQAKkQEAFpEBALSgAQDsoAEAxwYCANYGAgCKCgIA4AoC AO8KAgCeCwIACA8CAC4PAgBSDwIAXQ8CAGAPAgAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcA BQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAF AAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUA BwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAAAAAAYA8CAAcAGAABGy4AAAAAAAAAAAAAAQIAAgCC VaAKAAAAAAAAAAAAAQIAAgBrWBQOAAAAAAAAAAAAAQIAAgDGJiYQAAAAAAAAAAAAAQIAAgDGC9AV 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 x1PkAGZb5ABNd+QAjnnkAO0D5QCNE+UAIkHlAGMC5gAvD+YAyFLmAFle5gATaeYAlH/mAIog5wDf K+cArT7nAMxZ5wAoZucAWifoAFg+6AA4QegA/k7oAHtV6ACza+gAKB3pAPc16QCKS+kAggPqAB4p 6gARR+oATEjqAM1l6gDnduoA5ATrACps6wC8I+wAmTTsAN9m7AAwduwAcnrsAFR87AC/Be0Arhjt AJQZ7QAZMO0AdkLtALlC7QDNS+0A3nHtAAMc7gAXVu4AaQjvAGQr7wCqL+8AZT7vAMo/7wCoV+8A gHzvAG0H8ABDGfAA4i/wAGZP8AASX/AADwrxAMdF8QCQBfIAmwfyAGsN8gAsEvIAZBryAKJU8gDd DvMAiijzAJ4v8wD1M/MA1lfzAG948wAIe/MA8Aj0AOcW9ACoKvQAZzP0ALtR9ABkVfQAXXr0AIYI 9QBNLfUAHTf1AOIL9gAgDvYAN0f2AJFU9gA3a/YABHv2AKIJ9wDyWfcAy173AI529wAVffcAWgb4 ACsX+ADxNfgAyjD5AFsG+gAzEPoARRj6APUe+gAoPPoABQn7ADQM+wCiD/sATiX7AGQl+wB9O/sA xmf7ALQ4/ADhQ/wAsFX8AH1//ABBIf0AhRT+AOpb/gAtYv4ALnL+AK1z/gAnBP8AhxD/AFEk/wAT Kv8AhzD/AAhI/wAAAAAAsK0AALKtAADFrQAAz60AANutAADkrQAA5a0AAPKtAADzrQAA9a0AADau AABqrgAAsq4AAOSuAAAWrwAAF68AABmvAAAwrwAAQa8AAFOvAACQrwAAw68AAMSvAADGrwAA268A AAOwAAAZsAAAKrAAAFGwAABSsAAAVLAAAG6wAACHsAAAo7AAAMKwAADysAAA87AAAPWwAAAesQAA PrEAAFKxAAB/sQAAn7EAAKCxAACisQAAqrEAAKuxAAC+sQAAxrEAAMexAADgsQAAA7IAAASyAAAG sgAAG7IAACSyAABDsgAAULIAAHiyAAB5sgAAe7IAAJOyAACgsgAAxbIAAMyyAADqsgAA67IAAO2y AAAJswAAD7MAAEGzAABSswAAarMAAGuzAABtswAAerMAAH+zAAChswAArLMAAMqzAADLswAAzbMA AOKzAADmswAA+LMAAAa0AAAOtAAAD7QAABG0AAAktAAAP7QAAEy0AABTtAAAVLQAAGS0AABltAAA Z7QAAHe0AACEtAAAk7QAAKa0AAC9tAAAvrQAAMC0AADctAAA5rQAAPq0AAANtQAAH7UAACC1AAAi tQAAN7UAAFK1AACRtQAAw7UAAAG2AAACtgAABLYAABy2AABHtgAAYbYAAHu2AACItgAAibYAAIu2 AACXtgAAtLYAANe2AADhtgAA9rYAAPe2AAD5tgAADbcAABK3AAAstwAALbcAADe3AABOtwAAT7cA AFG3AABqtwAAhrcAAKq3AADJtwAA17cAANi3AADatwAA87cAAP23AAAeuAAAM7gAAEi4AABJuAAA S7gAAFy4AABjuAAAdrgAAIm4AACuuAAAr7gAALG4AADPuAAA37gAAOu4AAD4uAAACLkAAAm5AAAL uQAAObkAAE25AABzuQAAmLkAAKC5AAChuQAAo7kAAK+5AADOuQAA4rkAAPG5AAAOugAAD7oAABG6 AAAbugAAJLoAACm6AAAqugAARroAAGm6AABqugAAbLoAAHm6AACFugAAmLoAAKK6AAC7ugAAvLoA AL66AADbugAA9LoAAA27AAAluwAAJrsAAF3VAABf1QAAY9UAAGvVAABt1QAAb9UAAHHVAABz1QAA ddUAAHbVAAB41QAAetUAAHzVAAB+1QAAgdUAAIPVAACF1QAAh9UAAIjVAACL1QAAjtUAAJHVAACW 1QAAmtUAAJzVAACi1QAAo9UAAKTVAACm1QAAqNUAAKvVAAC01QAAvdUAAMXVAADN1QAA1dUAANbV AADY1QAA29UAAN3VAADm1QAA8dUAAPrVAAAD1gAADNYAAA3WAAAP1gAAEdYAABPWAAAb1gAAJNYA AC3WAAA11gAAPdYAAD7WAABA1gAAQ9YAAEXWAABO1gAAWNYAAGHWAABr1gAAdNYAAHXWAAB31gAA edYAAH/WAACH1gAAkNYAAJjWAACg1gAAqdYAAKrWAABgDwIAAAAAAAgAAAACAQAAAgEAAAIBAAAC AQAAAgEAAAIBAAACAQAAngEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIB AAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAACAQAAAgEA AAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAA AgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAAC AQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIB AAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEA AAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAA AgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAAC AQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIB AAACAQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEA AAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAA AgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIBAAAC AQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAngEAAAIB AAACAQAAAgEAAAIBAAACAQAAAgEAAJ4BAAACAQAAAgEAAAIBAAACAQAAAgEAAJYBAAAIAAAAAgEA AAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAA AgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAAC AQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIB AACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEA AAIBAAACAQAAAgEAAAIBAACeAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAACWAQAA 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 IFdvcmQAAABAAAAAAJAkbIEDAABAAAAAAPwxTMNo0AFAAAAAAF7jXKGx0AEDAAAAAQAAAAMAAAC2 TgAAAwAAAKjAAQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAAAAAAAAACAAAAAtXN1ZwuGxCTlwgAKyz5 rkQAAAAF1c3VnC4bEJOXCAArLPmuMAEAAOwAAAAMAAAAAQAAAGgAAAAPAAAAcAAAAAUAAAB8AAAA BgAAAIQAAAARAAAAjAAAABcAAACUAAAACwAAAJwAAAAQAAAApAAAABMAAACsAAAAFgAAALQAAAAN AAAAvAAAAAwAAADJAAAAAgAAAOMEAAAeAAAABAAAAAAAAAADAAAAvQMAAAMAAAANAQAAAwAAAFEO AgADAAAA5hULAAsAAAAAAAAACwAAAAAAAAALAAAAAAAAAAsAAAAAAAAAHhAAAAEAAAABAAAAAAwQ AAACAAAAHgAAAAkAAADN4Ofi4O3o5QADAAAAAQAAAAAAuAAAAAMAAAAAAAAAIAAAAAEAAAA4AAAA AgAAAEAAAAABAAAAAgAAAAwAAABfUElEX0hMSU5LUwACAAAA4wQAAEEAAABwAAAABgAAAAMAAABn AGsAAwAAAAAAAAADAAAAAAAAAAMAAAAFAAAAHwAAABwAAABoAHQAdABwAHMAOgAvAC8AdgBrAC4A YwBvAG0ALwBjAGwAdQBiADcANQAwADEANwA1ADkAOAAAAB8AAAABAAAAAAD/DwAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAA AA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAA HAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAq AAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgA AAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAA AEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAA VQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABj AAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEA AAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAA AIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACNAAAA jgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAJsAAACc AAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoA AACrAAAArAAAAK0AAACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAA ALkAAAC6AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAAxAAAAMUAAADGAAAA xwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADPAAAA0AAAANEAAADSAAAA0wAAANQAAADV AAAA1gAAANcAAADYAAAA2QAAANoAAADbAAAA3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMA AADkAAAA5QAAAOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAA APIAAADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAAD/AAAA AAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcBAAAIAQAACQEAAAoBAAALAQAADAEAAA0BAAAO AQAADwEAABABAAARAQAAEgEAABMBAAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwB AAAdAQAAHgEAAB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAApAQAAKgEA ACsBAAAsAQAALQEAAC4BAAAvAQAAMAEAADEBAAAyAQAAMwEAADQBAAA1AQAANgEAADcBAAA4AQAA OQEAADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEAAEABAABBAQAAQgEAAEMBAABEAQAARQEAAEYBAABH AQAASAEAAEkBAABKAQAASwEAAEwBAABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABTAQAAVAEAAFUB AABWAQAAVwEAAFgBAABZAQAAWgEAAFsBAABcAQAAXQEAAF4BAABfAQAAYAEAAGEBAABiAQAAYwEA AGQBAABlAQAAZgEAAGcBAABoAQAAaQEAAGoBAABrAQAAbAEAAG0BAABuAQAAbwEAAHABAABxAQAA cgEAAHMBAAB0AQAAdQEAAHYBAAB3AQAAeAEAAHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACA AQAAgQEAAIIBAACDAQAAhAEAAIUBAACGAQAAhwEAAIgBAACJAQAAigEAAIsBAACMAQAAjQEAAI4B AACPAQAAkAEAAJEBAACSAQAAkwEAAJQBAACVAQAAlgEAAJcBAACYAQAAmQEAAJoBAACbAQAAnAEA AJ0BAACeAQAAnwEAAKABAAChAQAAogEAAKMBAACkAQAApQEAAKYBAACnAQAAqAEAAKkBAACqAQAA qwEAAKwBAACtAQAArgEAAK8BAACwAQAAsQEAALIBAACzAQAAtAEAALUBAAC2AQAAtwEAALgBAAC5 AQAAugEAALsBAAC8AQAAvQEAAL4BAAC/AQAAwAEAAMEBAADCAQAAwwEAAMQBAADFAQAAxgEAAMcB AADIAQAAyQEAAMoBAADLAQAAzAEAAM0BAADOAQAAzwEAANABAADRAQAA0gEAANMBAADUAQAA1QEA ANYBAADXAQAA2AEAANkBAADaAQAA2wEAANwBAADdAQAA3gEAAN8BAADgAQAA4QEAAOIBAADjAQAA 5AEAAOUBAADmAQAA5wEAAOgBAADpAQAA6gEAAOsBAADsAQAA7QEAAO4BAADvAQAA8AEAAPEBAADy AQAA8wEAAPQBAAD1AQAA9gEAAPcBAAD4AQAA+QEAAPoBAAD7AQAA/AEAAP0BAAD+AQAA/wEAAAAC AAABAgAAAgIAAAMCAAAEAgAABQIAAAYCAAAHAgAACAIAAAkCAAAKAgAACwIAAAwCAAANAgAADgIA AA8CAAAQAgAAEQIAABICAAATAgAAFAIAABUCAAAWAgAAFwIAABgCAAAZAgAAGgIAABsCAAAcAgAA HQIAAB4CAAAfAgAAIAIAACECAAAiAgAAIwIAACQCAAAlAgAAJgIAACcCAAAoAgAAKQIAACoCAAAr AgAALAIAAC0CAAAuAgAALwIAADACAAAxAgAAMgIAADMCAAA0AgAANQIAADYCAAA3AgAAOAIAADkC AAA6AgAAOwIAADwCAAA9AgAAPgIAAD8CAABAAgAAQQIAAEICAABDAgAARAIAAEUCAABGAgAARwIA AEgCAABJAgAASgIAAEsCAABMAgAATQIAAE4CAABPAgAAUAIAAFECAABSAgAAUwIAAFQCAABVAgAA VgIAAFcCAABYAgAAWQIAAFoCAABbAgAAXAIAAF0CAABeAgAAXwIAAGACAABhAgAAYgIAAGMCAABk AgAAZQIAAGYCAABnAgAAaAIAAGkCAABqAgAAawIAAGwCAABtAgAAbgIAAG8CAABwAgAAcQIAAHIC AABzAgAAdAIAAHUCAAB2AgAAdwIAAHgCAAB5AgAAegIAAHsCAAB8AgAAfQIAAH4CAAB/AgAAgAIA AIECAACCAgAAgwIAAIQCAACFAgAAhgIAAIcCAACIAgAAiQIAAIoCAACLAgAAjAIAAI0CAACOAgAA jwIAAJACAACRAgAAkgIAAJMCAACUAgAAlQIAAJYCAACXAgAAmAIAAJkCAACaAgAAmwIAAJwCAACd AgAAngIAAJ8CAACgAgAAoQIAAKICAACjAgAApAIAAKUCAACmAgAApwIAAKgCAACpAgAAqgIAAKsC AACsAgAArQIAAK4CAACvAgAAsAIAALECAACyAgAAswIAALQCAAC1AgAAtgIAALcCAAC4AgAAuQIA ALoCAAC7AgAAvAIAAL0CAAC+AgAAvwIAAMACAADBAgAAwgIAAMMCAADEAgAAxQIAAMYCAADHAgAA yAIAAMkCAADKAgAAywIAAMwCAADNAgAAzgIAAM8CAADQAgAA0QIAANICAADTAgAA1AIAANUCAADW AgAA1wIAANgCAADZAgAA2gIAANsCAADcAgAA3QIAAN4CAADfAgAA4AIAAOECAADiAgAA4wIAAOQC AADlAgAA5gIAAOcCAADoAgAA6QIAAP7////rAgAA7AIAAO0CAADuAgAA7wIAAPACAADxAgAA8gIA APMCAAD0AgAA9QIAAPYCAAD3AgAA+AIAAPkCAAD6AgAA+wIAAPwCAAD9AgAA/gIAAP8CAAAAAwAA AQMAAAIDAAADAwAABAMAAAUDAAAGAwAABwMAAAgDAAAJAwAACgMAAAsDAAAMAwAA/v///w4DAAAP AwAAEAMAABEDAAASAwAAEwMAABQDAAAVAwAAFgMAABcDAAAYAwAAGQMAABoDAAAbAwAAHAMAAB0D AAAeAwAAHwMAACADAAAhAwAAIgMAACMDAAAkAwAAJQMAACYDAAAnAwAAKAMAACkDAAAqAwAAKwMA ACwDAAAtAwAALgMAAC8DAAAwAwAAMQMAADIDAAAzAwAANAMAADUDAAA2AwAANwMAADgDAAA5AwAA OgMAADsDAAA8AwAAPQMAAD4DAAA/AwAAQAMAAEEDAABCAwAAQwMAAEQDAABFAwAARgMAAEcDAABI AwAASQMAAEoDAABLAwAATAMAAE0DAABOAwAATwMAAFADAABRAwAAUgMAAFMDAABUAwAAVQMAAFYD AABXAwAAWAMAAFkDAABaAwAAWwMAAFwDAABdAwAAXgMAAF8DAABgAwAAYQMAAGIDAABjAwAAZAMA AGUDAABmAwAAZwMAAGgDAABpAwAAagMAAGsDAABsAwAAbQMAAG4DAABvAwAAcAMAAHEDAAByAwAA cwMAAHQDAAB1AwAAdgMAAHcDAAB4AwAA/v///3oDAAB7AwAAfAMAAH0DAAB+AwAAfwMAAIADAAD+ ////ggMAAIMDAACEAwAAhQMAAIYDAACHAwAAiAMAAP7////9/////f////3////9/////f////3/ ///9/////f///5IDAAD+/////v////7///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////1IA bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAWAAUB//////////8DAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAIB4F3+hsdAB lAMAAIAAAAAAAAAARABhAHQAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAoAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADqAgAAsUUAAAAAAAAxAFQAYQBiAGwAZQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgACAQEAAAAGAAAA/////wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0DAACN1gAAAAAAAFcAbwByAGQARABvAGMAdQBt AGUAbgB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIBAgAAAAUA AAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7SBQAAAAAABQBT AHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACgAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5 AwAAABAAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEA dABpAG8AbgAAAAAAAAAAAAAAOAACAQQAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAIEDAAAAEAAAAAAAAAEAQwBvAG0AcABPAGIAagAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAIA////////////////AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////// //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA /v////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////wEA/v8D CgAA/////wYJAgAAAAAAwAAAAAAAAEYfAAAAxO7q8+zl7fIgTWljcm9zb2Z0IE9mZmljZSBXb3Jk AAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------=_NextPart_000_1FCA_01D0CE5D.9B270350 Content-Type: application/msword; name="=?windows-1251?B?y+Xj4Ovo5+D26P8g7O7t7u/u6+jpLiDD6+7h?= =?windows-1251?B?4Ov87eD/IOHl5+7v4PHt7vHy/C5kb2M=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?y+Xj4Ovo5+D26P8g7O7t7u/u6+jpLiDD6+7h?= =?windows-1251?B?4Ov87eD/IOHl5+7v4PHt7vHy/C5kb2M=?=" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAADAAAAdQEAAAAAAAAA EAAAdwEAAAEAAAD+////AAAAAHIBAABzAQAAdAEAAP////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAcWAZBAAA+BK/AAAAAAAAEAAAAAAABgAAjhECAA4AYmpianFQcVAAAAAAAAAAAAAAAAAAAAAA AAAZBBYALlwCABM6AQATOgEAceIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAABoEAAAAAAAAGgQAABoE AAAAAAAAGgQAAAAAAAAaBAAAAAAAABoEAAAAAAAAGgQAABQAAAAAAAAAAAAAAC4EAAAAAAAA9jAA AAAAAAD2MAAAAAAAAPYwAAAAAAAA9jAAANwBAADSMgAAXAAAAC4EAAAAAAAAmVEAAPIAAAA6MwAA OgAAAHQzAAAAAAAAdDMAAAAAAAB0MwAAAAAAAHQzAAAAAAAAdDMAAPwAAABwNAAAZAAAANQ0AAA0 AAAA3FAAAAIAAADeUAAAAAAAAN5QAAAAAAAA3lAAAAAAAADeUAAAAAAAAN5QAAAAAAAA3lAAACQA AACLUgAAaAIAAPNUAABoAAAAAlEAAFEAAAAAAAAAAAAAAAAAAAAAAAAAGgQAAAAAAAAINQAAAAAA AAAAAAAAAAAAAAAAAAAAAAB0MwAAAAAAAHQzAAAAAAAACDUAAAAAAAAINQAAAAAAAAJRAAAAAAAA AAAAAAAAAAAaBAAAAAAAABoEAAAAAAAAdDMAAAAAAAAAAAAAAAAAAHQzAAAAAAAAU1EAABYAAABc QgAAAAAAAFxCAAAAAAAAXEIAAAAAAAAINQAAKgQAABoEAAAAAAAAdDMAAAAAAAAaBAAAAAAAAHQz AAAAAAAA3FAAAAAAAAAAAAAAAAAAAFxCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAACDUAAAAAAADcUAAAAAAAAAAAAAAAAAAAXEIAAAAAAAAAAAAA AAAAAFxCAAAAAAAAGgQAAAAAAAAaBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXEIAAAAAAAB0MwAAAAAAAC4zAAAMAAAAcFKpkWS3 0AEAAAAAAAAAAPYwAAAAAAAAMjkAACoHAABcQgAAAAAAAAAAAAAAAAAA3FAAAAAAAABpUQAAMAAA AJlRAAAAAAAAXEIAAAAAAABbVQAAAAAAAFxAAAD2AQAAW1UAAAAAAABcQgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAFtVAAAAAAAAAAAAAAAAAAAaBAAAAAAAAFxCAACADgAACDUAAAAAAAAINQAAAAAAAFxC AAAAAAAACDUAAAAAAAAINQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDUA AAAAAAAINQAAAAAAAAg1AAAAAAAAAlEAAAAAAAACUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUkIAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg1AAAA AAAACDUAAAAAAAAINQAAAAAAAJlRAAAAAAAACDUAAAAAAAAINQAAAAAAAAg1AAAAAAAACDUAAAAA AAAAAAAAAAAAAC4EAAAAAAAALgQAAAAAAAAuBAAAhCIAALImAABECgAALgQAAAAAAAAuBAAAAAAA AC4EAAAAAAAAsiYAAAAAAAAuBAAAAAAAAC4EAAAAAAAALgQAAAAAAAAaBAAAAAAAABoEAAAAAAAA GgQAAAAAAAAaBAAAAAAAABoEAAAAAAAAGgQAAAAAAAD/////AAAAAAIADAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsENQQz BDAEOwQ4BDcEMARGBDgETwQgADwEPgQ9BD4EPwQ+BDsEOAQ5BC4AIAATBDsEPgQxBDAEOwRMBD0E MARPBCAAMQQ1BDcEPgQ/BDAEQQQ9BD4EQQRCBEwELgANAA0AMgAwADEANQAgADMEPgQ0BCAAPgRC BCAAIAQ+BDYENAQ1BEEEQgQyBDAEIAAlBEAEOARBBEIEPgQyBDAEDQANAA0ADQAeBDEEQAQwBEkE NQQ9BDgENQQNAA0AFwQ0BEAEMAQyBEEEQgQyBEMEOQRCBDUELAAgAEMEMgQwBDYEMAQ1BDwESwQ5 BCAARwQ4BEIEMARCBDUEOwRMBCEADQAgACAAIAARBDsEMAQzBD4ENAQwBEAEOAQ8BCAANwQwBCAA MgQ9BDgEPAQwBD0EOAQ1BC4AIAASBDAEPAQgAD8EQAQ1BDQEOwQwBDMEMAROBEIEQQRPBCAANwQ9 BDAEPQQ4BE8ELAAgAEEEPgQxBEAEMAQ9BD0ESwQ1BCAAOAQgAD4EMQRABDAEMQQ+BEIEMAQ9BD0E SwQ1BCAAMAQ0BDwEOAQ9BDgEQQRCBEAEMARGBDgENQQ5BCAAMwRABEMEPwQ/BEsEIAAiACAEPgQ0 BC4AIARDBEEETAQuACEEMgQ+BDEEPgQ0BDAELgAiAC4AIAASBEEEUQQgAD4EPwQ4BEEEMAQ9BD4E IAAyBCAAQQRCBDAEQgRMBDUEIAA+BEIEIAA4BEUEIAA4BDwENQQ9BDgELgAgAB8EPgQgADIEPgQ/ BEAEPgRBBDAEPAQgAD4EMQRABDAESQQwBDkEQgQ1BEEETAQgAEcENQRABDUENwQgAD4EMQRJBDUE QQRCBDIEPgQgAHYAawAuAGMAbwBtAC0AIAATACAASABZAFAARQBSAEwASQBOAEsAIAAiAGgAdAB0 AHAAcwA6AC8ALwB2AGsALgBjAG8AbQAvAGMAbAB1AGIANwA1ADAAMQA3ADUAOQA4ACIAIAABABQA aAB0AHQAcABzADoALwAvAHYAawAuAGMAbwBtAC8AYwBsAHUAYgA3ADUAMAAxADcANQA5ADgAFQAu ACAAEQRDBDQENQQ8BCAAQAQwBDQESwQgADoEPgQ9BEEEQgRABEMEOgRCBDgEMgQ9BD4EOQQgADoE QAQ4BEIEOAQ6BDUEIAA4BCAAPwQ+BDYENQQ7BDAEPQQ4BE8EPAQuAA0AIAAbBD4EMwQ4BDoEMAQg AEEEQgQwBEIETAQ4BCAAPwRABDUENAQ/BD4EOwQwBDMEMAQ1BEIEIAA3BD0EMAQ6BD4EPARBBEIE MgQ+BCAAQQQgAD0EMARIBDUEOQQgAD8ENQRABDIEPgQ5BCAAPwRDBDEEOwQ4BDoEMARGBDgENQQ5 BCAAIgASBD4ENwRABD4ENgQ0BDUEPQQ4BDUEIAAgBEMEQQQ4BC4AIAAdBD4EMgQwBE8EIAATBDgE PwQ1BEAEMQQ+BEAENQRPBCIALgAgAB4ENAQ9BDAEOgQ+BCAAMgRBBDUEIAA6BDsETgRHBDUEMgRL BDUEIAA/BD4EOwQ+BDYENQQ9BDgETwQgADgEIAAyBEsEMgQ+BDQESwQgADEEQwQ0BEMEQgQgAD0E NQQ3BDAEMgQ4BEEEOAQ8BEsELAAgAD0ENQQgAEEERwQ4BEIEMARPBCAAQQRCBEAEQwQ6BEIEQwRA BEsEIAAgBD4ENAQwBCAAIARDBD0EIAATBDgEPwQ1BEAEMQQ+BEAENQQ4BCgAIAQgBBMEOwAgADEA QgQwBDEEOwQ4BEYEMAQyACkALAAgADoEPgRCBD4EQARLBDUEIAA1BEEEQgRMBCAAPQQwBEgEIAA0 BDAEQAQgADgEIAA9BDAEQQQ7BDUENAQ4BDUELAAgADoEQAQwBEEEPgRCBDAEIAA4BCAAOgRABDUE QQRCBC4AIAAiBDAEOgQ2BDUEIAA/BEAENQQ0BD8EPgQ7BDAEMwQwBDUEPAQgADQEPgQ6BDAENwQw BD0EPQRLBDwEKAA0BD4EOgQwBDcEMARCBDUEOwRMBEEEQgQyBD4EIAAyBCAAPwQuACAAIgBJAGEA KQAgABcEPQQwBD0EOAQ1BCwAIAA4BEEEQgQ4BD0EMAQgADgEIABEBEAEMAQ6BEIEMAQ7BEsEIgAg AEEEQgQwBEIETAQ4BCAAIgASBD4ENwRABD4ENgQ0BDUEPQQ4BDUEIAAgBEMEQQQ4BC4AIAAdBD4E MgQwBE8EIAATBDgEPwQ1BEAEMQQ+BEAENQRPBCIAKQAgAD0ENQQ+BDEERQQ+BDQEOAQ8BD4EQQRC BEwEIABBBD4ERQRABDAEPQQ1BD0EOARPBCAAPQQwBEgENQQ5BCAARwQ1BDsEPgQyBDUERwQ1BEEE OgQ+BDkEIAA/BEAEOARABD4ENARLBCAAOAQgADcEMARJBDgEQgRLBCAANQRRBCAAPgRCBCAAPAQ+ BD0EPgQ/BD4EOwQ4BDkEIAA0BDsETwQgADIESwQ2BDgEMgQwBD0EOARPBCAAIAQ+BDQEMAQuAA0A IAAUBDAEPQQ9BDAETwQgAEEEQgQwBEIETARPBCAATQRCBD4EIAA/BEAEOAQ3BEsEMgQgADoEIABD BDwEQwQgADgEIABBBD4EMgQ1BEEEQgQ4BCAAQARDBEEEQQQ6BDgERQQgADsETgQ0BDUEOQQuACAA JwQ1BDsEPgQyBDUEOgQgAD8EQAQ+BEEEPQRDBDsEQQRPBCAAOAQgAD8EQAQ+BE8EMgQ7BE8ENQRC BEEETwQgADIEIAA8BDgEQAQ1BCAAMgQgADwEQwRHBDgEQgQ1BDsETAQ9BD4EOQQgADAEMwQ+BD0E OAQ4BCAANgQ4BDIEPgRCBD0EPgQzBD4EIAA9BDAERwQwBDsEMAQuACAAHgQ9BCAAOARJBDUEQgQg AEEEMgQ+BE4EIAA8BDAEQgRMBCwAIAAyBDUEOwQ4BDoEQwROBCAAPAQ4BEQEOARHBDUEQQQ6BEME TgQgAEYEOAQyBDgEOwQ4BDcEMARGBDgETgQgAD8EQAQ+BEgEOwQ+BDMEPgQsACAAOAQgAD0EMARF BD4ENAQ4BEIEIAA1BFEEIAA6BDAEOgQgAEcEMARBBEIETAQgAEEENQQxBE8ELAAgAEEEMgQ+BDUE OQQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQ5BCAAQQRDBEkEPQQ+BEEEQgQ4BC4AIAAaBDAENgQ0 BEsEOQQgADQEPgQ7BDYENQQ9BCAAPwQ+BDwEPgRHBEwEIAA1BDwEQwQgADgEIAA3BDAESQQ4BEIE OARCBEwEIAAyBD4EIABBBDsEMAQyBEMEIAAgBD4ENAQwBCEADQAgABIEPgQ4BD0ESwQgACAEQwRB BDgELAAgAD4EQgQ6BEAEPgQ5BEIENQQgAEgEOARABDUEIAAzBDsEMAQ3BDAEIQAgAB4EMQQ9BDAE NgQ4BEIENQQgADwENQRHBDgEIAA/BEAEPgRCBDgEMgQgAEIEUQQ8BD0EPgQ5BCAAQAQwBEIEOAQh AA0AIAAdBD4EMgQwBE8EIAATBDgEPwQ1BEAEMQQ+BEAENQRPBCwAIAA9BDUEPwQ+BEAEPgRHBD0E MARPBCAAMwQ7BD4EMQQwBDsETAQ9BDAETwQgAEYEOAQyBDgEOwQ4BDcEMARGBDgETwQgADYENARR BEIEIAA9BDAEQQQhAA0AIAAgBDAENARDBDkEQQRPBCAAOAQgAEEEOwQwBDIETARBBE8ELAAgACAE QwRBBEEEOgQwBE8EIAAUBEMESAQwBCEAIQAhAA0ADQAqACAAKgANACoAIAAqACAAKgANABQEPgQz BD4EMgQ+BEAEIAAoAEMEQQQ7BD4EMgQ4BE8EIABABDAEQQQ/BEAEPgRBBEIEQAQwBD0ENQQ9BDgE TwQgADwEMARCBDUEQAQ4BDAEOwQ+BDIEKQA6AA0ADQAeBEAEOAQzBDgEPQQwBDsETAQ9BEsEOQQg AEIENQQ6BEEEQgQgAD4EPwRDBDEEOwQ4BDoEPgQyBDAEPQQgADIEIAAzBEAEQwQ/BD8ENQQgAHYA awAuAGMAbwBtACAAIgAgBD4ENAQuACAEQwRBBEwELgAhBDIEPgQxBD4ENAQwBC4AIgAgADIANQAg ADwEMARPBCAAMgAwADEANQAgADMEPgQ0BDAELgANABIESwQgAD4EMQRPBDcEQwQ1BEIENQRBBEwE IABABDAEQQQ/BEAEPgRBBEIEQAQwBD0ETwRCBEwEIAA0BDAEPQQ9BEsENQQgADwEMARCBDUEQAQ4 BDAEOwRLBCwAIAA9BDUEIAAyBD0EPgRBBE8EIAA9BDgEOgQwBDoEOARFBCAAOAQ3BDwENQQ9BDUE PQQ4BDkEIAA4BDsEOAQgAEEEPgQzBDsEMARBBD4EMgQwBDIEIAA4BEUEIABBBCAAPQQwBDwEOAQu AA0AEAQyBEIEPgRABEEEQgQyBD4EIAA/BEAEOAQ9BDAENAQ7BDUENgQ4BEIEIAA9BDAESAQ1BDkE IAAzBEAEQwQ/BD8ENQQgADgEIAASBEsEIAA+BDEETwQ3BEMENQRCBDUEQQRMBCAAQwQ6BDAENwRL BDIEMARCBEwEIAA9BDAEQQQgADoEMAQ6BCAAMAQyBEIEPgRABDAEIAA/BEAEOAQgAEAEMARBBD8E QAQ+BEEEQgRABDAEPQQ1BD0EOAQ4BCAAQQRCBDAEQgRMBDgEIAA4BDsEOAQgADUEUQQgAE0EOwQ1 BDwENQQ9BEIEPgQyBC4ADQAqACAAKgAgACoAIAAqACAAKgANACoAIAAqACAAKgAgACoAIAAqACAA KgAgACoADQANACAAIAAgABQEMAQyBD0ESwQ8BC0ANAQwBDIEPQQ+BCwAIAAyBCAAQgRABDgENAQ1 BDIETwRCBD4EPAQgAEYEMARABEEEQgQyBDUEIAAyBCAAQgRABDgENAQ1BEEETwRCBD4EPAQgADME PgRBBEMENAQwBEAEQQRCBDIENQQsACAANgQ4BDsEIAA0BDAEIAAxBEsEOwQgADQEMAQgAD0ENQQg AEIEQwQ2BDgEOwQgAD0EMARIBCAAQQQ7BDAEMgQ9BEsEOQQgAB8EQAQ1BDQEPgQ6BCEAIAAUBDAE MgQ9BD4EIAA2BDUEPQQ4BDsEIAAeBD0EIABBBDIEPgQ4BEUEIABCBEAEPgQ4BEUEIABBBEsEPQQ+ BDIENQQ5BCwAIAAwBCwAIAA+BD8EOARBBDAEMgQgADIENQRBBEwEIAA8BDgEQAQgAEAEQwQ9BDAE PAQ4BCAAOAQgAD8EPgQ3BD0EMAQyBCAAQgQwBDkEPQRLBCAAMgRBBDUEOwQ1BD0EPQQ+BDkEIAA0 BDAEIAA+BEIEIAA2BDgENwQ9BDgEIAA4BCAAPwRABDAEMgQ7BDUEPQQ4BE8EIABGBDAEQARBBEIE MgQ+BDwEIABDBEIEPgQ8BDgEMgRIBDgEQQRMBCwAIAAzACAANAQ9BE8EIAA4BCAAMwAgAD0EPgRH BDgEIAA0BEMEPAQwBDsEIAA0BEMEPARDBCAANARDBDwEPQRDBE4ELAAgADQEMAQgADgEIAA+BEIE PwRABDAEMgQ4BDsEQQRPBCwAIAA9BDAEOgQ+BD0ENQRGBCwAIAA3BDAEIAAYBEEEQgQ4BD0EPgQ5 BCAAPAQ+BD0EPgQ/BD4EOwRMBD0EPgQuAC4ALgAuAC4ALgAuACAAIAAgACoAKgAqACAAIAAgACAA IAANACAAFAQ+BDsEMwQ+BCAAOwQ4BCAAOgQ+BEAEPgRCBDoEPgQgADsEOAQgADgEQQQ6BDAEOwQs ACAAPQQwBEgEUQQ7BCAAHgQ9BCAAOARBBEIEOAQ9BEMEIQAgABgEIABCBD4EMwQ0BDAEIAAyBDcE TwQ7BCAAHwRABDUENAQ+BDoEIAA4BEEEQgQ4BD0EQwQsACAAPwQ+BEEEPAQ+BEIEQAQ1BDsEIAA9 BDAEIAA9BDUEUQQgAD4EOgQ+BDwEIABBBDIENQRCBDsESwQ8BCAAOAQgAD8EPgQ9BE8EOwQsACAA RwRCBD4EIAA4BEEEQgQ4BD0EMAQgAEEEOwQ+BDYEPQQwBCAAOAQgAD8EMARABDAENAQ+BDoEQQQw BDsETAQ9BDAELAAgADYENQRBBEIEPgQ6BDAEIAA4BCAAPwQ7BDAERwQ1BDIEPQQwBCAAPgQ9BDAE LAAgADQEMAQgADoEPgQgADIEQQQ1BDwEQwQgADIEIAA9BDUEMgQ1BDQEPgQ8BEsERQQgABQEMAQ7 BE8ERQQsACAAMAQgAD0ENQQgADIEIABABEMEOgQwBEUEIAAVBDMEPgQuACAAHwQ+BD0ETwQ7BCAA HgQ9BCwAIABHBEIEPgQgAD4ESAQ4BDEEOgRDBCAAPQQwBEgEUQQ7BCwAIAAwBCAAPQQ1BCAAGARB BEIEOAQ9BEMEIAA4BCAAPwQ+BDsENQQ3BCAAQgQ+BDMENAQwBCAAHgQ9BCAAPQQwBCAAMwQ+BEAE QwQgABwENQRABEMEIAA4BEEEOgQwBEIETAQgAD8EQwRBBEIETAQgAD0ENQQgABgEQQRCBDgEPQRD BCwAIAAwBCAARQQ+BEIETAQgADEESwQgAD8EQAQ+BEEEQgQ+BCAANwQ9BDAEPQQ4BDUEIAA+BCAA HQQ1BDkELgAgABcEMAQ7BDUENwQgAD0EMAQgAEEEMAQ8BEMETgQgADIENQRABEgEOAQ9BEMELAAg AD0EPgQsACAAPQQ1BCAAOAQ8BDUETwQgABgEQQRCBDgEPQRLBCwAIAA4BEEEOgQwBDsEIABBBDUE MQRPBCAAQQQwBDwEPgQzBD4ELAAgACcENQQ7BD4EMgQ1BDoEMAQuACAAGAQsACAAPQQ1BCAAPQQw BDkENARPBCwAIAA+BEEEOwQwBDEEIAAfBEAENQQ0BD4EOgQsACAAPgQxBDwEMAQ9BEMEOwQgACEE NQQxBE8ELAAgAFMANAQwBDsEQQRPBCAAOAQgAD8EMAQ7BCAANAQwBCAAMgQgAD8EPgQ6BD4ETwQg AD4EMQRKBE8EQgQ4BE8EIAAcBD4EQARPBC0AHgQ6BDgETwQ9BDAEIABBBDgEPQQ1BDMEPgQhACEA IQAhACEAIQAgACAAIAAgACAAIAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAq ACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgANACAAGgQwBDoEIABNBEIEPgQgAD4E MQRLBEcEPQQ+BCAAMQRLBDIEMAQ1BEIEIAAyBCAAPQQwBEgENQQ8BCAARwRDBDQEPQQ+BDwEIAA8 BDgEQAQ1BCgAOAQgADgEPQQ+BDMENAQwBCAAMgQgAEEEOgQwBDcEOgQ1BCkALAAgAD0EMAQgADoE MAQ2BDQEQwROBCAAMgQ1BEAESAQ4BD0EQwQgAD0EMAQ5BDQEUQRCBEEETwQgADUESQQ1BCAAMQQ+ BDsENQQ1BCAAOgRABEMEQgQ+BDkEIAA/BDgEOgQhACAAEAQgAEEEOgQwBDcEOgQwBCAAOwQ+BDYE TAQuACAAIAAgACAAIAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAq ACoAKgAqAA0ADQAgACAAIAAgACAASQAgACAAIAAnBDUEOwQ+BDIENQQ6BC4AIAAcBD4EPQQ+BD8E PgQ7BDgEOAQgADgEIAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBEwELgANAA0AIAAgACAALQRCBDAEIAAz BDsEMAQyBDAELQAgADoEQAQwBEIEOgQ4BDkEIABEBDgEOwQ+BEEEPgREBEEEOgQ4BDkEIAA+BEcE NQRABDoEIAA/BEAEPgQxBDsENQQ8BEsELgAgABUEQQQ7BDgEIAAyBDAEPAQgAD0ENQQgADgEPQRC BDUEQAQ1BEEEPQQwBCAARAQ4BDsEPgRBBD4ERAQ4BE8ELAAgAD8ENQRABDUERQQ+BDQEOARCBDUE IAA6BCAARwRCBDUEPQQ4BE4EIAAzBDsEMAQyBEsEIABJAEkALgANACAAIAAgACEEQAQwBDcEQwQg AD4EQgQ8BDUEQgQ4BDwELAAgAEEEQgRABD4EMwQ+BDMEPgQgAEQEPgRABDwEMAQ7BEwEPQQ+BDME PgQgAD4EQgQyBDUEQgQwBCAAPQQwBCAAMgQ+BD8EQAQ+BEEEIAAiAEcEQgQ+BCAAQgQwBDoEPgQ1 BCAAJwQ1BDsEPgQyBDUEOgQgADgEIABBBCAARwQ1BDwEIAA1BDMEPgQgADUENARPBEIEPwAiACAA NAQwBD0EPgQgADIEIABNBEIEPgQ5BCAAQQRCBDAEQgRMBDUEIAA9BDUEIAAxBEMENAQ1BEIELgAg AB0EPgQgAD4EQgQyBDUEQgQgADUEQQRCBEwELAAgADgEIAAgBEMEQQRMBCAAPwQ+BDsEQwRHBDgE QgQgADUEMwQ+BCAAOgQ+BDMENAQwBCAAQQQ8BD4ENgQ1BEIELgAgACEEMgQ+BDgEPAQ4BCAAQQRC BEAEMAQ0BDAEPQQ4BE8EPAQ4BCwAIAAyBCAAOgQwBDoEPgQ8BC0AQgQ+BCAAQQQ8BEsEQQQ7BDUE LAAgADwESwQgAD8EOwQwBEIEOAQ8BCAANwQwBCAAMwQ+BEAENARLBD0ETgQsACAAQQQ7BDUEPwQ+ BEIEQwQgADgEIAA+BEgEOAQxBDoEOAQgAD0EMARIBDUEMwQ+BCAAHwRABDUENAQ6BDAELAAgAEcE QgQ+BCAAPQQ1BCAAQwQyBDgENAQ1BDsEIAAyBCAAIQQ1BDEENQQgABgEQQRCBDgEPQRLBCAANgQ4 BDIEPgQzBD4EIAAnBDUEOwQ+BDIENQQ6BDAEIAA4BCAAPwQ+BE0EQgQ+BDwEQwQgAE8EMgQ4BDsE IABBBDwENQRABEIETAQgAD0EMAQ8BCAAOAQgAEMEPAQ1BEAEIAAhBDAEPAQuAC4ALgAgACMEIAA9 BDAEQQQgADYENQQgAD0ENQRCBCAAPwRABDAEMgQwBCAAQgQwBDoEIAA+BEgEOAQxBDAEQgRMBEEE TwQhAA0AIAAiABgEQQRCBDgEPQQwBCAANARABDUEMgQ9BD4EQQRCBDgEIgAsACAAIAQ+BDQEIAAg BEMEPQQoACAEIAQTBCkALAAgADIEIABABEMEOgQwBEUEIAAwBDQENQQ/BEIEPgQyBCAAQQQ8BDUE QARCBDgEIAA/BEAENQQyBEAEMARCBDgEOwQwBEEETAQgADIEIAA+BEAEQwQ2BDgENQQgADwEMARB BEEEPgQyBD4EMwQ+BCAAQwQ9BDgERwRCBD4ENgQ1BD0EOARPBC4AIAAhBEIEMARABDAETwQgADME OAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BDAETwQgAEQEOAQ7BD4EQQQ+BEQEOARPBCAANAQwBDsEMAQg AD8EPgRBBDsENQQgAD8EPgRCBD4EPwQwBCAAPwQ+BDsEPQRDBE4EIABBBDIEPgQxBD4ENARDBCAA MgQ4BEIEOARPBCAAPQQwBEgENQQzBD4EIAAgBDAENwQwBCgAQAQwBDcEQwQ8BDAELAAgADQEQwRF BD4EMgQ9BD4EMwQ+BCAAPQQwBEcEMAQ7BDAELAAgACIAIAQwBDcENAQ1BDsEUQQ9BD0EPgQ5BCAA GAQ3BD0EEARHBDAEOwRMBD0EPgQ5BCAAFwQ1BDwEOwQ4BCIALAAgADEEOAQxBDsENQQ5BEEEOgQ+ BDMEPgQgABAENAQwBDwEMAQpAC0AIAA7BE4ENARBBDoEOAQ8BCAANwQwBDEEOwRDBDYENAQ1BD0E OARPBDwELAAgADYENQRBBEIEPgQ6BD4EQQRCBDgEIAA4BCAAPgRCBDoEQARLBEIEPgQ5BCAAMgQ+ BDkEPQQ1BCAAPwRABD4EQgQ4BDIEIABBBDIEPgQ1BDkEIAA/BEAEOARABD4ENARLBCAAOAQgAEEE MgQ+BDUEOQQgAEYEOAQyBDgEOwQ4BDcEMARGBDgEOAQsACAAPwRABD4EQgQ4BDIEIABBBDAEPAQ4 BEUEIABBBDUEMQRPBCwAIAA8BEMERwQ4BEIENQQ7BEwEPQQ+BDwEQwQgADIEQAQwBEkENQQ9BDgE TgQgADIEIAA/BD4EQAQ+BEcEPQQ+BDwEIAA6BEAEQwQzBEMEIAA9BDUENwQ9BDAEPQQ4BE8ELgAg ABIEIAAfBB4EIAQeBCcEHQQeBBkEIAA4BDQENQQ1BCAAMQQ1BEEEOgQ+BD0ENQRHBD0EPgQzBD4E IAAxBDUEQQRBBDwESwRBBDsENQQ9BD0EPgQzBD4EIABABDAENwQyBDgEQgQ4BE8EIQAgAB0EPgQg AEQEOAQ7BD4EQQQ+BEQEOARPBCAAHwRABDUENAQ6BDAEIAA4BEEERwQ1BEAEPwQwBDsEMAQgAEEE MgQ+BDkEIAA/BD4EQgQ1BD0ERgQ4BDAEOwQsACAAOAQgAE0EQgQ+BCAANAQwBDsEPgQsACAAPQQw BDoEPgQ9BDUERgQsACAAJwQ1BDsEPgQyBDUEOgRDBCAAPwRABD4EQgQ4BDIEPgRABDUERwQ4BDIE SwQ5BCAASAQwBD0EQQQgAD4EQgQ6BDAENwQwBEIETARBBE8EIAA+BEIEIAA9BDUEUQQgAEEEPgQy BEEENQQ8BCAAOAQgADIEQQRRBCAANgQ1BCAAPQQwBDkEQgQ4BCAAQQQ1BDEETwQgADIEIAAxBEME NARDBEkENQQ8BCwAIAA/BEAENQQ6BEAEMARCBDgEQgRMBCAAMgQ4BEIETARBBE8EIAA4BCAAPQQw BEcEMARCBEwEIABNBD8EPgRFBEMEIAAxBDsEMAQzBD4EQQRCBD0EPgQzBD4EIABABD4EQQRCBDAE IAA0BD4EIABBBDIEPgQ1BDkEIAA3BDAEMgQ1BEIEPQQ+BDkEIABGBDUEOwQ4BC4ADQAgACAEIAQT BCAAQAQwBEEEPwQ+BDsEMAQzBDAENQRCBCAAQQRCBDgERQQ4BE4EIAAnBCAAQARPBDQEPgQ8BCAA QQQsACAAPgRHBDUEMgQ4BDQEPQQ+BCwAIAAbBCAAOAQgADUESQQ1BCAAQARPBDQEPgQ8BCAAQQRC BDgERQQ4BDkELAAgADIEIABGBDUEOwQ+BDwEIAA0BDAETgRJBDgERQQgAEUEPgRABD4ESAQ1BDUE IAA/BEAENQQ0BEEEQgQwBDIEOwQ1BD0EOAQ1BCAAPgQgACcELAAgAEIEMAQ6BCAAOgQwBDoEIAAy BEEENQQgADQEQARDBDMEIAA0BEAEQwQzBEMEIAA/BD4ENAQ+BDEEPQRLBC4AIAAcIBoEPgQ/BEwE NQQgACAEPgQ0BDAEHSAoABIEJAQbBBwEFgQpACAAPwQ1BEAENQRBBDUEOgQwBDUEQgQgAEEEPgRB BEIEMAQyBD0EQwROBCAAQQRCBDgERQQ4BE4EIAAiAHQEJwQaBB8EIgAuACAAIgQ+BCAANQRBBEIE TAQgACcENQQ7BD4EMgQ1BDoELAAgADoEMAQ6BCAAOAQgABoEIABNBEIEPgQgAD0ENQQ6BDAETwQg ADgEPQREBD4EQAQ8BDAERgQ4BD4EPQQ9BDAETwQgADoEMARCBDUEMwQ+BEAEOARPBCAAMgQ4BDQE OAQ8BD4EMwQ+BCAAPAQ4BEAEMAQsACAARQQwBEAEMAQ6BEIENQRABDgENwRDBE4ESQQwBE8EIAA7 BE4ENAQ1BDkEIAA6BDAEOgQgAD8EPgQ0BD4EMQQ9BEsERQQgABAELAAgADQENQRCBDUEOQQgAD8E NQRABDIEPgQ9BDAERwQwBDsEMAQsACAAOgQ+BEIEPgRABEsENQQgAD8EQAQ4BCAATQRCBD4EPAQg AEEEMgRPBDcESwQyBDAETgRCBCAALwQyBEwEIAA4BCAAHwRABDAEMgRMBCAAOAQ7BDgEIAAiACcE NQRABDUENwQgAHQEMAQyBEwEIAAaBCAAHwRABDAEMgQ4BCIALgAgAB0EQwQsACAAMAQgAEYENQQ7 BEwEIAA4BCAAQQQ8BEsEQQQ7BCAAQARDBDEENQQ2BDAEIAB0BCcEGgQfBC0AIAAiABwEFgQiACAA OAQ7BDgEIABDBDwEPQQ+BDYENQQ9BDgENQQgADYEOAQ3BD0EOAQuACAAHQQwBDIENQRABD0EPgQ1 BCwAIABCBDAEOgQwBE8EIABGBDUEOwRMBCAAMQRLBDsEMAQgADEEPgQ7BDUENQQgAEcENQQ8BCAA PgQ/BEAEMAQyBDQEMAQ9BDAELAAgAD8EPgQ6BDAEIAA8BDgEQAQgADEESwQ7BCAAIgAxBDUEQQQ6 BD4EPQQ1BEcEPQRLBDwEIgAgADgEIAA9BDUENwQwBEEENQQ7BFEEPQQ9BEsEPAQuACAAHQQ+BCAA OgQwBDoEIABCBD4EOwRMBDoEPgQgADsETgQ0BDUEOQQgAEEEQgQwBDsEPgQgADwEPQQ+BDMEPgQg ADgEIAAyBEsETwRBBD0EOAQ7BD4EQQRMBCwAIABHBEIEPgQgADwEPQQ+BDYEOARCBEwEIAA0BD4E PwQ+BDsEPQQ4BEIENQQ7BEwEPQRDBE4EIAA2BDgENwQ9BEwELAAgADwEPgQ2BDUEQgQgADEESwRC BEwELAAgAD0ENQQgADIEQQQ1BDMENAQwBCAAQQQwBDwEMARPBCAAQwQ0BDAERwQ9BDAETwQgADgE NAQ1BE8ELAAgADgENAQ1BE8EIABBBDwENQRABEIEOAQoAFIAQQApACAAPwRABD4EPQQ4BDoEOwQw BCAAMgQgAEMEQQQ7BD4EMgQ9BD4EIAAxBDUEQQRBBDwENQRABEIEPQRLBEUEIAAzBDgEPwQ1BEAE MQQ+BEAENQQ1BDIELAAgAD8EPgQxBDUENAQ4BDIEIAAQBCAAQQQ4BDsEPgQ5BCAAPgQxBEEEQgQ+ BE8EQgQ1BDsETARBBEIEMgQsACAAIgBDBEEESwQ/BDgEMgQiACAAHwRABDUENAQ6BDAELgAgAB8E QAQ+BEEEQgQwBE8EIAA4BDQENQRPBCwAIAA6BD4EQgQ+BEAEMARPBCAAPAQ+BDMEOwQwBCAAMQRL BCAAPwQ+BDQEOwQwBEIEMARCBEwEIAAiAEIENQQ+BEAEOAROBCAAHAQ9BD4ENgQ1BD0EOARPBCAA FgQ4BDcEPQQ4BCIALAAgADcEMAQ6BDsETgRHBDAENQRCBEEETwQgADIEIAA3BDAEPAQ1BD0ENQQg AEEEPARLBEEEOwQwBCAAJwQ1BDsEPgQyBDUEOgQwBC4AIAAnBDUEOwQ+BDIENQQ6BCAAQQRCBEAE NQQ8BDgEQgRMBEEETwQgAEEEOgQ+BEAENQQ1BCAAOgQgAEEEMgQ+BDEEPgQ0BDUEIAA4BDsEOAQg ADgEQQRCBDgEPQQ1BCwAIAAwBCAAPQQ1BCAAQwQ8BD0EPgQ2BDUEPQQ4BE4ELgAgABgEOwQ4BCAA PAQ+BDYEPQQ+BCAAPwQ+BDwENQQ9BE8EQgRMBCAAQQQ8BEsEQQQ7BCAAIgA8BD0EPgQ2BDUEPQQ4 BE8EIgAsACAAPQQwBD8EQAQ4BDwENQRABCwAIAA9BDAEIAAiAEEEPwQwBEEENQQ9BDgENQQiACAA OAQ7BDgEIAAiAEEEMgQ+BDEEPgQ0BEMEIgAuACAAEgQgAEAENQQwBDsETAQ9BD4EQQRCBDgELAAg AD4EMQRKBDUENAQ4BD0ETwRPBCAAPAQ1BEIEPgQ0BD4EPAQgAEAEQwRBBDsEMAQgAEMEPAQgADgE IABBBDUEQAQ0BEYENQQsACAAJwQ1BDsEPgQyBDUEOgQgADQEQwRFBD4EPAQgADQEMgQ4BDYENQRC BCAAQQQ1BDEETwQgADoEIAAYBEEEQgQ4BD0ENQQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAA OAQgADgEQQRCBDgEPQQ9BD4EPARDBCAAMgQ4BDQENQQ9BDgETgQgAEEENQQxBE8EIABBBDAEPAQ+ BDMEPgQuACAAEgQgAEIEMAQ6BD4EPAQgAEEEPgRBBEIEPgRPBD0EOAQ4BCAAPgQ9BCAAOAQgAEEE QgQwBD0EPgQyBDgEQgRBBE8EIAAnBDUEOwQ+BDIENQQ6BD4EPAQsACAAQQQyBD4EMQQ+BDQEPQRL BDwEIAA+BEIEIABABDAEMQRBBEIEMgQwBCwAIAA3BD0EMAROBEkEOAQ8BCwAIAA6BEIEPgQgAB4E PQQsACAAHwQ+BDEENQQ0BDgEQgQ1BDsENQQ8BCEADQAgACEEIAA0BEAEQwQzBD4EOQQgAEEEQgQ+ BEAEPgQ9BEsELAAgADoEMAQ6BCAAQQQ7BDUENARDBDUEQgQgADgENwQgAD4EMQRJBDgERQQgAEEE PgQ+BDEEQAQwBDYENQQ9BDgEOQQgADgEIAAyBEsEMgQ+BDQEMAQgAD4EIAA9BDUEPgQxBEUEPgQ0 BDgEPAQ+BEEEQgQ4BCAAQQQ+BEUEQAQwBD0ENQQ9BDgEOAQgADgEQQRCBDgEPQQ9BD4EOQQgAD8E QAQ4BEAEPgQ0BEsELAAgACcENQQ7BD4EMgQ1BDoEIABNBEIEPgQgAEIEPgRCBCwAIAA6BEIEPgQg ADcEMARJBDgESQQwBDUEQgQgAEEENQQxBE8EIAA+BEIEIAAxBD4EOwQ1BDcEPQQ1BDkELQA8BD4E PQQ+BD8EPgQ7BDgEOQQgADoEMAQ6BCAAPgRCBCAARwQwBEEEQgQ4BCAAQQQ1BDEETwQgAEEEMAQ8 BD4EMwQ+BC4AIAAfBD4ETQRCBD4EPARDBCAAPgQ9BCAAPwQ+BDEENQQ0BDgEQgQ1BDsETAQgADgE IABBBDIEPgQ1BDMEPgQgAD0ENQQ3BD0EMAQ9BDgETwQgADgEIABBBDAEPAQ+BDMEPgQgAEEENQQx BE8ELAAgAEEEMgQ+BDUEOQQgAD8EQAQ4BEAEPgQ0BEsELgAgABgEQgQwBDoELAAgACcENQQ7BD4E MgQ1BDoEIABNBEIEPgQgABIEFQQbBBgEGgQYBBkEIAASBB4EGAQdBCAAOAQgAB4EIAQjBBYEGAQV BCwAIAA+BDMEPgQ9BEwELAAgADEEPgRABDUERgQgAEEEPgQgADIEQQQ1BDwEOAQgAEEEOAQ7BDAE PAQ4BCAAEgRBBDUEOwQ1BD0EPQQ+BDkEIAA4BCAAQQQwBDwEOAQ8BCAAQQQ+BDEEPgQ5BCwAIAAy BDUERwQ9BEsEOQQgAB8EPgQxBDUENAQ4BEIENQQ7BEwELAAgADMEOAQ/BDUEQAQxBD4EQAQ1BDkE QQQ6BD4ENQQgADoEPgQ/BEwEUQQgACAEPgQ0BDAELgAgABIEIAA6BDAEOgQ+BDwELQBCBD4EIABB BDwESwRBBDsENQQgAB4EPQQgAD8EQwRCBDUESAQ1BEEEQgQyBDUEPQQ9BDgEOgQsACAAOgQwBDoE IAAzBDgEPwQ1BEAEMQQ+BEAENQQ5BEEEOgQwBE8EIAAbBC0AIABBBEMEPwQ1BEAEPQQwBD8EQAQw BDIEOwQ1BD0EOAQ1BCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQsACAAPAQ9BD4ENgQ1BEEEQgQyBD4E IAAyBEEENQRFBCAAQQRDBDEESgQ1BDoEQgQ+BDIEIAA4BCAAQwQ6BDAENwQwBEIENQQ7BEwEIAA9 BDAEIAAYBCEEIgQYBB0EIwQsACAANQRRBCAAGwQ4BEcEPQRLBDkEIAA0BDUEQgQ1BDoEQgQ+BEAE LgAgAC0EQgQ+BCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgRDBDUEQgQgADwEPQQ+BDYENQRBBEIEMgRD BCAAQQRCBDgERQQ4BDkEIAAgBCAEEwQtACAAdAQnBBoEHwQsACAAFwRTAB0EWgAsACAAKAQpBBEE FAQsACAAIgQmBC4AIAAiBD4EIAA1BEEEQgRMBCAAPwQ+BCAAEwQ4BD8ENQRABDEEPgRABDUENQQs ACAAPwRDBEIETAQgADoEIAAcBBYEIAA+BEIEIAAnBCAAPgQxBE8ENwQwBEIENQQ7BEwEPQQ+BCAA OwQ1BDYEOARCBCAARwQ1BEAENQQ3BCAAUwAsACAAQgQ+BCAANQRBBEIETAQgAEcENQRABDUENwQg AEIEPgQgAEEEMAQ8BD4ENQQgADIEOARCBDgENQQoADgEOwQ4BCAANwQ7BD4EKQAsACAAOgQwBDoE IABHBDUEQAQ1BDcEIABPBDoEPgQxBEsEIAA9BDUEPgQxBEUEPgQ0BDgEPARLBDkEIABNBEIEMAQ/ BC4AIAAdBDUENwQ9BDAEPQQ4BDUEPAQgAD8EQAQ4BEAEPgQ0BEsEIAATBDgEPwQ1BEAEMQQ+BEAE NQRPBCAAPgQxBEAENQQ6BDsEMAQgAEEENQQxBE8EIAA9BDAEIAA/BDAENAQ1BD0EOAQ1BCwAIAA3 BDAEPwRABD4EMwRABDAEPAQ8BDgEQAQ+BDIEMAQyBCAATQRCBD4EQgQgAD8EQAQ+BEYENQRBBEEE IAAyBCAAPgQxBEkENQQ5BCAAOAQ0BDUENQQgAEAEMAQ3BDIEOARCBDgETwQsACAAPwQ+BDQEMARA BDgEMgQgACAEQwQ9BDAEPAQgACAEPgQ0BDAEIABABEMEPQRDBCAAUwAsACAAOgQwBDoEIABBBDgE PAQyBD4EOwQgAEEEMgQ+BDUEMwQ+BCAAOAQ9BEIENQQ7BDsENQQ6BEIEQwQwBDsETAQ9BD4EMwQ+ BCAAPwQ+BEAEMAQ2BDUEPQQ4BE8ELgANACAAIgRDBEIEIAAyBDgENAQ4BDwEIABPBDIEPQQ+BCwA IABHBEIEPgQgAEIEMAQ6BD4ENQQgADMEOAQ/BDUEQAQxBD4EQAQ1BDkEQQQ6BD4ENQQgAEAEMAQ3 BDIEOARCBDgENQQuACAALQRCBD4EIAAyBDgEQgQ4BDUEIAAgBDAENwQwBCAAOAQ7BDgEIABSABAE WgBTACwAIABCBD4EIAA1BEEEQgRMBCAAPwRABD4EQQRCBD4EIAA9BDAEPwRABD4EQQRCBD4EIABA BDAENwRDBDwEIABTACwAIAA4BD0EQgQ1BDsEOwQ1BDoEQgQgAD0EMARIBDUEMwQ+BCAAMgQ9BEME QgRABDUEPQQ9BDUEMwQ+BCAANwQ7BDAELAAgACIAMgRBBEIEQAQ+BDUEPQQ9BD4EMwQ+BCIAIAA/ BD4EQAQ+BEcEPQQ+BDMEPgQgADoEQARDBDMEMAQhACAALQRCBD4EIABCBDAEIABHBDAEQQRCBEwE IAA9BDAESAQ1BDkEIAA/BEAEOARABD4ENARLBCwAIAA6BD4EQgQ+BEAEMARPBCAAQQQ6BDsEPgQ9 BE8ENQRCBCAAPQQwBEEEIAA6BCAAPwQwBDQENQQ9BDgETgQsACAAMAQgAEIEPgRHBD0ENQQ1BCwA IAAyBCAAPQQwBEcEMAQ7BDUEIAA6BCAAQAQwBDcEMgQ4BEIEOAROBCgAQARLBDEEMAQtAEIEPgQg AEEEIAAzBD4EOwQ+BDIESwQgADMEPQQ4BFEEQgQhACkALAAgAD8EPgRCBD4EPAQgADoEIABABDAE NwQ0BDUEOwQ1BD0EOAROBCwAIABABDAENwQ7BD4ENgQ1BD0EOAROBCAAOAQgAEAEMARBBD8EMAQ0 BEMELgAgABgEIAAxBDUENAQwBCAAQgQ1BDwELAAgADoEQgQ+BCAAPQQ1BCAAMgQ9BE8EOwQgAD8E QAQ4BDcESwQyBDAEIAA6BCAAPwQ1BEAENQQ+BEAEOAQ1BD0EQgQwBEYEOAQ4BCAAPQQwBCAAOgQ+ BD0ERgQ1BD8ERgQ4BE4EIAAxBDsEMAQzBD4EQQRCBD0EPgQzBD4EIABABD4EQQRCBDAELAAgAEIE MAQ6BCAAOgQwBDoEIAA0BD4EOwQzBD4EIAA+BD0EOAQgADEEQwQ0BEMEQgQgADUESQQ1BCAAMQQ7 BEMENgQ0BDAEQgRMBCAAOAQgADIEOARCBEwEQQRPBCAAQQQ+BCAAQQQyBD4EOAQ8BDgEIAA3BDAE TwQyBDsENQQ9BDgETwQ8BDgELAAgADIEQAQ+BDQENQQgACIALgAuAC4AIAAxBDsEMAQgADEEOwQw BC4ALgAgAEAEMAQ0BDgEIAA9BDAESAQ1BDMEPgQgADQEQAQwBDMEPgRGBDUEPQQ9BD4EMwQ+BCAA OAQgAD0ENQQ9BDAEMwQ7BE8ENAQ9BD4EMwQ+BCAAQAQwBDcEMgQ4BEIEOARPBCwAIAAyBD4EIAAy BDUEOgQ4BCAAMgQ1BDoEPgQyBCwAIAAwBDwEOAQ9BEwELAAgABEEPgQ2BDUEIABBBD4ERQRABDAE PQQ4BC4ALgAuACIALgAgACAEMAQ3BDIEOARCBDgENQQgADIEIAA3BDQEPgRABD4EMgQ+BDwEIAA+ BDEESQQ1BEEEQgQyBDUEIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAPQQ1BD4EMQRFBD4ENAQ4BDwE SwQ8BCAAQQQ7BDUENARBBEIEMgQ4BDUEPAQgAEAEPgRBBEIEMAQgADgEIAA4BD0EQgQ1BEAENQRB BD4EMgQgACAEPgQ0BDAELAAgAD0EPgQgAD0EOAQ6BDAEOgQgAD0ENQQgAD0EMAQ+BDEEPgRABD4E QgQhACAAIQQgADQEQARDBDMEPgQ5BCAAQQRCBD4EQAQ+BD0ESwQsACAAIAQgBBMEIABNBEIEPgQg AEQEOAQ7BD4EQQQ+BEQEOARPBCAAOAQ7BDsETgQ3BDgEOAQsACAAMAQgAD4EPQQwBCAAQAQwBDcE MgQ1BDgEMgQwBDUEQgRBBE8EIAA4BEEEQgQ4BD0EPQRLBDwEKAAyBCAAQQQ8BEsEQQQ7BDUELAAg AD0ENQQgADgEOwQ7BE4ENwQ+BEAEPQRLBDwEKQAgADQEQwRFBD4EPAQgACcENQQ7BD4EMgQ1BDoE MAQsACAAOAQgAEEEOwQ+BDIEMAQgADIEIAA9BDAESAQ1BDwEIAA8BDgEQAQ1BCAAPgQxBDwEMAQ9 BDAEIABDBDYENQQgADgEPAQ1BE4EQgQgADwEMAQ7BD4EIABBBDwESwRBBDsEMAQgADIEPgQ+BDEE SQQ1BC4ADQAgAB8EPgRABD4EOgQ4BCAAJwQ1BDsEPgQyBDUEOgQwBCAAMgQ1BDQEQwRCBCAANQQz BD4EIAA6BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIAA9BDAEIAA3BD0EMAQ9BDgETwQgADgEIAAyBDsE MARBBEIETAQuACAAEgQgADgEQgQ+BDMENQQsACAAMgQ7BDAEQQRCBEwEIAA4BDwEQwRJBDgENQQg AEMEPAQ9BD4ENgQwBE4EQgQgAEEEMgQ+BDgEIABBBDgEOwRLBCAAPwRABD4EPwQ+BEAERgQ4BD4E PQQwBDsETAQ9BD4EIAA+BDEESgRRBDwEQwQgADIEOwQ4BE8EPQQ4BE8EIAA4BCAAPAQ+BD0EPgQ/ BD4EOwQ4BE8EIAA/BEAEOAQ+BDEEQAQ1BEIEMAQ1BEIEIAA9BDUEPgQxBEAEMARCBDgEPARLBDkE IABFBDAEQAQwBDoEQgQ1BEAELAAgAEEEPgQ3BDQEMAQyBDAETwQgAEEEOARBBEIENQQ8BD0ESwQ5 BCAAPwQ+BEAEPgRHBD0ESwQ5BCAAOgRABEMEMwQgAEEEPgQgADwEPQQ+BDYENQRBBEIEMgQ+BDwE IAA+BEIEQAQwBDYENQQ9BDgEOQQtACAAPAQ1BD0ENQQ1BCAAQQQ1BEAETAQ1BDcEPQRLBEUEIAA3 BDAEMQQ+BDsENQQyBDAEPQQ4BDkELAAgAD0ENQQgADgENwQ7BDUERwQ4BDIEMAQ1BDwESwRFBCAA PgQ0BD0EMAQ6BD4EIAA0BD4EIAA6BD4EPQRGBDAEIAAxBDUENwQgADgENwQxBDAEMgQ7BDUEPQQ4 BE8EIAA+BEIEIAAzBDsEMAQyBD0EPgQ5BCAAMQQ+BDsENQQ3BD0EOAQuACAAHQQ1BEEEPAQ+BEIE QARPBCAAPQQwBCAAOgQ+BD0ERgQ1BD8EQgRDBDAEOwRMBD0EQwROBCAAQQQ7BD4ENgQ9BD4EQQRC BEwELAAgADIEQQRRBCwAIABHBEIEPgQgAD0EQwQ2BD0EPgQgAEEENAQ1BDsEMARCBEwEIAA0BDsE TwQgAD8EPgQxBDUENARLBCAAPQQwBDQEIAAyBEAEMAQzBD4EPAQsACAATQRCBD4EIAA7BDgESAQ4 BEIETAQgADUEMwQ+BCAAOAQgAEEEMAQ8BDgERQQgAEEENQQxBE8EIABNBEIEPgQ5BCAAPAQ+BD0E PgQ/BD4EOwQ4BDgEIAA8BDgEQAQ9BEsEPAQgAD8EQwRCBFEEPAQuACAALQRCBD4EQgQgAD8EQAQ+ BEYENQRBBEEEIAAyBD4ENwQ8BD4ENgQ1BD0EIAAyBCAAPQQwBEgENQQgADIEQAQ1BDwETwQgADME OwQ+BDEEMAQ7BEwEPQRLBEUEIABCBEAEMAQ9BEEERAQ+BEAEPAQwBEYEOAQ5BCAAOAQgAEAEMARB BEIEQwRJBDUEOQQgADQEPgRABD4EMwQ+BDIEOAQ3BD0ESwQgAEEEPgQ6BEAESwRCBDgETwQgADoE PgQ9BEYENQQ/BEIEQwQwBDsETAQ9BEsERQQgADcEPQQwBD0EOAQ5BCAAOAQgADIEOwQwBEEEQgQ4 BC4AIAAtBEIEPgQgADEENQQ3BDAEOwRMBEIENQRABD0EMARCBDgEMgQ9BD4ELAAgAD0EPgQgAD0E NQQyBD4ENwQ8BD4ENgQ9BD4EIABBBD4EIABBBDwENQRABEIENQQ7BEwEPQRLBDwEOAQgADEEPgQ7 BDUENwQ9BE8EPAQ4BCAAPQQwBEgENQQzBD4EIAA+BDEESQQ1BEEEQgQyBDAELAAgAD8EMARABDAE OwQ4BDcEPgQyBDAEMgRIBDgEPAQ4BCAAIARDBEEETAQuACAAJwRCBD4EMQRLBCAAPgQxBDUENwQ+ BD8EMARBBDgEQgRMBCAAQQQ1BDEETwQgADMEOwQ+BDEEMAQ7BEwEPQQ+BCwAIAA8BEsEIAA0BD4E OwQ2BD0ESwQgADIEIAA/BDUEQAQyBEMETgQgAD4ERwQ1BEAENQQ0BEwEIAAyBEsEQAQyBDAEQgRM BEEETwQgADgENwQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ4BEUEIAA+BDEESgRPBEIEOAQ5BCAA MAQ7BDoEPgQzBD4EOwRPBCwAIABBBDUEOgRBBDAELAAgADAEMQQ+BEAEQgQwBCAAOAQgAD0EMARI BDUEOQQgADEENQRBBD8EQAQ+BDEEQwQ0BD0EPgQ5BCAAIgBBBDIEPgQxBD4ENARLBCIAIAAyBDgE QgQ4BE8EIQANAA0ADQANACAAIAAgACAAIABJAEkAIAAgACAAHQQwBEAEOgQ+BEIEOAQ6BDgELgAg ABIESwQ8BDgEQAQwBD0EOAQ1BCAAOAQgADIESwQ8BEsEMgQwBD0EOAQ1BC4ADQANACAAIAAgACEE OARBBEIENQQ8BDAEQgQ4BDcEOARABEMETwQgADEEPgQ7BDUENwQ9BDgEIAA+BDEESQQ1BEEEQgQy BDAEIAA4BCAAMgRLBE8EMgQ7BE8ETwQgAD4EMQRJBDgENQQgADcEMAQ6BD4EPQQ+BDwENQRABD0E PgRBBEIEOAQgADgEIAA7BDUEOgQwBEAEQQRCBDIEMAQsACAAMgQ4BDQEOAQ8BCwAIABHBEIEPgQg AD8EQAQwBDoEQgQ4BEcENQRBBDoEOAQgADsETgQxBD4ENQQgAD4EQARDBDYEOAQ1BCwAIAA4BEEE PwQ+BDsETAQ3BEMENQQ8BD4ENQQgAEcEUQRABD0ESwQ8BDgEIAAzBDsEPgQxBDAEOwQ4BEEEQgQw BDwEOAQgAD8EQAQ+BEIEOAQyBCAAPQQwBEEELAAgADIEIABBBDIEPgQ1BDkEIAA+BEEEPQQ+BDIE NQQgAEEEPgQ0BDUEQAQ2BDgEQgQgAEIEPgRCBCAAOAQ7BDgEIAA4BD0EPgQ5BCAAMgQ4BDQEIAA8 BD4EPQQ+BD8EPgQ7BDgEOAQsACAAMAQgADwEPgQ9BD4EPwQ+BDsEOARPBCAAPwQ+BDQEIAA9BDUE QgRABDAENAQ4BEYEOAQ+BD0EPQRLBDwEIABDBDMEOwQ+BDwEIAA3BEAENQQ9BDgETwQgADIESwRB BDIENQRHBDgEMgQwBDUEQgQgADgEIAA/BEAEPgQxBDsENQQ8BEMEIAA9BDAEQAQ6BD4EQgQ4BDcE MARGBDgEOAQsACAAOgQwBDoEIAA+BEAEMwQwBD0EOARHBDUEQQQ6BDgEIAA4BCAAPQQ1BEAEMAQ3 BEAESwQyBD0EPgQgAEEEMgRPBDcEMAQ9BD0EQwROBCAAQQQgADwEPgQ9BD4EPwQ+BDsEOARPBDwE OAQuACAAHgQ/BEAENQQ0BDUEOwQ4BDwEIAA/BD4ETQRCBD4EPARDBCAANAQ7BE8EIAA0BDAEOwRM BD0ENQQ5BEgENQQzBD4EIAA8BD4EPQQ+BD8EPgQ7BDgETgQgADgEIAA9BDAEQAQ6BD4EQgQ4BDoE IAAyBCAASAQ4BEAEPgQ6BD4EPAQgAEEEPARLBEEEOwQ1BDoADQAqACAAHAQ+BD0EPgQ/BD4EOwQ4 BE8EIABNBEIEPgQgAEIEMAQ6BDAETwQgAD4EQAQzBDAEPQQ4BDcEMARGBDgETwQgAEIEQARDBDQE MAQsACAAPwRABDgEIAA6BD4EQgQ+BEAEPgQ5BCAARgQ1BD0EPQQ+BEEEQgRMBCAAPwRABD4ENARD BDoEQgQwBCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIABDBEEEQgQwBD0EMAQyBDsEOAQyBDAENQRCBEEE TwQgAD0EMAQgAEAESwQ9BDoENQQgADgEOwQ4BCAAPQQwBCAAPwQ+BDsENQQgAEAENQQwBDsEOAQ3 BDAERgQ4BDgEIAA+BDQEPQQ4BDwEIABHBDUEOwQ+BDIENQQ6BD4EPAQgADgEOwQ4BCAAMwRABEME PwQ/BD4EOQQgADsETgQ0BDUEOQQgADgEOwQ4BCAAPgRABDMEMAQ9BDgENwQwBEYEOAQ5BCwAIAA/ BEAEOAQ9BDgEPAQwBE4ESQQ4BEUEIABBBD4EMwQ7BDAEQQQ+BDIEMAQ9BD0EPgQ1BCAAQAQ1BEgE NQQ9BDgENQQuACAAEgQgAEEEPwQ1BDoEQgRABCAAQgQwBDoEOARFBCAAPAQ+BD0EPgQ/BD4EOwQ4 BDkEIAA/BD4EPwQwBDQEMAROBEIEIAA9BDUEIABCBD4EOwRMBDoEPgQgAD4EMQRLBEcEPQRLBDUE IABNBDoEPgQ9BD4EPAQ4BEcENQRBBDoEOAQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIAA4BCAAPgQ7 BDgEMwQ+BD8EPgQ7BDgEOAQsACAAPQQ+BCAAOAQgAD0ENQRNBDoEPgQ9BD4EPAQ4BEcENQRBBDoE OAQ1BCAAQQRDBDEESgQ1BDoEQgRLBCAAOAQgAD4EQAQzBDAEPQQ4BDcEMARGBDgEOAQuAA0AKgAg AB0EMARABDoEPgRCBDgEOgQgAE0EQgQ+BCAAPgQxBEoENQQ6BEIEIAA4BDsEOAQgADAEQQQ/BDUE OgRCBCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQsACAAPgQxBDsEMAQ0BDAETgRJBDgEOQQgADQEMgRD BDwETwQgAEEEMgQ+BDkEQQRCBDIEMAQ8BDgEOgANACAAIAAxAC4AIAASBEAENQQ0BCAANAQ7BE8E IAA3BDQEPgRABD4EMgRMBE8EIAA+BDEESQQ1BEEEQgQyBDAEIAA4BDsEOAQgADgEPQQ0BDgEMgQ4 BDQEMAQoAD4ENAQ9BD4ENwQ9BDAERwQ9BD4EIAAyBEsETwQyBDsENQQ9BD0ESwQ5BCEAKQAuAA0A IAAgADIALgAgABIESwQ3BD4EMgQgADcEMAQyBDgEQQQ4BDwEPgRBBEIEOAQuAA0AIAAfBD4EPQQ4 BDwEMAQ9BDgENQQgAD0EMARABDoEPgRCBDgEOgQwBCAARwQ1BEAENQQ3BCAARARDBD0EOgRGBDgE OAQgAEMEPwRABD4ESQQwBDUEQgQgAEEEQgRABD4EOARCBDUEOwRMBEEEQgQyBD4EIAA7BE4EMQRL BEUEIAA6BD4EPQRGBDUEPwRGBDgEOQQgADIEIAA+BEIEPQQ+BEgENQQ9BDgEOAQgAD0ENQQzBD4E LAAgAD8EPgRCBD4EPARDBCAAOgQwBDoEIABBBEIEMAQ9BD4EMgQ4BEIEQQRPBCAAMgQ+BDcEPAQ+ BDYEPQRLBDwEIAA+BDQEPQQ+BDcEPQQwBEcEPQQ+BCAAPwQ+BD0ETwRCBEwELAAgADoEMAQ6BDgE PAQgAD4EMQRABDAENwQ+BDwEIAA0BD4EOwQ2BD0EMAQgADEESwRCBEwEIAA/BEAEPgQyBDUENAQ1 BD0EMAQgADsENQQzBDAEOwQ4BDcEMARGBDgETwQuACAAGAQgAD0ENQQgAEEEMgQ+BDQEOARCBCAA TQRCBEMEIABABDAEMQQ+BEIEQwQgADoEIAAzBDsEQwQ/BD4EQQRCBE8EPAQgADgEOwQ4BCAAMgRA BDUENAQ+BD0EPgRBBD0EPgQ5BCAAPwRABD4EPwQwBDMEMAQ9BDQENQQsACAAMgRABD4ENAQ1BCAA IgAyBEEEUQQgADIEQAQ1BDQEPQQ+BCwAIAAyBEEEUQQgAD0EMARABDoEPgRCBDgEOgQsACAANARL BEgEMARCBEwEIAAyBEAENQQ0BD0EPgQuAC4ALgAgADgEIAA2BDgEQgRMBCAAQgQ+BDYENQQgADIE QAQ1BDQEPQQ+BCwAIAAyBEEEUQQgAEAEMAQyBD0EPgQgADIEQQQ1BCAAQwQ8BEAEUQQ8BCYgIgAu ACAAIQRCBDAEPQQ+BDIEOARCBEEETwQgAE8EQQQ9BDAEIAA9BDAEQAQ6BD4EQgQ4BEcENQRBBDoE MARPBCAAPwRABDgEQAQ+BDQEMAQgADoEMAQ3BDgEPQQ+BCAAOAQ7BDgEIAA/BD4EQAQ9BD4ELgAN ACAAEgQgAEEEMgRPBDcEOAQgAEEEIABNBEIEOAQ8BCAAPwQ1BEAENQRHBDgEQQQ7BDgEPAQgAD4E QQQ9BD4EMgQ9BEsENQQgAEIEOAQ/BEsEIAA8BD4EPQQ+BD8EPgQ7BDgEOQQgADgEIAA9BDAEQAQ6 BD4EQgQ4BDoEPgQyBCwAIAA/BD4ENAQ7BDUENgQwBEkEOARFBCAAOwQ1BDMEMAQ7BDgENwQwBEYE OAQ4BCAAMgQgADcENAQ+BEAEPgQyBD4EPAQgAD4EMQRJBDUEQQRCBDIENQQgADgEIAA/BEAEOAQ9 BEYEOAQ/BEsEIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BDgELgAgACEEQgRABEMEOgRCBEMEQAQwBCAA PAQ+BD0EPgQ/BD4EOwQ4BDkEOgANAEEALQAgABMEOwQ+BDEEMAQ7BEwEPQRLBDUEIAA8BD4EPQQ+ BD8EPgQ7BDgEOAQ6AA0AIAAwBCkAIAA8BD4EPQQ+BD8EPgQ7BDgETwQgAD0EMAQgADcEPQQwBD0E OARPBCAAOAQgADoEPgQ9BEYENQQ/BEIEQwQwBDsETAQ9BEMETgQgADIEOwQwBEEEQgRMBA0AIAAx BCkAIAA8BD4EPQQ+BD8EPgQ7BDgETwQgAD0EMAQgADgENAQ1BD4EOwQ+BDMEOARHBDUEQQQ6BEME TgQvAEAENQQ7BDgEMwQ4BD4ENwQ9BEMETgQgADIEOwQwBEEEQgRMBCgAPAQwBEEEPgQ9BD4EMgQg ADgEIAA6BDAEMQQxBDAEOwRLBC8AOARDBDQEMAQ4BDcEPAQwBCwAIAA9BDUEQQQ6BD4EOwRMBDoE OARFBCAAQgQwBDkEPQRLBEUEIAA+BEAENAQ1BD0EPgQyBCAAOAQgAD4EQAQzBDAEPQQ4BDcEMARG BDgEOQQpAA0AIAAyBCkAIAA8BD4EPQQ+BD8EPgQ7BDgETwQgAD0EMAQgADIEOwQwBEEEQgRMBCAA PQQwBDQEIABNBDoEPgQ9BD4EPAQ4BDoEPgQ5BCAAOgQ+BD0EMwQ7BD4EPAQ1BEAEMARCBDAEIABC BEAEMAQ9BEEEPQQwBEYEOAQ+BD0EMAQ7BEwEPQRLBEUEIAA6BD4EQAQ/BD4EQAQwBEYEOAQ5BA0A IAAzBCkAIAA8BD4EPQQ+BD8EPgQ7BDgETwQgAD0EMAQgAEUEPgQ3BE8EOQRBBEIEMgQ+BDIEMAQ9 BDgENQQgADgEIABDBD8EQAQwBDIEOwQ1BD0EOAQ1BCAAMwQ7BD4EMQQwBDsETAQ9BEsEPAQ4BCAA PAQwBEIENQRABDgEMAQ7BEwEPQRLBDwEOAQgAEAENQRBBEMEQARBBDAEPAQ4BA0AIAA0BCkAIAA8 BDUENgQ0BEMEPQQwBEAEPgQ0BD0ESwQ1BCAAPgQxBEkENQRBBEIEMgQwBCAAQwQzBD4EOwQ+BDIE PQQ4BDoEPgQyBCgAPQQwBEAEOgQ+BC0AIAA4BCAAQAQwBDEEPgRCBD4EQAQzBD4EMgRGBDUEMgQs ACAAPwQ1BDQEPgREBDgEOwQ+BDIEIAA4BCAAPwRABD4ERwQ4BDUEKQANAEIALQAgABsEPgQ6BDAE OwRMBD0ESwQ1BCAATQQ6BD4EPQQ+BDwEOARHBDUEQQQ6BDgENQQgADwEPgQ9BD4EPwQ+BDsEOAQ4 BDoADQAgADAEKQAgADUEQQRCBDUEQQRCBDIENQQ9BD0ESwQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgE DQAgADEEKQAgADwEPgQ9BD4EPwQ+BDsEOAQ4BCwAIAA/BD4ENAQ7BDUENgQwBEkEOAQ1BCAAPwQ+ BDsEPQQ+BDkEIAA0BDUEPAQ+BD0EPgQ/BD4EOwQ4BDcEMARGBDgEOAQgAEcENQRABDUENwQgADAE PQRCBDgEPAQ+BD0EPgQ/BD4EOwRMBD0ESwQ1BCAAQQQ7BEMENgQxBEsEDQAhBC0AIAAdBDUETQQ6 BD4EPQQ+BDwEOARHBDUEQQQ6BDgENQQgADsEPgQ6BDAEOwRMBD0ESwQ1BCAAPAQ+BD0EPgQ/BD4E OwQ4BDgEOgANACAAMAQpACAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIAA7BDUEMwQwBDsETAQ9BEsERQQg AD0EMARABDoEPgRCBDgEOgQ+BDIEKAAwBDsEOgQ+BDMEPgQ7BEwELAAgAD0EOAQ6BD4EQgQ4BD0E LAAgADoEPgREBDUEOAQ9BCAAOAQgAD8EQAQ+BEcEOAQ1BCkADQAgADAEKQAgADwEPgQ9BD4EPwQ+ BDsEOAQ4BCAAIQQcBBgEDQAgADEEKQAgADwEPgQ9BD4EPwQ+BDsEOAQ4BCAAGwQTBBEEIgQNACAA EAQgAEIENQQ/BDUEQARMBCwAIABBBD4EPgRCBDIENQRCBEEEQgQyBDUEPQQ9BD4ELAAgAD4EPwQ4 BEgENQQ8BCwAIAA6BDAEOgQ4BDUEIAA9BDAEQAQ6BD4EQgQ4BDoEOAQgAEEEPgQ+BEIEMgQ1BEIE QQRCBDIEQwROBEIEIAA0BDAEPQQ9BEsEPAQgADwEPgQ9BD4EPwQ+BDsEOARPBDwELAAgADgEIAA6 BDAEOgQ4BDwEIAA+BDEEQAQwBDcEPgQ8BCAANAQ+BDsENgQ9BDAEIAAxBEsEQgRMBCAAPwRABD4E MgQ1BDQENQQ9BDAEIABNBEQERAQ1BDoEQgQ4BDIEPQQwBE8EIAA7BDUEMwQwBDsEOAQ3BDAERgQ4 BE8EIAA4BCAAOAQ3BDEEMAQyBDsENQQ9BDgENQQgAD4EQgQgAD0EOARFBDoADQAgACAAIABBAC0A IAATBDsEPgQxBDAEOwRMBD0ESwQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgELgAgAC0EQgQ+BCAAPAQ+ BD0EPgQ/BD4EOwQ4BDgEIAAzBDsEPgQxBDAEOwRMBD0EPgQzBD4EIAA/BEAENQRBBEIEQwQ/BD0E PgQzBD4EIABBBD4EPgQxBEkENQRBBEIEMgQwBCwAIAAyBDoEOwROBEcEMAROBEkENQQzBD4EIAAy BCAAQQQ1BDEETwQgAEAEMAQ3BDIEOARCBEMETgQgAEEENQRCBEwEIAA+BEAEMwQwBD0EOAQ3BDAE RgQ4BDkELAAgAD4EMQRKBDUENAQ4BD0EUQQ9BD0ESwRFBCAANARABDUEMgQ9BDgEPAQgADIEOwQw BEEEQgQ9BEsEPAQgADgEIAAzBDsEQwQxBD4EOgQ+BCAANwQwBDoEPgQ9BEEEPwQ4BEAEOARABD4E MgQwBD0EPQRLBDwEIABABD4ENAQ+BDwEIABHBDUEQAQ1BDcEIABCBDAEOgQgAD0EMAQ3BEsEMgQw BDUEPAQ+BDUEIAAiABwEOARABD4EMgQ+BDUEIAAfBEAEMAQyBDgEQgQ1BDsETARBBEIEMgQ+BCIA LAAgADwEPgQ9BD4EPwQ+BDsETAQ9BD4EIABDBD8EQAQwBDIEOwRPBE4ESQQ1BDUEIAAyBEEENQQ8 BCAAPAQ4BEAEPgQ8BCAARwQ1BEAENQQ3BCAAPwQ+BEEEMgRPBEkEUQQ9BD0ESwQ1BCAAMgQgAEIE PgQ5BCAAOAQ7BDgEIAA4BD0EPgQ5BCAAQQRCBDUEPwQ1BD0EOAQgAD4EQAQzBDAEPQQ4BDcEMARG BDgEOAQgADoEQARDBD8EPQQ1BDkESAQ4BEUEIAA6BDsEMAQ9BD4EMgQgADgEIAA0BDgEPQQwBEEE QgQ4BDkELAAgAEIEMAQ5BD0ESwRFBCAAOAQgAE8EMgQ9BEsERQQgAEAENQQ7BDgEMwQ4BD4ENwQ9 BEsERQQgAD4EMQRJBDUEQQRCBDIELAAgAEIEMAQ6BDgERQQgADoEMAQ6BCAAQQQwBEIEMAQ9BDgE QQRCBEsELAAgADEEPQQwBDkELQAxBEAEOARCBCwAIAA8BDAEQQQ+BD0ESwQsACAAOAQ7BDsETgQ8 BDgEPQQwBEIESwQsACAAOAQ1BDcEQwQ4BEIESwQsACAAQAQ+BDcENQQ9BDoEQAQ1BDkERgQ1BEAE SwQsACAAOgQwBDEEMQQwBDsEOARBBEIESwQgADgEIAAyBEsEQQRIBDUENQQgADUEMgRABDUEOQRB BDoEPgQ1BCAANARDBEUEPgQyBDUEPQRBBEIEMgQ+BC4AIAAtBEIEOAQgAD4EMQRJBDUEQQRCBDIE MAQgAEEEIABFBD4ENAQ+BDwEIAA4BEEEQgQ+BEAEOAQ4BCAAPAQ1BD0ETwROBEIEIABBBDIEPgQ4 BCAAPQQwBDcEMgQwBD0EOARPBCwAIABBBEIEQARDBDoEQgRDBEAESwQgADgEIAA7BDgENAQ1BEAE PgQyBCwAIAA9BDUEOAQ3BDwENQQ9BD0EPgQgAD0EMARFBD4ENARPBEEETAQgAD8EPgQ0BCAAMgQ7 BDAEQQRCBEwETgQgADUENAQ4BD0EPgQzBD4EIABFBD4ENwRPBDgEPQQwBCAAOAQgADgEQQQ/BD4E OwQ9BE8ETwQgADUEMwQ+BCAAMgQ+BDsETgQtACAAQQRCBEAENQQ8BDsENQQ9BDgENQQgADoEIAAw BDEEQQQ+BDsETgRCBD0EPgQ5BCAAMgQ7BDAEQQRCBDgELgAgAB8EPgQ0BCAAQwQ/BEAEMAQyBDsE NQQ9BDgENQQ8BCAAQQQwBEIEMAQ9BDgEQQRCBD4EMgQgADgEIAA/BEAEPgRHBDUEOQQgAD0ENQRH BDgEQQRCBDgEIAA9BDAERQQ+BDQETwRCBEEETwQgADwENQQ9BDUENQQgADIEOwQwBEEEQgQ9BEsE NQQgADgEIABPBEAEOgQ4BDUEIAA8BDUENgQ0BEMEPQQwBEAEPgQ0BD0ESwQ1BCAAQQRCBEAEQwQ6 BEIEQwRABEsELAAgAEIEMAQ6BDgENQQgADoEMAQ6BCAAPAQ4BEAEPgQyBEsENQQgAEAENQQ7BDgE MwQ4BDgEIAA4BCAARAQ4BD0EMAQ9BEEEPgQyBEsENQQgADUEMgRABDUEOQRBBDoEOAQ1BCAAOgQ7 BDAEPQRLBCwAIABBBEIEQAQwBD0ESwQtADoEPgQ9BEYENQQ9BEIEQAQwBEIEPgRABEsEIAA6BDAE PwQ4BEIEMAQ7BDAEKAAhBCgEEAQgAEEENQQ5BEcEMARBBCwAIAASBDUEOwQ4BDoEPgQxBEAEOARC BDAEPQQ4BE8EIAAyBCAAPwRABD4ESAQ7BD4EPAQgADgEIAAaBDgEQgQwBDkEIAAyBCAAPwQ7BDAE PQQwBEUEKQAsACAAMAQgAEIEMAQ6BDYENQQgAD0ENQQ7BDUEMwQwBDsETAQ9BEsENQQgAD4EQAQz BDAEPQQ4BDcEMARGBDgEOAQsACAAOgQ+BD0EQgRABD4EOwQ4BEAEQwROBEkEOAQ1BCAAPAQ1BDYE NARDBD0EMARABD4ENAQ9BEsENQQgADwEMAREBDgETgQsACAAPQQwBEAEOgQ+BEIEQAQwBEQERAQ4 BDoELAAgAEAEMAQxBD4EQgQ+BEAEMwQ+BDIEOwROBCwAIABCBDUEQARABD4EQAQ4BDcEPAQuACAA GgQwBDoEOAQ1BCAAOAQ3BCAATQRCBDgERQQgAEEEQgRABEMEOgRCBEMEQAQgAE8EMgQ7BE8ETgRC BEEETwQgAD0EMARABDoEPgRCBDgEOgQwBDwEOAQgADIEIABIBDgEQAQ+BDoEPgQ8BCAAQQQ8BEsE QQQ7BDUEIAA4BCAARwRCBD4EIABCBDAEOgQ+BDUEIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE8EIAA0 BDsETwQgAD0EOARFBD8AIAAdBDAEPwRABDgEPAQ1BEAELAAgAEIEMAQ6BD4EMgRLBDwEOAQgAE8E MgQ7BE8ETgRCBEEETwQgAD0ENQQ7BDUEMwQwBDsETAQ9BEsENQQgAD0EMARABDoEPgRCBDgERwQ1 BEEEOgQ4BDUEIAAyBDUESQQ1BEEEQgQyBDAEIAAyBCAAPgQxBD4EQAQ+BEIENQQgADMEOwQ+BDEE MAQ7BEwEPQRLBEUEIAA8BD4EPQQ+BD8EPgQ7BDgEOQQgAD0EMARABDoEPgRCBD4EQAQzBD4EMgRG BDUEMgQ7ACAAQgQ+BEcEPQQ+BCAAQgQwBDoEPgQ5BCAANgQ1BCAAPQQwBEAEOgQ+BEIEOARHBDUE QQQ6BDgEOQQgAE0ERAREBDUEOgRCBCAAPwQ+BCAAQQRDBEIEOAQgAD4EOgQwBDcESwQyBDAENQRC BEEETwQgADgEIAA9BDAEIAA+BDEESQQ1BEEEQgQyBD4ELAAgAD8EPgRCBEAENQQxBDsETwROBEkE NQQ1BCAAQAQwBDEEQQQ6BDgEOQQgAEIEQARDBDQELgAgACAENQQ7BDgEMwQ4BD4ENwQ9BEsENQQg AD4EMQRJBDUEQQRCBDIEMAQgADwEMARBBD4EPQQ+BDIEIAA4BCAAPwRABD4ERwQ4BEUEIAA3BDAE MgQ4BEEETwRCBCAAPgRCBCAAIABBBDoEQARLBEIESwRFBCAANwQ9BDAEPQQ4BDkEIAA0BD4EPwQ+ BEIEPgQ/BD0EPgQ5BCAARgQ4BDIEOAQ7BDgENwQwBEYEOAQ4BCwAIAA4BCAATQRCBDAEIAA3BDAE MgQ4BEEEOAQ8BD4EQQRCBEwEIABABDAEQQRCBFEEQgQgAD8EPgQgADwENQRABDUEIAA6BD4EPQRG BDUEPQRCBEAEMARGBDgEOAQgADIEOwQwBEEEQgQ4BCAAMgQgAEAEQwQ6BDAERQQgADIENQRABEUE QwRIBDoEOAQuACAAHgQxBEkENQRBBEIEMgQwBCwAIAA6BD4EPQRCBEAEPgQ7BDgEQARDBE4ESQQ4 BDUEIABNBDoEPgQ9BD4EPAQ4BDoEQwQsACAAQQQ+BD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BCAA NwQwBDIEOARBBE8EQgQgAD4EQgQgADgENAQ1BD4EOwQ+BDMEOARHBDUEQQQ6BD4EOQQgADIEOwQw BEEEQgQ4BCAAMgRLBEgENQQ+BD8EOARBBDAEPQQ9BEsERQQgAD4EMQRJBDUEQQRCBDIEIAA4BCAA NAQ1BD0ENQQzBCwAIAA6BDAEOgQgAEEEQAQ1BDQEQQRCBDIEIAA+BDEEPAQ1BD0EMAQgADgEIAA6 BD4EPQRCBEAEPgQ7BE8ELgAgABIEQAQ1BDQEIAA7BE4EMQRLBEUEIAA/BD4ENAQ+BDEEPQRLBEUE IAA+BEAEMwQwBD0EOAQ3BDAERgQ4BDkEIAA0BDsETwQgAD4EMQRJBDUEQQRCBDIEMAQgADgEIAA4 BEUEIABBBDAEPAQ4BEUEIAA+BEcENQQyBDgENAQ1BD0ELAAgADIENQQ0BEwEIAAyBCAANAQ+BDsE MwQ+BEEEQAQ+BEcEPQQ+BDkEIAA/BDUEQARBBD8ENQQ6BEIEOAQyBDUEIAA4BEUEIAAyBEEEUQQg AEAEMAQyBD0EPgQgADYENARRBEIEIABDBD0EOARHBEIEPgQ2BDUEPQQ4BDUEIAA4BCAAQwRCBDgE OwQ4BDcEMARGBDgETwQgAEUEPgQ3BE8EOAQ9BD4EPAQgAD8EPgRBBDsENQQgADIESwQ/BD4EOwQ9 BDUEPQQ4BE8EIAA/BD4EQQRCBDAEMgQ7BDUEPQQ9BEsERQQgADcEMAQ0BDAERwQgADgEIAA0BD4E QQRCBDgENgQ1BD0EOARPBCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgRDBE4ESQQ4BEUEIABGBDUEOwQ1 BDkEIAA4BCAARwQ1BDwEIAAxBD4EOwRMBEgENQQgAD4EPQQ4BCAAMgQ/BDAENAQwBE4EQgQgADIE IAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBEwELAAgAEIENQQ8BCAAPQQ1BD4EMQRABDAEQgQ4BDwENQQ5 BCAAPwRABD4ERgQ1BEEEQQQgADgEIABCBDUEPAQgADIESwRIBDUEIAAyBDUEQAQ+BE8EQgQ9BD4E QQRCBEwEIABBBDwENQRABEIEOAQgADgEIAAyBEAENQQ0BC4AIAAYBEIEMAQ6BCwAIAA+BDEENQQg AEQEQwQ9BDoERgQ4BDgEIAA9BDAEIAA7BDgERgQ+BC0AIAAyBEAENQQ0BD4EPQQ+BEEEPQQ+BEEE QgRMBCAAOAQgADcEMAQyBDgEQQQ4BDwEPgRBBEIETAQgAD4EQgQgADUENAQ4BD0EPgQzBD4EIABF BD4ENwRPBDgEPQQwBC4AIAAaBDAEOgQ+BDwEQwQgADYENQQgAD0EMARABDoEPgRCBDgEOgRDBCAA QQQ+BD4EQgQyBDUEQgRBBEIEMgRDBDUEQgQgAEEEMAQ8BCAARQQ+BDcETwQ4BD0EPwAgABoEMAQ6 BD4EOQQgADIEQAQ1BDQEIAA+BD0EIAA9BDAEPQQ+BEEEOARCBCAAQQQwBDwEIABBBDUEMQQ1BCAA OAQgAD4EQgQgAEcENQQzBD4EIAA3BDAEMgQ4BEEEOAQ8BD8AIAAaBDAEOgQgAD8EPgQ6BDAENwQw BD0EPgQgADIEIABBBEIEMARCBEwENQQgACIAEgQ+BDcEQAQ+BDYENAQ1BD0EOAQ1BCAAIARDBEEE OAQuACAAHQQ+BDIEMARPBCAAEwQ4BD8ENQRABDEEPgRABDUETwQuACIALAAgAEEEPgQyBEAENQQ8 BDUEPQQ9BDAETwQgADMEOwQ+BDEEMAQ7BEwEPQQwBE8EIAAyBDsEMARBBEIETAQgADgEQQQ/BD4E OwRMBDcEQwQ1BEIEIAA6BDAEOgQgADgEPQRBBEIEQARDBDwENQQ9BEIEIABDBD8EQAQwBDIEOwQ1 BD0EOARPBCAAPwQ+BEAEPgRHBD0EQwROBCAARAQ4BDsEPgRBBD4ERAQ4BE4EIAA0BEAENQQyBD0E OARFBCwAIAA6BD4EQgQ+BEAEMARPBCAAMgQ1BDQEUQRCBCAAOgQgADMEOAQxBDUEOwQ4BCAAMgRB BE4EIABGBDgEMgQ4BDsEOAQ3BDAERgQ4BE4EIAAyBDoEOwROBEcEMARPBCAARQQ+BDcETwQ4BD0E MAQsACAAMAQgAEcENQQ8BCAAMQQ+BDsETARIBDUEIABNBEIEMAQgADIEOwQwBEEEQgRMBCwAIABC BDUEPAQgADEEPgQ7BEwESAQ1BCAAPgRCBCAAPQQ1BFEEIAA3BDAEMgQ4BEEETwRCBCAAMgRBBDUE LgAgAB0EMARIBDUEIAAyBDUEOwQ4BDoEPgQ1BCAANARABDUEMgQ9BDUENQQgAD0EMARBBDsENQQ0 BDgENQQoACAEIAQTBCAAOAQgACIAOgQ+BD8ETAQ1BCAAIAQ+BDQEMAQiACkALAAgADoEPgRCBD4E QAQ+BDUEIAA8BEsEIAA0BD4EOwQ2BD0ESwQgAD8EQAQ4BD0ETwRCBEwEIAA4BCAAPwQ+BD0ETwRC BEwELAAgADoEMAQ6BCAATQRCBD4EIAA9BDgEIAA/BDAEQAQwBDQEPgQ6BEEEMAQ7BEwEPQQ+BCwA IAA+BDQEPQQ+BDIEQAQ1BDwENQQ9BD0EPgQgAE8EMgQ7BE8ENQRCBEEETwQgADgEIAA4BDMEOwQ+ BDkELAAgADIEIAA6BD4EQgQ+BEAEPgQ5BCAAQQQ/BEAETwRCBDAEPQQwBCAAIgBBBDwENQRABEIE TAQgABoEPgRJBDUETwQiAC4ADQAgABoEPgQgADIEQQQ1BDwEIABNBEIEOAQ8BCAAPAQ+BD0EPgQ/ BD4EOwQ4BE8EPAQgAEEEOwQ1BDQEQwQ1BEIEIAA0BD4EMQQwBDIEOARCBEwEIAAzBDsEPgQxBDAE OwRMBD0ESwQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgELAAgAEMEPwRABDAEMgQ7BE8ENQQ8BEsENQQg ADQENQQtAE4EQAQ1BCAAPgRCBDQENQQ7BEwEPQRLBDwEOAQgADMEPgRBBEMENAQwBEAEQQRCBDIE MAQ8BDgELgAgAC0EQgQ+BCAAQgQwBDoEOAQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgELAAgADoEMAQ6 BCAAPAQ+BD0EPgQ/BD4EOwQ4BE8EIAAaBDgEQgQwBE8EIAA9BDAEIAA0BD4EMQRLBEcEQwQgAEAE NQQ0BDoEPgQ3BDUEPAQ1BDsETAQ9BEsERQQgADwENQRCBDAEOwQ7BD4EMgQsACAAPQQ1BEQEQgRP BD0EMARPBCAAPgQ7BDgEMwQ+BD8EPgQ7BDgETwQgAB4EHwQVBBoEIAA4BDsEOAQgADwEPgQ9BD4E PwQ+BDsEOARPBCAANAQ+BDsEOwQwBEAEMAQgAD0EMAQgAEAENQQ3BDUEQAQyBC4ADQAgACAAIABC AC0AIAAbBD4EOgQwBDsETAQ9BEsENQQgAE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ4BDUEIAA8BD4E PQQ+BD8EPgQ7BDgEOAQuACAALQRCBD4EIAA8BD4EPQQ+BD8EPgQ7BDgEOAQgAD4EQgQ0BDUEOwRM BD0ESwRFBCAAQQRCBEAEMAQ9BCAAOAQgAD0EMARABD4ENAQ+BDIEIAA9BDAEIABCBDUEIAA4BDsE OAQgADgEPQRLBDUEIABNBDoEPgQ9BD4EPAQ4BEcENQRBBDoEOAQ1BCAAQgQ+BDIEMARABEsEIAA4 BDsEOAQgAEMEQQQ7BEMEMwQ4BC4AIAAhBEIEQARDBDoEQgRDBEAEOARABEMETgRCBEEETwQgAD4E PQQ4BCAAPwRABD4EQQRCBD4EIAA/BD4EIAA/BEAEOARHBDgEPQQ1BCAAMgQ+BDcEPQQ4BDoEPQQ+ BDIENQQ9BDgETwQuACAAFQRBBEIENQRBBEIEMgQ1BD0EPQRLBDUEIAA8BD4EPQQ+BD8EPgQ7BDgE OAQgADIEPgQ3BD0EOAQ6BDAETgRCBCAAOAQ3BCAANwQwBCAAMQQwBEAETAQ1BEAEPgQyBCAANAQ1 BDwEPgQ9BD4EPwQ+BDsEOAQ3BDAERgQ4BDgELgAgAC0EQgQ+BCwAIAA9BDAEPwRABDgEPAQ1BEAE LAAgADwEPgQ9BD4EPwQ+BDsEOAQ4BCAAPQQwBCAAQQRCBEAEPgQ4BEIENQQ7BEwEQQRCBDIEPgQg ADQEPgRABD4EMwQgADgEIABCBEAEMAQ9BEEEPwQ+BEAEQgQgADIEIAAgBD4EQQRBBDgEOAQsACAA OgQ+BEIEPgRABEsENQQgAD8EPgQgAEEEMgQ+BDUEOQQgAD8EQAQ4BEAEPgQ0BDUEIABBBDsEPgQ2 BD0EPgQgADIEMgQ1BEEEQgQ4BCAAMgQgAEEERAQ1BEAEQwQgAEAESwQ9BD4ERwQ9BD4EOQQgAE0E OgQ+BD0EPgQ8BDgEOgQ4BCAAOAQgAD4EPQQ4BCAANAQ+BDsENgQ9BEsEIAAxBEsEQgRMBCAAPwQ+ BDQEIAAzBD4EQQRDBDQEMARABEEEQgQyBDUEPQQ9BEsEPAQgADoEPgQ9BEIEQAQ+BDsENQQ8BCgA PwQ+BDoEMAQgAEEEPgQ+BEIEMgQ1BEIEQQRCBDIEQwROBEkEOAQ1BCAAQQQ7BD4ENgQ9BD4EQQRC BDgEIAA9BDUEIAAxBEMENARDBEIEIABDBEEEQgRABDAEPQQ1BD0ESwQgADgEIAA8BD4EPQQ+BD8E PgQ7BDgEOAQgADQENQQ8BD4EPQRCBDgEQAQ+BDIEMAQ9BEsEKQAuACAAHwQ+BDQEPgQxBD0ESwQ1 BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIABPBDIEOwRPBE4EQgRBBE8EIABEBD4EQAQ8BDAEOwRMBD0E PgQgAD0EMARABDoEPgRCBDgEOgQwBDwEOAQgADQEOwRPBCAAPgQxBEkENQRBBEIEMgQwBCwAIABC BDAEOgQgADoEMAQ6BCAAMgRABDUENARPBEIEIABBBDIENQRABEUEIAA8BDUEQARLBCAAOgQ+BEgE NQQ7BEwEOgQwBDwEIAAzBEAEMAQ2BDQEMAQ9BCAAOAQgADIESwQ3BEsEMgQwBE4EQgQgADcEMAQy BDgEQQQ4BDwEPgRBBEIETAQgADMEPgRBBEMENAQwBEAEQQRCBDIEMAQgADgEIAA+BEIENAQ1BDsE TAQ9BEsERQQgAEcEOAQ9BD4EMgQ9BDgEOgQ+BDIEIAA+BEIEIABEBDgEPQQwBD0EQQQ+BDIESwRF BCAAQQRABDUENARBBEIEMgQgADwEPgQ9BD4EPwQ+BDsEOAQ4BC4AIAAiBD4ERwQ9BD4EIABCBDAE OgQ+BDkEIAA2BDUEIAAyBEAENQQ0BCAAMgRLBDcESwQyBDAETgRCBCAAPgQxBEsERwQ9BEsENQQg AE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ4BDUEIAA8BD4EPQQ+BD8EPgQ7BDgEOAQsACAAPQQ1BCAA QQRHBDgEQgQwBE8EIAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBDgELAAgADoEPgRCBD4EQAQwBE8EIAAy BCAANAQwBD0EPQQ+BDwEIABBBDsEQwRHBDAENQQgAD4EQgQ9BD4EQQQ4BEIEQQRPBCAAOgQ+BCAA MgRBBDUEPARDBCAAQARLBD0EOgRDBC4AIAAnBDUEPAQgADEEPgQ7BEwESAQ1BCAANAQ1BDkEQQRC BDIEQwQ1BEIEIAA8BD4EPQQ+BD8EPgQ7BDgETwQsACAAQgQ1BDwEIAAxBD4EOwRMBEgENQQgAD4E PQQwBCAAQQQ6BDsEPgQ9BD0EMAQgADoEIABDBEEEQgRABDAEPQQ1BD0EOAROBCAAOAQgAD8EPgQ0 BDAEMgQ7BDUEPQQ4BE4EIAA6BD4EPQQ6BEMEQAQ1BD0EQgQ+BDIELAAgAEEEQgRABEMEOgRCBEME QAQ4BEAEPgQyBDAEPQQ4BE4EIABABEsEPQQ6BDAEIAAiAD8EPgQ0BCAAQQQ1BDEETwQiACAAOAQg AEEEPgQ+BEIEMgQ1BEIEQQRCBDIENQQ9BD0EPgQgADcEMAQyBDgEQQQ4BDwEPgRBBEIEOAQgAD8E PgRCBEAENQQxBDgEQgQ1BDsENQQ5BCAAPgRCBCAAPQQ1BFEEIABBBDAEPAQ+BDkELgAgAC0EQgQ+ BCAAMwRABEMEPwQ/BDAEIAA6BDsEMARBBEEEOARHBDUEQQQ6BDgERQQgADwEPgQ9BD4EPwQ+BDsE OAQ5BCAAOAQ3BCAAQwRHBDUEMQQ9BDgEOgQwBCAAPwQ+BCAATQQ6BD4EPQQ+BDwEOAQ6BDUELgAN ACAAIAAgACEELQAgAB0ENQRNBDoEPgQ9BD4EPAQ4BEcENQRBBDoEOAQ1BCAAOwQ+BDoEMAQ7BEwE PQRLBDUEIAA8BD4EPQQ+BD8EPgQ7BDgEOAQuACAALQRCBD4EIAA+BEEEPgQxBDAETwQgADMEQARD BD8EPwQwBCAAPAQ+BD0EPgQ/BD4EOwQ4BDkELAAgADIEPgQ3BD0EOAQ6BDAETgRJBDgERQQgAD4E MQRLBEcEPQQ+BCAAPwQ+BDQEIABDBD8EQAQwBDIEOwQ1BD0EOAQ1BDwEIAAzBDsEPgQxBDAEOwRM BD0EPgQ5BCAAMgQ7BDAEQQRCBDgEIAAyBCAARgQ1BDsETwRFBCAAPwRABD4ENAQyBDgENgQ1BD0E OARPBCAAQgQ1BDoEQwRJBDUEOQQgAD8EPgQ7BDgEQgQ4BDoEOAQoAEIEPgQgADUEQQRCBEwEIABD BD0EOARHBEIEPgQ2BDUEPQQ4BE8EIAAxBDUEOwQ+BDMEPgQgAD0EMARBBDUEOwQ1BD0EOARPBCAA OAQgADIEIAA/BDUEQAQyBEMETgQgAD4ERwQ1BEAENQQ0BEwEIABABEMEQQRBBDoEPgQzBD4EIAA9 BDAEQAQ+BDQEMAQsACAANwQ+BDwEMQQ4BEAEPgQyBDAEPQQ4BE8ELAAgADAEQgQ+BDwEOAQ3BDAE RgQ4BDgEIAA+BDEESQQ1BEEEQgQyBDAEIAA4BCAAQwQ9BDgERwRCBD4ENgQ1BD0EOAQ1BCAAIAQ+ BDQEMAQpACAAOAQgAD0ENQQgAEEEMgQ+BDQEOARCBEEETwQgADoEIABNBDoEPgQ9BD4EPAQ4BEcE NQRBBDoEOAQ8BCAAOAQ9BEIENQRABDUEQQQwBDwELgAgAB8EPgQgAD0EMARABDoEPgRCBDgERwQ1 BEEEOgQ+BDwEQwQgADIEPgQ3BDQENQQ5BEEEQgQyBDgETgQgADsENQQzBDAEOwRMBD0ESwQ1BCAA PQQwBEAEOgQ+BEIEOAQ6BDgEIAA4BDQENQQ9BEIEOARHBD0ESwQgAD0EMARABDoEPgRCBDgERwQ1 BEEEOgQ4BDwEIAA9BDUEOwQ1BDMEMAQ7BEwEPQRLBDwEIAAyBDUESQQ1BEEEQgQyBDAEPAQuACAA HwRABD4EPwQwBDMEMAQ9BDQEMAQgAD4EMQQ8BDAEPQQwBCwAIAA9BDAEQQQ4BDsEOARPBCwAIABB BDUEOgRBBDAELAAgADAEMQQ+BEAEQgQwBCwAIAA7BD4ENgQ9BEsERQQgAEYENQQ9BD0EPgRBBEIE NQQ5BCAAQgQ1BDwEIAA4BDsEOAQgADgEPQRLBDwEIABBBD8EPgRBBD4EMQQ+BDwEIAA9BDAEPQQ+ BEEEOARCBCAAMgRABDUENAQgAD4EMQRJBDUEQQRCBDIEQwQgADgEIAAyBEsENwRLBDIEMAQ1BEIE IAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBEwEIAA+BDEEPAQwBD0EQwRCBEsERQQgAD4EQgQgAD4EMQQ8 BDAEPQQwBCgAPwQ+BD8EQAQ+BDEEQwQ5BEIENQQgAEAEMARBBEEEOgQwBDYEOARCBDUEIAAxBDsE TwQ0BDgELAAgAEcEQgQ+BCAAPgQ9BDAEIAAxBDsETwQ0BEwEKQAsACAANwQwBDIEOARBBDgEPAQ+ BEEEQgRMBCAAQgRABDAERQQwBE4ESQQ4BEUEQQRPBCAAPgRCBCAAQQQyBD4EOARFBCAAOAQ3BDIE QAQwBEkEUQQ9BD0ESwRFBCAANgQ1BDsEMAQ9BDgEOQQsACAAMAQsACAAPQQwBD8EQAQ4BDwENQRA BCwAIAAyBDUEQARDBE4ESQQ4BEUEIAAyBCAAOwQ4BEcEPQQ+BEEEQgRMBCgAQgQ+BDsEPwQ+BC0A QQQwBEIEMAQ9BDgEQQRCBD4EMgQpACAAPgRCBCAAPwQ+BEEEQgQ+BE8EPQQ9BD4EOQQgAD8EQAQ+ BD8EMAQzBDAEPQQ0BEsEIAA/BEAEMAQyBCwAIAA4BD0EQgQ1BDsEOwQ1BDoEQgQwBCwAIAAiAD8E NQRABDIEOARHBD0EPgRBBEIEOAQiACAAOAQgAD8EQAQ+BEcEOARFBCAAPwRABDUEOwQ1BEEEQgQ1 BDkEIAA7BDgERwQ9BD4EQQRCBDgELgANACAAHAQ+BD0EPgQ/BD4EOwQ4BE8EIAAhBBwEGAQgAEME QQRCBDAEPQQwBDIEOwQ4BDIEMAQ1BEIEIAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBEwEIAA/BD4EQgRA BDUEMQQ4BEIENQQ7BDUEOQQgAD4EQgQgAEIENQQ6BEMESQQ1BDkEIAA/BEAEPgQ/BDAEMwQwBD0E NARLBC4AIAAgABwEPgQ9BD4EPwQ+BDsEOARPBCAAGwQTBBEEIgQsACAAOgQwBDoEIAA+BEAEMwQw BD0EOAQ3BDAERgQ4BE8ELAAgADoEPgRCBD4EQAQwBE8EIAA0BD4EOwQ2BD0EMAQgADoEPgQ9BEIE QAQ+BDsEOARABD4EMgQwBEIETAQgADMEQAQwBDYENAQwBD0EIABBBCAAMQQ+BDsETAQ9BD4EOQQg AEEENQQ6BEEEQwQwBDsETAQ9BD4EQQRCBEwETgQsACAAOgQwBDoEIAA4BCAAMgQgAEEEOwRDBEcE MAQ1BCAAIQQcBBgELAAgAEEEOgQ+BEAENQQ1BCAAOgQwBDsENQRHBDgEQgQsACAARwQ1BDwEIAA7 BDUERwQ4BEIELgAgABEEPgQ7BEwEPQRLBDUEKAA4BD0EPgQzBDQEMAQgAD0ENQQ4BDcEOwQ1BEcE OAQ8BD4EKQAgADsETgQ0BDgEIAAyBDwENQRBBEIEPgQgADsENQRHBDUEPQQ4BE8EIAA4BCAAPwQ+ BDwEPgRJBDgEIABBBD4EIABBBEIEPgRABD4EPQRLBCAAPgQxBEkENQRBBEIEMgQwBCAAOwQ4BDEE PgQgACIAQAQwBDcEQAQ1BEgEMAROBEIEQQRPBCIAIAA4BCAAPgRBBEIEMAROBEIEQQRPBCAAMQQ1 BDcEIAA7BDUERwQ1BD0EOARPBCAAOwQ4BDEEPgQgACIANwQwBD8EQAQ1BEkEMAROBEIEQQRPBCIA IAA4BCAAPwQ+BDQEMgQ1BEAEMwQwBE4EQgRBBE8EIAAzBD4EPQQ1BD0EOARPBDwEIAA4BCAAPQQw BEEEOAQ7BDgETgQsACAAMgQ8BDUEQQRCBD4EIAA0BD4EOwQ2BD0EPgQzBD4EIABBBD4ERwRDBDIE QQRCBDIEOARPBCAAPwQ+BDsEQwRHBDAETgRCBCAAPQQ1BD0EMAQyBDgEQQRCBEwEIABBBDIEPgQ1 BDMEPgQgAD0EMARABD4ENAQwBC4AIAAiBD4EIAA1BEEEQgRMBCAATQRCBD4EIAA7BD4ENgQ9BEsE OQQgADIESwQxBD4EQAQgADIEIAAiAD8EPgQ7BEwENwRDBCIAIAAxBD4EOwQ1BDcEPQQ4BCAAOAQg ADIEPgQgADIEQAQ1BDQEIAAxBD4EOwRMBD0ESwQ8BC4AIAAVBEEEOwQ4BCAAPQQwBCAAIARDBEEE OAQgAE0EQgQ+BEIEIAAyBEsEMQQ+BEAEIABBBDoEOwQ+BD0ETwROBEIEIAAyBCAAPwQ+BDsETAQ3 BEMEIAA3BDAEPwRABDUESQQ1BD0EOARPBCAAOAQgAD0EMARBBDgEOwQ4BE8ELAAgAD0EMAQgADcE MAQ/BDAENAQ1BCAAGwQTBBEEIgQgAEAEMAQ3BEAENQRIBDUEPQRLBCwAIAA9BD4EIAA0BDUEOwQw BCAANQRJBDUEIABFBEMENgQ1BC4AIAAiBDAEPAQgAD4EPQQ4BCAAPQQ1BCAAPwRABD4EQQRCBD4E IABABDAENwRABDUESAQ1BD0ESwQsACAAPQQ+BCAAOAQgAD8EQAQ+BD8EMAQzBDAEPQQ0BDgEQARD BE4EQgRBBE8EIQAgACIEPgQgADUEQQRCBEwELAAgAEEEPgQ3BDQEMAQ9BCAAPgQxBDwEMAQ9BCwA IAA6BD4EMwQ0BDAEIAAxBD4EOwRMBD0ESwRFBCAAPwRABDgENwQ9BDAETgRCBCAANwQ0BD4EQAQ+ BDIESwQ8BDgEIAA4BCAAPwRABD4EPwQwBDMEMAQ9BDQEOARABEMETgRCBCAAMQQ+BDsENQQ3BD0E TAQhAA0AIAAYBEIEMAQ6BCwAIAA6BDAENgQ0BDAETwQgADwEPgQ9BD4EPwQ+BDsEOARPBCAANwQw BDoEOwROBEcEMAQ1BEIEIAAyBCAAQQQ1BDEENQQgADgEIABBBD4EPgRCBDIENQRCBEEEQgQyBEME TgRJBDgEOQQgAD0EMARABDoEPgRCBDgEOgQgADQEOwRPBCAAQgQ1BEUEIAA4BDsEOAQgADgEPQRL BEUEIABBBDsEPgRRBDIEIAA+BDEESQQ1BEEEQgQyBDAEIAA4BCAAQQQ+BD4EMQRJBDUEQQRCBDIE LgAgABgELAAgAEEEPgQ+BEIEMgQ1BEIEQQRCBDIENQQ9BD0EPgQsACAAPAQ+BD0EPgQ/BD4EOwQ4 BDgEIAAyBCAAPQQwBEgENQQ8BCAAPgQxBEkENQRBBEIEMgQ1BCAAMgRBBDUEMwQ0BDAEIAAyBEAE NQQ0BD0ESwQoAEcEQgQ+BCAAQAQwBEEESAQ4BEAETwQ1BEIEIABDBEIEMgQ1BEAENgQ0BDUEPQQ4 BDUEIAA+BCAAMgRABDUENAQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDkEIAAyBCAATQQ6BD4EPQQ+BDwE OAQ6BDUELAAgAEIEMAQ6BCAAOgQwBDoEIABNBDoEPgQ9BD4EPAQ4BDoEMAQgAEAEMARBBEEEPAQw BEIEQAQ4BDIEMAQ1BEIEIAA4BEEEOgQ7BE4ERwQ4BEIENQQ7BEwEPQQ+BCAAOwQ+BDoEMAQ7BEwE PQRLBDUEIABNBDoEPgQ9BD4EPAQ4BEcENQRBBDoEOAQ1BCAAPAQ+BD0EPgQ/BD4EOwQ4BDgEIAA6 BDsEMARBBEEEMAQgAEIAKQAuACAAGAQgAD8EPgRNBEIEPgQ8BEMEIAAyBEEENQQgADwEPgQ9BD4E PwQ+BDsEOAQ4BCAAPwQ+BDQEOwQ1BDYEMARCBCAANAQ1BDwEPgQ9BD4EPwQ+BDsEOAQ3BDAERgQ4 BDgEIAA4BDsEOAQgADsENQQzBDAEOwQ4BDcEMARGBDgEOAQsACAARwRCBD4EIABNBDoEMgQ4BDIE MAQ7BDUEPQRCBD0EPgQgADsENQQzBDAEOwQ4BDcEMARGBDgEOAQgAEEEPgQ+BEIEMgQ1BEIEQQRC BDIEQwROBEkEOARFBCAAPQQwBEAEOgQ+BEIEOAQ6BD4EMgQsACAAPQQwBCAAPwRDBEIEOAQgAEcE NQQ7BD4EMgQ1BEcENQRBBEIEMgQwBCAAOgQgADIESwQ3BDQEPgRABD4EMgQ7BDUEPQQ4BE4ELgAN AA0ADQANACAAIAAgACAAIABJAEkASQAgACAAIAAQBDsEOgQ+BDMEPgQ7BEwELgAgABsENQQzBDAE OwQ4BDcEMARGBDgETwQgAEEEPAQ1BEAEQgQ4BC4ADQANACAAIAAgAB4ENAQ9BDgEPAQgADgENwQg ADQEMgRDBEUEIAA9BD4ENgQ1BDkEIAAyBD4EPQQ3BFEEPQQ9BEsERQQgADIEIABBBD8EOAQ9BEME IAAgBEMEQQQ4BCAATwQyBDsETwQ1BEIEQQRPBCAAMAQ7BDoEPgQzBD4EOwRMBCwAIABPBEAEOgQ4 BDkEIAA/BEAENQQ0BEEEQgQwBDIEOARCBDUEOwRMBCAAMgRABDUENAQ9BDUEOQRIBDgERQQgADgE IABPBDQEPgQyBDgEQgQ1BDkESAQ4BEUEIAA9BDAEQAQ6BD4EQgQ4BEcENQRBBDoEOARFBCAAMgQ1 BEkENQRBBEIEMgQsACAAOgQ+BEIEPgRABEsEOQQgAD0ENQQgADwEPgQ2BDUEQgQgADEESwRCBEwE IAA7BDUEOgQwBEAEQQRCBDIEPgQ8BCAAPwRABDAEOgRCBDgERwQ1BEEEOgQ4BCAAPQQ4BCAAPwRA BDgEIAA6BDAEOgQ4BEUEIABDBEEEOwQ+BDIEOARPBEUELAAgAD0ENQQgAEEERwQ4BEIEMARPBCAA MAQ7BDoEPgQzBD4EOwQ4BDoEPgQyBCwAIAA0BDsETwQgADoEPgRCBD4EQARLBEUEIAA+BD0EIAAy BEEEUQQtAEIEMAQ6BDgEIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAOwQ1BDoEMARABEEEQgQyBD4E PAQsACAAQQQ9BDgEPAQwBE4ESQQ4BDwEIAAxBD4EOwRMBCgAPQQwBEAEOgQ+BEIEOARHBDUEQQQ6 BEMETgQgADsEPgQ8BDoEQwQpAC4ALgAuACAAIQQgAD8EPgQ8BD4ESQRMBE4EIAAwBDsEOgQ+BDME PgQ7BE8EIABDBDYENQQgAEMEPAQ1BEAESQQyBDsEUQQ9BCAAQARPBDQEIAA9BDAEQAQ+BDQEPgQy BCAAPAQ4BEAEMAQgAD8EQAQ+BEgEOwRLBEUEIABNBD8EPgRFBCAAOAQgADgEQQRCBEAENQQxBDsE TwROBEIEQQRPBCAAPQQwBEAEPgQ0BEsEIABBBD4EMgRABDUEPAQ1BD0EPQRLBDUELgANACAAEgQg AEgEOARABD4EOgQ+BDwEIABBBDwESwRBBDsENQQsACAAOwROBDEEPgQ1BCAAPQQwBEAEOgQ+BEIE OARHBDUEQQQ6BD4ENQQgADIENQRJBDUEQQRCBDIEPgQgADwEPgQ2BDUEQgQgADEESwRCBEwEIAA+ BEcENQQ9BEwEIAA/BEAEPgRBBEIEPgQgADsENQQzBDAEOwQ4BDcEPgQyBDAEPQQ+BC0AIAA3BDAE PwRABDUESQQ1BD0EPgQgADQEOwRPBCAAMgRBBDUERQQsACAAOgQ+BDwEQwQgAD4EPQQ+BCAAPQQw BD0EPgRBBDgEQgQgADIEQAQ1BDQEIAA4BCAATwQyBDsETwQ1BEIEQQRPBCAAPQQwBEAEOgQ+BEIE OAQ6BD4EPAQgADgEIABABDAENwRABDUESAQ1BD0EPgQgADQEOwRPBCAAMgRBBDUERQQsACAAOgQ+ BDwEQwQgAD4EPQQ+BCAAMgRABDUENAQwBCAAHQQVBCAAPQQwBD0EPgRBBDgEQgQsACAAMAQgAE8E MgQ7BE8ENQRCBEEETwQgADsENQQ6BDAEQARBBEIEMgQ+BDwELgAgACIEMAQ6BD4EOQQgAD8EPgQ0 BEUEPgQ0BCAAQQRABDAENwRDBCAAPgQ/BEAENQQ0BDUEOwRPBDUEQgQgAD0EMARABDoEPgRCBDgE RwQ1BEEEOgQ4BDUEIAAyBDUESQQ1BEEEQgQyBDAELAAgADgEQQQ/BD4EOwRMBDcEQwQ1BDwESwQ1 BCAAMgQgADwENQQ0BDgERgQ4BD0ENQQgADIEIAA6BDAERwQ1BEEEQgQyBDUEIAA+BDEENQQ3BDEE PgQ7BDgEMgQwBE4ESQQ4BEUEIAAoADwEPgRABEQEOAQ9BCAAOAQgAD8EQAQ+BEcEOAQ1BCkALAAg ADoEMAQ6BCAAGwQVBBoEEAQgBCEEIgQSBBAELgAgAB0EMARABDoEPgRCBDgERwQ1BEEEOgQ+BDUE IAAyBDUESQQ1BEEEQgQyBD4EIABPBDIEOwRPBDUEQgRBBE8EIAA+BDEENQQ3BDEEPgQ7BDgEMgQw BE4ESQQ4BDwELQAgADsENQQ6BDAEQARBBEIEMgQ+BDwEKAA9BD4EIAAdBBUEIAA9BDAEQAQ6BD4E QgQ4BDoEPgQ8BCEAKQAgADQEOwRPBCAAPQQwBEAEOgQ+BDwEMAQ9BDAELAAgADoEPgRCBD4EQARL BDkEIABPBDIEOwRPBE8EQQRMBCAAQAQ1BDAEOwRMBD0EPgQgADEEPgQ7BEwEPQRLBDwEIABHBDUE OwQ+BDIENQQ6BD4EPAQoADAEIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAOAQgADgEPQQyBDAEOwQ4 BDQEPgQ8BCkAIAA0BD4EOwQ2BDUEPQQgADgEPAQ1BEIETAQgADIEPgQ3BDwEPgQ2BD0EPgRBBEIE TAQgADIEQQQ1BDMENAQwBCAAMQQ1BEEEPwRABDUEPwRPBEIEQQRCBDIENQQ9BD0EPgQgADgEIAAx BDUENwQ+BD8EMARBBD0ESwQ8BCAAPgQxBEAEMAQ3BD4EPAQgADUEMwQ+BCAAPwQ+BDsEQwRHBDgE QgRMBCAAOAQgAD8EPgRCBEAENQQxBDgEQgRMBCEAIAAfBD4ENAQ+BDEEPQQwBE8EIAAxBD4EOwQ1 BDcEPQRMBCAAMgRBBDUEMwQ0BDAEIABBBD4ERwQ1BEIEMAQ1BEIEQQRPBCAAQQQgAD8EPgRCBDUE QAQ1BDkEIAA0BDUENQRBBD8EPgRBBD4EMQQ9BD4EQQRCBDgELAAgAD8EPgRNBEIEPgQ8BEMEIAAz BD4EQQRDBDQEMARABEEEQgQyBD4EIAA0BD4EOwQ2BD0EPgQgADIENwRPBEIETAQgAD0EMAQgAEEE NQQxBE8EIAA+BEIEMgQ1BEIEQQRCBDIENQQ9BD0EPgRBBEIETAQgADcEMAQgADsENQRHBDUEPQQ4 BDUEIAA4BCAAQAQ1BDAEMQQ4BDsEOARCBDAERgQ4BE4EIAA9BDAEQAQ6BD4EPAQwBD0EPgQyBCAA KAA6BDAEOgQgAEAEPgQ0BDgEQgQ1BDsETAQgADEENQRABDUEQgQgAD4EQgQyBDUEQgRBBEIEMgQ1 BD0EPQQ+BEEEQgRMBCAANwQwBCAAQQQyBD4ENQQzBD4EIAA9BDUENwRABDUEOwQ+BDMEPgQgAEAE NQQxBFEEPQQ6BDAEIAA4BCAAQwRBBEIEMAQ9BDAEMgQ7BDgEMgQwBDUEQgQgADoEPgQ9BEIEQAQ+ BDsETAQgAD0EMAQ0BCAAPQQ4BDwEKQAgADIEIABCBD4EPAQgAEcEOARBBDsENQQgADgEIABBBCAA PwQ+BDwEPgRJBEwETgQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ4BEUEIABBBEAENQQ0BEEEQgQy BCwAIAA/BDAEQAQwBDsEOwQ1BDsETAQ9BD4EIAA9BDUEIAA0BD4EPwRDBEEEOgQwBE8EIAA+BDEE PgRABD4EQgQgAE0EQgQ4BEUEIAAyBDUESQQ1BEEEQgQyBCAAQQRABDUENAQ4BCAANwQ0BD4EQAQ+ BDIEPgQzBD4EIAA9BDAEQQQ1BDsENQQ9BDgETwQsACAANAQ7BE8EIAA6BD4EQgQ+BEAEPgQzBD4E IAA+BD0EOAQgAE8EMgQ7BE8ETgRCBEEETwQgAD0EMARABDoEPgRCBDgEOgQwBDwEOAQuAA0AIAAf BEAEMAQyBDgEOwRMBD0EMARPBCAAOwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAAPQQwBEAEOgQ+BEIE OAQ6BD4EMgQgADIENQQ0BFEEQgQgADoEIAAyBEsENwQ0BD4EQAQ+BDIEOwQ1BD0EOAROBCAAPgQx BEkENQRBBEIEMgQwBCAAOAQgAD8EPgQ7BD0EPgQ8BEMEIAAyBEsEPARLBDIEMAQ9BDgETgQgAD0E MARABDoEPgRCBDgERwQ1BEEEOgQ4BEUEIAAyBDUESQQ1BEEEQgQyBCAAOAQ3BCAANQQzBD4EIABC BDUEOwQwBCAAMgQgAEIENQRHBDUEPQQ4BDUEIAA+BDQEPQQ+BDMEPgQtACAAPQQ1BEEEOgQ+BDsE TAQ6BDgERQQgAD8EPgQ6BD4EOwQ1BD0EOAQ5BC4AIAAbBDUEMwQwBDsEOAQ3BDAERgQ4BE8EIAA0 BD4EOwQ2BD0EMAQgADIEOgQ7BE4ERwQwBEIETAQgADIEIABBBDUEMQRPBCAAMgAgADIEMAQ2BD0E NQQ5BEgEOARFBCAATQRCBDAEPwQwBDoADQAxAC4AIAATBD4EQQRDBDQEMARABEEEQgQyBDUEPQQ9 BEsENQQgADoEPgQ9BEIEQAQ+BDsETAQgADgEIAA+BEAEMwQwBD0EOAQ3BDAERgQ4BE8EIAA+BDEE PgRABD4EQgQwBCAAPQQwBEAEOgQ+BEIEOARHBDUEQQQ6BDgERQQgADIENQRJBDUEQQRCBDIELgAN ADIALgAgAB8EQAQ+BD8EMAQzBDAEPQQ0BDAELgANAB8ENQRABDIESwQ5BCAATQRCBDAEPwQgAEAE MARBBD8EMAQ0BDAENQRCBEEETwQgAD0EMAQgAEAETwQ0BCAANwQwBDQEMARHBDoADQAqACAAHAQ+ BD0EPgQ/BD4EOwQ4BDcEMARGBDgETwQgADMEPgRBBEMENAQwBEAEQQRCBDIEPgQ8BCAAMgQ7BDAE QQRCBDgEIAA9BDAENAQgAD8EQAQ+BEYENQRBBEEEMAQ8BDgEIAA/BEAEPgQ4BDcEMgQ+BDQEQQRC BDIEMAQgADgEIABABDUEMAQ7BDgENwQwBEYEOAQ4BCAAPQQwBEAEOgQ+BEIEOARHBDUEQQQ6BDgE RQQgADIENQRJBDUEQQRCBDIELAAgADIEPgQ3BDwEPgQ2BD0EPgQsACAAMgQ/BDsEPgRCBEwEIAA0 BD4EIAA1BDQEOAQ9BD4EOQQgADEAMAAwACUAIAAzBD4EQQRDBDQEMARABEEEQgQyBDUEPQQ9BD4E OQQgADwEPgQ9BD4EPwQ+BDsEOAQ4BC4ADQAqACAAHgRABDMEMAQ9BDgENwQwBEYEOARPBCAAQAQ1 BDAEOwQ4BDcEMARGBDgEOAQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ4BEUEIAAyBDUESQQ1BEEE QgQyBCAAQQQ6BEAESwRCBEsEPAQgAD4EQgQgADcENAQ+BEAEPgQyBEsERQQgADsETgQ0BDUEOQQg AEEEPwQ+BEEEPgQxBD4EPAQuAA0AKgAgACMEPAQ1BD0ETARIBDUEPQQ4BDUEIABGBDUEPQRLBCAA PQQwBEAEOgQ+BEIEOAQ6BDAEIAA0BD4EIABDBEAEPgQyBD0ETwQgAEAENQQ9BEIEMAQxBDUEOwRM BD0EPgRBBEIEOAQgAD0ENQQ7BDUEMwQwBDsETAQ9BEsERQQgAD0EMARABDoEPgRCBD4EQAQzBD4E MgRGBDUEMgQuAA0AKgAgABIESwRPBDIEOwQ1BD0EOAQ1BCAAOAQgADgENwQ+BDsETwRGBDgETwQg AD4EQgQgAD4EMQRJBDUEQQRCBDIEMAQgAD0EMARABDoEPgRCBD4EQAQzBD4EMgRGBDUEMgQsACAA PQQ1BCAANgQ1BDsEMAROBEkEOARFBCAAQAQwBDEEPgRCBDAEQgRMBCAAMgQgADsENQQzBDAEOwRM BD0EPgQ8BCAAPwQ+BDsENQQgAD8EPgQ0BCAAOgQ+BD0EQgRABD4EOwQ1BDwEIAAzBD4EQQRDBDQE MARABEEEQgQyBDAELgANACoAIAAaBD4EPQRCBEAEPgQ7BEwEIAAxBD4EOwQ1BDcEPQQ4BCgAPQQw BEAEOgQ+BDwEMAQ9BD4EMgQpACwAIAA7BDUERwQ1BD0EOAQ1BCAAOAQgAEAENQQwBDEEOAQ7BDgE QgQwBEYEOARPBC4ADQAXBDAENAQwBEcEIAAyBD4EIAAyBEIEPgRABD4EPAQgAE0EQgQwBD8ENQQg ADwENQQ9BEwESAQ1BCwAIAA9BD4EIAA+BD0EOAQgAD0ENQQgADwENQQ9BDUENQQgADcEPQQwBEcE OAQ8BEsEOgANACoAIAAfBD4EOwQ9BEsEOQQgADoEMARCBDUEMwQ+BEAEOARHBDUEQQQ6BDgEOQQg ADcEMAQ/BEAENQRCBCAAPwRABD4EPwQwBDMEMAQ9BDQESwQgAD0EMARABDoEPgRCBDgEOgQ+BDIE IABBBEAENQQ0BDgEIAA3BDQEPgRABD4EMgQ+BDMEPgQgAD0EMARBBDUEOwQ1BD0EOARPBC4ADQAq ACAAIQQ+BEYEOAQwBDsETAQ9BDAETwQgAEAENQQ6BDsEMAQ8BDAEIAAyBCAAPgRCBD0EPgRIBDUE PQQ4BDgEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQyBCAAOAQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ4 BEUEIAAyBDUESQQ1BEEEQgQyBC4ADQAgABoEIABHBDUEPARDBCAATQRCBD4EIAA/BEAEOAQyBDUE NARRBEIEPwAgABMEPgRBBEMENAQwBEAEQQRCBDIENQQ9BD0EMARPBCAAPAQ+BD0EPgQ/BD4EOwQ4 BE8ELAAgAEAENQQwBDsEOAQ3BDAERgQ4BE8EIAA/BEAEPgRBBEIESwQ8BCAANAQ7BE8EIAA9BDAE QAQ6BD4EPAQwBD0EMAQgAEEEPwQ+BEEEPgQxBD4EPAQgADgEIAA4BEEEOgRDBEEEQQRCBDIENQQ9 BD0EPgQ1BCAAQwQ8BDUEPQRMBEgENQQ9BDgENQQgAEYENQQ9BEsEIAA9BDAEIAA9BDAEQAQ6BD4E QgQ4BDoEIAA/BEAEOAQyBDUENARRBEIEIAA6BCAAQwRBBEIEQAQwBD0ENQQ9BDgETgQgAD0ENQQ7 BDUEMwQwBDsETAQ9BEsERQQgAD0EMARABDoEPgRCBD4EQAQzBD4EMgRGBDUEMgQgADgENwQgADcE MAQgAD0ENQRABDUEPQRCBDAEMQQ1BDsETAQ9BD4EQQRCBDgEIAA4BEUEIAAxBDgENwQ9BDUEQQQw BC4AIAAeBD0EOAQgAD8EQAQ+BEEEQgQ+BCAAPQQ1BCAAQQQ8BD4EMwRDBEIEIAA6BD4EPQQ6BEME QAQ4BEAEPgQyBDAEQgRMBCAAQQQgADMEPgRBBEMENAQwBEAEQQRCBDIEPgQ8BC4AIAAaBD4EPQRC BEAEPgQ7BEwEIAAxBD4EOwQ1BDcEPQQ4BCAAOAQgADsENQRHBDUEPQQ4BDUEIAA/BEAEOAQyBDUE NARDBEIEIAA6BCAAPwQwBDQENQQ9BDgETgQgAEEEPAQ1BEAEQgQ9BD4EQQRCBDgEIAA+BEIEIAA9 BDUEOgQwBEcENQRBBEIEMgQ1BD0EPQRLBEUEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQyBCAAOAQgADEE MARABEwENQRABDAEPAQgADQEOwRPBCAAPwQ+BE8EMgQ7BDUEPQQ4BE8EIAA9BD4EMgRLBEUEIAA9 BDAEQAQ6BD4EPAQwBD0EPgQyBCwAIAA/BD4EQgQ+BDwEQwQgADoEMAQ6BCAAOAQ9BEQEPgRABDwE MARGBDgETwQgAD4EIAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBDgEIAA8BD4ENgQ1BEIEIAA4BCAANAQ+ BDsENgQ9BDAEIAAxBEsEQgRMBCAAOARBBD8EPgQ7BEwENwQ+BDIEMAQ9BDAEIAA/BEAEOAQgAD8E PgQ7BEMERwQ1BD0EOAQ4BCAAPwRABDAEMgQgAD0EMAQgAEAEMAQxBD4EQgRDBCwAIABCBEAENQQx BEMETgRJBEMETgQgAD4EPwRABDUENAQ1BDsEUQQ9BD0EPgQzBD4EIABDBEAEPgQyBD0ETwQgAD4E QgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BEEEQgQ4BCAAOAQgADQENQQ1BEEEPwQ+BEEEPgQxBD0EPgRB BEIEOAQuACAAHgRHBDUEMgQ4BDQEPQQ+BCwAIABHBEIEPgQgADcENAQ+BEAEPgQyBEsEOQQgAEcE NQQ7BD4EMgQ1BDoEIAA9BDUEIAAxBEMENAQ1BEIEIABABDgEQQQ6BD4EMgQwBEIETAQgAEEEMgQ+ BDgEPAQgADEEOwQwBDMEPgRBBD4EQQRCBD4ETwQ9BDgENQQ8BCwAIAAwBCAAPgRCBEEEQwRCBEEE QgQyBDgENQQgAD0ENQQ7BDUEMwQwBDsETAQ9BEsERQQgAD0EMARABDoEPgRCBD4EQAQzBD4EMgRG BDUEMgQgAEEEMgQ1BDQEUQRCBCAAOgQgADwEOAQ9BDgEPARDBDwEQwQgAEAEOARBBDoEIAA/BD4E NARBBDAENgQ4BDIEMAQ9BDgETwQgADgEPAQ4BCAAIgA9BDAEIAA4BDMEOwRDBCIAIAA9BD4EMgRL BEUEIAA6BDsEOAQ1BD0EQgQ+BDIEIAA4BCAAMgQ+BDIEOwQ1BEcENQQ9BDgETwQgADcENAQ+BEAE PgQyBEsERQQgADsETgQ0BDUEOQQgADIEIAA/BD4EQgRABDUEMQQ7BDUEPQQ4BDUEIAA9BDAEQAQ6 BD4EQgQ4BDoEMAQuACAAGgQ+BCAAMgRBBDUEPARDBCAAPwRABD4ERwQ1BDwEQwQsACAAQQQ+BEYE OAQwBDsETAQ9BDAETwQgAD8EQAQ+BD8EMAQzBDAEPQQ0BDAEIABEBD4EQAQ8BDgEQARDBDUEQgQg AEMEIAA7BE4ENAQ1BDkEIAA/BEAEMAQyBDgEOwRMBD0EPgQ1BCAAPgRCBD0EPgRIBDUEPQQ4BDUE IAA6BCAAPQQwBEAEOgQ+BEIEOAQ6BDAEPAQsACAAPwQ+BDsEPQQ+BDUEIAA/BD4EPQQ4BDwEMAQ9 BDgENQQgAD0EMAQ9BD4EQQQ4BDwEPgQzBD4EIAAyBEAENQQ0BDAEIAA4BCAAQQRCBD4EOQQ6BD4E NQQgAEEEPgQ/BEAEPgRCBDgEMgQ7BDUEPQQ4BDUEIAA7BE4EMQRLBDwEIABEBDAEOgRCBD4EQAQw BDwELAAgAEEEOgQ7BD4EPQRPBE4ESQQ4BDwEIAA6BCAAMQQ+BDsENQQ3BD0EOAQsACAAPAQ4BEAE PgQyBD4ENwQ3BEAENQQ9BEcENQRBBDoEOAQ5BCAAOAQ8BDwEQwQ9BDgEQgQ1BEIELgANACAAHQRD BCAAOAQgAD0EMAQ6BD4EPQQ1BEYELAAgADoEMAQ6BCAAPQRDBDYEPQQ+BCAAOwQ1BDMEMAQ7BDgE NwQ+BDIEMARCBEwEIAA4BDwENQQ9BD0EPgQgADAEOwQ6BD4EMwQ+BDsETAQ/ACAAGgRABD4EPAQ1 BCAAQQRCBEAEQwQ6BEIEQwRABEsEIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BDgEIAAyBEsESAQ1BCAA PQRDBDYEPQQ+BCAAQwRHBDUEQQRCBEwELAAgAEcEQgQ+BCAAMAQ7BDoEPgQzBD4EOwRMBCAATQRC BD4EIAA+BEcENQQ9BEwEIAA+BEEEPgQxBEsEOQQgAD0EMARABDoEPgRCBDgEOgQuACAAHgQ9BCAA PQQ1BCAAPwRABD4EQQRCBD4EIABHBEAENQQ3BDIESwRHBDAEOQQ9BD4EIAAyBEAENQQ0BDUEPQQg ADgEIABPBDQEPgQyBDgEQgQuACAAEgQgAEMEQQQ7BD4EMgQ4BE8ERQQgADMENQQ9BD4ERgQ4BDQE MAQgAEAEQwRBBEEEOgQ+BDMEPgQgAD0EMARABD4ENAQwBCAAQQQ+BCAAQQRCBD4EQAQ+BD0ESwQg ADwEOARABD4EMgQ+BDMEPgQgAD8EQAQwBDIEOARCBDUEOwRMBEEEQgQyBDAEIAA4BCAAPQQwBEgE NQQ5BCAAPwQ+BEcEQgQ4BCAAPwQ+BDMEPgQ7BD4EMgQ9BD4EOQQgADEEPgQ7BDUENwQ9BDgEIABA BDAENwQ7BDgERwQ9BD4EOQQgAEEEQgQ1BD8ENQQ9BDgEIABCBE8ENgQ1BEEEQgQ4BCwAIAAwBDsE OgQ+BDMEPgQ7BEwEIAA/BEAENQQ0BEEEQgQwBDIEOwRPBDUEQgQgACMEEwQgBB4EFwQjBCAAHQQQ BCYEGAQeBB0EEAQbBCwEHQQeBBkEIAARBBUEFwQeBB8EEAQhBB0EHgQhBCIEGAQhACEAIQAgAB8E PgQgADYENQRBBEIEPgQ6BD4EQQRCBDgEIAA4BCAAOgQ+BDsEOARHBDUEQQRCBDIEQwQgAEMEMQQ4 BEIESwRFBCAATQRCBD4EIAA+BEAEQwQ2BDgENQQgAEEEQAQwBDIEPQQ4BDwEPgQgAEEEIAA/BEAE PgQ/BDAEMwQwBD0ENAQ+BDkEIABBBDUEOgRBBDAEIAA4BCAAMAQxBD4EQARCBDAELAAgADAEIAA/ BD4EQgQ+BDwEQwQgADAEOwQ6BD4EMwQ+BDsETAQgAD0ENQQ+BDEERQQ+BDQEOAQ8BD4EIAA7BDUE MwQwBDsEOAQ3BD4EMgQwBEIETAQgAD0EMAQ4BDEEPgQ7BDUENQQgAEIESQQwBEIENQQ7BEwEPQQ+ BCAAOAQgAD8EQAQwBDIEOAQ7BEwEPQRLBDwEIAA+BDEEQAQwBDcEPgQ8BC4AIAAhBCAAQgQ+BEcE OgQ4BCAANwRABDUEPQQ4BE8EIABBBD4EMgRABDUEPAQ1BD0EPQQ+BDkEIABIBDoEMAQ7BEsEIAAy BEAENQQ0BD0EPgRBBEIEOAQgACIAOwQ1BDMEOgQ4BDUEIAA9BDAEQAQ6BD4EQgQ4BDoEOAQtAD0E MARABDoEPgRCBDgEOgQ4BCAAQQRABDUENAQ9BDUEOQQgAEIETwQ2BDUEQQRCBDgELQBCBE8ENgRR BDsESwQ1BCAAPQQwBEAEOgQ+BEIEOAQ6BDgEIgAsACAAMAQ7BDoEPgQzBD4EOwRMBCAAQAQwBEEE PwQ+BDsEMAQzBDAENQRCBEEETwQgADwENQQ2BDQEQwQgAEEEQAQ1BDQEPQQ4BDwEOAQgADgEIABC BE8ENgRRBDsESwQ8BDgEIAA9BDAEQAQ6BD4EQgQ4BDoEMAQ8BDgELAAgAD0EPgQgAEEEIABDBEcE UQRCBD4EPAQgAD0EMARGBDgEPgQ9BDAEOwRMBD0EPgQ5BCAAOgQwBEIEMARBBEIEQAQ+BEQESwQg ADwEPgQ2BDUEQgQgADEESwRCBEwEIABBBDwENQQ7BD4EIAA+BEIEPQQ1BEEEUQQ9BCAAOgQgAEAE MAQ3BEAETwQ0BEMEIABCBE8ENgRRBDsESwRFBCwAIAA9BD4EIAA9BDUEIAAyBCAAPwQ7BDAEPQQ1 BCAAOwQ1BDMEMAQ7BDgENwQwBEYEOAQ4BCgAPgQ9BCAAPAQ+BDYENQRCBCAAMQRLBEIETAQgADsE NQQzBDAEOwQ4BDcEPgQyBDAEPQQgADgEIAA6BDAEOgQgAD0EMARABDoEPgRCBDgERwQ1BEEEOgQ+ BDUEIAAyBDUESQQ1BEEEQgQyBD4EIABBBEAENQQ0BD0ENQQ5BCAAQgRPBDYENQRBBEIEOAQpACwA IAAwBCAAQQQgAEIEPgRHBDoEOAQgADcEQAQ1BD0EOARPBCAAMgQ9BDgEPAQwBD0EOARPBCAAOAQg ADoEPgQ9BEIEQAQ+BDsETwQgAEEEPgQgAEEEQgQ+BEAEPgQ9BEsEIAAzBD4EQQRDBDQEMARABEEE QgQyBDAELgAgABIEPgRCBCAAOgQ+BD0EOgRABDUEQgQ9BEsENQQgAEgEMAQzBDgELAAgADoEPgRC BD4EQARLBDUEIAA0BD4EOwQ2BD0EPgQgAD8EQAQ1BDQEPwRABDgEPQRPBEIETAQgADsETgQxBD4E NQQgADMEPgRBBEMENAQwBEAEQQRCBDIEPgQgAEEEIAA/BD4ENAQwBEcEOAQgAEEEMgQ+BDUEMwQ+ BCAAOwQ4BDQENQRABDAEKAA1BEEEOwQ4BCwAIAA6BD4EPQQ1BEcEPQQ+BCwAIAA+BD0EIABFBD4E RwQ1BEIEIABABDUEMgQ+BDsETgRGBDgEOAQgADgEIABBBEMENAQwBCAANwQwBCAAMwQ1BD0EPgRG BDgENAQgAEEEMgQ+BDUEMwQ+BCAAPQQwBEAEPgQ0BDAEKQA6AA0AMAApACAAHQQVBB4EEQQlBB4E FAQYBBwEHgQgACEEIAQeBCcEHQQeBCAAFwQQBBEEGwQeBBoEGAQgBB4EEgQQBCIELAQgADQENQRP BEIENQQ7BEwEPQQ+BEEEQgRMBCAAPQQ1BEEEOgQ+BDsETAQ6BDgERQQgAEIEQAQwBD0EQQQ9BDAE RgQ4BD4EPQQwBDsETAQ9BEsERQQgAD8EQAQ1BEEEQgRDBD8EPQRLBEUEIABBBD4EPgQxBEkENQRB BEIEMgQsACAAQAQ1BDAEOwQ4BDcEQwROBEkEOARFBCAAPwQ4BDIEPgQhACEAIQAgAC0EQgQ+BCAA PgQ7BDgEMwQ+BD8EPgQ7BDgETwQoADwEPgQ9BD4EPwQ+BDsEOARPBCAAMgQgAEgEOARABD4EOgQ+ BDwEIABBBDwESwRBBDsENQQpACAAPAQ4BEAEPgQyBD4EMwQ+BCAAPwRABDAEMgQ4BEIENQQ7BEwE QQRCBDIEMAQsACAATQRCBD4EIABCBD4EQgQgADEEMARABEsEMwQwBCwAIAA6BD4EQgQ+BEAESwQ5 BCAAPAQwBEEEQQQ+BDIEPgQgAD8EPgQ0BEEEMAQ2BDgEMgQwBDUEQgQgACIAPQQwBCAAOAQzBDsE QwQiACAAPQQwBEgEQwQgADwEPgQ7BD4ENARRBDYETAQhACAAGgRABD4EPAQ1BCAAQgQ+BDMEPgQs ACAAPQQwBCAAPwQ4BDIEPgQgAD8EQAQ4BEUEPgQ0BDgEQgRBBE8EIAA+BDoEPgQ7BD4EIAA/BD4E OwQ+BDIEOAQ9BEsEIAA/BD4EQgRABDUEMQQ7BE8ENQQ8BD4EMwQ+BCAAMAQ7BDoEPgQzBD4EOwRP BCAAMgQgAD8ENQRABDUEQQRHBFEEQgQ1BCAAPQQwBCAARwQ4BEEEQgRLBDkEIABNBEIEOAQ7BD4E MgRLBDkEIABBBD8EOARABEIELgAgABIEPgRCBCAAOgQ+BDwEPwQwBD0EOAQ4BCAAMAQ0BEEEOgQ+ BDMEPgQgAD4EQgRABD4ENARMBE8EIAA9BDAEIAA+BEEEQgRABDgENQQgADMENQQ9BD4ERgQ4BDQE MAQgAD0EMARIBDUEMwQ+BCAAPQQwBEAEPgQ0BDAEKAA/BD4ENAQ7BDUENgQwBEkEOAQ1BCAAPQQ1 BDwENQQ0BDsENQQ9BD0EPgQ5BCAAOAQ3BD4EOwRPBEYEOAQ4BCAAPgRCBCAAPgQxBEkENQRBBEIE MgQwBCAAOAQgAEAEMARBBEEEOwQ1BDQEPgQyBDAEPQQ4BE4EIAA4BEUEIAA0BDUETwRCBDUEOwRM BD0EPgRBBEIEOAQhACkAOgANACAAIAAtAC0AIAAaBDAEQAQ7BEEEMQQ1BEAEMwQgACgAQwBhAHIA bABzAGIAZQByAGcAKQANACAAIAAtAC0AIAAQBD0ERQRDBDkENwQ1BEAELQARBEMESQRMBCAAGAQ9 BBEETgQgACgAQQBuAGgAZQB1AHMAZQByAC0AQgB1AHMAYwBoACAASQBuAEIAZQB2ACkADQAgACAA LQAtACAAJQQwBDkEPQQ4BDoENQQ9BCAAKABIAGUAaQBuAGUAawBlAG4AKQANACAAIAAtAC0AIAAh BBAEEQQcBDgEOwQ7BDUEQAQgACgAUwBBAEIATQBpAGwAbABlAHIAKQANACAAIAAtAC0AIAAQBD0E MAQ0BD4EOwRDBCAALQREBDUEQQQgACgAQQBuAGEAZABvAGwAdQAgAEUAZgBlAHMAKQANADAEKQAg ACMEIAA6BD4EPAQ/BDAEPQQ4BDkELQBABDUEMAQ7BDgENwQwBEIEPgRABD4EMgQgADwEPgQ2BDUE QgQgADEESwRCBEwEIABABDAENwRABDUESAQ1BD0EOAQ1BCAAPQQwBCAAPwRABD4ENAQwBDYEQwQg ADAEOwQ6BD4EMwQ+BDsETwQgAEIEPgQ7BEwEOgQ+BCAAMgQ9BDUEIAAzBEAEMAQ9BDgERgQgAD0E MARBBDUEOwRRBD0EPQRLBEUEIAA/BEMEPQQ6BEIEPgQyBC4AIAAhBDgEQgRDBDAERgQ4BE8EIAA6 BD4EMwQ0BDAEIAA9BDAEQAQ6BD4EQgQ4BDoEOAQgAD8EQAQ+BDQEMAROBEIEQQRPBCAAQARPBDQE PgQ8BCAAQQQgAD8EQAQ+BDQEQwQ6BEIEMAQ8BDgEIAA/BDgEQgQwBD0EOARPBCAATQRCBD4EIAAy BD4EPwQ4BE4ESQQ4BDkEIAAzBDUEPQQ+BEYEOAQ0BCAAQQQ+BCAAQQRCBD4EQAQ+BD0ESwQgADME PgRBBEMENAQwBEAEQQRCBDIEMAQgAD8EPgQgAD4EQgQ9BD4ESAQ1BD0EOAROBCAAOgQgAEEEMgQ+ BDUEPARDBCAAPQQwBEAEPgQ0BEMELgAgABgEIABNBEIEPgQgAD0ENQQgAD8EQAQ+BEEEQgQ+BCAA QwQxBDgEOQRBBEIEMgQ+BCAAPQQ1BEEEOgQ+BDsETAQ6BDgERQQgAEIESwRBBE8ERwQgAD0EMAQg ABQEPgQ9BDEEMARBBEEENQQhACAALQRCBD4EIABDBDEEOAQ5BEEEQgQyBD4EIABCBEsEQQRPBEcE IABABEMEQQRBBDoEOARFBCAAGgQQBBYEFAQrBBkEIAAUBBUEHQQsBCEADQAxBCkAIAAfBEAEPgQ0 BDAEMgQwBEIETAQgADAEOwQ6BD4EMwQ+BDsETAQgAD0EQwQ2BD0EPgQgACIEHgQbBCwEGgQeBCAA OgQwBDoEIAA7BDUEOgQwBEAEQQRCBDIEPgQuACAAIgQ+BCAANQRBBEIETAQgADIEPQQ1BCAAMwQ+ BEAEPgQ0BEEEOgQ+BDkEIABHBDUEQARCBEsEIAA4BDsEOAQgADcEMAQgAEcENQRABEIEPgQ5BCAA OwROBDEEPgQzBD4EIAA/BD4EQQQ1BDsENQQ9BDgETwQgADAEOwQ6BD4EMwQ+BDsETAQgABQEHgQb BBYEFQQdBCAAMQRLBEIETAQgAEAENQQwBDsEOAQ3BD4EMgQwBD0EIAA9BDAEQAQ6BD4EPAQwBD0E MAQ8BC4AIAAUBDsETwQgAE0EQgQ+BDMEPgQgAD0EMARABDoEPgQ8BDAEPQQgADQEPgQ7BDYENQQ9 BCAANAQ+BDoEMAQ3BDAEQgRMBCwAIABHBEIEPgQgAD4EPQQgADEEPgQ7BDUEPQQsACAAPwRABD4E QQRCBEsEPAQgADwENQQ0BDgERgQ4BD0EQQQ6BDgEPAQgAD4EMQRBBDsENQQ0BD4EMgQwBD0EOAQ1 BDwEIAA4BDsEOAQgAD8EQAQ1BDQESgRPBDIEOAQyBCAAIgBBBDIEOAQ0BDUEQgQ1BDsETARBBEIE MgQ+BCAAPQQwBEAEOgQ+BDwEMAQ9BDAEIgAsACAAMAQgADQEPgQ3BDAEIAA0BD4EOwQ2BD0EMAQg AD4EPwRABDUENAQ1BDsETwRCBEwEQQRPBCAAOAQ3BCAAMAQ7BEwEQgQ1BEAEPQQwBEIEOAQyBD0E PgQ5BCAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgQ4BCAAOgRDBD8EOARCBEwEIAA8BD0EPgQzBD4EIAA4 BCAAPQQ1BDsENQQzBDAEOwRMBD0EPgQsACAAPQQ+BCAAMQQ1BDcEIAA/BD4ENQQ3BDQEOgQ4BCAA OgQgADMEQAQwBD0EOARGBDAEPAQgAD0EMARBBDUEOwRRBD0EPQQ+BDMEPgQgAD8EQwQ9BDoEQgQw BC4AIAAfBEAEOAQgAE0EQgQ+BDwEIAA0BD4EOwQ2BD0EMAQgADEESwRCBEwEIABDBDMEPgQ7BD4E MgQ9BDAETwQgAD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BEEEQgRMBCAANwQwBCAAPwRABD4ENAQw BDYEQwQgADgEOwQ4BCAAPwQ+BDQEMARABD4EOgQgAD0EMARABDoEPgRCBDgEOgQwBCAANwQ0BD4E QAQ+BDIEPgQ8BEMEIABHBDUEOwQ+BDIENQQ6BEMELAAgADQEMAQ2BDUEIAA1BEEEOwQ4BCAANQQ8 BEMEIAAxBD4EOwRMBEgENQQgADEAOABCBDgEIAA4BDsEOAQgADIAMQAzBD4EIAAzBD4ENAQwBC4A IAAdBEMENgQ9BD4EIAA/BEAEOAQ3BD0EMARCBEwEIABGBDUEPQQ9BD4EQQRCBEwEIABHBDUEOwQ+ BDIENQRHBDUEQQQ6BDgERQQgADcENAQ+BEAEPgQyBEwETwQgADgEIAA2BDgENwQ9BDgEIAAyBCAA GwQuBBEEHgQcBCAAEgQeBBcEIAQQBCEEIgQVBCEADQAyBCkAIAAjBDMEPgQ7BD4EMgQ9BDAETwQg AD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BEEEQgRMBCAANwQwBCAAPwRABD4EPwQwBDMEMAQ9BDQE QwQgADAEOwQ6BD4EMwQ+BDsETwQoAEAENQQ6BDsEMAQ8BEMEIAA4BDsEOAQgADwEMAQ9BDgEPwRD BDsETwRCBDgEMgQ9BD4ENQQgADgEPQREBD4EQAQ8BDgEQAQ+BDIEMAQ9BDgENQQtACAAQQQ8BD4E QgRABDgEQgQ1BCAAPQQ4BDYENQQpAC4AIAASBCAAQgQ+BDwEIABHBDgEQQQ7BDUEIAA9BEMENgQ9 BD4EIAA3BDAEPwRABDUEQgQ4BEIETAQgAD8EQAQ+BDQEMAQyBDAEQgRMBCAAPQQwBEAEOgQ+BEIE OARHBDUEQQQ6BDgENQQgADIENQRJBDUEQQRCBDIEMAQgADoEMAQ6BCAAPwRABD4ENARDBDoEQgRL BCAAPwQ4BEIEMAQ9BDgETwQgADIEPQRDBEIEQAQ4BCAAMwQ+BEAEPgQ0BDAELwBBBDUEOwQwBC4A IAAiBDAEMQQ7BDgERwQ6BDAEIAAiABQEPgQgADIAMQAgADMEPgQ0BDAEIAA9BDUEIAA/BEAEPgQ0 BDAEUQQ8BCIAIAA1BEEEQgRMBCAAPAQwBD0EOAQ/BEMEOwRPBEIEOAQyBD0EMARPBCAAPwRABD4E PwQwBDMEMAQ9BDQEMAQsACAAPQQwBD8EQAQwBDIEOwQ1BD0EPQQwBE8EIAA/BEAEPgRCBDgEMgQg AD0EMARIBDgERQQgADQENQRCBDUEOQQsACAAMwQ0BDUEIAAyBCAAQwQ8BD4EOwRHBDAEPQQ4BDgE IAAiAB8EPgRCBD4EPARDBCAARwRCBD4EIABCBEsEIAA9BDUEIAA0BD4EQAQ+BEEELAAgAD0EPgQg ADoEMAQ6BCAAQQRCBDAEPQQ1BEgETAQgADIENwRABD4EQQQ7BEsEPAQsACAAQQQ8BD4ENgQ1BEgE TAQgAD8EPgQ7BEMERwQ4BEIETAQgADgEIAAfBCAEEAQSBB4EKABCBD4EIAA1BEEEQgRMBCAAMgRL BEEEPgQ6BDgEOQQgAEEEQgQwBEIEQwRBBCkAIQAuAC4ALgAgAEIEQAQwBDIEOARCBEwEQQRPBCAA OwQ1BDMEMAQ7BEwEPQRLBDwEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQ8BCIALgAgABwEMAQ9BDgEPwRD BDsETwRCBDgEMgQ9BD4EOQQgAD8EQAQ+BD8EMAQzBDAEPQQ0BD4EOQQgADQEPgQ7BDYEPQQ+BCAA MQRLBEIETAQgAD8EQAQ4BDcEPQQwBD0EPgQgADsETgQxBD4ENQQgAD4EMQRBBEMENgQ0BDUEPQQ4 BDUEIAA9BDAEQAQ6BD4EQgQ4BDoEMAQgADEENQQ3BCAAPwRABDgENwQ9BDAEPQQ4BE8EIAA1BDME PgQgAD0EMARABDoEPgRCBDgEOgQ+BDwEIAA4BDsEOAQgADsEPgQ2BD0ESwQ1BCAANAQ+BDoEMAQ3 BDAEQgQ1BDsETARBBEIEMgQwBCwAIABHBEIEPgQgAD4EPQQgAD8EPgQ7BDUENwQ1BD0ELgANADME KQAgABcEMAQ/BEAENQRCBCAAPQQwBCAAQwQ/BD4EQgRABDUEMQQ7BDUEPQQ4BDUEIAA9BDAEQAQ6 BD4EQgQ4BDoEPgQyBCAAMgQgAD4EMQRJBDUEQQRCBDIENQQ9BD0ESwRFBCAAPAQ1BEEEQgQwBEUE KABCBDAEOgQ+BDUEIABDBD8EPgRCBEAENQQxBDsENQQ9BDgENQQgAEIEPgQ2BDUEIAA1BEEEQgRM BCAAPAQwBD0EOAQ/BEMEOwRPBEIEOAQyBD0EMARPBCAAPwRABD4EPwQwBDMEMAQ9BDQEMAQpAC4A DQA0BCkAIAAkBD4EQAQ8BDgEQAQ+BDIEMAQ9BDgENQQgAEEEPgRGBDgEMAQ7BEwEPQQ+BDkEIABA BDUEOgQ7BDAEPAQ+BDkEIAA9BDUEMwQwBEIEOAQyBD0EPgQzBD4EIAA+BDEEQAQwBDcEMAQgAD0E MARABDoEPgQ8BDAEPQQwBCAAQQRABDUENAQ4BCAAPAQ+BDsEPgQ0BDUENgQ4BC4AIAAdBDgEIAA+ BDQEOAQ9BCAAPAQ+BDsEPgQ0BD4EOQQgAEcENQQ7BD4EMgQ1BDoEIAA4BDsEOAQgADQENQQyBEME SAQ6BDAEIAA9BDUEIAA/BD4EOQQ0BFEEQgQgAD0EMAQgAEMEPwQ+BEIEQAQ1BDEEOwQ1BD0EOAQ1 BCAAQAQwBDQEOAQgADsETgQxBD4EPwRLBEIEQQRCBDIEMAQsACAAPwQ+BD0EOAQ8BDAETwQsACAA RwRCBD4EIAA9BDAEQAQ6BD4EPAQwBD0ESwQgAE0EQgQ+BCAAMQQ+BDsETAQ9BEsENQQsACAAQwQ9 BDgENgQ1BD0EPQRLBDUEIAA7BE4ENAQ4BCwAIABHBDAEQQRCBD4EIAA4BD0EMgQwBDsEOAQ0BEsE LAAgAD8EPgQ7BEMERwQwBE4ESQQ4BDUEIAA+BEIEIAA9BDAEQAQ6BD4EQgQ4BDoEMAQgADEEPgQ7 BDgELAAgADwEPQQ+BDMEPgQ6BEAEMARCBD0EPgQgAD8ENQRABDUEMgQ1BEgEOAQyBDAETgRJBDgE NQQgAEAEMAQ0BD4EQQRCBEwEIAA9BDAEQAQ6BD4EQgQ4BEcENQRBBDoEPgQzBD4EIAA+BD8ETARP BD0ENQQ9BDgETwQsACAAOAQgADIENQRBBEwEPAQwBCAAMQRLBEEEQgRABEMETgQgADwEQwRHBDgE QgQ1BDsETAQ9BEMETgQgAEEEPAQ1BEAEQgRMBC4ADQAgACIENQQgADYENQQgAD8EQAQ4BD0ERgQ4 BD8ESwQgAD8EQAQ4BDwENQQ9BDgEPARLBCAAOgQ+BCAAMgRBBDUEPAQgAD0EMARABDoEPgRCBDgE RwQ1BEEEOgQ4BDwEIAAyBDUESQQ1BEEEQgQyBDAEPAQgADEENQQ3BCAAOARBBDoEOwROBEcENQQ9 BDgETwQsACAAOgQ+BEIEPgRABEsENQQgADEENQQ3BDAEOwRMBEIENQRABD0EMARCBDgEMgQ9BD4E IAA0BD4EOwQ2BD0ESwQgADEESwRCBEwEIAA7BDUEMwQwBDsEOAQ3BD4EMgQwBD0ESwQgADIEIAA3 BDQEPgRABD4EMgQ+BDwEIAA+BDEESQQ1BEEEQgQyBDUEIQANACAAHAQeBBsEHgQUBBUEFgQsBCAA IAQjBCEEGAQhACAAHwQ+BEEEPAQ+BEIEQAQ4BEIENQQgAD0EMAQgAEEEQgQwBEAESAQ4BDUEIAA/ BD4EOgQ+BDsENQQ9BDgETwQsACAAPwQ+BEEEPAQ+BEIEQAQ4BEIENQQgAD0EMAQgAEIEPgQsACAA OgQwBDoEIAA+BD0EOAQgADcEMAQyBDgEQQRPBEIEIAA+BEIEIAAwBDsEOgQ+BDMEPgQ7BE8EIAA4 BCAAOgQwBDoEIAAzBD4EQgQ+BDIESwQgADcEMARJBDgESQQwBEIETAQgADUEMwQ+BCwAIAA9BDAE IAA4BEUEIAA8BEMERwQ1BD0EOARPBCAAOAQgAEMEPQQ4BDYENQQ9BDgETwQsACAANgQwBDsEOgRD BE4EIAA9BDUEPAQ+BEkETAQsACAAMQQ+BDsENQQ3BD0EOAQgADgEIABBBDwENQRABEIEOAQhACAA HQQwBCAAOARFBCAAPgRCBD0EPgRIBDUEPQQ4BDUEIAA0BEAEQwQzBCAAOgQgADQEQARDBDMEQwQg ADgEIAA6BCAAMgQwBDwELgAuAC4ADQAgACAAIAAXBBAEHwQeBBwEHQQYBCIEFQQtACAAEgQeBBcE IAQQBCEEIgQgAB0EFQQgAB8EEAQdBBAEJgQVBC8EIAAeBCIEIAATBBsEIwQfBB4EIQQiBBgEIAAY BCAAHQQVBBcEHQQQBB0EGAQvBCEAIQAhAA0ADQANAA0AIAAgACAAIAAgAEkAVgAgACAAIAAfBEAE PgQ/BDAEMwQwBD0ENAQwBC4AIAApBDgEQgQgADgEIAA8BDUERwQgADwEPgQ9BD4EPwQ+BDsEOAQ5 BC4ADQANACAAIAAgABoEMAQ6BCAAMgRLBCAANARDBDwEMAQ1BEIENQQsACAAPwQ+BEcENQQ8BEME IAA7BE4ENAQ4BCAAPwRMBE4EQgQgADAEOwQ6BD4EMwQ+BDsETAQ/ACAAIwQgAD0EOARFBCAANAQ1 BD8EQAQ1BEEEQQQ4BE8EIAA4BDsEOAQgAD4EPQQ4BCAARQQ+BEIETwRCBCAAPwQ+BEUEPgQ0BDgE QgRMBCAAPQQwBCAANARABEMEMwQ4BEUEPwAgABwEPgQ2BDUEQgQgADEESwRCBEwELAAgAD4EPQQ4 BCAARQQ+BEIETwRCBCAAQwQ8BDUEQAQ1BEIETAQgAD8EPgQxBEsEQQRCBEAENQQ1BD8AIAASBEEE UQQgAEIEQAQ4BDIEOAQwBDsETAQ9BD4ELAAgADsETgQ0BDgEIAA/BEwETgRCBCwAIAA/BD4EQgQ+ BDwEQwQgAEcEQgQ+BCAANwQ9BDAETgRCBCwAIABHBEIEPgQgAEIEMAQ6BD4ENQQgADAEOwQ6BD4E MwQ+BDsETAQuACAAFAQwBDYENQQgADUEQQQ7BDgEIAAxBEsEIAAyBCAAPgQxBEkENQRBBEIEMgQ1 BCAAMQRLBDsEIABABDAENwRABDUESARRBD0EPQRLBDkEIAAwBDsEOgQ+BDMEPgQ7BEwELAAgAD0E PgQgADsETgQ0BDgEIAA9BDUEIAA3BD0EMAQ7BDgELAAgAEcEQgQ+BCAANQQzBD4EIAA8BD4ENgQ9 BD4EIAA/BDgEQgRMBC0AIAA9BDgEOgRCBD4EIAAyBDUENARMBCAAPQQ1BCAAPwQ4BDsEIAAxBEsE LgAgACIEMAQ6BDgEPAQgAD4EMQRABDAENwQ+BDwELAAgADoEOwROBEcENQQyBDAETwQgAD8EQAQ4 BEcEOAQ9BDAEIABNBEIEPgQgAD8EQAQ+BD8EMAQzBDAEPQQ0BDAELAAgAD4EMQRLBEcEPQQwBE8E IABABDUEOgQ7BDAEPAQwBCAAOAQ7BDgEIAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4BDgEIAAyBEEETwQ6 BD4EMwQ+BCAAQAQ+BDQEMAQsACAAPwQ+BEEEOwQ1BCAAOgQ+BEIEPgRABEsERQQgAEcENQQ7BD4E MgQ1BDoEIAA3BD0EMAQ1BEIELAAgAEcEQgQ+BCAAQgQwBDoEPgQ1BCAAIgA/BDgEQgRMBCIALAAg ADgEIAA0BEMEPAQwBDUEQgQsACAARwRCBD4EIAA/BDgEQgRMBCAAMAQ7BDoEPgQzBD4EOwRMBCAA KAA4BDsEOAQgAEMEPwQ+BEIEQAQ1BDEEOwRPBEIETAQgADsETgQxBD4EOQQgADQEQARDBDMEPgQ5 BCAAPQQwBEAEOgQ+BEIEOAQ6BCkAIABNBEIEPgQgAEUEPgRABD4ESAQ+BC4AIAAhBCAAPwQ+BDwE PgRJBEwETgQgAD8EQAQ+BD8EMAQzBDAEPQQ0BEsEIAA8BD4ENgQ9BD4EIAA6BDAEOgQgADcEMARB BEIEMAQyBDgEQgRMBCAAPwQ4BEIETAQgAEYENQQ7BEsEOQQgAD0EMARABD4ENAQsACAAQgQwBDoE IAA4BCAANwQwBEEEQgQwBDIEOARCBEwEIAA/BEAEPgRCBEAENQQ3BDIENQRCBEwELAAgAEIEMAQ6 BDAETwQgAD8EQAQ+BD8EMAQzBDAEPQQ0BDAEIAAxBEMENAQ1BEIEIABDBDYENQQgAEEEPgRGBDgE MAQ7BEwEPQQ+BDkELAAgADoEMAQ6BCAAQwRBBEIEQAQwBD0ETwROBEkEMARPBCAAMgRABDUENAQu AA0AIAAgBDAEQQRBBDwEPgRCBEAEOAQ8BCAAPgRBBD0EPgQyBD0ESwQ1BCAAPAQ1BEUEMAQ9BDgE NwQ8BEsEIAA4BCAAQgQ1BEUEPQQ+BDsEPgQzBDgEOAQgAD8EQAQ+BD8EMAQzBDAEPQQ0BEsEIAA0 BDsETwQgADIESwRABDAEMQQ+BEIEOgQ4BCAAPAQ1BEUEMAQ9BDgENwQ8BD4EMgQgADcEMARJBDgE QgRLBCAAOAQgAD4ENwQ0BD4EQAQ+BDIEOwQ1BD0EOARPBCAAMwRABDAENgQ0BDAEPQQgADMEPgRB BEMENAQwBEAEQQRCBDIEPgQ8BC4AIAAhBDAEPAQ+BCAAPwQ+BCAAQQQ1BDEENQQgAD0EMARABDoE PgRCBDgENwQ4BEAEPgQyBDAEPQQ9BD4ENQQgAD4EMQRJBDUEQQRCBDIEPgQgADgEIABNBDoEPgQ9 BD4EPAQ4BDoEMAQgAD0ENQQgADIEIABBBD4EQQRCBD4ETwQ9BDgEOAQgAEEEMAQ8BD4EOAQ3BDsE NQRHBDgEQgRMBEEETwQsACAAMgQ1BDQETAQgADIEIABNBEIEPgQ8BCAAQQRDBEIETAQgADcEMAQy BDgEQQQ4BDwEPgRBBEIEOAQuACAAHgQxBDwEMAQ9BEsEMgQwBE8EIABBBDAEPAQgAEEENQQxBE8E LAAgAD0EMARABDoEPgQ8BDAEPQQgAD0ENQQgADwEPgQ2BDUEQgQgAD8EQAQ4BD0EOAQ8BDAEQgRM BCAAMAQ0BDUEOgQyBDAEQgQ9BEsENQQgAEAENQRIBDUEPQQ4BE8EIAAyBCAAPgRCBD0EPgRIBDUE PQQ4BDgEIABBBDIEPgQ1BDMEPgQgADsENQRHBDUEPQQ4BE8EIAAyBD8EOwQ+BEIETAQgADQEPgQg ADwEPgQ8BDUEPQRCBDAELAAgADoEPgQzBDQEMAQgADoEQgQ+BC0AOwQ4BDEEPgQgAD0ENQQgAD8E PgQ8BD4ENgQ1BEIEIAA1BDwEQwQgAD8EQAQ1BD4ENAQ+BDsENQRCBEwEIABNBEIEPgRCBCAAPgQx BDwEMAQ9BCAAOAQgAD0ENQQgADQEMARBBEIEIABDBDIENQRABDUEPQQ9BD4EQQRCBDgEIAAyBCAA QQQyBD4EOARFBCAAQQQ4BDsEMARFBC4AIAAhBCAAQgQ+BEcEOgQ4BCAANwRABDUEPQQ4BE8EIAA+ BDEESQQ1BEEEQgQyBDAELAAgADoEMAQ6BCAAPQQwBEAEOgQ+BDwEMAQ9BDAELAAgADUENAQ4BD0E QQRCBDIENQQ9BD0ESwQ5BCAAOgRCBD4EIAA8BD4ENgQ1BEIEIAA4BCAANAQ+BDsENgQ1BD0EIABN BEIEPgQgAEEENAQ1BDsEMARCBEwELAAgAD4EPwRPBEIETAQgADYENQQsACAAOgQwBDoEIABABD4E NAQ4BEIENQQ7BEwEIAA0BDsETwQgAEAENQQxBFEEPQQ6BDAELAAgAE0EQgQ+BCAAMwQ+BEEEQwQ0 BDAEQARBBEIEMgQ+BCAAOAQgADUEMwQ+BCAAOwQ4BDQENQRABEsELAAgADoEPgRCBD4EQARLBDUE IAA6BDAEOgQgADsEPgQ6BD4EPAQ+BEIEOAQyBCAANAQ+BDsENgQ9BEsEIAAyBEsEQgQwBEkEOARC BEwEIABBBDIEPgRRBCAAQwRCBD4EPwQwBE4ESQQ1BDUEIAAyBCAAMQQ+BDsEPgRCBDUEIAA9BDAE QAQ6BD4EQgQ4BDcEOARABD4EMgQwBD0EPQQ+BDUEIAA+BDEESQQ1BEEEQgQyBD4ELgAgABoEPgQ9 BDUERwQ9BD4ELAAgADIEQAQ1BDQEPQQwBE8EIAA/BEAEPgQ/BDAEMwQwBD0ENAQwBCAAPQQ1BCAA PgQzBEAEMAQ9BDgERwQ4BDIEMAQ1BEIEQQRPBCAAMAQ7BDoEPgQzBD4EOwQ1BDwEIAA4BCAAQQRC BEAEQwQ6BEIEQwRABDgEQAQ+BDIEMARCBEwEIAA1BFEEIAA8BD4ENgQ9BD4ELAAgADIEPgQtAD8E NQRABDIESwRFBCwAIAAyBCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgQ4BDgEIABBBD4EIABBBEIEQARD BDoEQgRDBEAEPgQ5BCAAPAQ+BD0EPgQ/BD4EOwQ4BDkELAAgAD8EPgRCBD4EPARDBCAARwRCBD4E IAA6BDAENgQ0BD4EOQQgADwEPgQ9BD4EPwQ+BDsEOAQ4BCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgRD BDUEQgQgAEEEMgQ+BDkEIAA9BDAEQAQ6BD4EQgQ4BDoELgAgAB8EQAQ4BEcEUQQ8BCwAIAA9BDUE OgQ+BEIEPgRABDAETwQgAD8EQAQ+BD8EMAQzBDAEPQQ0BDAEIAA8BD4ENgQ1BEIEIAAyBEAENQQ0 BDgEQgRMBCAAQQQwBDwEMAQgAD8EPgQgAEEENQQxBDUEIAAxBDUENwQgAD4EQAQzBDAEPQQ4BDcE MARGBDgEOAQgAD8EQAQ+BDQEMAQ2BCAARwQ1BDMEPgQtADsEOAQxBD4ELgAgAB0EMAQ/BEAEOAQ8 BDUEQAQsACAAPwRABD4EPwQwBDMEMAQ9BDQEMAQgAEEENQQ6BEEEMAQsACAAMwQ0BDUEIABBBDAE PAQgAEEENQQ6BEEEIAA+BDEESwRHBD0EPgQgAD0ENQQgAD8EQAQ+BDQEMARRBEIEQQRPBCAAOgQw BDoEOAQ8BDgELQA7BDgEMQQ+BCAAOgQ+BDwEPwQwBD0EOARPBDwEOAQgADgEOwQ4BCAAMwQ+BEEE QwQ0BDAEQARBBEIEMgQ+BDwELAAgAD0EPgQgAD8EQAQ4BCAATQRCBD4EPAQgADAEOgRCBDgEMgQ9 BD4EIAA/BD4EQgRABDUEMQQ7BE8ENQRCBEEETwQgAD4ENARDBEAEMARHBDUEPQQ9BEsEPAQ4BCAA PQQwBEAEOgQ+BDwEMAQ9BDAEPAQ4BC4AIAASBD4ELQAyBEIEPgRABEsERQQsACAAPAQ+BDYEPQQ+ BCAAQQRCBEAEQwQ6BEIEQwRABDgEQAQ+BDIEMARCBEwEIAAgADIEIABBBD4EPgRCBDIENQRCBEEE QgQyBDgEOAQgAEEEIABBBEMESQQ1BEEEQgQyBEMETgRJBDgEPAQ4BCAAPAQ1BEIEPgQ0BDAEPAQ4 BCAAPgQxBDwEMAQ9BDAELAAgAEIEMAQ6BCAAOgQwBDoEIAA/BEAEPgQ/BDAEMwQwBD0ENAQwBCAA PQQwBEAEOgQ+BEIEOAQ6BD4EMgQgADIEQQQ1BDMENAQwBCAANAQ+BDsENgQ9BDAEIAA+BDEEPAQw BD0EQwRCBEwEIABHBDUEOwQ+BDIENQQ6BDAELAAgADQEPgQ6BDAENwQwBEIETAQsACAARwRCBD4E IABDBD8EPgRCBEAENQQxBDgEQgRMBCAAOwRDBEcESAQ1BCwAIABHBDUEPAQgADEESwRCBEwEIABC BEAENQQ3BDIESwQ8BC4AIAAgBDAEQQRBBDwEPgRCBEAEOAQ8BCAATQRCBDgEIAA8BDUEQgQ+BDQE SwQ6AA0AIAAqACAAIAQ1BDoEOwQwBDwEMAQuAA0AIAAqACAAFAQ1BE8EQgQ1BDsETAQ9BD4EQQRC BEwELAAgAEEEPgQ/BEMEQgRBBEIEMgRDBE4ESQQwBE8EIAA/BEAENQQ0BDwENQRCBEMEIAA/BEAE PgQ/BDAEMwQwBD0ENARLBC4ADQAgACoAIAAeBDEEPAQwBD0EPQRLBDUEIAA6BD4EPQRGBDUEPwRG BDgEOAQgADgEIAA7BD4ENgQ9BDAETwQgAD0ENQQ+BDEERQQ+BDQEOAQ8BD4EQQRCBEwEIAAyBEsE MQQ+BEAEMAQuAA0AIAAqACAAHwRABD4EQQRCBD4EOQQgAD4EMQQ8BDAEPQQ9BEsEOQQgAEIENQQ3 BDgEQQQuAA0AIAAqACAAHwQ+BDQEPAQ1BD0EMAQgADgEIAA4BEEEOgQwBDYENQQ9BDgENQQgAD8E PgQ9BE8EQgQ4BDkELgAgABwENQRCBDAERAQ+BEAESwQuAA0AIAAqACAAHgQ/BDgEQQQwBD0EOAQ1 BCAAPwQ7BE4EQQQ+BDIEIAA4BCAAPAQ4BD0EQwRBBD4EMgQgAEIEMAQ6BCwAIABHBEIEPgQgAD8E OwROBEEESwQgAD8ENQRABDUEMgQ1BEgEOAQyBDAETgRCBC4AIAAXBDAEPAQwBDsERwQ4BDIEMAQ9 BDgENQQgADwEOAQ9BEMEQQQ+BDIELgANACAAKgAgABwEMAQ9BDgEPwRDBDsETwRGBDgEOAQgADEE NQRBBEEEPgQ3BD0EMARCBDUEOwRMBD0ESwQ8BC4AIAAdBBsEHwQgADgEIAAzBDgEPwQ9BD4ENwQu AA0AIAAqACAAGwRDBEcENQQyBD4ENQQgAD4EQARDBDYEOAQ1BC4ADQAgACAAIAAgACAAFAQ7BE8E IABCBD4EMwQ+BCAARwRCBD4EMQRLBCAAPwQ+BD0ETwRCBEwEIAA/BEAEOARABD4ENARDBCAAPwRA BD4EPwQwBDMEMAQ9BDQESwQgADgEIAA8BDUEQgQ+BDQESwQgADIEPgQ3BDwEPgQ2BD0EPgQ5BCAA NwQwBEkEOARCBEsEIAA+BEIEIAA9BDUEUQQsACAAQAQwBEEEQQQ8BDAEQgRABDgEMgQwBDUEPAQg AD8EPgQ0BEAEPgQxBD0EPgQgADoEPgQ9BDoEQAQ1BEIEPQRLBDUEIAA8BDUEQgQ+BDQESwQ6AA0A IAAgACAAKgAgACAENQQ6BDsEMAQ8BDAELgANACAAHgQxBEsERwQ9BDAETwQgAEAENQQ6BDsEMAQ8 BDAEIABPBDIEOwRPBDUEQgRBBE8EIAA/BEAEPgQ/BDAEMwQwBD0ENAQ+BDkEIAAyBCAAPwRABE8E PAQ+BDwEIABBBDwESwRBBDsENQQsACAAPwQ+BEIEPgQ8BEMEIABHBEIEPgQgAEAEMARBBD8EQAQ+ BEEEQgRABDAEPQRPBDUEQgQgADgENAQ1BDgEIAA4BCAARgQ1BD0EPQQ+BEEEQgQ4BCAAQQQgAD8E PgQ8BD4ESQRMBE4EIAA+BEEEMgQ1BEkENQQ9BDgETwQgADgERQQsACAAQQQ+BDcENAQwBD0EOAQ1 BDwEIAA4BD0EQgRABDgEMwQ4BCwAIAA/BEAEOAQ3BEsEMgQ+BDIEIAA6BCAAPwRABDgEPgQxBEkE NQQ9BDgETgQvAD8EQAQ4BD4EMQRABDUEQgQ1BD0EOAROBCwAIAA/BEAEOAQyBDsENQRHBDUEPQQ4 BDUEPAQgADIEPQQ4BDwEMAQ9BDgETwQsACAATwRABDoEPgQ5BCAAOAQgAEIEPgRHBD0EPgQ5BCAA PwQ+BDQEMARHBDUEOQQgADgEPQREBD4EQAQ8BDAERgQ4BDgEIAA+BCAAPwRABDUENAQ8BDUEQgQ1 BCgAPgRBBD0EPgQyBD0EPgQ8BCAAQgQ1BDcEOARBBDUELwBCBD4EMgQwBEAENQQvAEMEQQQ7BEME MwQ1BCkAIAA/BEAEPgQ/BDAEMwQwBD0ENARLBC4AIAAgBDUEOgQ7BDAEPAQwBCAAPQQ1BCAAQQRC BDAEMgQ4BEIEIABGBDUEOwRMBE4EIAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4BDgELAAgAD0EPgQgADwE PgQ2BDUEQgQgAEEEPgQ0BDUEQAQ2BDAEQgRMBCAAOARFBC4AIAAhBEIEMAQ9BDQEMARABEIEPQRL BDUEIABCBEAENQQxBD4EMgQwBD0EOARPBCAAOgQgAEAENQQ6BDsEMAQ8BDUEIABNBEIEPgQgADwE MAQ6BEEEOAQ8BDAEOwRMBD0EPgQ1BCAAQAQwBEEEPwRABD4EQQRCBEAEMAQ9BDUEPQQ4BDUEIAA4 BCAAQQQ+BDcENAQwBD0EOAQ1BCAAMQQ7BDAEMwQ+BD8EQAQ4BE8EQgQ9BD4EMwQ+BCAATQQ8BD4E RgQ4BD4EPQQwBDsETAQ9BD4EMwQ+BCAARAQ+BD0EMAQgADIEIAA+BEIEPQQ+BEgENQQ9BDgEOAQg AEAENQQ6BDsEMAQ8BDgEQARDBDUEPAQ+BDMEPgQuACAAIAQ1BDoEOwQwBDwEMAQgADAEOwQ6BD4E MwQ+BDsETwQsACAAQQQ1BDoEQQQwBCAAOAQgADAEMQQ+BEAEQgQ+BDIEIABBBD4ENAQ1BEAENgQw BEIEIAA6BEAEPgQ8BDUEIAAyBEEENQQzBD4EIAA/BEAEPgRHBDUEMwQ+BCAAPAQwBD0EOAQ/BEME OwRPBEYEOAQ4BCwAIABBBDoEQARLBDIEMAROBEkEOAQ1BCAAMgRABDUENAQ+BD0EPgRBBD0EPgRB BEIETAQuACAAGARBBD8EPgQ7BEwENwRDBE4EQgRBBE8EIAA9BDgENgQ1BD4EPwQ4BEEEMAQ9BD0E SwQ1BCAAPwRABDgEUQQ8BEsELgANACAAIAAgACoAIAAUBDUETwRCBDUEOwRMBD0EPgRBBEIETAQg AEEEPgQ/BEMEQgRBBEIEMgRDBE4ESQQwBE8EIAA/BEAENQQ0BDwENQRCBEMEIAA/BEAEPgQ/BDAE MwQwBD0ENARLBCwAIAA9BD4EIAA/BEAEOAQgAE0EQgQ+BDwEIAA9BDUEIABPBDIEOwRPBE4ESQQw BE8EQQRPBCAAPwRABE8EPAQ+BDkEIABABDUEOgQ7BDAEPAQ+BDkEKAA/BDgEMARABCkALgANACAA HgRBBD0EPgQyBD0EMARPBCAARgQ1BDsETAQtACAANAQ+BD0ENQRBBDUEPQQ4BDUEIAA4BD0ERAQ+ BEAEPAQwBEYEOAQ4BCwAIAA9BDUEMgQwBDYEPQQ+BCAAQQQgADoEMAQ6BD4EOQQgAD4EOgRABDAE QQQ6BD4EOQQoADYENQQ7BDAEQgQ1BDsETAQ9BD4ELAAgAE8EQQQ9BD4ENQQgADQENQQ7BD4ELAAg AEEEIAA/BD4ENwQ4BEIEOAQyBD0EPgQ5BCkALgAgABQEOwRPBCAAMAQ7BDoEPgQzBD4EOwRPBCAA TQRCBD4EIAA8BD4EMwRDBEIEIAAxBEsEQgRMBCAAPwRABDAENwQ0BD0EOAQ6BDgELAAgAD4EQQQy BDUESQQwBDUEPARLBDUEIAAhBBwEGAQsACAAOAQ7BDgEIABEBDgEOwRMBDwESwQsACAAQQQ+BD8E QAQ+BDIEPgQ2BDQEMAROBEkEOAQ1BEEETwQgAEMEPwQ+BEIEQAQ1BDEEOwQ1BD0EOAQ1BDwELAAg ADoEMAQ6BCAARwQ1BDwELQBCBD4EIAA9BD4EQAQ8BDAEOwRMBD0ESwQ8BCwAIAA6BD4EPQRGBDUE QARCBEsEIAA3BDIEUQQ3BDQEIAA4BDsEOAQgAD4EMQRJBDUEQQRCBDIENQQ9BD0ESwQ1BCAAPAQ1 BEAEPgQ/BEAEOARPBEIEOARPBC4AIAAfBDgEMARABCAAPAQ+BDYENQRCBCAAMQRLBEIETAQgADcE MAQ8BDAEQQQ6BDgEQAQ+BDIEMAQ9BCAAMgQgAD0EPgQyBD4EQQRCBE8ERQQsACAAQQQ+BD4EMQRJ BDUEPQQ4BE8ERQQgAD4EQgQgAE8EOgQ+BDEESwQgAEAENQQwBDsETAQ9BEsERQQgADsETgQ0BDUE OQQsACAAMgRLBDIENQRBBDoEMARFBCAAPQQwBEAEQwQ2BD0EPgQ5BCAAQAQ1BDoEOwQwBDwESwQg ADgEIAAwBEQEOARIBDAERQQsACAAMgQgAD8EQAQ+BEcEOARFBCAAOAQ9BEQEPgRABDwEMARGBDgE PgQ9BD0ESwRFBCAAPQQ+BEEEOARCBDUEOwRPBEUELgAgAB4EPQQgADwEPgQ2BDUEQgQgADEESwRC BEwEIABBBEQEPgRABDwEOARABD4EMgQwBD0EIAAyBCAANAQ1BE8EQgQ1BDsETAQ9BD4EQQRCBDgE IAA2BDgEMgRLBEUEIAA7BE4ENAQ1BDkELAAgAD0EMAQ/BEAEOAQ8BDUEQAQgADIEIAA/BEAENQQ0 BEEEQgQwBDIEOwQ1BD0EOARPBEUEIAAxBDAEQAQ8BDUEPQQ+BDIEIAA4BDsEOAQgAD8EPgQ7BEME PgQxBD0EMAQ2BDUEPQQ9BEsERQQgAEAEMAQ3BD0EPgRBBEcEOARGBCAAQgQ1BDoEOAQ7BEsELgAN ACAAIAAgACoAIAAeBDEEPAQwBD0EPQQwBE8EIAA6BD4EPQRGBDUEPwRGBDgETwQuAA0AIAAgBDAE QQQ/BEAEPgRBBEIEQAQwBD0ENQQ9BDgENQQgADoEMAQ6BDgERQQtADsEOAQxBD4EIAA7BD4ENgQ9 BEsERQQgADoEPgQ9BEYENQQ/BEYEOAQ5BCAAPAQ4BEAEPgRDBEEEQgRABD4EOQRBBEIEMgQwBCAA QQQgAEIENQQ8BCwAIABHBEIEPgQxBEsEIAA9BDAEMgRPBDcESwQyBDAEQgRMBCAAQAQwBEEEPwRA BD4EQQRCBEAEMAQ9BDUEPQQ4BDUEIABBBDIEPgQ4BEUEIAA4BDQENQQ5BC4AIAAdBDAEPwRABDgE PAQ1BEAELAAgADgENAQ1BE8EIABABDAENwQ0BDUEOwQ1BD0EOARPBCAAPAQ4BEAEMAQgAD0EMAQg AEcEUQRABD0EPgQ1BCAAOAQgADEENQQ7BD4ENQQgADgEIAA6BDAEQgQ1BDMEPgRABDgENwQwBEYE OARPBCAANwQ9BDAEPQQ4BE8EIAA6BDAEOgQgADgEQQRCBDgEPQQwBCAAOAQgADsEPgQ2BEwELgAg ACIEMAQ6BDAETwQgADoEPgQ9BEYENQQ/BEYEOARPBCAAMgQ1BDQEUQRCBCAAOgQgADsEPgQzBDgE RwQ9BD4EPARDBCAANwQwBD8EQAQ1BEIEQwQgADgEOwQ4BCAAQAQwBDcEQAQ1BEgENQQ9BDgETgQg AEcENQQzBD4EIAAxBEsEIABCBD4EIAA9BDgEIAAxBEsEOwQ+BC4AIAAYBCwAIAA6BDAEOgQgAEEE OwQ1BDQEQQRCBDIEOAQ1BCwAIAA3BDAEPwRABDUESQQwBE8EIAA9BDUEOwQ1BDMEMAQ7BEwEPQRL BDUEIAA9BDAEQAQ6BD4EQgQ4BDoEOAQsACAARAQ+BEAEPAQ4BEAEQwQ1BEIEQQRPBCAAPAQ+BEkE PQRLBDkEIAA/BD4ENAQ/BD4EOwRMBD0ESwQ5BCAAQARLBD0EPgQ6BCAAOAQgADwEPgQ9BD4EPwQ+ BDsEOARPBCwAIAAwBCAAQAQwBDcEQAQ1BEgEMARPBCAAMAQ7BDoEPgQzBD4EOwRMBCAAOAQgAD8E QAQ+BEcEOAQ1BCAAOwQ1BDMEMAQ7BEwEPQRLBDUEIAA9BDAEQAQ6BD4EQgQ4BDoEOAQsACAAQAQ1 BEgEMAQ1BEIEQQRPBCAANwQwBDQEMARHBDAEIAA0BDUEPwQ+BD8EQwQ7BE8ERgQ4BDgEIAA4BCAA QwQ9BDgERwRCBD4ENgQ1BD0EOARPBCAAMgRABDAEMwQwBCAARwRRBEAEPQRLBEUEIAAzBDsEPgQx BDAEOwQ4BEEEQgQ+BDIELQAgAD0EMARIBDUEOQQgACAEQwRBBDgELgANACAAHwRABD4EQgQ4BDIE PgQ/BD4EOwQ+BDYEPQQ+BEEEQgRMBCAATQRCBD4EOQQgADoEPgQ9BEYENQQ/BEYEOAQ4BCgAOgQw BDoEIAA9BD4EMgQwBE8EIAA6BD4EPQRGBDUEPwRGBDgETwQpAC0AIAA9BDUEQgQgAEcEUQRABD0E PgQzBD4EIAA4BCAAMQQ1BDsEPgQzBD4ELAAgADUEQQRCBEwEIABCBD4EOwRMBDoEPgQgAEEENQRA BD4ENQQuACAAIgQwBDoEOAQ8BCAAPgQxBEAEMAQ3BD4EPAQgADwEPgQ2BD0EPgQgADQEPgQ6BDAE NwQwBEIETAQgAEcENQQ7BD4EMgQ1BDoEQwQsACAARwRCBD4EIAA9BDUEQgQgAEAEMAQ3BD0EOARG BEsEIAA8BDUENgQ0BEMEIAA0BD4EMQRABD4EPAQgADgEIAA3BDsEPgQ8BCAAOAQgAEEEOgQ7BD4E PQQ4BEIETAQgAEcENQQ7BD4EMgQ1BDoEMAQgADoEIABBBDAEPARLBDwEIAA2BDUEQQRCBD4EOgQ4 BDwEIAA4BCAAMQQ1BEEERwQ1BDsEPgQyBDUERwQ9BEsEPAQgADQENQQ5BEEEQgQyBDgETwQ8BC4A IAAiBDAEOgQ+BDUEIABABDAENwQ8BEsEMgQwBD0EOAQ1BCAAPwRABDAEOgRCBDgEOgRDBDUEQgRB BE8ELAAgADoEIAA/BEAEOAQ8BDUEQARDBCwAIAAyBCAAQQRABDUENAQ1BCAAPAQwBEEEPgQ9BD4E MgQgADgEIABBBDAEQgQwBD0EOARBBEIEPgQyBC4AIAAeBD0EOAQgAD0ENQQgADQEPgQ7BDYEPQRL BCAAOAQ8BDUEQgRMBCAANgQwBDsEPgRBBEIEOAQgADoEIAAiAEAEMAQxBDAEPAQiACwAIAA6BD4E QgQ+BEAESwRFBCAAPAQ+BDYEPQQ+BCAAOAQgADQEMAQ2BDUEIAA9BEMENgQ9BD4EIAA0BDsETwQg ADsEQwRHBEgENQQzBD4EIABDBD8EQAQwBDIEOwQ1BD0EOARPBCAAMwRABDAEMQQ4BEIETAQgADgE IABDBDEEOAQyBDAEQgRMBC4ADQAgACEEMAQ8BEsENQQgAEAEMAQ3BD0ESwQ1BCAAOgQ+BD0ERgQ1 BD8ERgQ4BDgEIAA4BEEEPwQ+BDsETAQ3BEMETgRCBEEETwQgADQEOwRPBCAAPwRABDgEMgQ7BDUE RwQ1BD0EOARPBCAAMAQ0BDUEPwRCBD4EMgQgADIEIABBBDUEOgRCBEsELgAgAB4ENAQ9BDAEIAA4 BDcEIABGBDUEPQRCBEAEMAQ7BEwEPQRLBEUEIAA/BD4ENwQ4BEYEOAQ5BCAAMgQgADIENQRABEUE MARFBCAAMgQ7BDAEQQRCBDgEIABNBEIEPgQgADgENAQ1BE8EIABBBDAEQgQwBD0ESwQgADoEMAQ6 BCAAPQQwBEEEQgQ+BE8ESQQ1BDMEPgQgADEEPgQzBDAEIABBBDIENQRCBDAELAAgADgEAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAC CAAALggAADAIAABcCAAAXggAAGAIAABiCAAAZAgAAGYIAABoCAAAaggAAGwIAABuCAAAcAgAAHII AAB0CAAAdggAAHoIAAB8CAAAfggAAI4IAACQCAAAmAgAAJoIAACeCAAAoAgAAKIIAADv5NPL5MO6 r6SZjoqDeIqDbYNiV4piikyKg7oAAAAAAAAAAAAAAAAAFRVoeEJLABZoH0ZYAEIqC3BoADMAABUV aPlsPQAWaB9GWABCKgtwaACAAAAVFWgfRlgAFmgfRlgAQioJcGgAAIAAFRVo+Ww9ABZoH0ZYAEIq C3BoAFgAABUVaPlsPQAWaB9GWABCKgRwaDOZZgAMFWhDTjcAFmgfRlgAAAYWaB9GWAAAFRVo+i/c ABZoH0ZYAEIqCnBoADNmABUVaPov3AAWaB9GWABCKglwaAAAgAAVFWj5bD0AFmgfRlgAQioGcGj/ ZgAAFRVoEwepABZoH0ZYAEIqDXBoTQAAABEWaB9GWAA1CIFDShwAYUocAA4WaFtCdwBDSigAYUoo AAAOFmh2V+sAQ0ooAGFKKAAAIBVoH0ZYABZodlfrADUIgUIqCUNKKABhSigAcGgAAIAAABQVaHZX 6wAWaHZX6wBDSigAYUooAAAgFWgfRlgAFmh2V+sANQiBQioGQ0ooAGFKKABwaP8AAAAbAAYAAGAI AABiCAAAoAgAAKIIAACkCAAApggAALoIAAC8CAAAAAkAAIYLAABeDwAAvhEAAEYSAADEEgAADBMA AA4TAAAWEwAAIhMAAH4TAACAEwAAKhQAAPIUAADkFQAA+BUAABQWAAAWFgAA/QAAAAAAAAAAAAAA APUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAA AAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA8AAAAAAAAAAA AAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9 AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA6AAAAAAA AAAAAAAAAOgAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOgAAAAAAAAAAAAA AADoAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAHAAADJAFhJAFnZGc6 0gAABwAAAyQBYSQBZ2RHfFEAAAQAAGdkH0ZYAAAHAAADJAFhJAFnZB9GWAAAAQAAABoABgAAjhEC AP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAaIIAACkCAAA pggAAKgIAACqCAAAuggAALwIAAC+CAAA/AgAAP4IAAAACQAABgkAADIJAAA0CQAANgkAAEAJAABO CQAAVgkAAGgJAACYCQAAmgkAALYJAADICQAA6AkAAOoJAADsCQAAggoAAIYKAACICgAAjgoAAJIK AACUCgAA5goAAPbq2cq/t6uglKCQiZCJkImQiZCJkIl/d4mQa2RckFSQAAAAAA8DagAAAAAWaB9G WABVCAEOFmgfRlgAbUgJBHNICQQADBVo73YKABZoH0ZYAAAXFWiXLEcAFmgfRlgAPioBbUgJBHNI CQQPFWj1fZYAFmgfRlgANQiBEhVoEi5eABZoH0ZYADUIgT4qAQAMFWiVKXcAFmgfRlgAAAYWaB9G WAAAFxVoCEj/ABZoH0ZYADUIgUNKGgBhShoAFBVooi1iABZoH0ZYAENKGgBhShoAABcVaOFVowAW aB9GWAA1CIFDShoAYUoaAA4WaB9GWABDShwAYUocAAAUFWg+OZAAFmgfRlgAQ0ogAGFKIAAAHRVo EwepABZoH0ZYAEIqC0NKIABhSiAAcGgALAAAIBVo+Ww9ABZoH0ZYADUIgUIqC0NKIABhSiAAcGgA SAAAABcVaD45kAAWaB9GWAA1CIFDShwAYUocABEWaEd8UQA1CIFDShwAYUocAAAg5goAAOgKAADq CgAAIAsAACILAACGCwAAiAsAAAoMAAAMDAAAUAwAAFIMAABUDAAAVgwAAFgMAAAeDQAAIA0AACIN AAAkDQAARA0AAEYNAABIDQAASg0AAFINAABiDQAAZg0AAHgNAAB6DQAAfA0AAJoNAACcDQAAAg4A AAQOAAAIDgAACg4AAAwOAAA+DgAAQg4AAFAOAABSDgAAlg4AAJgOAADMDgAA2A4AAPTs4+zf1N/N 383G38Lfzd++3766377fvra+376yrqeXi4B3p65wrnCubAAABhZoMFAoAAAMFWgfRlgAFmi3RmkA ABEWaLdGaQA+KgFDShQAYUoUABQVaKhX7wAWaLdGaQBDShQAYUoUAAAXFWjEdIUAFmi3RmkAPioB Q0oUAGFKFAAfFWjEdIUAFmi3RmkAPioBQ0oUAGFKFABtSAkEc0gJBAwVaLdGaQAWaLdGaQAABhZo t0ZpAAAGFmhHfFEAAAYWaPAgggAABhZoJCHeAAAGFmg3XWAAAAYWaPE0MAAADBVo8TQwABZo8TQw AAAMFWgfRlgAFmgfRlgAABQVaB9GWAAWaB9GWABDSigAYUooAAAGFmgfRlgAABAVaL8S3AAWaB9G WAAwSg8AAA8DagAAAAAWaB9GWABVCAEVAgiBA2oAAAAABggBFmgfRlgAVQgBACrYDgAA2g4AAPIO AABQDwAAWg8AAFwPAABeDwAA0A8AALgQAADOEAAA7BAAAPYQAAAaEQAAVBEAAFYRAACgEQAAvBEA AEQSAAB8EgAAgBIAAIISAACSEgAAlhIAAKwSAACuEgAAxBIAAMYSAADUEgAA6BIAAAQTAAAGEwAA ChMAAAwTAAAOEwAAEhMAABYTAAAYEwAAGhMAABwTAAAeEwAAIhMAACQTAAAwEwAANBMAAHgTAAB6 EwAA+fXx7fHp5eHd4dnh3eHt1e3h0eHZ0dnR2eHZ1dnJwenZtquno6ejp5eMgXOBABoVaGZP8AAW aEd8UQA2CIE+KgFDShIAYUoSAAAUFWikZtcAFmhHfFEAQ0oSAGFKEgAAFBVopGbXABZoR3xRAENK FABhShQAABcVaOFVowAWaEd8UQA1CIFDShQAYUoUAAYWaGc60gAABhZoR3xRAAAUFWhnOtIAFmhH fFEAQ0oUAGFKFAAAFBVoZzrSABZoZzrSAENKFABhShQAAA8VaOFVowAWaJp+TgA1CIEPFWjhVaMA FmjdLMQANQiBBhZoaX/zAAAGFmhVIqIAAAYWaJp+TgAABhZoMFAoAAAGFmjdLMQAAAYWaPAgggAA BhZoH0ZYAAAGFmidGssAAAYWaLdGaQAABhZoNSOZAAAMFWg1I5kAFmg1I5kALXoTAAB8EwAAfhMA AIATAADQEwAA3BMAAOATAAAAFAAABBQAAAYUAAAKFAAADBQAABIUAAAoFAAAKhQAAPIUAAA8FQAA PhUAAOIVAADkFQAA+BUAABIWAAAUFgAAFhYAABwWAAAeFgAAkhYAAJYWAACsFgAA9e314dXhx+G+ tamgqb6VioKKgndzb3NnXWdVTQAAAAAAAAAAAAAPFWjSb7MAFmjSb7MANgiBDxVo0m+zABZoNBM8 ADYIgRIVaOFVowAWaAd/HwA1CIE2CIEADxVo0m+zABZoB38fADYIgQYWaJp+TgAABhZoZzrSAAAU FWi6VNYAFmhHfFEAQ0ocAGFKHAAADhZoR3xRAENKEABhShAAABQVaDU5VAAWaEd8UQBDShAAYUoQ AAAUFWjvdgoAFmhHfFEAQ0oSAGFKEgAAERZoVSKiADUIgUNKEABhShAAFxVopGbXABZoR3xRADUI gUNKEABhShAAERZoYzcoADUIgUNKEABhShAAERZoR3xRADUIgUNKEgBhShIAGhVo73YKABZoR3xR ADUIgT4qAUNKEgBhShIAABcVaO92CgAWaEd8UQA1CIFDShIAYUoSABcVaC81UwAWaEd8UQA1CIFD ShIAYUoSAA4WaEd8UQBDShIAYUoSAAAUFWgvNVMAFmhHfFEAQ0oSAGFKEgAcrBYAAMIWAADKFgAA 2hYAAOgWAADsFgAA7hYAAAIXAAAIFwAAOhcAAJgXAACwFwAAthcAAMoXAADaFwAA3BcAAPAXAADy FwAANBgAADYYAABAGAAAVhgAAFgYAABoGAAAahgAAGwYAAByGAAAdBgAAIAYAACYGAAAoBgAAKIY AACkGAAAqBgAAKoYAACwGAAAuhgAALwYAAC+GAAA3hgAAOQYAADwGAAAAhkAAC4ZAAA8GQAAcBkA AHwZAACIGQAAihkAAL4ZAADCGQAABhoAAA4aAABCGgAARBoAAIAaAACEGgAAthoAALgaAAAMGwAA GBsAAPry+vLt+vL68uXt4NvW2+3l8tHy5dHy0e3l+uXJxMnlxL+3xPLlr+Cnr+Wv5eCi4OXE5cTl +uWa5frl7QAAAAAPFWjSb7MAFmiHW2EANgiBCRZoFGuHADYIgQ8VaNJvswAWaCVu8gA2CIEPFWjS b7MAFmgHfx8ANgiBDxVo0WIxABZoUl/jADYIgQkWaNFiMQA2CIEJFmiGHBYANgiBDxVo0m+zABZo mWIQADYIgQkWaDBQKAA2CIEJFmhrQ+EANgiBCRZoukNsADYIgQkWaGAOCQA2CIEPFWjSb7MAFmg0 EzwANgiBCRZo0m+zADYIgQ8VaNJvswAWaNJvswA2CIEJFmiEZu0ANgiBADwWFgAAvBgAABgdAABS HgAAVB4AAKoeAACsHgAAjh8AAIoiAAAOKAAAyDEAABo5AADwPwAAoEYAAKJGAACkRgAApkYAAP5G AAAARwAATEoAAAhNAACcTQAAKE4AAFhOAACAUQAAslIAAORSAABEUwAANFQAAPoAAAAAAAAAAAAA AAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA+gAA AAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAA AAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA 8wAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAA AAAAAAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAA AAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAGdkhhwWAAAEAABnZPAgggAAHBgbAAAgGwAAIhsAADAb AAAyGwAAUBsAAGQbAABmGwAAbhsAAKAbAACiGwAApBsAAKwbAAC2GwAAuBsAAMAbAADCGwAAxBsA AAAcAAACHAAABBwAAAwcAAAWHAAAGhwAABwcAAAkHAAAMhwAAEYcAABIHAAAThwAAFIcAABUHAAA XhwAAGQcAABqHAAAjhwAAJIcAACUHAAAnBwAAJ4cAAC2HAAAzhwAABYdAAAYHQAAKh0AADYdAABU HQAAYh0AAGwdAACSHQAA9h0AABQeAAAeHgAA9/L36uX34PfY99P3y+DL6sv3y9jLw7vYu9i76rvD rcO78qijnqOeo5mP5ffq9+r3nveKqAAAAAAAAAAAAAAAAAkWaGAOCQA2CIESFWhSX+MAFmhnOtIA NQiBNgiBAAkWaGc60gA2CIEJFmgnYIoANgiBCRZo/UCSADYIgQkWaIYcFgA2CIEaFWgnYIoAFmgn YIoANQiBNgiBbUgJBHNICQQADxVo0m+zABZo8CCCADYIgQ8VaNJvswAWaIdbYQA2CIEPFWjSb7MA FmisM9kANgiBCRZoMFAoADYIgQ8VaNJvswAWaGYqrgA2CIEJFmjRYjEANgiBCRZo0m+zADYIgQ8V aNJvswAWaAd/HwA2CIEJFmiEZu0ANgiBDxVo0m+zABZoNBM8ADYIgQA0Hh4AAFAeAABSHgAAVB4A AF4eAABgHgAAZh4AAGgeAAB2HgAAeB4AAHoeAACoHgAAqh4AAKweAACGHwAAih8AAIwfAACOHwAA kh8AALIfAADcHwAA/h8AAAAgAABGIAAASCAAAJ4gAACgIAAA5CAAAAghAADGIQAA1CEAAIoiAACM IgAAjiIAAJAiAACuIgAAsCIAAM4iAACgIwAA9vHp4dXhycHhtqvhp6Obo5SQjIiMgYyBjH2MeYx1 jHFqZnFqYnEAAAYWaIdbYQAABhZoci4cAAAMFWisM9kAFmisM9kAAAYWaKwz2QAABhZo0nYlAAAG FmjRYjEAAAYWaDBQKAAADBVoPlJdABZoB38fAAAGFmjSb7MAAAYWaAd/HwAABhZoTA4sAAAMFWj2 RtgAFmj2RtgAAA4WaPZG2ABtSAkEc0gJBAAGFmj2RtgAAAYWaIYcFgAAFBVodlfrABZohhwWAENK HABhShwAABQVaGwhqAAWaIYcFgBDShwAYUocAAAOFmhsIagAQ0ocAGFKHAAAFxVoJW7yABZohhwW ADUIgUNKHABhShwAFhZohhwWAENKHABhShwAbUgJBHNICQQADhZohhwWAENKHABhShwAAA4WaNwh TgBDShwAYUocAAAJFmjwIIIANgiBEhVoUl/jABZohhwWADUIgTYIgSagIwAAuiMAALwjAADYIwAA 2iMAAOIjAADkIwAA5iMAADIkAAA0JAAANiQAAEwkAABSJAAAVCQAAGIkAABkJAAAZiQAAHAkAACW JAAAmCQAAJokAACcJAAAqiQAAMgkAADcJAAADCUAAA4lAAAuJQAAUCUAAHYlAAB6JQAAkiUAAMYl AADYJQAA2iUAANwlAADgJQAARiYAAEwmAABOJgAAoCYAAKImAACmJgAAqCYAALgmAAC6JgAAyiYA AMwmAADOJgAA3iYAAConAAA4JwAAPCcAAGAnAAB0JwAACigAAAwoAAAOKAAAECgAAD4oAABAKAAA aCgAAGooAAD8+Pz07OTd2d3R2c3Fzdm92c3Z9Pi5+LW5+Ln4ufyx/K38qbWpubX8tfz4ubW5tbn4 ufy5+Lmp+KX0uZ25nQ8VaIdbYQAWaIdbYQA1CIEGFmiiKwkAAAYWaNYzhwAABhZoNSOZAAAGFmga Iw0AAAYWaDBQKAAABhZoh1thAAAPFWigMPQAFmhoSccANQiBDxVooDD0ABZooDD0ADUIgQYWaKAw 9AAADxVoaEnHABZoaEnHADUIgQYWaGhJxwAADBVoaEnHABZoaEnHAAAPFWipU7EAFmhyLhwANQiB DxVoqVOxABZoVSKiADUIgQYWaFUiogAABhZorDPZAAAGFmhyLhwAPmooAABuKAAAdigAAH4oAACC KAAA4igAAOQoAAAkKQAAJikAACgpAAAqKQAAPikAAEApAABCKQAATCkAAFApAABmKQAAeCkAAIgp AACKKQAAjCkAAJApAACSKQAAlCkAALYpAADGKQAAyCkAAA4qAAAqKgAAdCoAAHYqAACcKgAA9ioA APgqAAD6KgAABCsAAAYrAAAOKwAAECsAABIrAAAUKwAAHCsAAB4rAABIKwAAVCsAAFYrAABYKwAA XisAAGIrAABkKwAAaCsAAGorAAB0KwAA8CsAAPn18e3x5fH18d7x1s/xz/HL8c+98cvP8bmx8a3x 5fHLpp7LjMuey57LpvHL8b3L8c/xz4jxAAAABhZoQk5+AAAjFWhoSccAFmhoSccANQiBQ0oUAE9K AwBRSgMAXkoDAGFKFAAPFWhoSccAFmhoSccANQiBDBVoaEnHABZoaEnHAAAGFmhmQDkAAA8VaAcq 0QAWaAcq0QA1CIEGFmgHKtEAABoWaGhJxwBDShQAT0oDAFFKAwBeSgMAYUoUAAAGFmhoSccAAAwV aLQxPwAWaLQxPwAADhZoQk5+AG1ICQRzSAkEAAwVaEJOfgAWaEJOfgAADxVotDE/ABZotDE/ADUI gQYWaKlTsQAABhZotDE/AAAGFmiHW2EAAAwVaIdbYQAWaIdbYQA18CsAAPIrAAAOLAAAECwAACYs AAAoLAAAMiwAAEIsAADmLAAA6CwAAP4sAAAALQAAVC0AAFYtAABaLQAAXC0AAMYtAADILQAA8C0A APQtAAD2LQAAAi4AAAQuAAAGLgAAEi4AAGguAABqLgAAeC4AAHouAACKLgAAjC4AAJQuAACWLgAA LC8AAEIvAABQLwAAUi8AAGQvAACYLwAAmi8AAKovAACsLwAAzC8AANwvAADeLwAA6C8AAOovAAD4 LwAA+i8AAPwvAAD+LwAAHDAAAGAwAACcMAAAnjAAAIYxAADGMQAA+fXu9e716vXm9eb14tri9dL1 zsfOx87D9bz1tPW09bz16vWw9aylrKWsoayhmqGapaGW9ZLDko4GFmhpf/MAAAYWaLdGaQAABhZo Qk5+AAAMFWhSctsAFmhSctsAAAYWaFJy2wAADBVoaEnHABZoaEnHAAAGFmhoSccAAAYWaNFiMQAA DxVoqVOxABZoqVOxADUIgQwVaFUiogAWaFUiogAABhZoqVOxAAAMFWg5ZJwAFmg5ZJwAAAYWaCRl MQAADxVotDE/ABZotDE/ADUIgQ4WaPQCIwBtSAkEc0gJBAAGFmj0AiMAAAYWaHIuHAAABhZoZkA5 AAAMFWj1cOUAFmj1cOUAAAYWaLQxPwAADBVoQk5+ABZoQk5+ADjGMQAAyDEAAAoyAAAyMgAARDIA AGAyAABiMgAAdjIAAIgyAADoMgAA+jIAAAwzAAAUMwAArDMAAMozAAAKNAAAHDQAAB40AAAkNAAA JjQAACg0AAAqNAAALDQAAGw0AACINAAArjQAAMo0AADQNAAA2DQAANo0AADkNAAA5jQAAFg1AABa NQAA/jUAAAA2AAAeNgAARDYAAG42AABwNgAAcjYAAH42AACANgAAgjYAAIQ2AACGNgAAkDYAAJI2 AACYNgAA5DYAAOY2AAAYNwAAGjcAAHI3AACwNwAA1DcAANg3AAC2OAAA/Pj0+PD47Ojs6Ozk7ODs 3OzY4Njg2Ozc7NjU2PDY7NTM1MzU9Mj0uvSyrrLI9KrI9KL0lvTIksiSAAAABhZo0m+zAAAXFWhS ctsAFmhSctsANQiBbUgJBHNICQQPFWhSctsAFmhSctsANQiBBhZoljX+AAAGFmhCTn4AAA4WaFJy 2wBtSAkEc0gJBAAaFmhSctsAQ0oUAE9KAwBRSgMAXkoDAGFKFAAABhZoZmIJAAAPFWiXL8YAFmiX L8YANQiBBhZoly/GAAAGFmgVb3cAAAYWaNZvdAAABhZoJGUxAAAGFmhyLhwAAAYWaNYzhwAABhZo ZkA5AAAGFmjaSswAAAYWaFJy2wAABhZot0ZpAAAGFmgwOaMAObY4AAC4OAAAGDkAABo5AABuOQAA fjkAAIo5AACeOQAAqDkAAKo5AACsOQAAsDkAAPA5AADyOQAACDoAAC46AAA2OgAAOjoAADw6AABS OgAAVDoAAHQ6AAAaOwAAHjsAAHA7AAB0OwAAhDsAAIg7AACMOwAAnDsAAKI7AACmOwAAHDwAADA8 AABAPAAARjwAAFA8AABSPAAA3DwAAN48AADqPAAA7DwAAPY8AABaPQAAaj0AALg9AAC8PQAAzj0A APY9AACWPgAABD8AABY/AAB4PwAAej8AAKQ/AADz7+vn3+fX58/nz+fP5+vn68jryOvnwOfA57y0 vOfA57DnsOew56yo56HnmeehlbyV542oiecGFmjRT1wAAA8VaDA5owAWaPM0awA+KgEGFmiiKwkA AA8VaPM0awAWaPM0awA1CIEMFWjzNGsAFmjzNGsAAAYWaDA5owAABhZo2krMAAAGFmiWNf4AAA8V aAYqnAAWaAYqnAA1CIEGFmgGKpwAAA8VaJY1/gAWaPM0awA1CIEMFWj5f3AAFmj5f3AAAA4WaPM0 awBtSAkEc0gJBAAPFWgGKpwAFmjzNGsAPioBDxVoBiqcABZo8zRrADUIgQYWaPM0awAABhZo+X9w AAAGFmjSb7MAABcVaNJvswAWaNJvswA1CIFtSAkEc0gJBAA2pD8AALQ/AADuPwAA8D8AAPI/AAAQ QAAAHEAAACRAAABQQAAAZEAAAGZAAAB2QAAAUEEAAOhBAAD+QQAAhEIAAIZCAACIQgAA1kIAANpC AADcQgAALEMAAC5DAABOQwAAaEMAAEREAABGRAAAhEQAAJZEAAA0RQAAXkUAAGBFAABkRQAAQkYA AERGAABSRgAAfkYAAIBGAACORgAAkEYAAJxGAACeRgAAoEYAAKJGAACmRgAAsEYAALRGAAC2RgAA ukYAALxGAADQRgAA4kYAAP5GAAD8+PHt/O387fzt/O3p5ent4fzt3e3d7fzt2e3V7fzV7c3IzcjN yM3Dzbuzq6OXs6uOs4azAAAAAA4WaOMrhgBDShwAYUocAAARFmhNTcgANQiBQ0ocAGFKHAAWFmhN TcgAQ0ocAGFKHABtSAkEc0gJBAAOFmidGssAQ0ocAGFKHAAADhZoTA4sAENKHABhShwAAA4WaHZX 6wBDShwAYUocAAAPFWi0MT8AFmjWb3QAPioDCRZoMDmjAD4qAQkWaNZvdAA+KgEPFWjWb3QAFmjW b3QAPioBBhZoN11gAAAGFmi6ItAAAAYWaEJOfgAABhZoJGUxAAAGFmiIc/wAAAYWaKIrCQAABhZo 1m90AAAMFWjzNGsAFmiHW2EAAAYWaPM0awAABhZoMDmjADT+RgAAAEcAAAZHAAAIRwAAHkcAAFhH AACeRwAAqEcAALpJAABISgAASkoAAExKAABQSgAAYkoAAI5KAACaSgAAnEoAAMhKAADsSgAADEsA AExLAAA8TAAAUEwAAK5MAAC2TAAADE0AABxNAACYTQAAoE0AAKJNAACmTQAArk0AALhNAADKTQAA 9E0AACROAAAsTgAALk4AAD5OAABUTgAAVk4AABBPAAAcTwAA1k8AAGJQAABkUAAACFEAAApRAAAM UQAADlEAAH5RAACAUQAAhFEAAIZRAACIUQAA+PHt8e3x7fHp8eXp3enZ7ent6dXp0enR6d3p8cnx venV6bnpyem96fHR8bWutaegtZyVkYqnAAAMFWgwSC8AFmgwSC8AAAYWaDBILwAADBVoZxUiABZo lDB/AAAGFmiufYMAAAwVaGcVIgAWaKkrlwAADBVoqSuXABZoqSuXAAAMFWhnFSIAFmhnFSIAAAYW aGcVIgAABhZohy8fAAAXFWjRT1wAFmiUMH8ANQiBQ0oaAGFKGgAPFWjRT1wAFmiUMH8ANQiBBhZo ikOGAAAGFmgGTDYAAAYWaMgGRgAADxVo0U9cABZolDB/AD4qAQYWaHZX6wAABhZolDB/AAAGFmiA HHwAAAwVaJQwfwAWaJQwfwAADhZoTA4sAENKHABhShwANohRAAD+UQAAAFIAAIhSAACuUgAAsFIA ALJSAAC0UgAAuFIAAOBSAADkUgAAQlMAAERTAACCUwAAhFMAAKpTAADMUwAAzlMAAN5TAAD2UwAA BFQAADBUAAAyVAAANFQAAHhVAACAVQAAmlUAAPJVAAAIVgAAHlYAACRWAABmVgAAaFYAAGBXAAB0 VwAAiFcAAIpXAACMVwAAGFgAABpYAABaWAAAZFgAAKZYAACoWAAACFkAAApZAAA2WQAAOFkAAK5Z AACwWQAAslkAALhZAAC6WQAA/PX87ebf19/83/zT/N/P/MjEwM/Az7n8xLXEscTX/Nf8xPyp/MTI /MSl9aX1pc+lnqWZjQAAAAAAAAAAAAAAAAAAAAAAABcVaC8fNQAWaC8fNQA1CIFtSAkEc0gJBAkW aK0rHAA1CIEMFWgvHzUAFmgvHzUAAAYWaC8fNQAADhZohBjCAG1ICQRzSAkEAAYWaD0l7QAABhZo 0wW+AAAMFWiEGMIAFmgwSC8AAAYWaIAcfAAABhZohBjCAAAMFWiEGMIAFmiEGMIAAAYWaMRSHwAA BhZolDB/AAAOFmgwSC8AbUgJBHNICQQADBVoMEgvABZoMEgvAAAMFWipK5cAFmgwSC8AAA8VaNFP XAAWaDBILwA1CIEMFWipK5cAFmipK5cAAAYWaDBILwA0NFQAANZUAAB4VQAAHlYAAGpWAACgVgAA PFcAAIxXAAAaWAAAPlgAAGRYAACyWQAA2m0AAMBvAAA+eAAAkn4AAIKEAABGiAAASIgAAEqIAABM iAAAnogAAKCIAADQiwAA1pMAAIKVAAAUlgAAMpYAAH6WAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAA AAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9 AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAA AAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAA AAD4AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAA AAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAA AAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAEAABnZBxzBAAAAQAAABy6WQAAvlkAAFZbAABYWwAAglsAAIRbAADi XAAA6lwAAOxcAADuXAAA+FwAAAhdAAAQXQAAIF0AAKZdAACoXgAAql4AAN5fAAAEYAAA1mAAAOJg AACmYQAAvGEAAHpiAAB8YgAAfmIAAFRjAABWYwAAdGMAAJBjAAAaZAAARGQAAGZkAAB+ZAAAkGQA AJxkAADKZAAAzGQAAGxlAABuZQAAoGUAAKJlAAAuZgAAfGYAAL5mAADuZgAABGcAAAxnAAB+ZwAA gmcAAMJoAAACaQAAiGoAAIpqAADQagAA0moAAABrAAACawAAgmsAAJBrAABabAAAXGwAAGhsAABw bAAAvGwAAL5sAADSbAAA1GwAALptAAC8bQAA+fXu9e716ubq5vXi5vXm3uba5tbm1ubSztLH0sPS 5trm2ua/zr/iv+K/u7/Ov7e/2r/Ov7C/sL/Ov7u/u7+7v7C/sL+wAAAADBVoHHMEABZoHHMEAAAG FmiKQ4YAAAYWaK0rHAAABhZoHHMEAAAGFmiDDNAAAAwVaDM9LwAWaDM9LwAABhZoqSuXAAAGFmgz PS8AAAYWaLotywAABhZowRxQAAAGFmjEUh8AAAYWaNFPXAAABhZotFs2AAAGFmjTBb4AAAwVaC8f NQAWaC8fNQAABhZoLx81AAAMFWgwSC8AFmgvHzUARbxtAADUbQAA1m0AANhtAADabQAAwG8AAMZv AADIbwAAzG8AAMBwAAAscQAALnEAAGZzAAC0cwAAUnYAAFR2AABWdgAAWHYAAA53AABAdwAAQncA AFJ3AABUdwAAwncAAMR3AAA8eAAAPngAAER4AABGeAAARnkAAH56AADOegAAFH0AACx9AAB8fQAA PH4AAD5+AABUfgAAVn4AAJB+AACSfgAA7H8AAO5/AAD8fwAADIAAAFyAAACCgAAAqoAAALyAAADu gAAA8IAAAPKAAAAIgQAACoEAAEKBAABEgQAARoEAAFyBAABegQAA/PX88e3o3PX82NTY0NjMyMzI 7cHtwcjY7fzoue21sbWxta2mraat7aLQotCinqLUopqTmpOaopOikwwVaK5CxQAWaK5CxQAABhZo rkLFAAAGFmixCDUAAAYWaNYYnAAADBVo0U9cABZo0U9cAAAGFmitKxwAAAYWaOEwFwAABhZoMz0v AAAPFWi4Q/MAFmi4Q/MANQiBDBVouEPzABZouEPzAAAGFmi5AtAAAAYWaIpDhgAABhZoxFMjAAAG FmjRT1wAAAYWaIdAmgAAFxVoHHMEABZoHHMEADUIgW1ICQRzSAkECRZorSscADUIgQYWaLhD8wAA BhZolDB/AAAMFWgccwQAFmgccwQAAAYWaBxzBAA6XoEAAB6CAABWggAAWIIAAGSCAABmggAAaIIA AJqCAACeggAAYoMAAHKDAAB4gwAAiIMAAJiDAACsgwAAtIMAAOyDAADugwAA8IMAAPyDAAAMhAAA FoQAAICEAACChAAA/IYAAP6GAAAChwAABIcAAPaHAAD4hwAARIgAAEaIAABIiAAASogAAEyIAABW iAAAXIgAAF6IAABiiAAAZIgAAHaIAAB4iAAAnogAAKCIAACiiAAApogAACKJAAD8+PH48fjt+O3p 7fjt+O345fjl+On4/OHZ0svHw8e8uLStpZmRpYWRepGly7TLAAAAAAAAAAAAABQVaE1NyAAWaMI8 VABDShwAYUocAAAXFWhNTcgAFmjCPFQANQiBQ0ocAGFKHAAOFmjCPFQAQ0ocAGFKHAAAFhZoTU3I AENKHABhShwAbUgJBHNICQQADhZoTA4sAENKHABhShwAAAwVaJQwfwAWaEwOLAAABhZoTA4sAAAG FmgvHzUAAAwVaBxzBAAWaBxzBAAABhZo4TAXAAAGFmiLUSsAAAwVaItRKwAWaItRKwAADBVorSsc ABZorSscAAAOFmitKxwAbUgJBHNICQQABhZorSscAAAGFmi1aP0AAAYWaIt/pwAABhZogxOuAAAM FWiDE64AFmiDE64AAAYWaLEINQAABhZo1hicAC4iiQAASIkAAHyKAACOigAA2ooAAASLAAAKiwAA zosAANKLAADUiwAAso0AAMaNAADWjQAA9I0AAGiOAABqjgAAoI4AAKKOAADgjgAAAI8AAHqPAACI jwAAnpAAAKKQAACkkAAAGpEAACqRAADWkQAAmpIAAF6UAABulAAAXJUAAF6VAAB+lQAAgJUAAKSV AACmlQAAGpYAAByWAAB6lgAAfJYAAEKXAABYlwAAqpgAAAKZAAAwmQAAlJkAAOiZAADqmQAA7JkA AMaaAADKmgAA2poAANyaAAD4mgAA9JsAAPabAAAmnAAAVJwAAKycAADInAAAwJ4AANCeAADSngAA 2J4AAOqeAADsngAAEp8AAB6fAAD89fH18fXt6fzp7ent6eXp4end6e3p2eHZ4dnV2e3Z8dnO2fzZ 5dnH2fzZw9nDv8PZw7jDsa3D3cO/w7/D5cPlw+XD4QAABhZoSgDTAAAMFWhKANMAFmhKANMAAAwV aBdPrAAWaBdPrAAABhZotWj9AAAGFmgXT6wAAAwVaPxNNgAWaPxNNgAADBVoPQBMABZo/E02AAAG FmiIdRoAAAYWaPxNNgAABhZobCSBAAAGFmiKQ4YAAAYWaGg0TQAABhZoi1ErAAAGFmhha98AAAYW aAYqnAAADBVoi1ErABZoi1ErAAAGFmg9AEwARH6WAAC8lwAAYpgAAASZAADsmQAAXJoAAMqaAABq mwAA9JsAANyjAAB+rAAAbLAAAKKwAAAAsQAAMrEAAGixAACqsQAATrQAACi5AADsvQAA1L4AAJ7B AADAwgAAesQAAPDEAADyxAAA9MQAAPbEAABMxQAATsUAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAA AAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0A AAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAA AAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAA AP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAA AAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAA AAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAdHp8AAGSfAAB2nwAAVqAAAIyhAACOoQAAnKEAAJ6h AADUoQAA1qEAANqjAADcowAA+qMAACakAAA0pAAANqQAAEakAABIpAAA1qUAABqmAAAspgAATKYA AHymAAC8pgAAwqYAAFKoAABmqAAAaKgAAGqoAADiqAAA5KgAAACqAACiqgAApKoAAM6qAADqqgAA QKsAAEKrAABEqwAA9KsAAParAAAkrAAAeqwAAHysAAB+rAAAgqwAAISsAADCrAAAxKwAAC6tAAD8 +Pz48fjx+O34/Pjj2ePLwfi9ub34san4pfjx+PH4oe2h7aH4oZm9lb2O+IaChoKGAAAAAAAAAAAA AAAGFmg7HPwAAA8VaDsc/AAWaDsc/AA1CIEMFWiQL6oAFmiQL6oAAAYWaLVo/QAADxVoWgCIABZo kC+qADUIgQYWaJAvqgAABhZolCHlAAAPFWgEPasAFmgEPasANQiBDxVoBD2rABZowF6IADUIgQYW aPQCIwAABhZoBiqcAAASFWhha98AFmjAXogANQiBPioBABoVaFoAiAAWaMBeiAA1CIE+KgFDShoA YUoaAAASFWhaAIgAFmgGKpwANQiBPioBABIVaFoAiAAWaMBeiAA1CIE+KgEABhZoaDRNAAAMFWjA XogAFmjAXogAAAYWaMBeiAAABhZoF0+sADEurQAAMq0AAGatAABqrQAAiK0AAMCtAADyrQAAAK4A AAyuAAAOrgAAEq4AACCuAAAirgAAMK4AAHyuAAAWrwAAGK8AAFKvAABqrwAAbK8AAIqvAADOrwAA 4q8AAPivAAD6rwAABLAAAAywAAAksAAAZLAAAGawAABssAAAiLAAAIqwAACgsAAAsrAAALawAADC sAAAxrAAANCwAADSsAAA1LAAAPywAAD+sAAACrEAABqxAAAcsQAAHrEAAC6xAAAwsQAAMrEAAD6x AABCsQAAULEAAFKxAABksQAA+vLt8ujy4/Lj8uPb4/LX09fyy8byvra+tr62vsbyrsunrsauxq7L p5+nrpfLp5+nkJeLl6efAAAAAAkWaEZSIQA1CIEMFWidPW4AFmg7HPwAAA8VaJ09bgAWaPE8hgA1 CIEPFWidPW4AFmidPW4AXAiBDBVonT1uABZonT1uAAAPFWidPW4AFmg7HPwANQiBDxVoYzcoABZo Oxz8ADUIgQ8VaGM3KAAWaJ09bgA1CIEJFmidPW4ANQiBDxVonT1uABZonT1uADUIgQYWaGM3KAAA BhZoOxz8AAAPFWhjNygAFmhjNygANQiBCRZoYzcoADUIgQkWaGFr3wA1CIEJFmg7HPwANQiBDxVo Oxz8ABZoOxz8ADUIgQkWaA59OgA1CIEANmSxAABmsQAAaLEAAHKxAAB6sQAAirEAAIyxAACOsQAA prEAAKixAACqsQAAsLEAALKxAAC0sQAA3rEAAPSxAAAysgAAQrIAAHyyAAD+swAATLQAAIa0AACS tAAAOrUAAEa1AAB+tQAAJrYAAES2AABGtgAAdLYAAHa2AAAitwAAPrcAAHy3AAD8twAACLgAANy4 AADguAAA4rkAAOS5AAAAugAABroAADy6AADEugAAxroAANC6AADkugAA5roAABC7AAASuwAAUrsA AJS7AAC2uwAAuLsAAPny6uLq4vna+erW0tbK1tLWytbC1rrWtta2squyq7anttaj1qPWn5vWo9aU 1raNto22sraNAAAAAAAAAAAAAAAAAAwVaOkgKAAWaOkgKAAADBVokC+qABZokC+qAAAGFmiHLx8A AAYWaMBuKgAABhZoaDRNAAAGFmjRYjEAAAwVaGowbgAWaGowbgAABhZoajBuAAAGFmjpICgAAA8V aMBuKgAWaJAvqgA1CIEPFWhsJIEAFmiQL6oANQiBDxVoWTFFABZokC+qAD4qAQYWaFkxRQAABhZo kC+qAAAPFWidPW4AFmidPW4AXAiBDxVonT1uABZonT1uADUIgQ8VaJ09bgAWaPE8hgA1CIEMFWid PW4AFmjxPIYAAAwVaJ09bgAWaJ09bgA1uLsAAEq8AAB6vAAAwLwAAMK8AADGvAAAyLwAAHq9AACc vQAAqr0AAMi9AADqvQAA7L0AAGC+AABivgAAhr4AAM6+AADQvgAA1L4AAMy/AADOvwAAWMEAAGbB AABCwgAAYsIAAMDCAABCwwAARMMAAHrEAAB+xAAAgMQAALbEAAC4xAAA4sQAAOTEAADwxAAA8sQA APbEAAAAxQAABMUAAPfv9+jk4OTc2Nzk1OTg0OTg5MzIzMTMvMy4tLiwqaGcoZehj4d8bQAAAAAA AAAAAAAAAAAAAAAAAAAcFWhsJIEAFmhNTcgAQ0oeAGFKHgBtSAkEc0gJBAAUFWhsJIEAFmixDCQA Q0oeAGFKHgAADhZohy8fAENKHABhShwAAA4WaMI8VABDShwAYUocAAAJFmhZMUUANQiBCRZopX7l ADUIgQ8VaFkxRQAWaFkxRQA1CIEMFWhZMUUAFmhZMUUAAAYWaKV+5QAABhZoK0QIAAAGFmhZMUUA AA8VaLpcpgAWaLpcpgA+KgEGFmhjNygAAAYWaGg0TQAABhZoulymAAAGFmhqMG4AAAYWaJAvqgAA BhZowG4qAAAGFmjRYjEAAAYWaIpDhgAABhZo6SAoAAAMFWjpICgAFmjpICgAAA8VaMBuKgAWaNFi MQA2CIEPFWjAbioAFmjpICgANgiBACcExQAABsUAAArFAAAMxQAAHsUAACDFAAAixQAAJMUAAEjF AABMxQAAdMUAACLGAAAkxgAAOsYAADzGAABkxgAAZsYAAJLGAACUxgAArMYAALbGAADOxgAA3sYA AMjIAADKyAAA0sgAANTIAAD8yAAAXskAAIDKAACKygAAlMoAAKDKAACiygAApMoAAKbKAACSywAA lssAAEDMAABIzAAAAM0AAD7OAABAzgAAys4AAMzOAACIzwAAks8AAADRAAAU0QAA7tIAAPXq3tPI 9cjT9cG9ub25vbW9ub2pvZ69wb3BvZq9lpK9jr2KvYa9kr2CmoK5gn6CkoIAAAAGFmgZDwMAAAYW aEMy7gAABhZoGmqAAAAGFmhschIAAAYWaLl0KgAABhZoikOGAAAGFmgQI5MAAAYWaBwUHAAAFBVo Dn06ABZosQwkAENKGgBhShoAABcVaA59OgAWaLEMJAA+KgFDShoAYUoaAAYWaKRcawAABhZoK0QI AAAGFmixDCQAAAwVaLEMJAAWaLEMJAAAFBVobCSBABZo0kLkAENKHgBhSh4AABQVaGwkgQAWaMI8 VABDSh4AYUoeAAAXFWhsJIEAFmjCPFQANQiBQ0oeAGFKHgAUFWhsJIEAFmixDCQAQ0oeAGFKHgAA FBVobCSBABZodlfrAENKHgBhSh4AMU7FAACiygAAHNUAADTVAACc1QAABtYAADzWAACQ1gAAMNcA AIzXAACy1wAAptgAAMLYAACi3QAAbt4AAKziAADe4gAA2OYAABjqAABYMQEADjcBAEg3AQBmOgEA QjsBAEpBAQCiQQEAOksBAKRTAQD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAA AAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAA AAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAA AAAAAAD4AAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA 7gAAAAAAAAAAAAAAAO4AAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAA AAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAA AAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAGdkuXQqAAAEAABn ZClCRQAABAAAZ2TxNDAAAAEAAAAb7tIAAGTTAAB60wAAfNMAAH7TAADq0wAArtQAAO7UAAAY1QAA GtUAABzVAAAi1QAAMNUAADTVAABS1QAAVNUAAJzVAACi1QAArtUAALLVAADE1QAAAtYAAAbWAABQ 1gAAaNYAAHrWAACO1gAAAtcAAC7XAAA21wAAbtcAAIrXAACM1wAAstcAALrXAAAM2AAAENgAAIDY AACi2AAAptgAAKzYAACw2AAAstgAAL7YAADA2AAAwtgAADDZAAA82QAA/Pj8+Pz49Pjt6eXh5fjd +PzZ1dnV/PjR+M34yfj8xfj8wb25vbGqwb2ckIV9yXkAAAAGFmiKQ4YAAA4WaEZu/ABDShoAYUoa AAAUFWiWWk0AFmjxNDAAQ0oaAGFKGgAAFxVollpNABZo8TQwAD4qAUNKGgBhShoAGhVollpNABZo 8TQwADUIgT4qAUNKGgBhShoAAAwVaPE0MAAWaPE0MAAADxVoHG7lABZo8TQwADUIgQYWaLl0KgAA BhZo8TQwAAAGFmgcbuUAAAYWaKZeSgAABhZoKUJFAAAGFmjIIhIAAAYWaI1/8gAABhZoey/IAAAG FmhpKL4AAAYWaCtECAAABhZohmwmAAAGFmgffuAAAAYWaLEMJAAADBVohy8fABZoQzLuAAAGFmgc FBwAAAYWaEMy7gAABhZohy8fAC882QAAPtkAAETZAACW2QAAqNkAALLZAADY2QAABNoAAAbaAAAe 2gAANtoAADraAABW2gAAWtoAAGjaAAB82gAAotoAAMjaAADK2gAA1toAANjaAAD82gAA/toAAMLb AAD62wAAoN0AAKLdAACo3QAArN0AAK7dAAAI3gAAXt4AAGDeAABo3gAAat4AAGzeAABu3gAABN8A ABjfAACE3wAAqN8AAP7fAAAs4AAAhuAAAMLgAADE4AAA0uAAANbgAADs4AAA7uAAAC7hAAAy4QAA /Pj89Pzw/On89OX0/PT89Pzp/On89Pzh/PTd/M/Dt6udq5aS/I783fzd/IqGgoaChoKGAAYWaFY0 QgAABhZoQGygAAAGFmgrRAgAAAYWaBY9KAAABhZoRm78AAAMFWgcbuUAFmgpQkUAABoVaEZu/AAW aClCRQA1CIE+KgFDShoAYUoaAAAXFWhGbvwAFmiWWk0APioBQ0oaAGFKGgAXFWhGbvwAFmgpQkUA PioBQ0oaAGFKGgAXFWiWWk0AFmgpQkUAPioBQ0oaAGFKGgAaFWiWWk0AFmgpQkUANQiBPioBQ0oa AGFKGgAABhZoHG7lAAAGFmj6VacAAAYWaBkPAwAADBVoKUJFABZoKUJFAAAGFmjEd/YAAAYWaPE0 MAAABhZoikOGAAAGFmgpQkUAMzLhAABi4QAArOEAAK7hAACq4gAArOIAALLiAAC24gAAuOIAANri AADc4gAA3uIAAKbjAAC64wAAdOQAAHbkAAD65QAANOYAANbmAAAa5wAAROcAACLpAAA86QAAfOkA AH7pAACI6QAAiukAABbqAAAY6gAApOoAALbqAADG6gAAyuoAANjqAADa6gAAVOsAAAAwAQBWMQEA WDEBACoyAQC6MgEA4DIBAOIyAQAsMwEALjMBAEA1AQBCNQEA9DUBAPY1AQBiNgEAZDYBAAw3AQAO NwEAFDcBABg3AQD8+Pz49PDs3tLszuzK7MbswuzCvsK+wrfCt8LswrPCs8KzwrHC7K2zraatprOf s5izmLOf8JQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhZohmwmAAAMFWgqDrMAFmijMqkAAAwVaKMy qQAWaKMyqQAADBVoKg6zABZoL3kWAAAGFmgveRYAAANVCAEGFmijMqkAAAwVaCoOswAWaCoOswAA BhZo+lWnAAAGFmgqDrMAAAYWaPwwHgAABhZo9AIjAAAGFmhGbvwAABcVaJZaTQAWaLl0KgA+KgFD ShoAYUoaABoVaJZaTQAWaLl0KgA1CIE+KgFDShoAYUoaAAAGFmi5dCoAAAYWaBxu5QAABhZoKUJF AAAGFmhAbKAAAAYWaFY0QgA2PQRCBDUEOwQ7BDUEOgRCBDAEIAA4BCAAQQQyBD4EMQQ+BDQESwQs ACAAOgQ+BEIEPgRABD4EPARDBCAATwQ6BD4EMQRLBCAAOAQgAD0EQwQ2BD0EPgQgAD8EPgQ6BDsE PgQ9BE8EQgRMBEEETwQsACAAPQQ1BEEEPAQ+BEIEQARPBCAAPQQwBCAAQgQ+BCwAIAA6BCAARwQ1 BDwEQwQgAD4EPQQgAD8EQAQ4BDcESwQyBDAENQRCBC4AIAAtBEIEPgQsACAAPwQ+BCAAQQRDBEIE OAQsACAAMwRABDAEPQQ0BDgEPgQ3BD0ESwQ5BCAAPgQxBDwEMAQ9BD0ESwQ5BCAAQgQ1BDcEOARB BCwAIAAyBEsEQAQwBDYENQQ9BD0ESwQ5BCAAMgQgAEAENQQ7BDgEMwQ4BD4ENwQ9BD4EOQQgADoE PgQ9BEYENQQ/BEYEOAQ4BC4ADQAgAB4ENAQ9BD4EOQQgADgENwQgAD8EPgQ/BEMEOwRPBEAEPQRL BEUEIAA+BDEEPAQwBD0EPQRLBEUEIAA6BD4EPQRGBDUEPwRGBDgEOQQgAE8EMgQ7BE8ENQRCBEEE TwQgADcEMAQ8BDUEPQQwBCAAPwRABDgERwQ4BD0ESwQgAEEEOwQ1BDQEQQRCBDIEOAQ1BDwEIAA4 BCAAOwQ+BDYEPQQwBE8EIAA6BD4EQARABDUEOwRPBEYEOARPBC4AIAAdBDAEPwRABDgEPAQ1BEAE LAAgAEEEPgQ/BD4EQQRCBDAEMgQ7BE8ETwQgAEMEPwQ+BEIEQAQ1BDEEOwQ1BD0EOAQ1BCAAMAQ7 BDoEPgQzBD4EOwRPBCAAOAQgAEIEQARDBDQEKAA4BCAANwQwBDwENQQ9BE8ETwQgAD8EQAQ4BEcE OAQ9BEMEIABBBDsENQQ0BEEEQgQyBDgENQQ8BCkALAAgAEMEQgQyBDUEQAQ2BDQEMAQ1BEIEQQRP BCwAIABHBEIEPgQgACIAPwRMBE4ESQQ4BDUEIAAxBD4EOwRMBEgENQQgAEAEMAQxBD4EQgQwBE4E QgQgADgEIAA3BDAEQAQwBDEEMARCBEsEMgQwBE4EQgQiACwAIABFBD4EQgRPBCAAPQQwBCAAQQQw BDwEPgQ8BCAANAQ1BDsENQQsACAAOgQ+BD0ENQRHBD0EPgQgADYENQQsACAAPQQwBD4EMQQ+BEAE PgRCBCgARwQ1BDwEIAAxBD4EOwRMBEgENQQgAEAEMAQxBD4EQgRLBCwAIABCBDUEPAQgADEEPgQ7 BEwESAQ1BCAAQwRBBEIEMAQ7BD4EQQRCBDgELAAgAEEEQgRABDUEQQRBBD4EMgQgADgEIABBBDoE OwQ+BD0EPQQ+BEEEQgQ4BCAAOgQgAD0EMARABDoEPgRCBDgEOgQwBDwEKQAuACAAGwQ+BDYEPQQw BE8EIAA6BD4EQARABDUEOwRPBEYEOARPBCAAPgQ/BEAENQQ0BDUEOwRPBDUEQgQgADIEIABNBDoE PgQ9BD4EPAQ4BDoENQQgAE8EMgQ7BDUEPQQ4BDUELAAgAD8EQAQ4BCAAOgQ+BEIEPgRABD4EPAQg ADoEMAQ2BEMESQQwBE8EQQRPBCAAQQQyBE8ENwRMBCAAPAQ1BDYENARDBCAANAQyBEMEPARPBCAA MgQ1BDsEOARHBDgEPQQwBDwEOAQoADIEIABGBDgERARABDAERQQpACAAPQQwBCAAQQQwBDwEPgQ8 BCAANAQ1BDsENQQgAD0ENQQgAE8EMgQ7BE8ENQRCBEEETwQgAEIEMAQ6BD4EMgQ+BDkEOwAgAD4E PQQ4BCAAPgQxBDUEIAA3BDAEMgQ4BEEETwRCBCAAPgRCBCAAQgRABDUEQgRMBDUEOQQgADIENQQ7 BDgERwQ4BD0ESwQuACAAHQQwBD8EQAQ4BDwENQRABCwAIABDBEIEMgQ1BEAENgQ0BDAENQRCBEEE TwQoADIEIAA/BD4EOwRMBDcEQwQgADoEQwQ7BEwEQgQwBCAANAQ1BD0ENQQzBCkALAAgAEcEQgQ+ BCAAIgAyBCAAMQQ+BDMEMARCBEsERQQgADgEIABABDAENwQyBDgEQgRLBEUEIABBBEIEQAQwBD0E MARFBCAAPQQ4BDYENQQgAEMEQAQ+BDIENQQ9BEwEIAA/BEAENQRBBEIEQwQ/BD0EPgRBBEIEOAQi ACwAIABFBD4EQgRPBCAAPQQwBCAAQQQwBDwEPgQ8BCAANAQ1BDsENQQgADgEIABCBD4EIAA4BCAA NARABEMEMwQ+BDUEIAA3BDAEMgQ4BEEEOARCBCAAMgQgADEEPgQ7BEwESAQ1BDkEIABBBEIENQQ/ BDUEPQQ4BCAAPgRCBCAAOgQwBEcENQRBBEIEMgQwBCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQuAA0A IAAgACAAKgAgAB8EQAQ+BEEEQgQ+BDkEIAA+BDEEPAQwBD0EPQRLBDkEIABCBDUENwQ4BEEELgAN ACAALQRCBD4EIAA+BDQEOAQ9BCAAOAQ3BCAAQQQwBDwESwRFBCAAPwQ+BD8EQwQ7BE8EQAQ9BEsE RQQgAD8EQAQ4BFEEPAQ+BDIEIAAyBDIEOAQ0BEMEIABBBDIEPgQ1BDkEIABNBEQERAQ1BDoEQgQ4 BDIEPQQ+BEEEQgQ4BCAAOAQgAD8EQAQ+BEEEQgQ+BEIESwQuACAAFwQwBDoEOwROBEcEMAQ1BEIE QQRPBCAAMgQgAEQEPgRABDwEQwQ7BDgEQAQ+BDIEOgQ1BCAAPwRABD4EQQRCBD4EMwQ+BCAAOwQ+ BDYEPQQ+BDMEPgQgAEMEQgQyBDUEQAQ2BDQENQQ9BDgETwQgACIAOAQ3BCAANAQyBEMERQQgAEEE OwQ+BDIEIgAgADgEIAA/BD4EQQQ7BDUENARDBE4ESQQ1BDkEIAA/BEAEMAQyBDQEPgQ/BD4ENAQ+ BDEEPQQ+BDkEIAA0BDUEPAQwBDMEPgQzBDgEOAQsACAAOgQwBDcEQwQ4BEEEQgQ4BDoEOAQsACAA QgRABD4EOwQ7BDgEPQQzBDAEIAA4BCAAQgRABDAEMgQ7BDgEIAA4BDsEOAQgADQEMAQ2BDUEIAA/ BEAEMAQyBDgEOwRMBD0ESwRFBCAAQwRCBDIENQRABDYENAQ1BD0EOAQ5BCAAPQQ4BDoEMAQ6BCAA PQQ1BCAANAQ+BDoEMAQ3BEsEMgQwBE4ESQQ4BEUEIABCBDUENwQ4BEEELgAgABQEOwRPBCAATQRE BEQENQQ6BEIEOAQyBD0EPgRBBEIEOAQgAD4EMQRLBEcEPQQ+BCAAOARBBD8EPgQ7BEwENwRDBE4E QgRBBE8EIABABDAEQQQ/BDsESwQyBEcEMARCBEsENQQgAEQEPgRABDwEQwQ7BDgEQAQ+BDIEOgQ4 BCwAIABDBEEEOwQ+BDYEPQRPBE4ESQQ4BDUEIAA3BDAENAQwBEcEQwQgADgENAQ1BD0EQgQ4BEQE OAQ6BDAERgQ4BDgEIAA/BEAEPgQ/BDAEMwQwBD0ENARLBCwAIAA9BDAEPwRABDgEPAQ1BEAEOgAN ACIAEgQ+BDkEPQQwBC0AIAA8BDAEQgRMBCAAQAQ+BDQEPQQwBE8EIgAsACAAIgARBEMERQQwBEIE TAQgAE0EQgQ+BCAAOgQ7BDAEQQRBBD0EPgQiACwAIAAiAB0EQwQ2BD0EPgQgAEIEQAQwBEUEMARC BEwEQQRPBCIALAAgACIALwQgAEUEPgQ3BE8EOQQ6BDAEIABBBDIEPgQ1BDwEQwQgAEIENQQ7BEME IgAsACAAIgAbBE4EMQQyBDgEIAA9BDUEQgQiACAAOAQgAD8EQAQ+BEcEOAQ1BC4ADQAgABIEPgRC BCAAPwRABDgEPAQ1BEAEIAA/BEAEPgRBBEIEPgQzBD4EIAA+BDEEPAQwBD0EPQQ+BDMEPgQgAEIE NQQ3BDgEQQQwBCwAIAA6BDAEQQQwBDUEPAQ+BCAAQQQwBDwEPgQ5BCAANgQ1BCAAPwRABD4EPwQw BDMEMAQ9BDQESwQuACAAHgQxBDwEMAQ9BEkEOAQ6BDgEIAA4BDcEIAA/BDUENAQ+BDIEOAQ6BDgE OAQgAD8EOARIBEMEQgQgAD0EMAQ8BCgAMAQgACIAOgQ+BD8EOAQ/BDAEQQRCBDUEQARLBCIAIABA BDAENwQ9BD4EQQRPBEIEIAA/BD4EIAA/BEAEPgRBBEIEPgRABDAEPAQgADgEPQRCBDUEQAQ9BDUE QgQwBCkAOgAgACIAHwRABD4EPwQwBDMEMAQ9BDQEQwQgAD0ENQQ7BEwENwRPBCAAQQRABDAEMgQ9 BDgEMgQwBEIETAQgAEEEIABABDUEOgQ7BDAEPAQ+BDkELgAiACAAOAQgAEEEQAQwBDcEQwQgAD8E PgRBBDsENQQgAE0EQgQ+BDkEIABEBEAEMAQ3BEsEIABBBD4EIABBBDwEMAQ6BD4EPAQgAEAEPgQy BD0EPgQgAE0EQgQ4BDwEIAA4BCAANwQwBD0EOAQ8BDAETgRCBEEETwQoAEEEQAQwBDIEPQQ4BDIE MAROBEIEKQAsACAAPgQ/BEAEPgQyBDUEQAQzBDAETwQgAEEEMgQ+BDkEIAA2BDUEIABCBDUENwQ4 BEEEIAA0BDAEOwRMBD0ENQQ5BEgENQQ5BCAAMQQ+BDsEQgQ+BDIEPQRRBDkEKAA/BEAEMAQyBDQE OAQyBD4EOQQsACAAQAQwBDcEQwQ8BDUENQRCBEEETwQpACAAOAQgAD8EQAQ4BCAATQRCBD4EPAQg AEAENQQwBDsETAQ9BD4EIABABDUESAQwBE8EIAA3BDAENAQwBEcEQwQgAD8EQAQ+BD8EMAQzBDAE PQQ0BEsEIAAzBDsEQwQ/BD4EQQRCBDgELQAgAEAEMAQ3BDQENQQ7BE8ETwQgAEcENQQ7BD4EMgQ1 BEcENQRBBDoEPgQ1BCAAPwQ+BD0EOAQ8BDAEPQQ4BDUEIAA+BDEESQQ4BEUEIAA/BD4EIAA/BEAE OARABD4ENAQ1BCAAPwRABD4ERgQ1BEEEQQQ+BDIELgAgAB4EPQQ4BCAAMwQ+BDIEPgRABE8EQgQg ADIEIABDBDwEPgQ7BEcEMAQ9BDgEOAQgADsENQQ9BDgEMgQ+BDwEQwQgADwEPgQ3BDMEQwQgAEcE OARCBDAEQgQ1BDsETwQgACIAPQQ1BCAAQQRABDAEMgQ9BDgEMgQwBDkEIQAgAD0ENQQgAD4EMQQ+ BDEESQQwBDkEIQAgAD0ENQQgADQEQwQ8BDAEOQQhACIALgAgACAENQQ6BDsEMAQ8BEMEIAA4BCAA PwRABD4EPwQwBDMEMAQ9BDQEQwQsACAAOgQ+BD0ENQRHBD0EPgQgADYENQQsACAAPAQ+BDYEPQQ+ BCAAQQRABDAEMgQ9BDgEMgQwBEIETAQsACAARQQ+BEIETwQgADEESwQgADQEMAQ2BDUELAAgAD8E PgRCBD4EPARDBCAARwRCBD4EIAAyBCAAQQQ+BD4EQgQyBDUEQgRBBEIEMgQ4BDgEIABBBCAAPgQx BEkENQQ/BEAEOAQ9BE8EQgRLBDwEIAA/BD4EPQQ4BDwEMAQ9BDgENQQ8BCwAIABABDUEOgQ7BDAE PAQwBCAATwQyBDsETwQ1BEIEQQRPBCAARwQwBEEEQgQ9BEsEPAQgAEEEOwRDBEcEMAQ1BDwEIAA/ BEAEPgQ/BDAEMwQwBD0ENARLBCwAIAA4BCAAOgRCBD4EIAA2BDUEIAA9BDAEPAQsACAAQQQyBD4E MQQ+BDQEPQRLBDwEIAAzBDgEPwQ1BEAEMQQ+BEAENQRPBDwELAAgADcEMAQ/BEAENQRCBDgEQgQg AEEEQAQwBDIEPQQ4BEIETAQgAD4EMQRJBDUENQQgAEEEIABHBDAEQQRCBD0ESwQ8BD8AIQANACAA IAAgACoAIAAfBD4ENAQ8BDUEPQQwBCAAOAQgADgEQQQ6BDAENgQ1BD0EOAQ1BCAAPwQ+BD0ETwRC BDgEOQQuACAAHAQ1BEIEMAREBD4EQARLBC4ADQAgACIEPgQ2BDUEIAA+BEcENQQ9BEwEIAA/BD4E PwRDBDsETwRABD0ESwQ5BCAAPAQ1BEIEPgQ0BCAANwQwBCAAQQRHBFEEQgQgADIESwRBBD4EOgQ+ BDkEIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ4BDIEPQQ+BEEEQgQ4BC4AIAAeBEIEOgRABEsEMgQwBDUE QgQgAD8EQwRCBEwEIAA6BCAAPAQwBD0EOAQ/BEMEOwRPBEYEOARPBDwEIAAxBDUEQQRBBD4ENwQ9 BDAEQgQ1BDsETAQ9BEsEPAQuACAAHgRHBDUEPQRMBCAARwQwBEEEQgQ+BCAAPARLBCAAMgQ+BEEE PwRABDgEPQQ4BDwEMAQ1BDwEIABBBDgEPQQ+BD0EOAQ8BDgERwQ9BEsENQQgADgEOwQ4BCAAPwRA BD4EQQRCBD4EIABABE8ENAQ+BDwEIAA7BDUENgQwBEkEOAQ1BCAAQgQ1BEAEPAQ4BD0ESwQgADEE NQQ3BCAAQgQ+BEcEPQQ+BDMEPgQgAD8EPgQ9BDgEPAQwBD0EOARPBCAAOARFBCwAIAA/BEAEOAQ9 BDgEPAQwBDUEPAQgADgERQQgADoEMAQ6BCAANAQ+BDsENgQ9BD4ENQQsACAAMgQgAEIEPgQgADIE QAQ1BDwETwQgADoEMAQ6BCAAMgQ8BDUEQQRCBDUEIABBBCAAPwQ+BDQEPAQ1BD0EPgQ5BCAAPARL BCAAPwRABDgEPQQ4BDwEMAQ1BDwEIAAyBEEENQQgAEEEPARLBEEEOwRLBCAAOAQgAE0EPAQ+BEYE OAQ4BCwAIABBBDIETwQ3BDAEPQQ9BEsENQQgAEEEIAA4BDcEPAQ1BD0EUQQ9BD0ESwQ8BCAAPwQ+ BD0ETwRCBDgENQQ8BC4AIAAYBCAANAQwBDYENQQgAEEEMAQ8BEsENQQgADEENQQ3BEMEPAQ9BEsE NQQgAD8EPgQ0BDwENQQ9BEsEIAA9BDUEOgQ+BEIEPgRABEsENQQgADsETgQ0BDgEIAAzBD4EQgQ+ BDIESwQgAD8EQAQ+BDMEOwQwBEIESwQyBDAEQgRMBCAAOAQgAEEEPgQyBDUEQARIBDAEQgRMBCAA PwQ+BEIEPgQ8BCAAQwQ2BDAEQQQ9BEsENQQgADIENQRJBDgELQAgAEAEMARBBD8EMAQ7BE8EQgRM BCAAPQQ1BD0EMAQyBDgEQQRCBEwEIAA6BCAAMQRABDAEQgRMBE8EPAQsACAAQwRBBEIEQAQwBDgE MgQwBEIETAQgADMENQQ9BD4ERgQ4BDQEIAA9BDAEQAQ+BDQEPgQyBCAAOAQgADQEQARDBDMEOAQ1 BCAAMQQ1BEEERwQ1BDsEPgQyBDUERwQ9BEsENQQgAD8EQAQ1BEEEQgRDBD8EOwQ1BD0EOARPBC4A IAAdBDAEPwRABDgEPAQ1BEAELAAgADIEPAQ1BEEEQgQ+BCAAPwRABDgEQQQ+BDUENAQ4BD0ENQQ9 BDgETwQgABoEQARLBDwEMAQgADoEIAAgBD4EQQRBBDgEOAQgADgEQQQ/BD4EOwRMBDcEQwQ1BEIE QQRPBCAAQgQ1BEAEPAQ4BD0EIAAiADAEPQQ9BDUEOgRBBDgETwQiACwAIAA6BD4EQgQ+BEAESwQ5 BCAAPgQ/BEAENQQ0BDUEOwRPBDUEQgRBBE8EIAA/BDUENAQ+BDIEOAQ6BDgENQQ5BCAAOgQwBDoE IAAiADIEPgQ+BEAEQwQ2BFEEPQQ9BEsEOQQgADcEMARFBDIEMARCBCIAIAA4BCAAPAQwBDsEPgQg AEIEPgQzBD4ELAAgAEcEQgQ+BCAAPQQ1BCAAOAQ8BDUENQRCBCAAPQQ4BDoEMAQ6BD4EMwQ+BCAA PgRCBD0EPgRIBDUEPQQ4BE8EIAA6BCAAPAQ4BEAEPQQ+BDwEQwQgAD8EQAQ4BEEEPgQ1BDQEOAQ9 BDUEPQQ4BE4ELAAgAD0EPgQgAD8EPgQ0BDwENQQ9BE8ENQRCBCAAQQQ+BDEESwRCBDgETwQgAD8E QARPBDwEPgQgAD8EQAQ+BEIEOAQyBD4EPwQ+BDsEPgQ2BD0ESwQ8BDgELgAgABAEPQQwBDsEPgQz BDgERwQ9BD4ELAAgAEIEMAQ6BCAAPQQwBDcESwQyBDAENQQ8BDAETwQgACIAEAQiBB4EIgAsACAA OgQ+BEIEPgRABDAETwQgAD8EPgQ0BDwENQQ9BE8ENQRCBCAAQQQ1BD8EMARABDAEQgQ4BEEEQgQ+ BDIEIAA9BDAEIABCBDUEQARABD4EQAQ4BEEEQgQ+BDIELgAgABAEIABABDAEQQQ/BDAEOwQ4BEIE TAQgAD0ENQQ9BDAEMgQ4BEEEQgRMBCAAOgQgAEIENQRABEAEPgRABDgEQQRCBDAEPAQsACAAPgRH BDUEMgQ4BDQEPQQ+BCwAIAA9BDAEPAQ9BD4EMwQ+BCAAPwRABD4ESQQ1BCwAIABHBDUEPAQgADoE IAAwBDEEQQRCBEAEMAQ6BEIEPQRLBDwEIABBBDUEPwQwBEAEMARCBDgEQQRCBDAEPAQgADgEOwQ4 BCAAQgQ1BDwEIAAxBD4EOwQ1BDUEIAA8BDgEQAQ9BEsEPAQgADYEOARCBDUEOwRPBDwELAAgAEEE MgQ+BDgEPAQgAEAEPgQ0BEEEQgQyBDUEPQQ9BDgEOgQwBDwELgAgABoEQAQ+BDwENQQgAD0ENQQ9 BDAEMgQ4BEEEQgQ4BCAAMgQgADsEPgQ6BDAEOwRMBD0EPgQ5BCAAMgQ+BDkEPQQ1BCwAIAA/BD4E NAQ8BDUEPQQ+BDkEIAA8BD4ENgQ9BD4EIAA/BEAEPgQ/BDAEMwQwBD0ENAQ4BEAEPgQyBDAEQgRM BCAAMAQ7BDoEPgQzBD4EOwRMBCwAIAA9BDAEPwRABDgEPAQ1BEAELAAgAD8EPgQ0BDwENQQ9BD4E OQQgAD8EPgQ9BE8EQgQ4BE8EIAAiAD0EMARABDoEPgRCBDgERwQ1BEEEOgQwBE8EIAA3BDAEMgQ4 BEEEOAQ8BD4EQQRCBEwEIgAgAD0EMAQgACIAMAQ7BDoEPgQzBD4EOwRMBD0EQwROBCIAIAA4BDsE OAQgADIEPgQ+BDEESQQ1BCAAPQQ1BCAAPwRABDgENwQ9BDAEMgQwBE8EIAA3BDAEMgQ4BEEEOAQ8 BD4EQQRCBDgELAAgADAEIAAiAD0EMARABDoEPgRCBDgERwQ1BEEEOgRDBE4EIAA7BD4EPAQ6BEME IgAgAD0EMAQgACIAPwQ+BEUEPAQ1BDsETAQ1BCIALgANACAAIAAeBDQEPQQ+BDkEIAA4BDcEIAA/ BD4EPwRDBDsETwRABD0ESwRFBCAAPwQ+BDQEPAQ1BD0EIABPBDIEOwRPBDUEQgRBBE8EIAA3BDAE PAQ1BD0EMAQgAEQEMAQ6BEIEMAQgACIAMQQ+BDsENQQ3BD0EOAQgAEEENQQ6BEEEQwQwBDsETAQ9 BD4EQQRCBDgEIgAgAD0EMAQgAB8EIAQeBCEEIgQeBCAAIgBHBDsENQQ9BDAEIAAbBBMEEQQiBC0A QQQ+BD4EMQRJBDUEQQRCBDIEMAQiAC4AIAAfBEAEPgQ/BDAEMwQwBD0ENAQwBCAAMgQ1BDQEUQRC BEEETwQgADIEIAA9BDAEPwRABDAEMgQ7BDUEPQQ4BDgEIAA/BEAEOAQ9BE8EQgQ4BE8EIAA+BDEE SQQ1BEEEQgQyBD4EPAQgADEEPgQ7BDUENwQ9BDUEOQQsACAAOgQwBDoEIABHBDUEMwQ+BC0AQgQ+ BCAAPgQxBEsERwQ9BD4EMwQ+BCwAIAA4BCwAIAA1BEEEOwQ4BCAAPQQ1BCAARQQ+BEAEPgRIBDUE MwQ+BCwAIABCBD4EIABFBD4EQgRPBCAAMQRLBCAAPQQ1BCAAPwQ7BD4ERQQ+BDMEPgQuACAAIQQw BDwEPgQgABsEEwQRBCIEIABBBEIEMAQ9BD4EMgQ4BEIEQQRPBCAAPAQ+BD0EPgQ/BD4EOwQ4BDUE OQQgADIEIAAiADsENQRHBDUEPQQ4BDgEIgAgADEEPgQ7BDUENwQ9BDUEOQQgAEEEMgQ+BDgERQQg AEcEOwQ1BD0EPgQyBCwAIAA/BEAEOAQgADoEPgRCBD4EQAQ+BDwEIAA7BDUERwQ1BD0EOARPBCAA PQQ1BEIEIAAyBD4EMgRBBDUELAAgADAEIAA1BEEEQgRMBCAAQgQ+BDsETAQ6BD4EIABABDAEQQQ/ BEAEPgRBBEIEQAQwBD0ENQQ9BDgENQQgADEEPgQ7BDUENwQ9BDgELgAgACAAIgQ+BCAANQRBBEIE TAQgAD4EPQQwBCAAQQQ7BEMENgQ4BEIEIAAzBDsEPgQxBDAEOwRMBD0EPgQ5BCAAPwQ+BDsEOARC BDgEOgQ1BCAAMgRLBEAEPgQ2BDQENQQ9BDgETwQgADgEIAA0BDUEPwQ+BD8EQwQ7BE8ERgQ4BDgE LAAgAEAEMAQ3BEAEQwRIBDUEPQQ4BE4EIABCBEAEMAQ0BDgERgQ4BD4EPQQ9BD4EOQQgAEEENQQ8 BEwEOAQuACAAIgQwBDoEIAA6BDAEOgQgAE0EQgQwBCAAPwRABD4EPwQwBDMEMAQ9BDQEMAQgAD4E QQQ9BD4EMgQwBD0EMAQgAD0EMAQgAE8EMgQ9BD4EPAQgAD4EMQQ8BDAEPQQ1BCwAIAA/BEAEMAQy BDQEMAQgAD8EPgQ0BDsENQQ2BDgEQgQgADIESwRPBDIEOwQ1BD0EOAROBCAAMgQgAD8EQAQ+BEYE NQRBBEEENQQgADsENQQzBDAEOwQ4BDcEMARGBDgEOAQuACAAHQRDBDYEPQQ+BCAAPwRABDgENwQ9 BDAEQgRMBCwAIABHBEIEPgQgADUEQQRCBEwEIABCBE8ENgQ1BDsEMARPBCAAMQQ+BDsENQQ3BD0E TAQgAEEENQQ6BEEEQwQwBDsETAQ9BD4EQQRCBDgEKAAwBCAAMgQ+BDcEPAQ+BDYEPQQ+BCAAOAQg ADgEPQQyBDAEOwQ4BDQEPQQ+BEEEQgRMBCwAIAA1BEEEOwQ4BCAAPQQ1BDgENwQ7BDUERwQ4BDwE MAQpACwAIAA/BEAEPgRPBDIEOARCBEwEIABBBD4ERwRDBDIEQQRCBDIEOAQ1BCAAOAQgAD4EOgQw BDcEMARCBEwEIABBBD4EPgRCBDIENQRCBEEEQgQyBEMETgRJBEMETgQgAD4EMQRJBDUEQQRCBDIE NQQ9BD0EQwROBCAAPwQ+BDwEPgRJBEwEIAA9BDUEQQRHBDAEQQRCBD0ESwQ8BCAAOwROBDQETwQ8 BCwAIAA+BDEENAQ1BDsEUQQ9BD0ESwQ8BCAAQQQwBDwESwQ8BCAAPwRABDUEOgRABDAEQQQ9BEsE PAQgADgEIAA2BDUEOwQwBD0EPQRLBDwEIAA0BDsETwQgADEEPgQ7BEwESAQ4BD0EQQRCBDIEMAQt ACAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgRMBE4EIABBBD4ENwQ0BDAEQgRMBCAANwQ0BD4EQAQ+BDIE QwROBCwAIAA7BE4EMQRPBEkEQwROBCwAIABABDAENAQ+BEEEQgQ9BEMETgQgADgEIABBBEcEMARB BEIEOwQ4BDIEQwROBCAAQQQ1BDwETAROBC4AIAASBCAAPgRCBDsEOARHBDgENQQgAD4EQgQgADcE NAQ+BEAEPgQyBEsERQQgADsETgQ0BDUEOQQgAD4EPQQ4BCAAOwQ4BEgENQQ9BEsEIAAyBD4ENwQ8 BD4ENgQ9BD4EQQRCBDgEIAAyBEsEPwQ+BDsEPQQ1BD0EOARPBCAAQQQyBD4ENQQ5BCAAMgQwBDYE PQQ1BDkESAQ1BDkEIABBBDAEOgRABDAEOwRMBD0EPgQ5BCAAPgQxBEkENQRBBEIEMgQ1BD0EPQQ+ BDkEIABEBEMEPQQ6BEYEOAQ4BC0AIABEBD4EQAQ8BDgEQAQ+BDIEMAQ9BDgETwQgAEQEQwQ9BDQE MAQ8BDUEPQRCBDAEOwRMBD0EPgQ5BCAATwRHBDUEOQQ6BDgEIAA9BDAESAQ1BDMEPgQgAD4EMQRJ BDUEQQRCBDIEMAQhACAAJwRCBD4EIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAQQRCBEAEMARIBD0E NQQ1BCAATQRCBD4EMwQ+BD8AIQANACAAIAAgACoAIAAXBDAEPAQwBDsERwQ4BDIEMAQ9BDgENQQg ADwEOAQ9BEMEQQQ+BDIELgAgAB4EQQQ+BDEEPgQgAD8EQAQ4BDwENQQ9BDgEPAQ+BCAAOgQgAD8E QAQ+BD8EMAQzBDAEPQQ0BDUEIAA9BDAEQAQ6BD4EQgQ4BDoEPgQyBCAAOAQgADwEPgQ9BD4EPwQ+ BDsEOAQ5BCwAIAA6BD4EMwQ0BDAEIAA8BDgEPQRDBEEESwQgAEMEPwQ+BDwEOAQ9BDAETgRCBEEE TwQgAD0ENQQgAD8EPgQ7BD0EPgRBBEIETAROBCAAOAQ7BDgEIAAyBD4EPgQxBEkENQQgAD0ENQQg ADQENQQ6BDsEMARABDgEQARDBE4EQgRBBE8ELgAgABwEPgQ2BDUEQgQgAD4EMQQ7BDAENAQwBEIE TAQgADIESwRBBD4EOgQ+BDkEIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ4BDIEPQQ+BEEEQgRMBE4EIAA3 BDAEIABBBEcEUQRCBCAAPQQ1BDcEPQQwBD0EOARPBCAAPAQwBEEEQQQwBDwEOAQgADgEOwQ4BCAA OAQ9BDQEOAQyBDgENARDBDAEOwRMBD0ESwQ8BCAAPgQxBEoENQQ6BEIEPgQ8BCAAPAQwBD0EOAQ/ BEMEOwRPBEYEOAQ4BCAATQRCBDgERQQgADwEOAQ9BEMEQQQ+BDIEIAA4BCwAIABBBDsENQQ0BD4E MgQwBEIENQQ7BEwEPQQ+BCwAIAA9BDUEMgQ+BDcEPAQ+BDYEPQQ+BEEEQgQ4BCAAPwRABD4EQgQ4 BDIEPgQ/BD4EQQRCBDAEMgQ4BEIETAQgADgERQQgAD8EOwROBEEEMAQ8BC4AIAAiBDUEIAA2BDUE IAAiADMENQQ4BCIAIAA4BCAAIgA7BDUEQQQxBDgETwQ9BDoEOAQiACAAMAQ6BEIEOAQyBD0EPgQg ADcEMAQ8BDAEOwRHBDgEMgQwBE4EQgQgADwEOAQ9BEMEQQRLBCAAQQQyBD4ENQQ5BCAAMQQ+BDsE NQQ3BD0EOAQgADIEIAA+BEIEPQQ+BEgENQQ9BDgEOAQgADIEPgQ3BDwEPgQ2BD0EPgRBBEIEOAQg ADgEPAQ1BEIETAQgADQENQRCBDUEOQQgADsETgQxBDIEOAQuAA0AIAAgACAAKgAgABwEEAQdBBgE HwQjBBsELwQmBBgEGAQgADEENQRBBEEEPgQ3BD0EMARCBDUEOwRMBD0ESwQ8BC4AIAAaBD4EPQRC BEAEPgQ7BEwEIABBBD4ENwQ9BDAEPQQ4BE8ELgANACAAFAQ7BE8EIAA+BDEERQQ+BDQEMAQgAEEE PgQ3BD0EMAQ9BDgETwQgADgEQQQ/BD4EOwRMBDcEQwQ1BEIEQQRPBCAASAQwBDEEOwQ+BD0EPQQ+ BEEEQgRMBCAAPARLBEgEOwQ1BD0EOARPBC4AIAAnBEIEPgQgAE0EQgQ+BCAANwQ9BDAERwQ4BEIE PwAgAB0EOAQgAD4ENAQ4BD0EIABHBDUEOwQ+BDIENQQ6BCAAPQQwBCAAPQQwBEgENQQ5BCAAPwRA BDUEOgRABDAEQQQ9BD4EOQQgAD8EOwQwBD0ENQRCBDUEIAA9BDUEIAA3BD0EMAQ1BEIEIAAwBDEE QQQ+BDsETgRCBD0EPgQgAEIEPgRHBD0EPgQsACAAOgQwBDoEIAA9BDAEIABBBDAEPAQ+BDwEIAA0 BDUEOwQ1BCAAQwRBBEIEQAQ+BDUEPQQwBCAAPgQ6BEAEQwQ2BDAETgRJBDAETwQgADQENQQ5BEEE QgQyBDgEQgQ1BDsETAQ9BD4EQQRCBEwELgAgACEEPgQ+BEIEMgQ1BEIEQQRCBDIENQQ9BD0EPgQs ACAANAQ7BE8EIABCBD4EMwQ+BCwAIABHBEIEPgQxBEsEIAA6BDAEOgQtAEIEPgQgAEEEIAA9BDUE OQQgADIENwQwBDgEPAQ+BDQENQQ5BEEEQgQyBD4EMgQwBEIETAQgADgEIABABDAEQQQ/BD4ENwQ9 BDAEMgQwBEIETAQgAEIENQQgADgEOwQ4BCAAOAQ9BEsENQQgADUEUQQgAD4EMQRKBDUEOgRCBEsE LwAwBEEEPwQ1BDoEQgRLBCwAIABHBDUEOwQ+BDIENQQ6BCAAMgRLBEAEMAQxBDAEQgRLBDIEMAQ1 BEIEIABIBDAEMQQ7BD4EPQRLBCAAPARLBEgEOwQ1BD0EOARPBCwAIAA/BD4EMgQ1BDQENQQ9BDgE TwQgADgEIAAyBDcEMAQ4BDwEPgQ0BDUEOQRBBEIEMgQ4BE8EIABBBCAAPAQ4BEAEPgQ8BCwAIAA6 BD4EQgQ+BEAESwQ1BCAANAQwBE4EQgQgAD8EQAQwBDIEOAQ7BEwEPQRLBDkEIABNBEQERAQ1BDoE QgQgADIEIAAxBD4EOwRMBEgEOAQ9BEEEQgQyBDUEIABBBDgEQgRDBDAERgQ4BDkELAAgADgEIAA9 BDAEQAQwBDEEMARCBEsEMgQwBDUEQgQgAD4EPwRLBEIEIABABDAEMQQ+BEIESwQgAE0EQgQ4BEUE IABIBDAEMQQ7BD4EPQQ+BDIELgAgAC0EQgQ+BCAAQgQ+BCwAIABHBEIEPgQgAD0EMAQ3BEsEMgQw BDUEQgRBBE8EIAA8BDgEQAQ+BDIEPgQ3BDcEQAQ1BD0EOAQ1BCAAOAQgADwENQQ9BEIEMAQ7BDgE QgQ1BEIELAAgAEQEPgRABDwEOARABEMETgRJBDgENQQgACIAOgQwBEAEQgRDBCAAQAQ1BDAEOwRM BD0EPgRBBEIEOAQiAC4AIAAaBEAEPgQ8BDUEIAA/BEAEOAQ+BDEEQAQ1BEIEUQQ9BD0ESwRFBCAA SAQwBDEEOwQ+BD0EPgQyBCAAPgRCBD0EPgRIBDUEPQQ4BE8EIAA6BCAAQAQ1BDAEOwRMBD0EPgRB BEIEOAQsACAARwQ1BDsEPgQyBDUEOgQgAEEEPgQ0BDUEQAQ2BDgEQgQgAEEEQgRABEMEOgRCBEME QARLBC0ASAQwBDEEOwQ+BD0ESwQgAEEEMgQ+BDgERQQgAE0EPAQ+BEYEOAQ5BCwAIAA3BDAEOwQ+ BDYENQQ9BD0ESwQ1BCAAMwQ1BD0ENQRCBDgERwQ1BEEEOgQ4BCAAMgQgADIEOAQ0BDUEIAAwBEAE RQQ1BEIEOAQ/BD4EMgQgADgEIABBBEQEPgRABDwEOARABD4EMgQwBD0EPQRLBDUEIAAyBCAAQgQ1 BEcENQQ9BDgENQQgADYEOAQ3BD0EOAQuACAAGgQwBDYENARLBDkEIABHBDUEOwQ+BDIENQQ6BCAA NgQ4BDIEUQRCBCAAMgQgADgEQgQ+BDMENQQgADIEIABBBDIEPgQ1BDkEIABBBD4EMQRBBEIEMgQ1 BD0EPQQ+BDkEIAAyBDgEQARCBEMEMAQ7BEwEPQQ+BDkEIABABDUEMAQ7BEwEPQQ+BEEEQgQ4BC4A IAAtBEIEPgQgAEEEMgQ+BDkEQQRCBDIEPgQgAD4EMQRDBEEEOwQwBDIEOwQ4BDIEMAQ1BEIEIAAy BD4ENwQ8BD4ENgQ9BD4EQQRCBEwEIAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4BDgEIAA7BE4EMQRLBDwE IABHBDUEOwQ+BDIENQQ6BD4EPAQsACAAQQRCBEAEMAQ9BDAEPAQ4BCAAOAQgAD0EMARABD4ENAQw BDwEOAQsACAAQgQwBDoEIAA6BDAEOgQgADgEQQRCBDgEPQRLBCAAPQQ4BDoEQgQ+BCAAPQQ1BCAA NwQ9BDAENQRCBCAAOAQgADIEQQQ1BDMENAQwBCAAPQQwBEUEPgQ0BDgEQgRBBE8EIAAcIDIEIAA8 BDAEQgRABDgERgQ1BB0gKAA/BEAEOAQ9BEYEOAQ/BCAAHQQbBB8EIAAiABoEMARABEIEMAQgAD0E NQQgADUEQQRCBEwEIABCBDUEQARABDgEQgQ+BEAEOARPBCIAKQAuACAAHAQwBD0EOAQ/BEMEOwRP BEIEPgRABCAAQQRCBDAEPQQ+BDIEOARCBEEETwQgAEEEQwQxBEoENQQ6BEIEPgQ8BCAAQwQ/BEAE MAQyBDsENQQ9BDgETwQgADYENQRABEIEMgQ+BDkEIAA4BCAANAQ7BE8EIAA+BD8EOARBBDAEPQQ4 BE8EIAA0BDAEOwRMBD0ENQQ5BEgENQQzBD4EIAA/BEAEPgRGBDUEQQRBBDAEIAA8BD4ENgQ9BD4E IAA4BEEEPwQ+BDsETAQ3BD4EMgQwBEIETAQsACAAPQQwBD8EQAQ4BDwENQRABCwAIAAUBB4EIgQj BCgAFAQ+BEEEQgQwBEIEPgRHBD0EPgQgAB4EMQRJBEMETgQgACIENQQ+BEAEOAROBCAAIwQ/BEAE MAQyBDsENQQ9BDgETwQpAC4ADQAgABwEMAQ9BDgEPwRDBDsETwRGBDgETwQgAE8EMgQ7BE8ENQRC BEEETwQgAEEEMAQ8BEsEPAQgADwEPgRJBD0ESwQ8BCAAQQRABDUENARBBEIEMgQ+BDwEIAA/BEAE PgQ/BDAEMwQwBD0ENARLBCwAIAA/BD4ENwQyBD4EOwRPBE4ESQQ4BDwEIAA6BD4EPQRCBEAEPgQ7 BDgEQAQ+BDIEMARCBEwEIAAzBDsEQwQxBD4EOgQ4BDUEIABBBDsEPgQ4BCAAPwQ+BDQEQQQ+BDcE PQQwBD0EOARPBCwAIABDBDwENQQ9BEwESAQwBE8EIAAyBDUEQAQ+BE8EQgQ9BD4EQQRCBEwEIAA+ BEEEMgQ+BDEEPgQ2BDQENQQ9BDgETwQgADYENQRABEIEMgRLBCwAIAA1BEEEOwQ4BCAAQgQwBCAA PwQ+BDkEPARRBEIELAAgADIEIABHBFEEPAQgAD4EMQQ8BDAEPQQsACAAOAQ7BDgEIAA9BDUEIAA3 BDAERQQ+BEcENQRCBCAAMgQ4BDQENQRCBEwEIABABDUEOgQ7BDAEPARDBCgAMgQgAEEEOwRDBEcE MAQ1BCAAPwRABDUENARLBDQEQwRJBDgERQQgADEEPgQ7BDUENQQgAD8EQAQ4BDwEOARCBDgEMgQ9 BEsERQQgADwENQRCBD4ENAQ+BDIEKQAuACAAHwQ+BCAAPAQ9BDUEPQQ4BE4EIAA9BDUEOgQ+BEIE PgRABEsERQQgAEMERwRRBD0ESwRFBCwAIAA9BDAESAQ1BCAAPgQxBEkENQRBBEIEMgQ+BCAAOAQ0 BFEEQgQsACAAMAQsACAAPAQ+BDYENQRCBCAAMQRLBEIETAQsACAANAQwBDYENQQgAEMENgQ1BCAA PwRABDgESAQ7BD4EIAA6BCAAMwQ7BD4EMQQwBDsETAQ9BD4EPARDBCAAQwQ/BEAEMAQyBDsENQQ9 BDgETgQgAEEEOAQ7BEwEPQQ1BDkESAQ4BDwEOAQgAEEEOgRABEsEQgRLBDwEOAQgADwEMAQ9BDgE PwRDBDsETwRCBD4EQAQwBDwEOAQhACAAEAQgADwESwQgADYENQQgAE0EQgQ+BCAANwQ9BDAENQQ8 BCAAPQQwBDIENQRABD0ETwQ6BDAELgANACAAIAAgAB4EMQRJBDgEOQQgADAEOwQzBD4EQAQ4BEIE PAQgADwEMAQ9BDgEPwRDBDsETwRGBDgEOQQgAEIEPgQ7BD8EPgQ5BCAAPQQwBCAAMQQ1BEEEQQQ+ BDcEPQQwBEIENQQ7BEwEPQQ+BDwEIABDBEAEPgQyBD0ENQQgADAEPQQwBDsEPgQzBDgERwQ1BD0E IAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4BE8EPAQsACAAOARBBD8EPgQ7BEwENwRDBDUEPARLBEUEIAAy BCAAHQQbBB8EKAA9BDUEOQRABD4EOwQ4BD0EMwQyBDgEQQRCBDgERwQ1BEEEOgQ+BDwEIAA/BEAE PgQzBEAEMAQ8BDwEOARABD4EMgQwBD0EOAQ4BCkALgAgAC0EQgQ+BCAANAAgAD4EQQQ9BD4EMgQ9 BEsERQQgAE0EQgQwBD8EMAQ6AA0AIAAxAC4AIAAhBD4ENwQ0BDAEPQQ4BDUEIABBBEIEQAQwBEIE NQQzBDgEOAQgADgEIABCBDAEOgRCBDgEOgQgADwEMAQ9BDgEPwRDBDsEOARABD4EMgQwBD0EOARP BCwAIABBBEIEQAQwBEIEMAQzBDUEPAQuAA0AIAAyAC4AIAAaBDAEOwQ4BDEEQAQ+BDIEOgQwBCAA NgQ1BEAEQgQyBEsELgANACAAMwAuACAAHwQ+BDQEQQRCBEAEPgQ5BDoEMAQgADgEIABABDAEPwQ/ BD4EQARCBC4ADQAgADQALgAgABIENQQ0BDUEPQQ4BDUELgANACAAIAAgACEEQgRABDAEQgQ1BDME OARPBCAAOAQgAEIEMAQ6BEIEOAQ6BDgEIABEBD4EQAQ8BDgEQARDBE4EQgRBBE8EIAA6BDAEOgQg ADIEIAA7BE4EMQQ+BDwEIAA0BDUEOwQ1BCAAPQQwBCAAPgRBBD0EPgQyBDUEIAA4BDwENQROBEkE OARFBEEETwQgAEAENQRBBEMEQARBBD4EMgQsACAANwQ9BDAEPQQ4BDkEIAA4BCAAQwQ8BDUEPQQ4 BDkEIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ+BEAEMAQgADgEIAAyBCAAQQQ+BD4EQgQyBDUEQgRBBEIE MgQ4BDgEIABBBCAANQQzBD4EIABGBDUEOwRPBDwEOAQgADgEIAA3BDAENAQwBEcEMAQ8BDgELAAg AD8EPgQgADQEPgRBBEIEOAQ2BDUEPQQ4BE4EIAA6BD4EQgQ+BEAESwRFBCAAPgRCBCAANgQ1BEAE QgQyBEsEIAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4BDkEIAA8BD4ENgQ9BD4EIAA4BDcEMQQwBDIEOARC BEwEQQRPBCAAOAQ7BDgEIAA/BEAEPgRBBEIEPgQgAD8EQAQ1BDoEQAQwBEIEOARCBEwEIAA+BDEE QAQwBEkEMARCBEwEIAA9BDAEIAA9BDUEUQQgADIEPQQ4BDwEMAQ9BDgENQQuACAAEgQgAEYENQQ7 BD4EPAQgAE0EQgQ+BCAAQgQyBD4EQARHBDUEQQQ6BDgEOQQgAD8EQAQ+BEYENQRBBEEEIAA/BD4E RQQ+BDYEOAQ5BCAAPQQwBCAAPwRABD4ENARDBDwESwQyBDAEPQQ4BDUEIABBBEIEQAQwBEIENQQz BDgEOAQgADgEIABCBDAEOgRCBDgEOgQgADIEPgQ1BD0EPQRLBEUEIAA0BDUEOQRBBEIEMgQ4BDkE OgAgAEQEPgRABDwEOARABD4EMgQwBD0EOAQ4BCAARARABD4EPQRCBDAEIAA4BCAAQgRLBDsEMAQs ACAAQAQ1BDcENQRABDIEPgQyBCwAIAAwBEAEPAQ4BDkEIAA4BCAAPQQwBEEEQgRDBD8EOwQ1BD0E OAQ5BCwAIAAwBEIEMAQ6BCAAOAQgADoEPgQ9BEIEQAQwBEIEMAQ6BC4AIAAaBD4EPQQ6BEAENQRC BD0ESwQ1BCAAQgQwBDoEQgQ4BDoEOAQgADgEIAA0BDUEOQRBBEIEMgQ4BE8EIAAyBCAAQAQwBDEE PgRCBDUEIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ+BEAEMAQgADQEPgQ7BDYEPQRLBCAAMQRLBEIETAQg AD4EQgRABDUEPwQ1BEIEOARABD4EMgQwBD0ESwQsACAAOgQwBDoEIAAyBCAAQQQ7BEMERwQwBDUE IABABDUEMAQ7BEwEPQQ+BDkEIAAwBEAEPAQ4BDgELAAgADAEIAA8BD0EPgQ2BDUEQQRCBDIEPgQg AEUEOARCBEAEPgRBBEIENQQ5BCAAOAQgAEMEOwQ+BDIEPgQ6BCAATQRCBD4EIAA4BD0EQgQ1BDsE OwQ1BDoEQgRDBDAEOwRMBD0EPgQ1BCAAPwQ+BDsENQQgADIENQQ7BDgEOgQ4BEUEIAA/BD4EOwQ6 BD4EMgQ+BDQERgQ1BDIEKABHBDgEQgQwBDkEQgQ1BCwAIAA9BDAEPwRABDgEPAQ1BEAELAAgAD8E QAQ+BCAAOgQ4BEIEMAQ5BEEEOgQ4BDUEIABBBEIEQAQwBEIEMAQzBDUEPARLBCkALgANACAAIAAg ACEEPgQxBEEEQgQyBDUEPQQ9BD4ELAAgABwgOgQwBDsEOAQxBEAEPgQyBDoEMAQdICAAOAQgADUE QQRCBEwEIAAyBEsETwQyBDsENQQ9BDgENQQgAEIEPgQ5BCAAQQQwBDwEPgQ5BCAAMgQ4BEAEQgRD BDAEOwRMBD0EPgQ5BCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQsACAAMgQgADoEPgRCBD4EQAQ+BDkE IAA2BDgEMgRRBEIEIABHBDUEOwQ+BDIENQQ6BC0AIAA6BDAEOgQgAD4EPQQgAD4EQgQ9BD4EQQQ4 BEIEQQRPBCAAOgQgAEIENQQ8BCAAOAQ7BDgEIAA4BD0ESwQ8BCAAOgQ+BD0ERgQ1BD8ERgQ4BE8E PAQgADgEIABBBDwESwRBBDsEMAQ8BCwAIABGBDUEPQQ9BD4EQQRCBE8EPAQgADgEIAAwBEEEPwQ1 BDoEQgQwBDwEIAAxBEsEQgQ4BE8ELgAgAB8EPgRBBDsENQQgAEIEPgQzBD4ELAAgADoEMAQ6BCAA PARLBCAANwQ9BDAENQQ8BCwAIAAiAEcEQgQ+BCAAQwQgAEcENQQ7BD4EMgQ1BDoEMAQgAD0EMAQg ADQEQwRIBDUEIgAsACAAPAQ+BDYEPQQ+BCAAPwQ+BDQEQQRCBEAEPgQ4BEIETARBBE8EIAA/BD4E NAQgAEcENQQ7BD4EMgQ1BDoEMAQsACAAQgQ+BCAANQRBBEIETAQgADQEMARCBEwEIAA1BDwEQwQg AD8EPgQ9BE8EQgRMBCwAIABHBEIEPgQgADUEMwQ+BCAAPAQ4BEAEIABCBDAEOgQ+BDkEIAA2BDUE LAAgADoEMAQ6BCAAOAQgADwEOARABCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABDAELgAgABoEMAQ6 BCAAQQQ7BDUENARBBEIEMgQ4BDUELQAgAEcENQQ7BD4EMgQ1BDoEIAAxBEMENAQ1BEIEIAAyBDgE NAQ1BEIETAQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQwBCwAIABBBDsEPgQyBD0EPgQgAEEEMAQ8 BD4EMwQ+BCAAQQQ1BDEETwQgADIEIAA3BDUEQAQ6BDAEOwQ1BCAAOAQgADoEPgQ9BDUERwQ9BD4E IAA+BDEESQQwBEIETARBBE8EIABBBCAAQgQwBDoEOAQ8BCAARQQ+BEAEPgRIBDgEPAQgAEcENQQ7 BD4EMgQ1BDoEPgQ8BCAAMQRDBDQENQRCBCAAPQQwBDwEPQQ+BDMEPgQgAD8EQAQ4BE8EQgQ9BDUE NQQgADgEIAA+BD0EIAAyBEsENwQ+BDIENQRCBCAAMQQ+BDsETARIBDUEIAA0BD4EMgQ1BEAEOARP BC4AIAAiBDAEOgQ+BDUEIABBBD4EQQRCBD4ETwQ9BDgENQQgAD0EMAQ3BEsEMgQwBDUEQgRBBE8E IAAyBCAAHQQbBB8EIAAcIEAEMAQ/BD8EPgRABEIEHSAsACAAQgQ+BCAANQRBBEIETAQgADoEPgQ8 BEQEPgRABEIEPQQ+BDUEIAA0BDsETwQgAD4EMQQ+BDgERQQgAD4EMQRJBDUEPQQ4BDUELgAgABAE IAAyBD4EQgQgADQEMAQ7BEwESAQ1BCAAPQQwBEcEOAQ9BDAENQRCBEEETwQgADwEMAQ9BDgEPwRD BDsETwRCBDgEMgQ9BD4ENQQgABwgMgQ1BDQENQQ9BDgENQQdIC4AIAAtBEIEPgQgAEEEPgRBBEIE PgRPBD0EOAQ1BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQgAD8EQAQ+BDIEPgQ6BDAERgQ4BE8EPAQ4 BCwAIAA/BEAEOAQgADoEPgRCBD4EQAQ+BDwEIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ+BEAELAAgAD4E MQQ7BDAENAQwBE8EIAAxBD4EOwQ1BDUEIABBBDgEOwRMBD0ESwQ8BCAAPAQ4BEAEPgQyBD4ENwQ3 BEAENQQ9BDgENQQ8BCAAOAQsACAAQQQ+BD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BCwAIAAxBD4E OwQ1BDUEIABBBEIEPgQ5BDoEPgQ5BCAAMgQ4BEAEQgRDBDAEOwRMBD0EPgQ5BCAAQAQ1BDAEOwRM BD0EPgRBBEIETAROBCAANAQwBFEEQgQgAEAEMAQ3BDsEOARHBD0ESwQ1BCAAMgQ1BEAEMQQwBDsE TAQ9BEsENQQgADgEOwQ4BCAAPQQ1BDIENQRABDEEMAQ7BEwEPQRLBDUEIAA6BD4EPAQwBD0ENARL BCwAIAA3BDAEOgQ7BE4ERwQwBE4ESQQ4BDUEQQRPBCAAMgQgAD4EMQRABDAESQQ1BD0EOAQ4BCAA OgQgAD4EPwRABDUENAQ1BDsEUQQ9BD0EPgQ5BCAAQgQ+BEcEOgQ1BCAAQAQ1BDAEOwRMBD0EPgRB BEIEOAQgADwEMAQ9BDgEPwRDBDsEOARABEMENQQ8BD4EMwQ+BCAARwQ1BDsEPgQyBDUEOgQwBCAA OAQgAD8EQAQ+BDIEPgQ6BDAERgQ4BDgEIAA+BD8EQAQ1BDQENQQ7BFEEPQQ9BD4EOQQgAD8EQAQ1 BDQEQQQ6BDAENwRDBDUEPAQ+BDkEIABABDUEMAQ6BEYEOAQ4BCwAIAA9BDAEPwRABDAEMgQ7BDUE PQQ9BD4EOQQgAD0EMAQgADEEPgQ7BDUENQQgADgEOwQ4BCAAPAQ1BD0ENQQ1BCAAPwQ7BDAEMgQ9 BEsEOQQgAD8ENQRABDUERQQ+BDQEIAAyBCAAMgQ4BEAEQgRDBDAEOwRMBD0EQwROBCAAQAQ1BDAE OwRMBD0EPgRBBEIETAQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQwBCwAIAAyBCAAOgQ+BEIEPgRA BD4EOQQsACAAQAQwBDcEQwQ8BDUENQRCBEEETwQsACAAPQRDBDYEPQQ+BCAANARDBDwEMARCBEwE IAA4BCAANAQ1BDsEMARCBEwEIAA4BDwENQQ9BD0EPgQgAEIEMAQ6BCwAIAA6BDAEOgQgAD4EPQQg ADgEIABFBD4ERwQ1BEIELgANACAAIQQgAEIEPgRHBDoEOAQgADcEQAQ1BD0EOARPBCAAPAQwBD0E OAQ/BEMEOwRPBEYEOAQ4BCAAPgQxBEkENQRBBEIEMgQ+BDwELAAgADoEMAQ7BDgEMQRABD4EMgQ6 BDAEIABNBEIEPgQgADIESwRPBDIEOwQ1BD0EOAQ1BCAAPgQxBEkEOARFBCAARgQ1BD0EPQQ+BEEE QgQ1BDkEIAA4BCAAPAQ4BEAEPgQyBD4ENwQ3BEAENQQ9BDgETwQsACAAQQQ+BEYEOAQwBDsETAQ9 BEsERQQsACAAQAQ1BDsEOAQzBDgEPgQ3BD0ESwRFBCwAIAA6BEMEOwRMBEIEQwRABD0ESwRFBCwA IABNBEIEPQQ4BEcENQRBBDoEOARFBCAAOAQgADMENQQ9BDQENQRABD0ESwRFBCAAPwRABDUENAQ/ BD4ERwRCBDUEPQQ4BDkEIAA4BCAAQwQxBDUENgQ0BDUEPQQ4BDkEIABNBEIEPgQzBD4EIAA+BDEE SQQ1BEEEQgQyBDAELAAgADUEMwQ+BCAAPwRBBDgERQQ+BDsEPgQzBDgERwQ1BEEEOgQ4BEUEIAA+ BEEEPgQxBDUEPQQ9BD4EQQRCBDUEOQQuACAALQRCBD4EIAA8BD4ENgQ1BEIEIAA/BEAEPgQ4BDcE MgQ+BDQEOARCBEEETwQgAD8EPgRBBEAENQQ0BEEEQgQyBD4EPAQgADoEQwQ7BEwEQgRDBEAEPQQ+ BDMEPgQgAD4EMQQ8BDUEPQQwBCAAOAQgADIEPQQ1BDQEQAQ1BD0EOAQ1BDwEIAA/BD4EOwQ4BEIE OAQ6BD4EMgQsACAATQQ6BD4EPQQ+BDwEOARBBEIEPgQyBCwAIABBBD4ERgQ4BD4EOwQ+BDMEPgQy BCwAIAAxBDgEPgQ7BD4EMwQ+BDIELAAgADoEQwQ7BEwEQgRDBEAEPgQ7BD4EMwQ+BDIEIAA4BCAA PwRABD4ERwQ4BEUEIABABDAEMQQ+BEIEPQQ4BDoEPgQyBCAAOAQgADAEMwQ1BD0EQgQ+BDIELgAN ACAAHwQ+BEEEOwQ1BCAARAQ+BEAEPAQ4BEAEPgQyBDAEPQQ4BE8EIAA/BD4ENARABD4EMQQ9BD4E OQQgADoEMARABEIESwQgAEAENQQwBDsETAQ9BD4EQQRCBDgEIAA0BDAEPQQ9BD4EMwQ+BCAAPgQx BEkENQRBBEIEMgQwBCwAIAA/BEAEPgQ4BDcEMgQ+BDQEOARCBEEETwQgAD8EPgQ0BEEEQgRABD4E OQQ6BDAELAAgAEIEPgQgADUEQQRCBEwEIAA0BDUEOgQ7BDAEQAQwBEYEOARPBCgAPQQwBCAAMwQ+ BEEEQwQ0BDAEQARBBEIEMgQ1BD0EPQQ+BDwEIABDBEAEPgQyBD0ENQQpACAANARABEMENgQxBEsE LAAgAD4EMQRJBDgERQQgAEYENQQ9BD0EPgRBBEIENQQ5BCwAIAA4BEEEQgQ+BEAEOAQ4BCAAOAQg ADgENAQ1BDkELAAgAE0EPAQ+BEYEOAQ+BD0EMAQ7BEwEPQQwBE8EIAA+BDoEQAQwBEEEOgQwBCAA QgQ1BEUEIAA4BDsEOAQgADgEPQRLBEUEIABEBDAEOgRCBD4EMgQuACAAHwQ+BEEEOwQ1BCAAQgQw BDoEPgQ5BCAAPwQ+BDQEMwQ+BEIEPgQyBDoEOAQgADwEMAQ9BDgEPwRDBDsEOARABD4EMgQwBD0E OAQ1BCAAPwRABD4EOAQ3BDIEPgQ0BDgEQgRBBE8EIAAwBD0EMAQ7BD4EMwQ4BEcEPQQ+BCAAQQRG BDUEPQQwBEAEOAROBCwAIAA+BD8EOARBBDAEPQQ9BD4EPARDBCAAMgRLBEgENQQsACAAQgQ+BDsE TAQ6BD4EIAAyBCAAPQQ+BDIEQwROBCAAQAQ1BDAEOwRMBD0EPgRBBEIETAQgADIENQQ0BFEEQgRB BE8EIAA9BDUEIAA+BDQEOAQ9BCAARwQ1BDsEPgQyBDUEOgQsACAAMAQgADIEQQRRBCAAPgQxBEkE NQRBBEIEMgQ+BCAAQQRABDAENwRDBC4ADQAgACAAIAAUBDsETwQgADMEOAQxBDoEPgQzBD4EIABD BD8EQAQwBDIEOwQ1BD0EOARPBCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABCAAPAQ+BDYENQRCBCAA OARBBD8EPgQ7BEwENwQ+BDIEMARCBEwEIABCBDAEOgQ4BDUEIAA8BDUEQgQ+BDQESwQgAEQEPgRA BDwEOARABD4EMgQwBD0EOARPBCAAOAQgAD0EMARBBEIEQAQ+BDkEOgQ4BCAAMgQ4BEAEQgRDBDAE OwRMBD0EPgQ5BCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQoAEAEMAQ/BD8EPgRABEIEMAQpADoADQAq ACAAQwRBBDgEOwQ1BD0EOAQ1BCAATQQ8BD4ERgQ4BDkEIAA3BDAEIABBBEcEUQRCBCAAMAQ/BDUE OwQ7BE8ERgQ4BDkEIAA6BCAAQAQ1BDsEOAQzBDgEPgQ3BD0ESwQ8BCAAOAQgAD0EMARGBDgEPgQ9 BDAEOwRMBD0ESwQ8BCAARwRDBDIEQQRCBDIEMAQ8BCwAIAAxBD4EOwRMBD0ESwQ8BCAAOAQgAEcE QwQyBEEEQgQyBDgEQgQ1BDsETAQ9BEsEPAQgADwENQRBBEIEMAQ8BCAANgQ1BEAEQgQyBEsELAAg AD0EMAQyBE8ENwRLBDIEMAQ9BDgETwQgADIEOAQ9BEsEIAA4BDsEOAQgAEEEQgRLBDQEMAQsACAA QQQ+BDEEOwQwBDcEPQQ1BD0EOARPBCwAIAA3BDAEPwRDBDMEOAQyBDAEPQQ4BE8EIAA4BCAAQwRB BEIEQAQwBEgENQQ9BDgETwQsACAAOgRABDgEQgQ4BDoEOAQsACAAQgRABDAEPQRBBDsETwRGBDgE OAQgAE0EPAQ+BEYEOAQ5BCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABDAEIAA2BDUEQARCBDIENQQg ADgEIAA/BEAEOARBBD4ENQQ0BDgEPQQ1BD0EOAQ1BCAANgQ1BEAEQgQyBEsEIAA6BCAAMQRDBDQE QwRJBDUEPARDBCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABDAEKAA+BEkEQwRJBDUEPQQ4BDUEIAAx BEMENARDBEkENQQzBD4EIABBBD4EQQRCBD4ETwQ9BDgETwQgADYENQRABEIEMgQ+BDkEIAA0BDsE TwQgAD4EMQQ7BDUEMwRHBDUEPQQ4BE8EIAA/BD4EQQQ7BDUENARDBE4ESQQ1BDMEPgQgAEAENQQw BDsETAQ9BD4EMwQ+BCAAPwQ1BEAENQRFBD4ENAQwBCAAOgQgAD0ENQQ8BEMEKQANACoAIAA4BDcE SgRPBEIEOAQ1BCAAOAQ3BCAAOgQ+BD0EQgQ1BDoEQQRCBDAELAAgADQEQAQ+BDEEOwQ1BD0EOAQ1 BCwAIAA/BD4EMgRCBD4EQAQ1BD0EOAQ1BCAAOAQ9BEQEPgRABDwEMARGBDgEOAQsACAAPAQ4BEEE QgQ4BEQEOAQ6BDAERgQ4BDgEIAA4BCAANAQ+BD8EPgQ7BD0EOARCBDUEOwRMBD0ESwQ1BCAAOAQ7 BDsETgQ3BDgEOAQgADoEIAAyBDgEQARCBEMEMAQ7BEwEPQQ+BDkEIABABDUEMAQ7BEwEPQQ+BEEE QgQ4BCAANgQ1BEAEQgQyBEsEDQAqACAAPwQ+BDQEPAQ1BD0EQwQgAEcEMARBBEIEPQQ+BDMEPgQg AD4EMQRJBDgEPAQgADgEIAA9BDAEPgQxBD4EQAQ+BEIELAAgAEEEPwQ1BEYEOAREBDgERwQ1BEEE OgQ4BDkEIABPBDcESwQ6BCAAOAQgADsENQQ6BEEEOAQ6BEMELAAgAEQEPgRABDwEQwQgAD8ENQRA BDUENAQwBEcEOAQgADgEPQREBD4EQAQ8BDAERgQ4BDgELAAgADAEPwQ1BDsEOwRPBEYEOAROBCAA OgQgAEcEQwQyBEEEQgQyBDAEPAQgADgEIABNBDwEPgRGBDgETwQ8BCAAOAQgAE0EPAQ+BEYEOAQ+ BD0EMAQ7BEwEPQRDBE4EIAA+BDoEQAQwBEEEOgRDBCwAIAA0BDgEQQRBBD4EPQQwBD0EQQQgADQE OwRPBCAAQAQwBDcEQARDBEgENQQ9BDgETwQgADgEQQRCBD4EQAQ4BEcENQRBBDoEPgQ5BCAAPwQw BDwETwRCBDgEIAA4BCAAMgQyBD4ENAQwBCAAMgQgAEEEPgQ3BD0EMAQ9BDgENQQgAD0EPgQyBEsE RQQgADoEPgQ9BEYENQQ/BEYEOAQ5BCwAIABBBDgEPAQyBD4EOwQ+BDIEIAA4BCAANwQwBDwENQQ9 BEsEIABGBDUEPQQ9BD4EQQRCBDUEOQQgAD0EMAQgADAEOgRCBEMEMAQ7BEwEPQRLBDUEIAA0BDsE TwQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQwBA0AKgAgADgEQQQ/BD4EOwRMBDcEPgQyBDAEPQQ4 BDUEIAA0BDUEPAQwBDMEPgQzBDgEOAQsACAAPwRABD4EQgQ4BDIEPgRABDUERwQ4BDIEPgQ5BCAA OAQ9BEQEPgRABDwEMARGBDgEOAQsACAAPwQ1BEAENQQ0BDAERwQ4BCAAQQQ7BEMERQQ+BDIEIAA4 BCAAPAQ9BDUEPQQ4BDkEIAAwBDIEQgQ+BEAEOARCBDUEQgQ+BDIEIAA4BDsEOAQgAD0EMAQ+BDEE PgRABD4EQgQgADgERQQgADQEOARBBDoEQAQ1BDQEOARCBDAERgQ4BE4ELAAgADsENQQ6BEYEOAQ4 BCwAIAA/BEAEPgQ/BD4EMgQ1BDQEOAQgADgEIAA4BD0ENAQ+BDoEQAQ4BD0EMARGBDgEOAQsACAA PwQ+BDQEMAQyBDsENQQ9BDgENQQgAD8EPgQ7BDgEQgQ4BEcENQRBBDoEPgQ5BCAAMAQ6BEIEOAQy BD0EPgRBBEIEOAQgADQEOwRPBCAAOgQ+BD0EQgRABD4EOwRPBCAAQQQ+BEYEOAQwBDsETAQ9BD4E OQQgAD0EMAQ/BEAETwQ2BFEEPQQ9BD4EQQRCBDgEDQAqACAAQAQwBDcEOwQ4BEcEPQRLBDUEIAA+ BDEEPAQwBD0ESwQ6ACAATwQyBD0ESwQ1BCAAOAQgADIEIABDBDwEPgQ7BEcEMAQ9BDgETwRFBCwA IAA+BDEEPAQwBD0EPQRLBDUEIAA0BDUEPAQ+BD0EQQRCBEAEMARGBDgEOAQgADgEIAA0BDUENwQ4 BD0ERAQ+BEAEPAQwBEYEOAQ4BCwAIAA6BDgEMQQ1BEAEMARCBDAEOgQ4BCwAIAA0BDgEMgQ1BEAE QQQ4BDgELAAgAD4EMQQ8BDAEPQQgADgEOwQ7BE4ENwQ4BDUEOQQgAD8EQAQ4BD0ETwRCBDgETwQg ADEEPgQ7BEwESAQ4BD0EQQRCBDIEPgQ8BCAAOAQgAD4ESAQ4BDEEPgRHBD0EMARPBCAAMARABDME QwQ8BDUEPQRCBDAERgQ4BE8EIAA9BDAEIAA+BEEEPQQ+BDIENQQgAE0EQgQ+BDMEPgQgAD4EMQQ8 BDAEPQQwBCwAIAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4BDgEIAAyBD0EQwRCBEAEOAQgAEIEPgQ7BD8E SwQoADAEPwQ7BD4ENAQ4BEEEPAQ1BD0EQgRLBCwAIABBBDoEMAQ9BDQEOARABD4EMgQwBD0EOAQ1 BCwAIABBBDwENQRFBCkAIAA4BCAAQQQgAD8EPgQ8BD4ESQRMBE4EIABCBD4EOwQ/BEsEKAA4BDsE OwROBDcEOARPBCAAPwRABDgEPQRPBEIEOARPBCAAOAQgADIESwRBBD4EOgQ+BDkEIAA+BEYENQQ9 BDoEOAQgADEEPgQ7BEwESAQ4BD0EQQRCBDIEPgQ8BCwAIAAwBDIEQgQ+BEAEOARCBDUEQgQwBDwE OAQ7ACAAPgQxBEkENQRBBEIEMgQ1BD0EPQRLBDUEIAA6BDAEPAQ/BDAEPQQ4BDgEKQAgADgEIABB BEIEMAQ0BD0EPgQzBD4EIAA4BD0EQQRCBDgEPQQ6BEIEMAQNACoAIAA6BD4EPQRGBDUEPwRCBEME MAQ7BEwEPQRLBDUEIAA4BCAAPwRBBDgERQQ+BDsEPgQzBDgERwQ1BEEEOgQ4BDUEIAAwBEIEMAQ6 BDgEIAA4BCAAOgQ+BD0EQgRABDAEQgQwBDoEOAQsACAAPwQwBEAEOARABD4EMgQwBD0EOARPBCAA OAQgAEMEMgRRBEAEQgQ6BDgEDQAqACAAOAQ9BEIENQQzBEAEMAQ7BEwEPQRLBDUEIAA4BCAAPwRA BD4ERwQ4BDUEIAA8BDUEQgQ+BDQESwQgAD4EMQRJBDUEPQQ4BE8EIAA0BDsETwQgAD8EPgQ7BEME RwQ1BD0EOARPBCAAQgQ1BEUEIAA4BDsEOAQgADgEPQRLBEUEIABBBD4EQQRCBD4ETwQ9BDgEOQQg AEMEPwRABDAEMgQ7BE8ENQQ8BD4EMwQ+BCAARwQ1BDsEPgQyBDUEOgQwBCAAOAQ7BDgEIAA+BDEE SQQ1BEEEQgQyBDAELAAgADwEPgQ9BD4EQgQ+BD0EPQQ+BDUEIAA9BDAEQAQwBEkEOAQyBDAEPQQ4 BDUEIAAyBDsEOARPBD0EOARPBCAANAQ7BE8EIAA/BD4EQQRCBDUEPwQ1BD0EPQQ+BDMEPgQgAD8E QAQ4BDIESwQ6BDAEPQQ4BE8EIAA2BDUEQARCBDIEPgQ5BCAAOAQgAEMEPwRABD4ESQQ1BD0EOARP BCAAQQQ+BDoEQARLBEIEOARPBCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ4BA0AIAAfBD4EQQQ7BDUE IAAiADMEOAQxBDoEPgQ5BCAAPQQwBEEEQgRABD4EOQQ6BDgEIgAgADwEMAQ9BDgEPwRDBDsETwRC BD4EQAQgADwEPgQ2BDUEQgQgADgEQQQ/BD4EOwRMBDcEPgQyBDAEQgRMBCAAQARLBEcEMAQzBDgE IAAyBDsEOARPBD0EOARPBDoADQArACAAPgQ6BD0EMAQgAB4EMgQ1BEAEQgQ+BD0EMAQoAEMENwQ6 BDgENQQgAD4EOgQ9BDAEIAAyBD4ENwQ8BD4ENgQ9BD4EQQRCBDgEIAA0BDsETwQgADwEMAQ9BDgE PwRDBDsETwRCBD4EQAQwBCAAQwQyBDUEQQRCBDgEIAA2BDUEQARCBDIEQwQgADIEIAA9BD4EMgRD BE4EIABABDUEMAQ7BEwEPQQ+BEEEQgRMBCAAQQQgAD8EPgRPBDIEOwQ1BD0EOAQ1BDwEIAA9BD4E MgQ+BDMEPgQgADgEOwQ4BCAAQwRBBEIEQAQwBD0ENQQ9BDgENQQ8BCAAOgQwBDoEPgQzBD4ELQA7 BDgEMQQ+BCAAQQRCBDAEQAQ+BDMEPgQgAD4EMQRKBDUEOgRCBDAELwAwBEEEPwQ1BDoEQgQwBCAA PwQ7BDAEMgQ9BEsEPAQgAD4EMQRABDAENwQ+BDwEIAA+BEIEIAA+BEIEQAQ4BEYEMAQ9BDgETwQg ADgEIAA+BEIEQgQ+BEAENgQ1BD0EOARPBCAANAQ+BCAAPwRABDgEPQRPBEIEOARPBCAAOAQgAEME QgQyBDUEQAQ2BDQENQQ9BDgETwQgADgEIAA9BDAEPgQxBD4EQAQ+BEIEKQANACsAIAA/BEAEPgQy BD4EOgQwBEYEOAQ4BCgAQQQ6BEAESwRCBEsENQQgADIEPgQ3BDQENQQ5BEEEQgQyBDgETwQgADgE IAA/BD4EQQQ7BDAEPQQ4BE8EKQANACsAIABDBEEEOAQ7BDUEPQQ4BDUEIAA4BDsEOAQgAD8EPgQ0 BDAEMgQ7BDUEPQQ4BDUEIABNBEQERAQ1BDoEQgQwBCAAPwRABD4EMgQ+BDoEMARGBDgEOAQNACsA IAAwBD8EPgQ7BD4EMwQ1BEIEOAQ6BDAEIABBBD4EMQRLBEIEOAQ5BCAAPwRABD4ERgQ1BEEEQQQw BCAAQwQ/BEAEMAQyBDsENQQ9BDgETwQoADQEOwRPBCAAPgQ/BEAEMAQyBDQEMAQ9BDgETwQgADwE MAQ9BDgEPwRDBDsETwRCBD4EQAQwBCAANgQ1BEAEQgQyBD4EOQQgADgEIABBBDoEQARLBEIEOARP BCAAQwQ/BEAEMAQyBDsETwROBEkENQQzBD4EIAAyBD4ENwQ0BDUEOQRBBEIEMgQ4BE8EKQANACAA EgQ+BDcEPAQ+BDYEPQQ+BEEEQgQ4BCAAPwRABD4EMgQ+BDoEMARGBDgEOAQgADwEPgQzBEMEQgQg ADEESwRCBEwEIAA+BDEEQAQ1BEIENQQ9BEsEIAA/BEAENQQ0BDIEMARABDgEQgQ1BDsETAQ9BEsE PAQgADIEMgQ+BDQEPgQ8BCAAMgQgAD0EQwQ2BD0EQwROBCAAMgQ4BEAEQgRDBDAEOwRMBD0EQwRO BCAAQAQ1BDAEOwRMBD0EPgRBBEIETAQgADgEIAAiAE8EOgQ+BEAENQQ9BDgENQQ8BCIAKAA8BDAE PQQ4BD8EQwQ7BE8EQgQ4BDIEPQRLBDwEIAAyBEEEQgRABDAEOAQyBDAEPQQ4BDUEPAQgADIEIAA/ BEEEOARFBDgEOgRDBCAARwQ1BDsEPgQyBDUEOgQwBCAAOAQ7BDgEIAA+BDEESQQ1BEEEQgQyBDAE IAA3BDAENAQwBD0EPQQ+BDMEPgQgAD4EQgQ6BDsEOAQ6BDAEIAA9BDAEIABCBD4EIAA4BDsEOAQg ADgEPQQ+BDUEIAA0BDUEOQRBBEIEMgQ4BDUEIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ+BEAEMAQgAD8E QwRCBDUEPAQgADwEPQQ+BDMEPgQ6BEAEMARCBD0EPgQ5BCAAPwRABD4EMgQ+BDoEMARGBDgEOAQp AC4AIAASBCAAQQQ7BEMERwQwBDUEIAA9BDUEQwQ0BDAERwQ4BCAAPAQwBD0EOAQ/BEMEOwRPBEIE PgRABCAAPAQ+BDYENQRCBCAAOARBBD8EPgQ7BEwENwQ+BDIEMARCBEwEIAA9BDAEOgQwBDcEMAQ9 BDgENQQgADIEIAAyBDgENAQ1BCAATQQ8BD4ERgQ4BD4EPQQwBDsETAQ9BD4EMwQ+BCAANAQwBDIE OwQ1BD0EOARPBCAAOAQ7BDgEIAA9BDAEPQQ1BEEENQQ9BDgENQQgAD8EQQQ4BEUEPgQ7BD4EMwQ4 BEcENQRBBDoEPgQ5BCAAQgRABDAEMgQ8BEsELgAgABIEIABBBDsEQwRHBDAENQQgAD4EMQRJBDUE QQRCBDIENQQ9BD0ESwRFBCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ5BCAANAQ7BE8EIABABDUESAQ1 BD0EOARPBCAAPgQ/BDgEQQQwBD0EPQRLBEUEIABGBDUEOwQ1BDkEIAA8BD4EMwRDBEIEIAA4BEEE PwQ+BDsETAQ3BD4EMgQwBEIETARBBE8EIABIBD8EOAQ+BD0ESwQsACAAQAQwBDcEMgQ1BDQERwQ4 BDoEOAQgADgEIABCBDAEOgQgAD0EMAQ3BEsEMgQwBDUEPAQwBE8EIAAiAD8ETwRCBDAETwQgADoE PgQ7BD4EPQQ9BDAEIgAsACAAOAQ9BEQEPgRABDwEMARGBDgEPgQ9BD0ESwQ1BCAAQgQ1BEUEPQQ+ BDsEPgQzBDgEOAQgADgEIABBBD4EPgRCBDIENQRCBEEEQgQyBEMETgRJBDUENQQgAD8EQAQ+BDME QAQwBDwEPAQ9BD4ENQQgAD4EMQQ1BEEEPwQ1BEcENQQ9BDgENQQsACAAMwRABEMEPwQ/BEsEIAA9 BDAEIABEBD4EQARDBDwEMARFBCAAOAQgADIEIABBBD4ERgQ4BDAEOwRMBD0ESwRFBCAAQQQ1BEIE TwRFBCwAIAAwBCAAQgQwBDoENgQ1BCAAOAQ9BEQEPgRABDwEMARGBDgEPgQ9BD0EMARPBCAAOAQg AD8EQQQ4BEUEPgQ7BD4EMwQ4BEcENQRBBDoEMARPBCAAMQQ+BEAETAQxBDAEIAA4BCAAMgQ+BDkE PQQwBC4AIAAfBEAEPgQyBD4EOgQwBEYEOAQ1BDkEIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAPAQ1 BDQEOAQwBC0AMgQ4BEAEQwRBBCgAOwROBDEEPgQ1BCAATwRABDoEPgQ1BCAAPAQ1BDQEOAQwBC0A QQQ+BDEESwRCBDgENQQpACAAOAQ7BDgEIABABDUEOgQ7BDAEPAQ9BEsEOQQvAD8EOAQwBEAELQBF BD4ENAQsACAAMgQ3BEAESwQyBDAETgRJBDgEOQQgADgEPQREBD4EQQRABDUENARDBCAAQAQwBEEE PwRABD4EQQRCBEAEMAQ9BDUEPQQ4BDUEPAQgADwENQQ8BD4EMgQsACAAOgQ+BEIEPgRABEsENQQg AD4EPQQgAEEEPgQ0BDUEQAQ2BDgEQgQuAA0AIAAVBEEEOwQ4BCAAPAQwBD0EOAQ/BEMEOwRPBEIE PgRABEMEIABDBDQEMARRBEIEQQRPBCAAPgRCBDoEOwROBEcEOARCBEwEIABBBD4ENwQ9BDAEPQQ4 BDUEIAA+BDEESgQ1BDoEQgQwBCAAQQQyBD4EOARFBCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ5BCwA IAA9BD4EIAA/BEAEOAQgAE0EQgQ+BDwEIABBBD4ERQRABDAEPQQ4BEIETAQgAEEEMgQ+BE4EIAAy BDgEQARCBEMEMAQ7BEwEPQRDBE4EIABABDUEMAQ7BEwEPQQ+BEEEQgRMBCAAMgQgADMEPgQ7BD4E MgQ1BCAATQRCBD4EMwQ+BCAARwQ1BDsEPgQyBDUEOgQwBCgAOAQ7BDgEIAA+BDEESQQ1BEEEQgQy BDAEKQAsACAAQgQ+BCAANAQwBDsETARIBDUEIAA+BD0EIAA8BD4ENgQ1BEIEIAA2BDUEQQRCBDoE PgQgAEMEPwRABDAEMgQ7BE8EQgRMBCAARwQ1BEAENQQ3BCAAMwQ4BD8EPQQ+BDcELgAgABIEIABC BDAEOgQ+BDwEIABBBD4EQQRCBD4ETwQ9BDgEOAQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQgADwE PgQ2BDUEQgQsACAAPQQwBD8EQAQ4BDwENQRABCwAIABCBEAEMAQ9BEEERAQ+BEAEPAQ4BEAEPgQy BDAEQgRMBCAAQAQ1BDAEOwRMBD0EPgRBBEIETAQgADIEPwQ7BD4EQgRMBCAANAQ+BCAAPwQ+BDsE PQQ+BDkEIABIBDgENwQ+BEQEQAQ1BD0EOAQ4BCAAOAQgAD4EMQQ1BEEERwQ1BDsEPgQyBDUERwQ4 BDIEMAQ9BDgETwQgADYENQRABEIEMgRLBC4AIAAtBEIEPgQgAEIEPgQsACAARwRCBD4EIAA/BEAE PgQ4BDcEPgRIBDsEPgQgAEEEIAAgBEMEQQRMBE4ELgAgAB8EPgRCBDUEQARPBDIEIABBBD4ENwQ9 BDAEPQQ4BDUEIAAgBD4ENAQwBCwAIAA8BEsEIAA/BD4EQgQ1BEAETwQ7BDgEIAA4BCAARwQ1BDsE PgQyBDUERwQ1BEEEOgQ4BDkEIAA+BDEEOwQ4BDoELgAgABAEIAA2BDUEQARCBDIENQQgADEENQQ3 BCAAQQQ+BDcEPQQwBD0EOARPBCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABCAAPAQ+BDYENQRCBCAA PQQwBD0ENQRBBEIEOAQgADsETgQxBD4EOQQgAD8EQQQ4BEUEPgQ7BD4EMwQ4BEcENQRBBDoEOAQ5 BCAAOAQ7BDgEIABEBDgENwQ4BEcENQRBBDoEOAQ5BCAAMgRABDUENAQuACAAEgQ+BDcEPAQ+BDYE PQQ+BCAAQgQwBDoENgQ1BCAAPQQ1BCAAPgRCBDoEOwROBEcENQQ9BDgENQQsACAAPQQ+BCAAPwQ+ BDQEMAQyBDsENQQ9BDgENQQgAEEEPgQ3BD0EMAQ9BDgETwQgADQEPgQgAEMEQAQ+BDIEPQRPBCAA QwQ0BD4EMQQ9BD4EMwQ+BCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABEMELgAgAB8EPgQ0BDAEMgQ7 BE8EQgRMBEEETwQgAEEEPgQ3BD0EMAQ9BDgENQQgADwEPgQ2BDUEQgQgAEAETwQ0BD4EPAQgAEEE PwQ+BEEEPgQxBD4EMgQ6ACAAPQQwBEAEOgQ+BEIEOAQ3BDAERgQ4BDUEOQQsACAARAQ4BDcEOARH BDUEQQQ6BDgEPAQgADgEOwQ4BCAAPQQ1BEAEMgQ9BEsEPAQgADgEQQRCBD4ESQQ1BD0EOAQ1BDwE LAAgADQEOwQ4BEIENQQ7BEwEPQRLBDwEIABNBDwEPgRGBDgEPgQ9BDAEOwRMBD0ESwQ8BCAAPQQw BD8EQARPBDYENQQ9BDgENQQ8BCwAIAA7BDgESAQ1BD0EOAQ1BDwEIABBBD0EMAQgADgEIAA/BEEE OARFBD4EOwQ+BDMEOARHBDUEQQQ6BDgEPAQgADQEMAQyBDsENQQ9BDgENQQ8BCAAOAQgADIEPQRD BEgENQQ9BDgENQQ8BC4AIAAtBEIEPgQgADIEQQRRBCAAQAQwBDEEPgRCBDAENQRCBCwAIAA1BEEE OwQ4BCAAQwQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQwBCAANAQ+BEEEQgQwBEIEPgRHBD0EPgQg ADQEOwRPBCAATQRCBD4EMwQ+BCAAMgQ7BDAEQQRCBDgEIAA4BCAAQwQ8BDUEPQQ4BE8ELAAgAEAE MAQ3BEMEPAQ1BDUEQgRBBE8ELgANACAALQREBEQENQQ6BEIEIAA8BDAEPQQ4BD8EQwQ7BE8ERgQ4 BDgEIABBBDgEOwRMBD0EPgQgADcEMAQyBDgEQQQ4BEIEIAA+BEIEIABDBE8ENwQyBDgEPAQ+BEEE QgQ4BCAANgQ1BEAEQgQyBEsELgAgACMETwQ3BDIEOAQ8BDAEIAA+BD0EMAQgADwEPgQ2BDUEQgQg ADEESwRCBEwEIAA4BDcEIAA3BDAEIABBBDsEMAQxBD4EQQRCBDUEOQQgADgEOwQ4BCAAMQQ+BDsE NQQ3BD0ENQQ5BCwAIAAzBDsEQwQ/BD4EQQRCBDgELAAgADIEPQRDBEgEMAQ1BDwEPgRBBEIEOAQs ACAAQQRCBEAEMARFBD4EMgQsACAAPQQ1BEMEMgQ1BEAENQQ9BD0EPgRBBEIEOAQsACAAPQQ1BDIE PQQ4BDwEMARCBDUEOwRMBD0EPgRBBEIETAQsACAANAQ+BDIENQRABEcEOAQyBD4EQQRCBDgELAAg AD0EMAQ4BDIEPQQ+BEEEQgQ4BCwAIAA2BDAENAQ9BD4EQQRCBDgELAAgAEEEMAQ8BD4EPgQxBDwE MAQ9BDAELAAgADIEIABCBD4EPAQgAEcEOARBBDsENQQgACIARARDBD0ENAQwBDwENQQ9BEIEMAQ7 BEwEPQQ+BDkEIAA+BEgEOAQxBDoEOAQgADAEQgRABDgEMQRDBEYEOAQ4BCIAKAA9BDUEMgQ1BEAE PQQ+BDkEIABBBDIETwQ3BDgEIAA/BEAEOARHBDgEPQRLBCAAOAQgAEEEOwQ1BDQEQQRCBDIEOARP BCAAQQQyBD4ENQQzBD4EIAA4BCAARwRDBDYEOARFBCAAPwQ+BDIENQQ0BDUEPQQ4BDkEKQAsACAA IgAyBEsEQwRHBDUEPQQ9BD4EOQQgADEENQRBBD8EPgQ8BD4ESQQ9BD4EQQRCBDgEIgAoAD0ENQQ/ BEAEPgRCBDgEMgQ7BDUEPQQ4BE8EIABEBDAEOgRCBD4EQAQwBDwEIAAyBD4ENwQ0BDUEOQRBBEIE MgQ4BE8EIAA4BDcEIAA3BDAEIAA9BDgENwQ6BD4EOQQgADgEOwQ4BCAAPgRCBEAEOARGBDAEQgQ1 BDsETAQ9BD4EOQQgAE0ERAREBDUEOgRCBDgEMgQ9BD4EQQRCBDgEIABBBD4EPwRABD4EQgQ4BDIE OwQ1BD0EOARPBCAAMgQgAD8EQAQ+BEgEOwQ+BDwEKQAsACAAQQQ6BDsEPgQ9BD0EPgRBBEIEOAQg ADoEIAA6BD4EPQREBD4EQAQ8BDgENwQ8BEMEIAA4BCAAOgQ+BD0ERgQ1BD8EQgRDBDAEOwRMBD0E PgQ8BEMEIAA4BDsEOAQgADgENAQ1BD4EOwQ+BDMEOARHBDUEQQQ6BD4EPARDBCAAQgQ+BEIEMAQ7 BDgEQgQwBEAEOAQ3BDwEQwQsACAAPwRABD4ERwQ4BDUELgAgAB4EMQRJBDUEQQRCBDIEPgQsACAA OgQ+BEIEPgRABD4ENQQgAEEEPgQ0BDUEQAQ2BDgEQgQgADoEMAQ6BD4EOQQtAEIEPgQgAD8EQAQ+ BEYENQQ9BEIEIAAxBD4EOwRMBD0ESwRFBCAAOAQgAEEEOwQwBDEESwRFBCwAIAAyBEEENQQzBDQE MAQgAEMETwQ3BDIEOAQ8BD4ELgANACAAIgQ4BD8EOARHBD0ESwQ5BCAAPwRABDgEPAQ1BEAEIAA/ BEAEPgQyBD4EOgQwBEYEOAQ4BCAATQRCBD4EIAA9BDAEQgRABDAEMgQ7BDgEMgQwBD0EOAQ1BCAA EAQ8BDUEQAQ4BDoEOAQgAD0EMAQgABgEQAQwBDoELgAgABIEIABDBDYENQQgAD8EPgRABE8ENAQ6 BD4EPAQgAD4EQgREBD4EQAQ8BDAEQgQ4BEAEPgQyBDAEPQQ9BD4EOQQgAEAENQQwBDsETAQ9BD4E QQRCBDgEIAAwBDwENQRABDgEOgQwBD0ERgQ1BDIEIAAiADcEOwRLBDUEIABIBDAERQQ4BDQESwQi ACAAOAQgACIAOgRABD4EMgQwBDIESwQ1BCAANAQ4BDoEQgQwBEIEPgRABEsEIgAgABEEOwQ4BDYE PQQ1BDMEPgQgABIEPgRBBEIEPgQ6BDAEIABCBD4EOwRMBDoEPgQgADgEIAA0BEMEPAQwBE4EQgQs ACAAOgQwBDoEIAAxBEsEIABDBDEEOARCBEwEIAA6BD4EMwQ+BC0APQQ4BDEEQwQ0BEwEIAA4BDcE IAAwBDwENQRABDgEOgQwBD0ERgQ1BDIELAAgADAEIAA1BEkENQQgADsEQwRHBEgENQQgAEEEQAQw BDcEQwQgADwEPQQ+BDMEPgQgAEEEMgQ+BDgEPAQgACIARQQ4BDwEOARHBDUEQQQ6BDgEPAQgAD4E QARDBDYEOAQ1BDwEIgAoAEQEMAQ7BEwEQQQ4BEQEOAQ6BDAERgQ4BE8EPAQ4BCAAMgQ7BDAEQQRC BDgEIAAhBCgEEAQgAD4EQgQ6BEAESwQ7BDgEIAA+BDoEPQQ+BCAAHgQyBDUEQARCBD4EPQQwBCkA LgAgABgEIAAyBD4EQgQsACAAOgQ+BDMENAQwBCAAEQQwBEAEQwRFBCAANAQ1BDwEPgQ9BEIEOARA BD4EMgQwBDsEIABBBDIEPgQ5BCAAPgREBDgEQQQoADEEMARIBD0EOAQtADEEOwQ4BDcEPQQ1BEYE SwQgADIEQQQ1BDwEOARABD0EPgQzBD4EIABCBD4EQAQzBD4EMgQ+BDMEPgQgAEYENQQ9BEIEQAQw BCAAMgQgAB0ETAROBC0AGQQ+BEAEOgQ1BCkAIAA/BD4ENAQ3BDUEPAQ9BEsEPAQ4BCAATwQ0BDUE QAQ9BEsEPAQ4BCAAMgQ3BEAESwQyBDAEPAQ4BCAAOAQgAD8ENQRABDUEPAQ1BEEEQgQ4BDsEIAA1 BDMEPgQgADIEIAA9BD4EMgRLBDkEIABGBDUEPQRCBEAEIAAzBDsEPgQxBDAEOwRMBD0EPgQzBD4E IAA6BDAEPwQ4BEIEMAQ7BDAEKAATBD4EPQQzBCAAGgQ+BD0EMwQpACwAIABBBD8EQAQ+BDIEPgRG BDgEQAQ+BDIEMAQ9BD0EMARPBCAAEAQ8BDUEQAQ4BDoEMAQgADIEQgQ+BEAEMwQ7BDAEQQRMBCAA MgQgABgEQAQwBDoELAAgAEcEQgQ+BCAAOAQgAEIEQAQ1BDEEPgQyBDAEOwQ+BEEETAQgADEENQRB BEcENQQ7BD4EMgQ1BEcEPQRLBDwEIAAzBDsEPgQxBDAEOwQ4BEEEQgQwBDwELgANACAAEAQ9BDAE OwQ+BDMEOARHBD0EPgQgAEEEPgQ3BDQEMAROBEIEQQRPBCAARgQyBDUEQgQ9BEsENQQgAEAENQQy BD4EOwROBEYEOAQ5BCwAIAA4BCAAQAQwBDcENgQ4BDMEMAQ1BEIEQQRPBCAAPQQ1BD0EMAQyBDgE QQRCBEwEIAA0BDAENgQ1BCAAOgQgADEEQAQwBEIEQQQ6BDgEPAQgAD0EMARABD4ENAQwBDwELgAg ABIEIAA9BDAERwQwBDsENQQgAD0EMAQ4BDwENQQ9BDUENQQgAD8EQAQ+BEEEMgQ1BEkEUQQ9BD0E MARPBCAAOAQsACAAOgQwBDoEIAA/BEAEMAQyBDgEOwQ+BCwAIAA4BDcEIAAxBDUENAQ9BEsERQQg AEEEOwQ+BDUEMgQgAD4EMQRJBDUEQQRCBDIEMAQsACAAQQQ6BDsEPgQ9BD0EMARPBCAAOgQgADoE QQQ1BD0EPgREBD4EMQQ4BDgEIAA8BD4EOwQ+BDQENQQ2BEwEIAAyBD4EMgQ7BDUEOgQwBDUEQgRB BE8EIAAyBCAAQQQ1BDoEQgRLBCAAOAQ7BDgEIABCBDAEOgQgAD0EMAQ3BEsEMgQwBDUEPARLBDUE IABABDAENAQ4BDoEMAQ7BEwEPQRLBDUEIAA0BDIEOAQ2BDUEPQQ4BE8ELAAgADIEIAA6BD4EQgQ+ BEAESwRFBCAAQQQgAD8EPgQ8BD4ESQRMBE4EIABBBEIEMARABEgEOARFBCAAQgQ+BDIEMARABDgE SQQ1BDkEIAA/BEMEQgQ1BEgENQRBBEIEMgRDBE4EQgQgADIEIABABDUEMAQ7BEwEPQQ+BEEEQgRM BCgAPQQ+BDIEPgQzBD4EIAA+BDoEPQQwBCAAHgQyBDUEQARCBD4EPQQwBCkALAAgADIEIAA6BD4E QgQ+BEAEPgQ5BCAAPAQ+BDYEPQQ+BCAAPwRDBEEEQgRMBCAAPQQ1BCAAPQQ1BD0EMAQyBDgENAQ1 BEIETAQsACAAPQQ+BCAAPgRHBDUEPQRMBCAAPQQwBEEEQgQ+BEAEPgQ2BDUEPQQ9BD4EIAA4BCAA QQQgAD0ENQQ0BD4EMgQ1BEAEOAQ1BDwEIAA+BEIEPQQ+BEEEOARCBEwEQQRPBCAAOgQgAEEEMgQ+ BDgEPAQgADYENQQgADEEQAQwBEIETARPBDwEIAA4BCAAQQRRBEEEQgRABDAEPAQuACAAIQQyBD4E OARFBCAAQAQ+BDQEPQRLBEUELAAgAD0EPgQgAD8EQAQ+BDYEOAQyBDAETgRJBDgERQQgADIEIABB BD4EQQQ1BDQEPQQ1BDkEIABBBEIEQAQwBD0ENQQgAD4EPQQ4BCAAQwRHBDAEQgRBBE8EIABBBEcE OARCBDAEQgRMBCAARwRDBDYEOAQ8BDgELAAgADAEIABBBCAAPwQ+BDwEPgRJBEwETgQgAE8EQAQ7 BEsEOgQ+BDIEIAA4BCAAOgQ7BDgERwQ1BDoEIAA+BEIEPQQ+BEEEOARCBEwEIAA4BEUEIAA6BCAA PQQ1BDoEOAQ8BCAAMAQxBEEEQgRABDAEOgRCBD0ESwQ8BCAAQQRDBEkENQRBBEIEMgQwBDwEIAA4 BCAAOwROBDQETAQ8BDgELQBCBD4EIAA9BDUEIABPBDIEOwRPBE4ESQQ4BDwEOARBBE8ELAAgADoE PgRCBD4EQARLBEUEIAA8BD4ENgQ9BD4EIAAxBDgEQgRMBCwAIAA9BDAEQQQ4BDsEPgQyBDAEQgRM BCAAOAQgAEMEMQQ4BDIEMARCBEwEIAAxBDUENwQgADcEMAQ3BEAENQQ9BDgETwQgAEEEPgQyBDUE QQRCBDgEIAA4BCAAMgQgAEIEMgRRBEAENAQ+BDkEIABDBDIENQRABDUEPQQ9BD4EQQRCBDgEIABB BDIEPgQ1BDMEPgQgADMENQRABD4EOQRBBEIEMgQwBC4AIAAhBCAATQRCBD4EOQQgAEYENQQ7BEwE TgQgAEAEMAQ3BEAEMAQxBDAEQgRLBDIEMAQ1BEIEQQRPBCAAOwQ1BDoEQQQ4BDoEMAQgAD0ENQQ9 BDAEMgQ4BEEEQgQ4BC0AIACrADoEPgQ7BD4EQAQwBDQESwS7ACwAIACrADIEMARCBD0EOAQ6BDgE uwAsACAAqwATACAASABZAFAARQBSAEwASQBOAEsAIAAiAGgAdAB0AHAAcwA6AC8ALwByAHUALgB3 AGkAawBpAHAAZQBkAGkAYQAuAG8AcgBnAC8AdwBpAGsAaQAvACUARAAwACUAQQAyACUARAAwACUA QgA4ACUARAAxACUAOAAyACUARAAxACUAOAAzACUARAAxACUAOAA4ACUARAAwACUAQgBBACUARAAw ACUAQgA4ACIAIABcAG8AIAAiACIEOARCBEMESAQ6BDgEIgAgABQAQgQ4BEIEQwRIBDoEOAQVALsA LAAgAKsAEwAgAEgAWQBQAEUAUgBMAEkATgBLACAAIgBoAHQAdABwAHMAOgAvAC8AcgB1AC4AdwBp AGsAaQBwAGUAZABpAGEALgBvAHIAZwAvAHcAaQBrAGkALwAlAEQAMAAlAEEAMgAlAEQAMAAlAEIA NQAlAEQAMQAlADgAMAAlAEQAMQAlADgAMAAlAEQAMAAlAEIARQAlAEQAMQAlADgAMAAlAEQAMAAl AEIAOAAlAEQAMQAlADgAMQAlAEQAMQAlADgAMgAiACAAXABvACAAIgAiBDUEQARABD4EQAQ4BEEE QgQiACAAFABCBDUEQARABD4EQAQ4BEEEQgRLBBUAuwA7ACAAqwBDBDoEQAQ+BD8ESwS7ACwAIACr ADwEMAQ5BDQEMARDBD0ESwS7ACwAIACrADoEMARABDAEQgQ1BDsEOAS7ACwAIACrAEQEMARIBDgE QQRCBEsEuwAgADgEIAA0BEAEQwQzBDgENQQuACAAHwQ+BEEEOwQ1BCAAQQQ1BEAEOAQ4BCAAPwRA BD4EMgQ+BDoEMARGBDgEOQQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQAQgADwEPgQ2BDUEQgQgAD8E PgQ2BDgEPQQwBEIETAQgAD8EOwQ+BDQESwQgADIEIAAyBDgENAQ1BCAAMwQ+BEAETwRJBDUEOQQg AD0ENQQ9BDAEMgQ4BEEEQgQ4BCwAIABABDUEMgQ+BDsETgRGBDgEOAQsACAAPAQwBEEEQQQ+BDIE SwRFBCAAQwQxBDgEOQRBBEIEMgQsACAAMgQ+BDkEPQQgADgEIAAzBDUEPQQ+BEYEOAQ0BDAELgAN ACAAHwRABDgEIAAyBD4ENwQ0BDUEOQRBBEIEMgQ4BDgEIAA4BDcEOwRDBEcENQQ9BDgETwQgAEAE MAQ3BDsEOARHBD0ESwRFBCAAOAQ3BDsEQwRHBDAEQgQ1BDsENQQ5BCAAOAQ9BEQEPgRABDwEMARG BDgEOAQgAD0EMAQgAEcENQQ7BD4EMgQ1BDoEMAQgADIEPgQ3BDwEPgQ2BD0EPgQgADgEQQQ/BD4E OwRMBDcEPgQyBDAEQgRMBCAANAQyBDAEIAA/BD4EPwRDBDsETwRABD0ESwRFBCAATQREBEQENQQ6 BEIEMAQtACAAQAQ1BDcEPgQ9BDAEPQRBBCAAOAQgAEEEQwQ/BDUEQAQ/BD4ENwQ4BEYEOAROBC4A IAASBCAAQQQ7BEMERwQwBDUEIAA/BEAEPgQyBD4EOgQwBEYEOAQ4BCAAOgQwBDoEOARFBC0AOwQ4 BDEEPgQgADQENQQ5BEEEQgQyBDgEOQQgADwEMAQ9BDgEPwRDBDsETwRCBD4EQARDBCAAMgRLBDME PgQ0BD0EPgQgADIESwQ3BDIEMARCBEwEIAAyBCAAQAQ1BDAEOwRMBD0EPgRBBEIEOAQgAEcENQQ7 BD4EMgQ1BDoEMAQgADgEOwQ4BCAAPgQxBEkENQRBBEIEMgQwBCAAQAQ1BDcEPgQ9BDAEPQRBBCAA PwRABD4EMgQ+BDoEMARGBDgEOAQgADgEIAA8BEsEQQQ7BDgEQgQ1BDsETAQ9BEsERQQgAD8EQAQ+ BEYENQRBBEEEPgQyBCwAIABBBDIETwQ3BDAEPQQ9BEsERQQgAEEEIABNBEIEPgQ5BCAAPwRABD4E MgQ+BDoEMARGBDgENQQ5BCwAIABCBDAEOgQgADoEMAQ6BCAAMgQgAE0EQgQ+BDwEIABBBDsEQwRH BDAENQQgAE0ERAREBDUEOgRCBCAANAQ+BEEEQgQ4BDMEMAQ1BEIEQQRPBCAAQQQgADwEOAQ9BDgE PARDBDwEPgQ8BCAAQwRBBDgEOwQ4BDkELgAgABoEQAQ+BDwENQQgAEIEPgQzBD4ELAAgAEEEQwQ/ BDUEQAQ/BD4ENwQ4BEYEOARPBCAAOAQ3BDsEQwRHBDAEQgQ1BDsENQQ5BCAANAQwBFEEQgQgADIE PgQ3BDwEPgQ2BD0EPgRBBEIETAQgAEMEQQQ4BDsEOARCBEwEIAA8BD4ESQRMBCAAQQQ4BDMEPQQw BDsEMAQgADIEIABOAF4AMgAsACAAMwQ0BDUEIABOAC0AIAA6BD4EOwQ4BEcENQRBBEIEMgQ+BCAA PgQ0BDgEPQQwBDoEPgQyBEsERQQgADgENwQ7BEMERwQwBEIENQQ7BDUEOQQuACAALQRCBD4EQgQg AE0ERAREBDUEOgRCBCAAOARBBD8EPgQ7BEwENwRDBE4EQgQgADMEOwQ+BDEEMAQ7BDgEQQRCBEEE OgQ4BDUEIAA+BEAEMwQwBD0EOAQ3BDAERgQ4BDgELAAgADIEQAQ+BDQENQQgADwEMARBBD4EPQQ+ BDIELgAgABQEOwRPBCAAQgQ+BDMEPgQgAEcEQgQ+BDEESwQgADQEPgRBBEIEOARHBEwEIAA8BD4E SQQ9BD4EQQRCBDgEIABOAF4AMgAsACAANAQ+BEEEQgQwBEIEPgRHBD0EPgQgAEIEPgQ7BEwEOgQ+ BCAATgAgADgENwQ7BEMERwQwBEIENQQ7BDUEOQQtACAAMAQ0BDUEPwRCBD4EMgQsACAAOgQ+BEIE PgRABEsENQQgADEEQwQ0BEMEQgQgADgENwQ7BEMERwQwBEIETAQgADgEPQREBD4EQAQ8BDAERgQ4 BE4EIABBBCAAQAQwBDcEPQRLBEUEIAA/BD4ENwQ4BEYEOAQ5BCAAQgQwBDoELAAgAEcEQgQ+BCAA MgQgAD0EQwQ2BD0EPgQ8BCAAPAQ1BEEEQgQ1BCAAPAQ+BEkEPQQ+BEEEQgRMBCAAOAQ3BDsEQwRH BDUEPQQ4BE8EIAA3BDAEIABBBEcEUQRCBCAAQQRDBD8ENQRABD8EPgQ3BDgERgQ4BDgEIAA8BD4E NgQ1BEIEIAAyBEsEQAQwBEEEQgQ4BCAAMgQgAE4AXgAyAC4AIAAVBEEEOwQ4BCwAIAA/BEAENQQ0 BD8EPgQ7BD4ENgQ4BDwELAAgADQEOwRPBCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ5BCAAPAQ9BD4E MwQ+BEIESwRBBE8ERwQ9BD4EOQQgAEIEPgQ7BD8EPgQ5BCAAPQRDBDYEPQQ+BCAAQQQ/BEAEPgQy BD4ERgQ4BEAEPgQyBDAEQgRMBCAAOAQ7BDgEIAA/BDUEQAQ1BDIENQRBBEIEOAQgADIEIAAyBD4E NwQxBEMENgQ0BFEEPQQ9BD4ENQQgAEEEPgRBBEIEPgRPBD0EOAQ1BCAATQQ7BDUEPAQ1BD0EQgQg AE0EQgQ+BDkEIABCBD4EOwQ/BEsEIAA4BCAAPAQ+BEkEPQQ+BEEEQgRMBCwAIAA9BEMENgQ9BDAE TwQgADQEOwRPBCAAPwQ1BEAENQRFBD4ENAQwBCAAQAQwBDIEPQQwBCAAMQAwADAAKgBQADAALAAg ADMENAQ1BCAAUAAwAC0AIAA8BD4ESQQ9BD4EQQRCBEwEIAA+BDQEPQQ+BDMEPgQgADwEMARBBD4E PQQwBCwAIABCBD4EIAA0BDsETwQgAEAENQQwBDsEOAQ3BDAERgQ4BDgEIABCBDAEOgQ+BDkEIAA3 BDAEQgQ1BDgEIAA/BD4EPQQwBDQEPgQxBDgEQgRBBE8EIAAyBEEENQQzBD4EIAAxADAALAAgADAE IAA9BDUEIAAxADAAMAAgADwEMARBBD4EPQQ+BDIEIAA4BCAATQRCBD4EIAAyBEEEUQQgADwEPgQ2 BDUEQgQgAD4EQAQzBDAEPQQ4BDcEPgQyBDAEQgRMBCAAPgQ0BDgEPQQgAEcENQQ7BD4EMgQ1BDoE LAAgADgEPAQ1BE4ESQQ4BDkEIAAyBCAAQQQyBD4EUQQ8BCAAPwQ+BDQERwQ4BD0ENQQ9BDgEOAQg ADQENQRBBE8EQgQ1BEAESwRFBC4ADQAgABwENQRCBD4ENARLBCAAPwRABD4EPwQwBDMEMAQ9BDQE SwQsACAAOgRABD4EPAQ1BCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ5BCwAIAAyBCAAQgQ1BEUEIAA4 BDsEOAQgADgEPQRLBEUEIABDBEEEOwQ+BDIEOARPBEUEIAA4BCAAPwQ+BCAAPgRCBD0EPgRIBDUE PQQ4BE4EIAA6BCAAQAQwBDcEPQRLBDwEIAA7BE4ENARPBDwEIABCBD4ENgQ1BCAAPAQ+BDMEQwRC BCAARAQ+BEAEPAQ4BEAEPgQyBDAEQgRMBCAAOgQwBDoEOAQ1BC0AQgQ+BCAAMARBBD8ENQQ6BEIE SwQgADIEOARABEIEQwQwBDsETAQ9BD4EOQQgAEAENQQwBDsETAQ9BD4EQQRCBDgELAAgAD0EQwQ2 BD0EPgQ5BCAAPAQwBD0EOAQ/BEMEOwRPBEIEPgRABEMELgAgAB0EPgQgADgERQQgAE0ERAREBDUE OgRCBDgEMgQ9BD4EQQRCBEwEIABBBDgEOwRMBD0EPgQgADcEMAQyBDgEQQQ4BEIEIAA+BEIEIAA6 BEAEOARCBDgERwQ9BD4EQQRCBDgEIAA8BEsESAQ7BDUEPQQ4BE8EIAA2BDUEQARCBDIESwQsACAA MgQgAEIEPgQgADIEQAQ1BDwETwQgADoEMAQ6BCAAQwQ0BDAERwQ9BDAETwQgADwEMAQ9BDgEPwRD BDsETwRGBDgETwQgAEEEOgRABEsEQgQwBCAAPgRCBCAANQRRBCAAQAQwBEEEQQRDBDQEOgQwBCAA PQQwBCAAMQAwADAAJQAuAA0AIAAhBDAEPAQgAD8EPgQgAEEENQQxBDUEIABCBDUEQAQ8BDgEPQQg ACIAPAQwBD0EOAQ/BEMEOwRPBEYEOARPBCIAIAA8BDAEPQQ4BD8EQwQ7BE8EQgQ4BDIENQQ9BCwA IAAyBDUENARMBCAAPwRABDgEIAA4BEEEPwQ+BDsETAQ3BD4EMgQwBD0EOAQ4BCAANQQzBD4EIABH BDUEOwQ+BDIENQQ6BEMEIABBBD4EPgQxBEkEMAQ1BEIEQQRPBCAAPgQgAEQEMAQ6BEIEOARHBDUE QQQ6BDgEIAA9BDAEQQQ4BDsEOAQ4BCwAIABHBEIEPgQgAD0ENQQgADwEPgQ2BDUEQgQgAD0ENQQg ADIESwQ3BEsEMgQwBEIETAQgAD4EPwRABDUENAQ1BDsEUQQ9BD0ESwRFBCAATQQ8BD4ERgQ4BDkE IAA+BEIEIABBBEIEQAQwBEUEMAQgADQEPgQgAEAEMAQ0BD4EQQRCBDgEIAA4BDcEIAA3BDAEIABC BD4EMwQ+BCwAIABHBEIEPgQgADwEMAQ9BDgEPwRDBDsEOARABEMETgRCBCAAOgQ1BDwELQBCBD4E LgANACAAIAAgACoAIAAbBEMERwQ1BDIEPgQ1BCAAPgRABEMENgQ4BDUEIAA6BDAEOgQgADwEMAQ9 BDgEPwRDBDsETwRCBD4EQAQuAA0AIAAbBEMERwQ1BDIEPgQ1BCAAPgRABEMENgQ4BDUEIABNBEIE PgQgAD4EQARDBDYEOAQ1BCwAIAAyBD4ENwQ0BDUEOQRBBEIEMgRDBE4ESQQ1BDUEIAA4BDcEOwRD BEcENQQ9BDgENQQ8BCAAQAQwBDcEPQQ+BDkEIAA/BEAEOARABD4ENARLBCwAIAA9BD4EIABBBCAA PgQ/BEAENQQ0BDUEOwRRBD0EPQRLBDwEOAQgAEcEMARBBEIEPgRCBDAEPAQ4BCwAIABBBD4EPgRC BDIENQRCBEEEQgQyBEMETgRJBDgEPAQ4BCAARwQwBEEEQgQ+BEIEMAQ8BCAAPARLBEEEOwQ4BEIE NQQ7BEwEPQRLBEUEIAA/BEAEPgRGBDUEQQRBBD4EMgQgADgEOwQ4BCAAMQQ+BDsENQQ1BCAAPAQ1 BDsEOgQ4BEUEIABBBEIEQARDBDoEQgRDBEAELAAgADIEPwQ7BD4EQgRMBCAANAQ+BCAARwQwBEEE QgQ+BEIEIAA6BD4EOwQ1BDEEMAQ9BDgEOQQgAD4EQgQ0BDUEOwRMBD0ESwRFBCAAPAQ+BDsENQQ6 BEMEOwQuACAALQRCBD4EIAA8BD4ENgQ1BEIEIAAxBEsEQgRMBCAAPwRABD4EPwQwBDMEMAQ9BDQE MAQgADgEOwQ4BCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ4BCwAIAA9BD4ELAAgAEMERwQ4BEIESwQy BDAETwQsACAARwRCBD4EIABBBEIEQARDBDoEQgRDBEAESwQsACAAPQQwBCAAOgQ+BEIEPgRABEsE NQQgAD4EQQRDBEkENQRBBEIEMgQ7BE8ENQRCBEEETwQgADIEPgQ3BDQENQQ5BEEEQgQyBDgENQQs ACAAPAQ+BDMEQwRCBCAAMQRLBEIETAQgAEAEMAQ3BEAEQwRIBDUEPQRLBCwAIAA/BD4ENAQ+BDEE PQRLBDkEIABCBDgEPwQgADIEPgQ3BDQENQQ5BEEEQgQyBDgETwQgAD0EQwQ2BD0EPgQgAD4EQgQ9 BDUEQQRCBDgEIAA6BCAAPwQ+BEIENQQ9BEYEOAQwBDsETAQ9BD4EPARDBCAAPgRABEMENgQ4BE4E LAAgAEUEPgRCBE8EIAA1BEEEQgRMBCAAQARPBDQEIAA4BDcEPgQxBEAENQRCBDUEPQQ4BDkEIAA+ BEIEPQQ+BEEEOARCBDUEOwRMBD0EPgQgADEENQQ3BD4EPwQwBEEEPQQ+BCAAPAQ1BD0ETwROBEkE OARFBCAAQQQ+BEEEQgQ+BE8EPQQ4BDUEIABBBD4ENwQ9BDAEPQQ4BE8ELAAgAD8EQAQ+BDIEPgRG BDgEQARDBE4ESQQ4BEUEIABBBD8ENQRGBDgERAQ4BEcENQRBBDoEOAQ1BCAAPwQ1BEAENQQ2BDgE MgQwBD0EOARPBCAAOAQ7BDgEIAA/BEAEPgRBBEIEPgQgAEEEPwQ+BEEEPgQxBEEEQgQyBEMETgRJ BDgENQQgAEEEPQRDBC4AIAAaBEAEPgQ8BDUEIAA8BDgEQAQ9BEsERQQgAEMEQQRCBDAEPQQ+BDIE PgQ6BCAANQRBBEIETAQgADgEIAA6BD4EPQQ6BEAENQRCBD0EPgQ1BCAAPgRABEMENgQ4BDUELAAg AD4EMQRLBEcEPQQ+BCAAOARBBD8EPgQ7BEwENwRDBDUEPAQ+BDUEIAA0BDsETwQgADIEPgQ3BDQE NQQ5BEEEQgQyBDgETwQgAD0EMAQgAEIEPgQ7BD8EQwQgADgEIABDBD8EQAQwBDIEOwQ1BD0EOARP BCAANQROBCAAPQQwBCAAQAQwBEEEQQRCBD4ETwQ9BDgEOAQsACAAMAQgAEIEMAQ6BDYENQQgADIE IAAyBD4ENQQ9BD0EPgQ8BCAANAQ1BDsENQQgADQEOwRPBCAANwQwBEUEMgQwBEIEMAQgADYEOAQy BEsERQQgADIEQAQwBDMEPgQyBCwAIABCBD4EPAQgAEcEOARBBDsENQQgACIAPwRBBDgERQQ+BEIE QAQ+BD0EPQQ+BDUEIgAgAD4EQARDBDYEOAQ1BC4AIAASBD4EQgQgAD4EQQQ9BD4EMgQ9BEsENQQg AEIEOAQ/BEsEIAA4BDcEOwRDBEcENQQ9BDgETwQ6AA0AIAAtAC0AIABGBDIENQRCBCwAIABBBDIE NQRCBCwAIAA3BDIEQwQ6BCwAIABCBDUEPwQ7BD4ELAAgAEIEMAQ6BEIEOAQ7BEwEPQRLBDUEIAAy BDgEMQRABDAERgQ4BDgEDQAgAC0ALQAgACEEEgQnBCAAKAA8BDUEPQRPBDUEQgQgAD8EQQQ4BEUE PgQ7BD4EMwQ4BEcENQRBBDoEPgQ1BCAAQQQ+BEEEQgQ+BE8EPQQ4BDUEIAA8BDgEOgRABD4EMgQ+ BDsEPQQ+BDIESwQ8BCAAOAQ3BDsEQwRHBDUEPQQ4BDUEPAQpAA0AIAAtAC0AIAAdBCcEIAAoADIE PgQ3BDQENQQ5BEEEQgQyBEMENQRCBCAAPQQwBCAAQAQ4BEIEPARLBCAAPAQ+BDcEMwQwBCAAPQQ4 BDcEOgQ+BEcEMARBBEIEPgRCBD0ESwQ8BCAAOAQ3BDsEQwRHBDUEPQQ4BDUEPAQpAA0AIAAgACAA IgRABDUEQgQ4BDkEIAA8BDUEQgQ+BDQEIABBBEIEQARDBDoEQgRDBEAEOARABD4EMgQwBD0EOARP BCAAPwRABD4EPwQwBDMEMAQ9BDQESwQtACAAPwQ+BCAAQgQ4BD8EQwQgADgEQQRCBD4ERwQ9BDgE OgQwBCAAOAQ9BEQEPgRABDwEMARGBDgEOAQ6AA0AIAAgACoAIAAhBBwEGAQoAEIENQQ7BDUEMgQ4 BDcEPgRABCAAOAQgAEAEMAQ0BDgEPgQsACAAPwQ1BEcEMARCBD0ESwQ1BCAAOAQ3BDQEMAQ9BDgE TwQsACAAPQQwBEAEQwQ2BD0EMARPBCAAQAQ1BDoEOwQwBDwEMAQsACAAOAQ9BEIENQRABD0ENQRC BCkADQAgACAAKgAgACEEMARABDAERAQwBD0EPQQ+BDUEIABABDAENAQ4BD4EDQAgACAAKgAgABwE OAREBEsELAAgADsENQQzBDUEPQQ0BEsELAAgAEEEOwRDBEUEOAQsACAAQQQ/BDsENQRCBD0EOAQN ACAAIAAqACAAGgQ4BD0EPgQsACAAQgQ1BDAEQgRABCwAIAA/BEMEMQQ7BDgERwQ9BEsENQQgADwE NQRABD4EPwRABDgETwRCBDgETwQNACAAIAAqACAAEgRLBEEEOgQwBDcESwQyBDAEPQQ4BE8EIAA4 BCAAOwQ1BDoERgQ4BDgEIAAwBDIEQgQ+BEAEOARCBDUEQgQ+BDIEDQAgACAAKgAgABoEQwQ7BEwE QgRDBEAEPQRLBDkEIAA+BDEEPAQ1BD0ELAAgADAEMwQ4BEIEMARGBDgEOAQNACAAHwRABDgEPAQ1 BD0ENQQ9BDgENQQgAD4ENAQ9BD4EMgRABDUEPAQ1BD0EPQQ+BCAAQAQwBDcEPQRLBEUEIAA4BEEE QgQ+BEcEPQQ4BDoEPgQyBCAAOAQgADwENQRCBD4ENAQ+BDIEIAA/BEAEPgQ/BDAEMwQwBD0ENARL BCAANAQwBFEEQgQgADQEPgQ/BD4EOwQ9BDgEQgQ1BDsETAQ9BEsEOQQgAE0ERAREBDUEOgRCBCAA QQRDBD8ENQRABD8EPgQ3BDgERgQ4BDgEIAA4BDsEOAQgAD8EPgQyBEIEPgRABDAELAAgADoEPgRC BD4EQARLBDkEIAA8BD4ENgQ9BD4EIAA4BEEEPwQ+BDsETAQ3BD4EMgQwBEIETAQgADQEOwRPBCAA QwRBBDgEOwQ1BD0EOARPBCAAPwRABD4EPwQwBDMEMAQ9BDQESwQsACAAOAQgAD8EQAQ+BDIEPgRG BDgEQARDBDUEQgQgAE0ERAREBDUEOgRCBCAAMwRABEMEPwQ/BD4EMgQ+BDMEPgQgAD8EPgQ0BEIE MgQ1BEAENgQ0BDUEPQQ4BE8ELAAgADoEPgQzBDQEMAQgADEEOwQwBDMEPgQ0BDAEQARPBCAAPAQw BEEEQQQ+BDIEPgQ8BEMEIABBBD4EMwQ7BDAEQQQ4BE4EIABBBCAAPwRABD4EPwQwBDMEMAQ9BDQE PgQ5BCAAQwQgADsETgQ0BDUEOQQgAEAEMARBBEIEUQRCBCAAQwQxBDUENgQ0BFEEPQQ9BD4EQQRC BEwEIAAyBCAAQgQ+BDwELAAgAEcEQgQ+BCAAPwRABD4EPwQwBDMEMAQ9BDQEMAQgAD0ENQQgADsE NgRRBEIELAAgADIENQQ0BEwEIAAiADIEQQQ1BCAAPQQ1BCAAPAQ+BDMEQwRCBCAAPgRIBDgEMQQw BEIETARBBE8EIgAuACAAGgRABD4EPAQ1BCAAOAQ9BEQEPgRABDwEMARGBDgEPgQ9BD0EPgQzBD4E LAAgADwEPgQzBEMEQgQgAD8EQAQ4BDwENQQ9BE8EQgRMBEEETwQgAEQEOAQ3BDgERwQ1BEEEOgQ4 BDUEIAAyBD4ENwQ0BDUEOQRBBEIEMgQ4BE8EIABGBDIENQRCBD4EPAQsACAANwQyBEMEOgQ+BDwE LAAgAEIEMAQ6BEIEOAQ7BEwEPQRLBDwEOAQgADoEPgQ9BEIEMAQ6BEIEMAQ8BDgELgAgAC0EQgQ+ BCAANAQ1BDsEMAQ1BEIEIAA9BEMENgQ9BEMETgQgADIEOARABEIEQwQwBDsETAQ9BEMETgQgAEAE NQQwBDsETAQ9BD4EQQRCBEwEIAA9BDAEPAQ9BD4EMwQ+BCAAMQQ+BDsENQQ1BCAAOgRABDAEQQQ+ BEcEPQQ+BDkEIAA4BCAAQAQ1BDAEOwRMBD0EPgQ5BC4ADQAgACAAPgA+AD4APgA+AD0APQA9AD0A PQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APgA+AD4APgA+ AA0AIAAiBDUEPwQ1BEAETAQsACAANwQ9BDAETwQgAEMEQQRCBEAEPgQ5BEEEQgQyBD4EIAA/BEAE PgQ/BDAEMwQwBD0ENARLBCwAIAA8BD4ENgQ9BD4EIABBBEQEPgRABDwEQwQ7BDgEQAQ+BDIEMARC BEwEIAA8BDUEQgQ+BDQESwQgADcEMARJBDgEQgRLBCAAPgRCBCAAPQQ1BFEEOgANACAAIAAgADEA LgAgABoEQAQ4BEIEOARHBD0EPgRBBEIETAQgADwESwRIBDsENQQ9BDgETwQuAA0AIAAUBDsETwQg AE0EQgQ4BEUEIABGBDUEOwQ1BDkEIAA9BDUEPgQxBEUEPgQ0BDgEPAQ+BCAAPwQ+BEEEQgQwBDIE OARCBEwEIAAyBD4EIAAzBDsEMAQyBEMEIABDBDMEOwQwBCAAOAQ3BEMERwQ1BD0EOAQ1BCAAMgRB BDUEPAQ4BCAAOwROBDQETAQ8BDgEIAASBCEEFQQlBCAAOgQ7BE4ERwQ1BDIESwRFBCAAPgQxBDsE MARBBEIENQQ5BCAARwQ1BDsEPgQyBDUERwQ1BEEEOgQ+BDMEPgQgADcEPQQwBD0EOARPBC0AIAA8 BDAEQgQ1BDwEMARCBDgEOgQ4BCwAIABEBDgENwQ4BDoEOAQsACAARAQ4BDsEPgRBBD4ERAQ4BDgE LAAgAEAENQQ7BDgEMwQ4BDkEIAA4BCAAOAQ0BDUEPgQ7BD4EMwQ4BDkELAAgAEEEPgRGBDgEPgQ7 BD4EMwQ4BDgELAAgAD8EQQQ4BEUEPgQ7BD4EMwQ4BDgEIAA4BCAAOgQ+BD0ERgQ1BD8ERgQ4BDkE IAA+BDEESQQ1BEEEQgQyBDUEPQQ9BD4EOQQgADEENQQ3BD4EPwQwBEEEPQQ+BEEEQgQ4BC4AIAAV BEEEOwQ4BCAARwQ1BDsEPgQyBDUEOgQgAD0ENQQgAD8EQAQ4BD0EOAQ8BDAENQRCBCAAQQQgAEUE PgQ0BEMEIABCBD4ELAAgAEcEQgQ+BCAANQQ8BEMEIAAzBD4EMgQ+BEAETwRCBCAAOAQgAD0ENQQg AD4EMQRABDAESQQwBDUEQgQgADIEPQQ4BDwEMAQ9BDgETwQgAEEEMgQ1BEAERQQgADwENQRABEsE IAA9BDAEIAAwBDIEQgQ+BEAEOARCBDUEQgQ+BDIELAAgACIAQQQ+BEYEOAQwBDsETAQ9BEsENQQg ADQEPgQ6BDAENwQwBEIENQQ7BEwEQQRCBDIEMAQiACgAQQQ+BDEESwRCBDgETwQgADgEOwQ4BCAA MARBBD8ENQQ6BEIESwQsACAAOgQwBDoEIAA/BDgEMARABCAAPwQ+BDQEQgQyBDUEQAQ2BDQEMARO BEkEOAQ1BCAAPwRABD4EPwQwBDMEMAQ9BDQEQwQpACAAOAQgACIAMwQwBDsEPgQtAE0ERAREBDUE OgRCBEsEIgAoADIEOwQ4BE8EPQQ4BDUEIAA+BDEESQQ1BDMEPgQgADIEPwQ1BEcEMARCBDsENQQ9 BDgETwQgAD0EMAQgAEcEMARBBEIEPQQ+BEEEQgQ4BCkALAAgADAEIAA/BEAENQQ0BD8EPgRHBDgE QgQwBDUEQgQgAEEEPgQ/BEAEPgRCBDgEMgQ7BE8EQgRMBEEETwQgACIAQQQ+BEYEOAQwBDsETAQ9 BD4EPARDBCAANAQwBDIEOwQ1BD0EOAROBCIAIAA4BCAAQAQwBDcEPgQxBEAEMARCBEwEQQRPBCAA QQQwBDwEPgQ8BEMELAAgAEIEPgQgADwENQRCBD4ENARLBCAAPwRABD4EPwQwBDMEMAQ9BDQESwQg ADEEQwQ0BEMEQgQgADUEPARDBCAAPQQ1BCAAQQRCBEAEMARIBD0ESwQsACAAMAQgAD8EPgQ0BDQE MARCBEwEQQRPBCAAPQQwBCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ4BCAAPgQ9BCAAPAQ+BDYENQRC BCAAQgQ+BDsETAQ6BD4EIAA1BEEEOwQ4BCAAPwRABD4ERwQ9BD4EQQRCBEwEIAA8BDgEQAQ+BDIE PgQ3BDcEQAQ1BD0EOARPBCAAOAQgADoEPgQ9BEYENQQ/BEYEOAQ5BCAAPAQ4BEAEPgRDBEEEQgRA BD4EOQRBBEIEMgQwBCAAPAQ1BD0ETARIBDUELAAgAEcENQQ8BCAAQwQgADwEMAQ9BDgEPwRDBDsE TwRCBD4EQAQwBCwAIAA/BD4ETQRCBD4EPARDBCAAMgQ+BEIEIAAyBEIEPgRABD4EOQQgADAEQQQ/ BDUEOgRCBCAANwQwBEkEOARCBEsEOgANACAAIAAgADIALgAgAB4EMQQ7BDAENAQwBD0EOAQ1BCAA PAQ+BEkEPQQ+BDkEIAA6BD4EPQRGBDUEPwRGBDgENQQ5BCAAPAQ4BEAEPgRDBEEEQgRABD4EOQRB BEIEMgQwBC4ADQAgABIEOwQwBDQENQQ7BDUERgQgAEIEMAQ6BD4EMgQ+BDkEIAA3BDAESQQ4BEkE UQQ9BCAAPgRCBCAAMgQ+BDcENAQ1BDkEQQRCBDIEOARPBCAAOwQ+BDYEPQRLBEUEIAA6BD4EPQRG BDUEPwRGBDgEOQQgADgEIABBBDwEPgQ2BDUEQgQgAE0ERAREBDUEOgRCBDgEMgQ9BD4EIAA3BDAE SQQ4BEkEMARCBEwEQQRPBCAAPgRCBCAAPAQwBD0EOAQ/BEMEOwRPBEYEOAQ5BCwAIAA1BEEEOwQ4 BCAAPwQ+BD0EOAQ8BDAENQRCBCAAOARFBCAAPwRABDgEQAQ+BDQEQwQuACAAIQRCBEAEPgQ4BEIE NQQ7BEwEQQRCBDIEPgQgADwEPgRJBD0EPgQ5BCwAIAAyBCAAMgRLBEEEPgQ6BD4EOQQgAEEEQgQ1 BD8ENQQ9BDgEIAA4BEEEQgQ4BD0EPQQ+BDkEIAA6BD4EPQRGBDUEPwRGBDgEOAQgADwEOARABD4E QwRBBEIEQAQ+BDkEQQRCBDIEMAQgADQEPgQ7BDYEPQQ+BCAAMQRLBEIETAQgAD8EPgRBBEIEMAQy BDsENQQ9BD4EIAAyBD4EIAAzBDsEMAQyBEMEIABDBDMEOwQwBCAAOwROBDEEPgQ5BCAAPQQwBEME RwQ9BD4EOQQgADQENQRPBEIENQQ7BEwEPQQ+BEEEQgQ4BCwAIAAwBCAAQQQwBDwEMAQgAEEEQwRC BEwEIABCBDAEOgQ+BDMEPgQgAEEEQgRABD4EOARCBDUEOwRMBEEEQgQyBDAEIAA0BD4EOwQ2BD0E MAQgAD8EQAQ+BEIEOAQyBD4ENAQ1BDkEQQRCBDIEPgQyBDAEQgRMBCAAQAQwBDcENAQ1BDsENQQ9 BDgETgQgADcEPQQwBD0EOAQ5BCAAOAQgADsETgQ0BDUEOQQgAD0EMAQgAE0EQgQ+BDwEIAA/BD4E OwQ1BC4ADQAgACAAIAAzAC4AIAAXBDAESQQ4BEIEMAQgAEEEPgQgAEEEQgQ+BEAEPgQ9BEsEIAAx BD4EOwQ1BDUEIABBBDgEOwRMBD0ESwRFBCwAIAAyBCAAPwQ1BEAEMgRDBE4EIAA+BEcENQRABDUE NARMBCwAIAAzBD4EQQRDBDQEMARABEEEQgQyBDAELgANACAAEwQ+BEEEQwQ0BDAEQARBBEIEMgQ+ BCAAPgQxBE8ENwQwBD0EPgQgAD8EQAQ1BEEENQQ6BDAEQgRMBCAAPwRABD4EPwQwBDMEMAQ9BDQE QwQgADIEQAQ1BDQEPQRLBEUEIAA0BDsETwQgAD4EMQRJBDUEQQRCBDIEMAQgAE8EMgQ7BDUEPQQ4 BDkELQAgADwEPgQ9BD4EPwQ+BDsEOAQ5BCAAOAQgAEEEPgQ+BEIEMgQ1BEIEQQRCBDIEQwROBEkE OARFBCAAPQQwBEAEOgQ+BEIEOAQ6BD4EMgQgAEcENQRABDUENwQgADsENQQzBDAEOwQ4BDcEMARG BDgETgQgAD8EQAQ+BD8EMAQzBDAEPQQ0BEsEOgANACAALQA+ACAANwQwBD8EQAQ1BEIEIAAyBEAE NQQ0BD4EPQQ+BEEEPQQ+BDkEIAA/BEAEPgQ/BDAEMwQwBD0ENARLBCAANAQ7BE8EIAAyBEEENQRF BCwAIAA6BEAEPgQ8BDUEIAA4BEEEQQQ7BDUENAQ+BDIEMARCBDUEOwQ1BDkEIAA/BEAEPgQ/BDAE MwQwBD0ENARLBCwAIAA6BD4EQgQ+BEAESwQ1BCAAMgQgAD0ENQQ5BCAAPAQ+BDMEQwRCBCAAPQRD BDYENAQwBEIETARBBE8EIAA6BDAEOgQgADIEIAA8BDAEQgQ1BEAEOAQwBDsENQQgADQEOwRPBCAA OARBBEEEOwQ1BDQEPgQyBDAEPQQ4BE8EKAA+BD0EMAQgADQEOwRPBCAAPQQ4BEUEIAA9BDUEPgQx BEUEPgQ0BDgEPARLBDkEIAA9BDAEQAQ6BD4EQgQ4BDoEKQAgADgELAAgADwEPgQ2BDUEQgQgADEE SwRCBEwELAAgADEEPgQ7BEwEPQRLBEUEIAA3BDAEMgQ4BEEEOAQ8BD4EQQRCBEwETgQgAD4EQgQg AD8EPgRABD0EPgQNACAALQA+ACAAPwQ+BDQENAQ1BEAENgQ6BDAEIAA4BCAAQQRCBDgEPARDBDsE OARABD4EMgQwBD0EOAQ1BCAAOgRABDgEQgQ4BEcEPQQ+BEEEQgQ4BCAAPARLBEgEOwQ1BD0EOARP BCAAPAQwBEEEQQQgADgEIAAyBEsETwQyBDsENQQ9BDgENQQgAD4EMQQ8BDAEPQQ+BDIEDQAgAC0A PgAgAEEEPgQ3BDQEMAQ9BDgENQQgADwEPgRJBD0EPgQ5BCAAOgQ+BD0ERgQ1BD8ERgQ4BDgEIAA8 BDgEQAQwBCAAOAQgACcENQQ7BD4EMgQ1BDoEMAQsACAAPQQ1BCAAQwQ6BDsEMAQ0BEsEMgQwBE4E SQQ1BDkEQQRPBCAAMgQgAEAEMAQ8BDoEOAQgADQEQAQ1BDIEPQQ1BDkEIAA+BEgEOAQxBD4ERwQ9 BD4EOQQgAEEEOARBBEIENQQ8BEsEIAA4BCAAMQQ7BD4EOgQ4BEAEPgQyBDAEPQQ4BDUEIAA8BDAE PQQ4BD8EQwQ7BE8EQgQ+BEAEPgQyBCAAQQQgADwENQQ9BDUENQQgADwEPgRJBD0ESwQ8BDgEIAA6 BD4EPQRGBDUEPwRGBDgETwQ8BDgEDQAgAC0APgAgADIESwRPBDIEOwQ1BD0EOAQ1BCAAMgRABDUE NAQ+BD0EPgRBBD0EPgQ5BCAAPwRABD4EPwQwBDMEMAQ9BDQESwQgADgEIAA7BEMERwQ1BDIEPgQz BD4EIAA+BEAEQwQ2BDgETwQNACAALQA+ACAAOARBBD8EQAQwBDIEOwQ1BD0EOAQ1BCAAQQQ0BDUE OwQwBD0EPQQ+BDMEPgQgADIEQAQ1BDQEOARCBDUEOwRPBDwEOAQgADgEIAA4BDcEPgQ7BE8ERgQ4 BE8EIABBBDAEPAQ4BEUEIAAyBEAENQQ0BDgEQgQ1BDsENQQ5BCAAPgRCBCAAPgQxBEkENQRBBEIE MgQwBA0AIAAtAD4AIABBBD4ERgQ4BDAEOwRMBD0EMARPBCAAPwRABD4EPwQwBDMEMAQ9BDQEMAQg ADcENAQ+BEAEPgQyBEwETwQgADgEIAAyBEsEPARLBDIEMAQ9BDgETwQgAD0EMARABDoEPgRCBDgE OgQ+BDIEDQAhACEAIQA9AD0APQA9AD4APgA+ACAAIQQ+BDEEQQRCBDIENQQ9BD0EPgQsACAAPARL BCAAPQQ1BCAAPwRABDUENARBBEIEMAQyBDsETwQ1BDwEIABBBDUEMQQ1BCAAMQQ+BDsENQQ1BCAA TQREBEQENQQ6BEIEOAQyBD0EPgQzBD4EIAA8BDUEQgQ+BDQEMAQgADEEPgRABEwEMQRLBCAAQQQg ADcEPgQ8BDEEOARABD4EMgQwBD0EOAQ1BDwEIAA9BDUEPQQwBDIEOARBBEIETAROBCAAOAQgAEEE MAQ8BD4EOQQgAD0ENQQ9BDAEMgQ4BEEEQgRMBE4ELAAgAEcENQQ8BCAAQQQ+BEYEOAQwBDsETAQ9 BDAETwQgAD8EQAQ+BD8EMAQzBDAEPQQ0BDAEIAA8BDgEQAQwBCwAIABBBD8EPgQ6BD4EOQRBBEIE MgQ4BE8EIAA4BCAAOwROBDEEMgQ4BCAAOgQgADQEQARDBDMEOAQ8BCAAPQQwBEAEPgQ0BDAEPAQh ACAAGwROBDEETwRJBDUENQQgAEEENQRABDQERgQ1BCAAPQQ1BCAAQAQwBDcEOwROBDEEOARCBCwA IABFBD4EQgRMBCAAMQQ1BDkEIAA1BDMEPgQgAEUEPgRCBEwEIAA0BD4EOgQwBDYEOAQsACAARwRC BD4EIAA7BE4EMQQ4BEIETAQgAD0ENQQgAD0EQwQ2BD0EPgQuACAALQRCBD4EIABBBDAEPAQ+BDUE IABBBDgEOwRMBD0EPgQ1BCAAPwRABD4EQgQ4BDIEPgRPBDQEOAQ1BCAAPgRCBCAAPQQ1BD0EMAQy BDgEQQRCBDgELgAgABsETgQxBD4EMgRMBCAAOAQgAD0ENQQ9BDAEMgQ4BEEEQgRMBCAAMAQ9BEIE MAQzBD4EPQQ4BEEEQgQ4BEcEPQRLBCAAPQQ1BCAAQgQ+BDsETAQ6BD4EIAA6BDAEOgQgAE0EPAQ+ BEYEOAQ4BCwAIAA9BD4EIAA4BCAAOgQwBDoEIAA3BD0EMAQ9BDgENQQtAD0ENQQ3BD0EMAQ9BDgE NQQgAEIENQRFBCAAOgQ+BDMEPgQgACIAOwROBDEEOAQ8BCAAOAQgAD0ENQQ9BDAEMgQ4BDQEOAQ8 BCIAKAA1BEEEOwQ4BCAAPwQ+BDQEIAA9BDUEPQQwBDIEOARBBEIETAROBCAAPwQ+BD0EOAQ8BDAE QgRMBCAAPgRCBEEEQwRCBEEEQgQyBDgENQQgADIEOAQ0BDUEPQQ4BE8EIAAyBCAAHQQwBDIEOAQp AC4AIAAdBEMENgQ9BD4EIAA0BDUEOgQ7BDAEQAQ4BEAEPgQyBDAEQgRMBCAAOAQgAD8EQAQ+BD8E MAQzBDAEPQQ0BDgEQAQ+BDIEMARCBEwEIAAgBD4ENAQgADgEIABABD4ENARBBEIEMgQ+BCAAOgQw BDoEIAAzBDsEMAQyBD0ESwQ1BCAARgQ1BD0EPQQ+BEEEQgQ4BCwAIABBBD4ENAQ1BEAENgQwBEkE OAQ1BCAAOwROBDEEPgQyBEwEIAA6BCAAMQQ7BDgENgQ9BDgEPAQsACAANwQ9BDAEPQQ4BDUEIAAg BD4ENAQwBCAAOAQgAEAEPgQ0BD4EQQQ7BD4EMgQ9BD4EOQQsACAAOgQ1BDwEIAAxBEsEIAA9BDgE IAAxBEsEOwQwBCAANgQ1BEAEQgQyBDAEIAA9BDUEPQQwBDIEOARBBEIEOAQsACAAQgQwBDoEIAA6 BDAEOgQgADIEQQQ1BCAAOwROBDQEOAQgAD0EMAQgABcENQQ8BDsENQQtACAAMQQ+BDsENQQ1BCAA OAQ7BDgEIAA8BDUEPQQ1BDUEIAAxBDsEOAQ3BDoEOAQ1BCAAQAQ+BDQEOARHBDgELgAgAB0EMARI BCAAIAQ+BDQEIABNBEIEPgQgAEIEMAQgADcEMARJBDgEQgQwBCAAPwRABD4EQgQ4BDIEIAA3BD4E PAQxBDgEQAQ+BDIEMAQ9BDgETwQsACAARwRCBD4EIABDBDQENQRABDYEMAQ7BDAEIAA9BDUEPAQ9 BD4EMwQ4BEUEIABDBDoEQAQwBDgEPQRGBDUEMgQgAD4EQgQgAD0ENQQ9BDAEMgQ4BEEEQgQ4BCAA OgQgAEEEMgQ+BDUEPARDBCAANgQ1BCAAPQQwBEAEPgQ0BEMEIAAyBD0ENQQgADcEMAQyBDgEQQQ4 BDwEPgRBBEIEOAQgAD4EQgQgADwENQRBBEIEMAQgADUEMwQ+BCAAPwRABD4ENgQ4BDIEMAQ9BDgE TwQuACAAIwQ6BEAEMAQ4BD0ERgRLBCwAIAAxBDUEOwQ+BEAEQwRBBEsEIAA4BCAAQAQ+BEEEQQQ4 BE8EPQQ1BC0AIAA+BDQEOAQ9BCAAPQQwBEAEPgQ0BC4AIAAtBEIEPgQgADQEMAQ2BDUEIAA9BDUE IAAxBEAEMARCBEwETwQuACAAEQRABDAEQgRMBE8EIAA8BEsEIAA0BEAEQwQzBCAANARABEMEMwRD BCAAPQQwBCAAOAQ9BDQEOAQyBDgENARDBDAEOwRMBD0EPgQ8BCAAQwRABD4EMgQ9BDUELgAgABAE IAAzBDsEPgQxBDAEOwRMBD0EPgQsACAAIARDBEEETAQtACAANQQ0BDgEPQRLBDkEIAA9BDAEQAQ+ BDQEIAA4BCAAPAQ4BEAELAAgAEAEMARBBEEENQRHBFEEPQQ9BEsEOQQgAD0EMARIBDgEPAQgADIE QAQwBDMEPgQ8BCAAPQQwBCAAMwAgAEcEMARBBEIEOAQuACAAHARLBCAAPgQ0BDgEPQQgACAEHgQU BCEAIAAjBCAAPQQwBEEEIAA+BDQEOAQ9BCAAHgRCBDUERgQtACAAMARABDgEOQQgADgEIAA+BDQE PQQwBCAAHAQwBEIETAQtACAARQQ+BDcETwQ5BDoEMAQgACEENQQyBDUEQAQwBC4AIAAcBEsELAAg AEAEQwRBBEEEOgQ4BDUEIAA7BE4ENAQ4BCwAIAAyBEEENQQzBDQEMAQgAD8EPgQ8BD4EMwQwBDUE PAQgADEEQAQwBEIETARPBDwEIAAyBCAAMQQ1BDQENQQgADgEIAA9BDgEOgQ+BDMENAQwBCAAPQQ1 BCAAQwQxBEwENQQ8BCAAOAQgAD0ENQQgADIEPgQ3BD0ENQQ9BDAEMgQ4BDQEOAQ8BCAAOARFBCAA PwQ+BDoEMAQgAD8EPgQ8BD0EOAQ8BCwAIAA6BEIEPgQgADwESwQsACAAPwQ+BDwEPQQ4BDwEIABB BDIEPgQ5BCAAIAQ+BDQEIQANACAAIAAgABoEQAQ+BDwENQQgAEIEPgQzBD4ELAAgADMEPgRBBEME NAQwBEAEQQRCBDIEPgQgAD4EMQRPBDcEMAQ9BD4EIABBBEAEPgRHBD0EPgQgAD8EQAQ4BD0ETwRC BEwEIAA8BDUEQARLBCAAOwQ1BDMEMAQ7BDgENwQwBEYEOAQ4BCAAMQQ1BEEERwQ1BDsEPgQyBDUE RwQ9BD4EOQQgAD8EQAQ+BD8EMAQzBDAEPQQ0BEsEIABBBDUEOgRBBDAEIAA4BCAAMAQxBD4EQARC BDAELAAgAD8EPgQgADoEPgQ7BDgERwQ1BEEEQgQyBEMEIABBBDwENQRABEIENQQ5BCAAOAQgAEAE MARBBD8EMAQyBEgEOARFBEEETwQgAEEENQQ8BDUEOQQgAD0EMARABE8ENARDBCAAQQQgADAEOwQ6 BD4EMwQ+BDsENQQ8BCAANAQwBDIEPQQ+BCAAQQRCBDAEMgRIBDUEOQQgACMEEwQgBB4EFwQeBBkE IAAdBBAEJgQYBB4EHQQQBBsELAQdBB4EGQQgABEEFQQXBB4EHwQQBCEEHQQeBCEEIgQYBCgAIQAh ACEAKQA6AA0AIAAhACAAFwQwBD8EQAQ1BEIEIAA/BEAEPgQ/BDAEMwQwBD0ENARLBCAAQQQ1BDoE QQQwBCwAIABBBDIEPgQxBD4ENAQ9BEsERQQgAD4EQgQ9BD4ESAQ1BD0EOAQ5BCAAOAQgADAEMQQ+ BEAEQgQwBCAAIQANACgAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1BCAAPQQ1BDwENQQ0BDsENQQ9BD0E PgQ1BCAAQwRBBEIEQAQwBD0ENQQ9BDgENQQgAD8EOAQ6BDAEPwQtAEEEMQQ+BEAEOARJBCAAOAQg AD8EQAQ+BEcEOARFBCAAIgBIBDoEPgQ7BCAAOgQwBDcEMAQ9BD4EMgRLBCIALAAgADoEMAQ7BDUE RwQwBEkEOARFBCAAQwQ8BEsEIAA9BDAESAQ4BEUEIABBBDAEPARLBEUEIAAwBDoEQgQ4BDIEPQRL BEUEIAA/BDAEQAQ9BDUEOQQgADgEIABBBDUEQAQ0BEYEMAQgAEEEMAQ8BEsERQQgADQEPgQyBDUE QARHBDgEMgRLBEUEIAA4BCAAOgRABDAEQQQ4BDIESwRFBCAANAQ1BDIEQwRIBDUEOgQsACAAOAQ3 BD4EOwRPBEYEOARPBCAAPgRABDMEMAQ9BDgENwQwBEIEPgRABD4EMgQgAE0EQgQ4BEUEIAA6BD4E PQRCBD4EQAQgAD4EQgQgAD4EMQRJBDUEQQRCBDIEMAQ7ACAAOgRABD4EPAQ1BCAATQRCBD4EMwQ+ BCAAMwQ+BEEEQwQ0BDAEQARBBEIEMgQ+BCAANAQ+BDsENgQ9BD4EIAA9BDUEPAQ1BDQEOwQ1BD0E PQQ+BCAAOAQ3BD4EOwQ4BEAEPgQyBDAEQgRMBCAAOAQgAEAEMARBBEEEOwQ1BDQEPgQyBDAEQgRM BCAANAQ1BE8EQgQ1BDsETAQ9BD4EQQRCBEwEIAA/BEAENQRBBEIEQwQ/BD0ESwRFBCAARwQ4BD0E PgQyBD0EOAQ6BD4EMgQsACAAPwQ+BDoEQARLBDIEMAROBEkEOARFBCAAPAQwBEEEQQQ+BDIESwQ5 BCAAQAQwBDcEMgRABDAEQgQgADMEQAQwBDYENAQwBD0EIAA9BDAEIAA+BDEESQQ1BEEEQgQyBDUE PQQ9BD4EPAQgAEIENQQ7BDUEMgQ4BDQENQQ9BDgENQQsACAAMgQgAEIEPgQ8BCAARwQ4BEEEOwQ1 BCAAMwRABDAENgQ0BDAEPQQgACAEJAQ6AA0AIAAgAC0AIAAdBDAERwQwBDsETAQ9BDgEOgQwBCAA HgRCBDQENQQ7BDAEIAAjBD8EQAQwBDIEOwQ1BD0EOARPBCAAPwQ+BCAAPQQwBDQENwQ+BEAEQwQg ADcEMAQgAEEEPgQxBDsETgQ0BDUEPQQ4BDUEPAQgAD8EQAQwBDIEIAA4BCAAQQQyBD4EMQQ+BDQE IAAzBEAEMAQ2BDQEMAQ9BCAAEwQ1BD0ENQRABDAEOwRMBD0EPgQ5BCAAPwRABD4EOgRDBEAEMARC BEMEQARLBCAAIAQkBCAAHAQQBCAEGAQdBCMEIAASBBsEEAQUBBgEHAQYBCAEHgQSBB0EIwQgABcE EAQZBCYEFQQSBCMEDQAgACAALQAgABcEMAQ8BDUEQQRCBDgEQgQ1BDsETwQgAEAEQwQ6BD4EMgQ+ BDQEOARCBDUEOwRPBCAAIAQ+BEEEOgQ+BDwEPQQwBDQENwQ+BEAEMAQgABwEEAQaBCEEGAQcBBAE IAAuBCAELAQVBBIEGAQnBBAEIAAaBCEEFQQdBBcEHgQSBBAEDQAgACAALQAgAB0EMARHBDAEOwRM BD0EOAQ6BDAEIAAjBD8EQAQwBDIEOwQ1BD0EOARPBCAAOgQ+BD0EQgRABD4EOwRPBCAAOAQgAD0E MAQ0BDcEPgRABDAEIAAyBCAAQQREBDUEQAQ1BCAAPAQwBEEEQQQ+BDIESwRFBCAAOgQ+BDwEPARD BD0EOAQ6BDAERgQ4BDkEIAASBBAEFAQYBBwEEAQgABAEGwQVBBoEIQQVBBUEEgQYBCcEEAQgACEE IwQRBBEEHgQiBBgEHQQQBA0AMAQgAEIEMAQ6BDYENQQgADgERQQgAD8EPgQ6BEAEPgQyBDgEQgQ1 BDsENQQ5BCEAKQANACAAKwAhACAAGwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAAPwRABD4EQQRCBDgE QgRDBEYEOAQ4BCwAIAA/BEAEPgQ0BDAEMgRGBD4EMgQgAEEENQQ6BEEELQA4BDMEQARDBEgENQQ6 BCAAOAQgAD8EQAQ+BEcEOARFBCAAPwRABDgEQQQ/BD4EQQQ+BDEEOwQ1BD0EOAQ5BCAAOAQ3BDIE QAQwBEkEUQQ9BD0EPgQzBD4EIABBBDUEOgRBBDAELAAgADIEIABCBD4EPAQgAEcEOARBBDsENQQg AD8EQAQ1BDcENQRABDIEMARCBDgEMgQ+BDIELAAgAD8EPgQgADAEPQQwBDsEPgQzBDgEOAQgAEEE IAA7BDUEMwQwBDsEOAQ3BDAERgQ4BDUEOQQgADAEOwQ6BD4EMwQ+BDsETwQgACEADQAgACEAIAAf BEAEPgRBBDIENQRJBDUEPQQ4BDUEIAA9BDAEQAQ+BDQEMAQgAD4EQgQ9BD4EQQQ4BEIENQQ7BEwE PQQ+BCAANwQ0BD4EQAQ+BDIEPgQ5BCAAQQQ1BDwETAQ4BCwAIAA1BFEEIABABDUEMAQ7BEwEPQQ+ BDkEIAA/BEAEOARABD4ENARLBCAAOAQgAEYENQQ9BD0EPgRBBEIEOAQgACEADQAgACEAIAAhBD4E RgQ4BDAEOwRMBD0EMARPBCAAPwRABD4EPwQwBDMEMAQ9BDQEMAQgADIESwQ8BEsEMgQwBD0EOARP BCAAOAQ3BCAAPgQxBEkENQRBBEIEMgQwBCAAMwQ9BDgEOwQ+BDMEPgQgADwENQQ9BEIEMAQ7BDgE QgQ1BEIEMAQgADcEMAQ/BDAENAQwBCAAOAQgADcEMAQ8BDUEPQRLBCAANQQzBD4EIAA9BDAEIAA8 BDUEPQRCBDAEOwQ4BEIENQRCBCAAQQQ1BDwENQQ5BD0ESwRFBCAARgQ1BD0EPQQ+BEEEQgQ1BDkE LAAgAD8EPgRABE8ENAQ+BEcEPQQ+BEEEQgQ4BCwAIABHBDgEQQRCBD4EQgRLBCAAOAQgAEYENQQ7 BD4EQQRCBD0EPgRBBEIEOAQgADQEQwRIBDgEIAA4BCAAQgQ1BDsEMAQsACAAPgRCBD0EPgRIBDUE PQQ4BDkEIAA0BEAEQwQzBCAAOgQgADQEQARDBDMEQwQsACAARgQ1BD0EPQQ+BEEEQgQ4BCAANAQ1 BEIENQQ5BCAAOAQgAEcENQQ7BD4EMgQ1BEcENQRBBDoEPgQ5BCAANgQ4BDcEPQQ4BCAAMgQgAEYE NQQ7BD4EPAQgACEADQANAA0ADQAgACAAIAAgACAAVgAgACAAIAAbBDUEMwQwBDsEOAQ3BDAERgQ4 BE8EIAAyBDsEMARBBEIEOAQuACAAHgQxBEkENQRBBEIEMgQ+BCAAPAQ4BEAEMAQgADgEIAA/BD4E QARPBDQEOgQwBC4ADQAgACAAIAANACAAIAAgAB0EMAQ6BD4EPQQ1BEYEIABABDAEQQRBBDwEMARC BEAEOAQyBDAENQQ8BCAAOwQ1BDMEMAQ7BDgENwQwBEYEOAROBCAAMwQ7BD4EMQQwBDsETAQ9BEsE RQQgADwEPgQ9BD4EPwQ+BDsEOAQ5BC4AIAAoBDAEMwQ4BCAAMgQgAE0EQgQ+BDwEIAA9BDAEPwRA BDAEMgQ7BDUEPQQ4BDgEIAA+BD8EOARBBDAEPQRLBCAAMgQgAEEEQgQwBEIETAQ1BCAAIgASBD4E NwRABD4ENgQ0BDUEPQQ4BDUEIAAgBEMEQQQ4BC4AIAAdBD4EMgQwBE8EIAATBDgEPwQ1BEAEMQQ+ BEAENQRPBC4AIgAuACAAFwQ0BDUEQQRMBCAAPwRABD4EMAQ9BDAEOwQ4BDcEOARABEMENQQ8BCAA OARFBCAAOwQ1BDMEMAQ7BDgENwQwBEYEOAROBCAAQQQgAEIEPgRHBDoEOAQgADcEQAQ1BD0EOARP BCAAPQQwBEAEOgQ+BEIEOAQ6BD4EMgQuACAAHQQwBD8EQAQ4BDwENQRABCwAIAAyBCAAQQQ7BEME RwQwBDUEIAAzBDsEPgQxBDAEOwRMBD0EPgQzBD4EIAA9BDAEQAQ6BD4EQgRABDAERAREBDgEOgQw BCwAIAA7BDUEMwQwBDsEOAQ3BDAERgQ4BE8EIABBBDIEPgQ0BDgEQgRBBE8EIAA6BCAAOwQ1BDME MAQ7BDgENwQwBEYEOAQ4BCAAOwQ+BDoEMAQ7BEwEPQQ+BDkELQAgAD0ENQQ7BDUEMwQwBDsETAQ9 BEsENQQgAEIEPgRABDMEPgQyBEYESwQgAEEEQgQwBD0EPgQyBE8EQgRBBE8EIAA9BDUEOgQ+BD0E OgRDBEAENQQ9BEIEPgRBBD8EPgRBBD4EMQQ9BEsELgAgABIEIABBBDsEQwRHBDAENQQgAEAEMAQx BD4EQgQ+BEAEMwQ+BDIEOwQ4BCAAMwQ7BD4EMQQwBDsETAQ9BD4ENQQgADMEPgRBBEMENAQwBEAE QQRCBDIEPgQsACAAHQQ+BDIEMARPBCAAEwQ4BD8ENQRABDEEPgRABDUETwQsACAANAQ+BDsENgQ9 BD4EIAA+BEAEMwQwBD0EOAQ3BD4EMgQwBEIETAQgAD8EPgQ7BD0EQwROBCAAOAQgADEENQQ3BD4E MwQ+BDIEPgRABD4ERwQ9BEMETgQgADIEPgQ5BD0EQwQgAEAEMAQxBD4EQgQ+BEAEMwQ+BDIERgQw BDwELAAgAD0ENQQgADYENQQ7BDAETgRJBDgEPAQgAD4EQQQyBD4EMQQ+BDQEOARCBEwEIABABDAE MQQ+BDIEIAA4BCAAMgRLBDkEQgQ4BCAAOAQ3BCAANAQ1BDsEMAQuACAAGgRCBD4ELQBCBD4EIAA8 BD4ENgQ1BEIEIAA3BDAEMgQ4BEEENQRCBEwEIAA+BEIEIABABDAEMQRBBDoEPgQ5BCAAQQQ4BDsE SwQsACAAPQQ+BCAAOARFBCAAMQQ+BDsEOAQgAD0EOAQ6BDAEOgQgAD0ENQQgAD4EPwRABDAEMgQ0 BEsEMgQwBE4EQgQgAEAEMAQxBEEEQgQyBDAELAAgADoEPgRCBD4EQAQ+BDUEIAA0BD4EOwQ2BD0E PgQgADEESwRCBEwEIAA4BEEEOgQ+BEAENQQ9BDUEPQQ+BCAAPwQ+BDsEPQQ+BEEEQgRMBE4ELgAg ABAEMQRBBD4EOwROBEIEPQQ+BCAAQgQ+BDYENQQgAEEEMAQ8BD4ENQQgADoEMARBBDAENQRCBEEE TwQgADgEIABBBD4EMgRABDUEPAQ1BD0EPQRLBEUEIAAzBDsEPgQxBDAEOwRMBD0ESwRFBCAARQQ+ BDcETwQ1BDIEIABABDAEMQQ+BDIELgAgAB4EPQQ4BCAAPQQwBEUEPgQ0BE8EQgRBBE8EIAA9BDAE IAAyBDUEQARIBDgEPQQ1BCAAQQQyBD4ENQQ5BCAAQAQwBDEEQQQ6BD4EOQQgAD8EOARABDAEPAQ4 BDQESwQgADgEIAA3BDAEMgQ4BEEETwRCBCAAPgRCBCAAPQQ1BFEELAAgAD0EPgQgAE0EQgQ+BCAA PQQ1BCAAPgRBBD0EPgQyBDAEPQQ4BDUEIABBBD4ERQRABDAEPQQ4BEIETAQgAE0EQgRDBCAAPwQ4 BEAEMAQ8BDgENARDBCAAMgQgADEEQwQ0BEMESQQ1BDwELgAgACEEPgRGBDgEMAQ7BEwEPQQwBE8E IAA/BDgEQAQwBDwEOAQ0BDAEIABABDAEMQQ+BDIEIAA/BD4ENAQ7BDUENgQ4BEIEIABCBEAEMAQ9 BEEERAQ+BEAEPAQwBEYEOAQ4BCAAMgQgAD8EOwQ+BEIEIABBBDIEPgQxBD4ENAQ9BD4EMwQ+BCAA RwQ1BDsEPgQyBDUERwQ1BEEEQgQyBDAELgAgABwEPgQ2BDUEQgQgADEESwRCBEwELAAgAD0ENQQg AEEEQAQwBDcEQwQsACAAHAQYBCAEHQQrBBkEIAAUBB4EEwQeBBIEHgQgBCAAEgQhBBUEEwQUBBAE IAASBB4EFwQcBB4EFgQVBB0EIQANACAAGwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAAMgQ7BDAEQQRC BD0ESwRFBCAAQQQ+BD4EMQRJBDUEQQRCBDIEIAA4BCAAPgRABDQENQQ9BD4EMgQgADQEPgQ7BDYE PQQwBCAANwQwBDoEOwROBEcEMARCBEwEQQRPBCAAMgQgAD8ENQRABDUEPgRABDgENQQ9BEIEMARG BDgEOAQgADgERQQgAD0EMAQgAD0EPgQyBEsENQQgAD8EQAQwBDIEOAQ7BEwEPQRLBDUEIABEBDgE OwQ+BEEEPgREBDgETgQgADgEIAA6BD4EPQRGBDUEPwRGBDgEOAQsACAAPgRCBCAAOgQ+BEIEPgRA BEsERQQgAD4EPQQ4BCAAPQQ1BCAAMQRDBDQEQwRCBCAAQAQwBDEEQQQ6BDgEIAA3BDAEMgQ4BEEE OAQ8BEsELgAgAB4EPQQ4BCAANgQ1BCAAPAQ+BDMEQwRCBCAAPwQ+BEEEOwQ1BCAATQRCBD4EMwQ+ BCAANAQ+BDsEMwQ+BCAAQwQ/BEAEMAQyBDsETwRCBEwEIABCBEAEMAQ9BEEEPQQwBEYEOAQ+BD0E MAQ7BEwEPQRLBDwEOAQgADoEPgRABD8EPgRABDAERgQ4BE8EPAQ4BCAAOAQgAD0ENQQ6BD4EPAQ8 BDUEQARHBDUEQQQ6BDgEPAQ4BCAAPgQxBEkENQRBBEIEMgQwBDwEOAQoAD8EPgRCBD4EPARDBCAA OgQwBDoEIAA+BDEEOwQwBDQEMAROBEIEIAA9BEMENgQ9BEsEPAQ4BCAAQQRCBEAEQwQ6BEIEQwRA BDAEPAQ4BCAAOAQgAD4EQAQzBDAEPQQ4BDcEMARGBDgENQQ5BCkALAAgADAEIABCBDUELAAgADIE IABBBDIEPgROBCAAPgRHBDUEQAQ1BDQETAQtACAAQQRDBEkENQRBBEIEMgQ1BD0EPQRLBDwEIAA+ BDEESgQ1BDwEPgQ8BCAAMwQ7BD4EMQQwBDsETAQ9BEsERQQgADwEMARCBDUEQAQ4BDAEOwRMBD0E SwRFBCAAQAQ1BEEEQwRABEEEPgQyBCAAQQQgAD8EPgRBBEIENQQ/BDUEPQQ9BD4EOQQgADQENQQ8 BD4EPQQ+BD8EPgQ7BDgENwQwBEYEOAQ1BDkEIABCBDAEOgQ+BDMEPgQgAEMEPwRABDAEMgQ7BDUE PQQ4BE8ELgANACAAEgQgAEEEOwRDBEcEMAQ1BCAAPwRABD4EMgQ1BDQENQQ9BDgETwQgADsENQQz BDAEOwQ4BDcEMARGBDgEOAQgADMEOwQ+BDEEMAQ7BEwEPQQ+BDkEIAAyBDsEMARBBEIEOAQsACAA MwQ+BEEEPwQ+BDQEQQRCBDIEQwROBEkENQQ5BCAAQQRCBDAEPQQ+BDIEOARCBEEETwQgADoEPgQ9 BEYENQQ/BEYEOARPBCAAMQQ7BDAEMwQ+BEEEQgQ9BD4EMwQ+BCAAQAQ+BEEEQgQwBCAAJwQ1BDsE PgQyBDUEOgQwBCAAQQQyBDUEQARFBEAEMAQ3BEMEPAQ9BD4EMwQ+BC4AIAAQBCAAQAQ+BEEEQgQg ADQEPgQ7BDYENQQ9BCAAIAA/BEAEPgRFBD4ENAQ4BEIETAQgADEENQQ3BCAAPgRCBEAESwQyBDAE IAA+BEIEIAA/BDsEMAQ9BDUEQgRLBCwAIABCBD4EIAA1BEEEQgRMBCAAPgQ9BDAEIAA0BD4EOwQ2 BD0EMAQgADMEMARABDwEPgQ9BDgERwQ9BD4EIABABDAEQQRCBDgEIAAyBDwENQRBBEIENQQgAEEE IAA9BDAEPAQ4BCwAIAAwBCAAPQQ1BCAAQwQ8BDgEQAQwBEIETAQsACAAPQQ1BEEETwQgAD0EMAQg AEEENQQxBDUEIAA8BDgEOwQ7BDgEMARABDQESwQgADsETgQ0BDUEOQQsACAANwQwBDMEMAQ2BDgE MgQwBE4ESQQ4BEUEIAAyBEEEUQQgADgEIAAyBEEETwQuACAAJQQ4BEkEPQQ4BDoEIAA/BEAEPgRI BDsEPgQzBD4EIAA0BD4EOwQ2BDUEPQQgAEEEPAQ1BD0EOARCBEwEQQRPBCAAPQQwBCAAPQQwBEEE QgQ+BE8ESQQ1BDMEPgQgAEUEPgQ3BE8EOAQ9BDAEIAAxBEMENARDBEkENQQzBD4ELgAgAC0EQgQ+ BEIEIABFBD4ENwRPBDgEPQQsACAAOwQ1BDMEMAQ7BDgENwQ+BDIEMAQyBCAAPAQ+BD0EPgQ/BD4E OwQ4BDgEIAA4BCAAPwQ+BDsEQwRHBDgEMgQgAEEEMgQ+BDEEPgQ0BEMEIAA+BEIEIABBBDAEPAQ+ BDMEPgQgAEEENQQxBE8EIAA4BCAANgQ4BDIEPgRCBD0EPgQzBD4EIAAyBDgEQgQ4BE8ELAAgAD0E NQQgADEEQwQ0BDUEQgQgADIEIAAxBEMENARDBEkENQQ8BCAANgQ1BEAEQgQyBD4EMgQwBEIETAQg AEEEMgQ+BDUEOQQgAD8EQAQ4BEAEPgQ0BD4EOQQgADgEIAA3BDQEPgRABD4EMgRMBDUEPAQgAEAE MAQ0BDgEIAA/BD4EQgRABDUEMQQ7BDUEPQQ4BE8ELAAgAEIEMAQ6BCAAOgQwBDoEIAA9BDUEMQQ+ BDsETARIBD4EMwQ+BCAAOgQ+BDsEOARHBDUEQQRCBDIEMAQgAEIEQARDBDQEMAQgADEEQwQ0BDUE QgQgAEUEMgQwBEIEMARCBEwEIAA9BDAEIAA+BDEENQRBBD8ENQRHBDUEPQQ4BDUEIABBBDUEPARM BDgELAAgAD4EMQRJBDUEQQRCBDIEMAQgADgEIABBBDIEPgRRBCAAQQQ+BDEEQQRCBDIENQQ9BD0E PgQ1BC4AIAASBDUENARMBCAAPQQwBDwEIAA9BDUEIAA/BEAEOAQ0BFEEQgRBBE8EIABCBEAEMARC BDgEQgRMBCAAMgRABDUEPARPBCAAPQQwBCAAQQRCBEAEMAQ0BDAEPQQ4BE8EIAA+BEIEIAA7BDUE MwQ4BD4EPQQwBCAAMQQ+BDsENQQ5BCAAPgRCBCAAPQQwBDIETwQ3BDAEPQQ9BEsERQQgADEEPgQ7 BDUENwQ9BDUEOQQgADgEIAA7BDUERwQ1BD0EOAQ1BCAAPgRCBCAAPQQ4BEUELAAgADwEMAQ9BDgE PwRDBDsETwRCBDgEMgQ9BEsENQQgADEEOwRDBDYENAQwBD0EOARPBCAAMgQgAEcEQwQ2BD4EOQQg ADIEOARABEIEQwQwBDsETAQ9BD4EOQQgAEAENQQwBDsETAQ9BD4EQQRCBDgELAAgADIEPgQ5BD0E QwQgAD8EQAQ+BEIEOAQyBCAANwQ7BDAELAAgADIESwQ2BDgEMgQwBD0EOAQ1BCAAOAQgADcEMARJ BDgEQgRDBCAAQQQyBD4ENQQzBD4EIAAgBD4ENAQwBC4AIAAVBDQEOAQ9BEsEOQQgACcENQQ7BD4E MgQ1BDoEIABBBDwEPgQ2BDUEQgQgAEEEPgRBBEAENQQ0BD4EQgQ+BEcEOARCBEwEQQRPBCAAPQQw BCAAQgQwBDoEOARFBCAAPQQwBEEEQwRJBD0ESwRFBCAANwQwBDQEMARHBDAERQQsACAAOgQwBDoE IAA/BEAENQQ0BD4EQgQyBEAEMARJBDUEPQQ4BDUEIAAzBDsEPgQxBDAEOwRMBD0EPgQzBD4EIAAx BDgEPgRBBEQENQRABD0EPgQzBD4EIAA6BEAEOAQ3BDgEQQQwBCwAIABBBD8EMARBBDUEPQQ4BDgE IAA4BEEERwQ1BDcEMAROBEkEOARFBCAAMgQ4BDQEPgQyBCAANgQ4BDIEPgRCBD0ESwRFBCAAOAQg ADIEPgRBBEEEQgQwBD0EPgQyBDsENQQ9BDgEOAQgAEEEMgQ+BDUEMwQ+BCAANAQ+BDwEMAQgAD8E PgRBBDsENQQgAE0EPwQ+BEUEMAQ7BEwEPQQ+BDkEIABABDAENwRABEMERQQ4BC4AIAASBD4EOQQ9 BEsEIAA8BDUENgQ0BEMEIAA9BDAEQAQ+BDQEMAQ8BDgELAAgAD0EMAQ6BD4EPQQ1BEYELAAgAD8E QAQ1BDoEQAQwBEIETwRCBEEETwQsACAAQQRCBDAEMgQgAD0ENQQ9BEMENgQ9BEsEPAQ4BCwAIAA6 BDAEOgQgAEEEPgRCBD0EOAQgAEIESwRBBE8ERwQgADgEIAA8BDgEOwQ7BDgEPgQ9BEsEIAA7BDUE QgQgAD0EMAQ3BDAENAQuACAAHARLBCAAPwQ1BEAENQRBBEIEMAQ9BDUEPAQgAEMEMQQ4BDIEMARC BEwEIAA4BCAAPQQwBEEEOAQ7BD4EMgQwBEIETAQgADQEQARDBDMEIAA0BEAEQwQzBDAELgAgACcE NQQ7BD4EMgQ1BDoEIABBBDwEPgQ2BDUEQgQgAD0ENQQgAD0ENQQ9BDAEMgQ4BDQENQRCBEwEIAA4 BCAAPQQ1BCAAQwQ8BDgEQAQwBEIETAQuACAAHgQ9BCAAPwQ+BDkEPARRBEIEIAA0BEAEQwQzBDgE RQQgADsETgQ0BDUEOQQsACAAOgQwBDYENARLBDkEIAAxBEMENAQ1BEIEIABPBEEEPQQ+BCAARwRD BDIEQQRCBDIEPgQyBDAEQgRMBCAAQQQ8BDUEQARCBEwEIAA4BCAAMQQ+BDsETAQgADoEMAQ2BDQE PgQzBD4ELgAgABIEQQRRBCAAOAQgADIEQQQ1BCAAMgRBBEIEMAQ9BEMEQgQgAD0EMAQgAEEEMgQ+ BDgEIAA8BDUEQQRCBDAELgAgABwESwQsACAAPQQwBDoEPgQ9BDUERgQsACAAPwQ+BDsENQRCBDgE PAQgADoEIAA3BDIEUQQ3BDQEMAQ8BCEAIAAmBDgEMgQ4BDsEOAQ3BDAERgQ4BE8EIAA8BDgEQAQw BCAAOAQgAD8EPgRABE8ENAQ6BDAEIAA2BDQEUQRCBCAAPQQwBEEELAAgAEAEMAQyBD0EPgQgADoE MAQ6BCAAOAQgADYENQRABEIEMgQ1BD0EPQRLBDkEIAA9BD4ENgQgAEEEOwQ1BD8EPgQzBD4EIAA+ BDEESQQ1BEEEQgQyBDAEIAA/BEAEPgRIBDsEPgQzBD4EIABBBD4EIABBBDIEPgQ4BDwEOAQgADYE OAQyBD4EQgQ9BEsEPAQ4BCAAQQRCBEAEMARFBD4EPAQgADgEIAA9BDUEPQQwBDIEOARBBEIETARO BC4ADQAgACAAIAAiBD4EOwRMBDoEPgQgAD4EQgQgAD0EMARBBCAAQQQgABIEMAQ8BDgEIAA3BDAE MgQ4BEEETwRCBA0AIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg ACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAB0EPgQyBDAE TwQgABMEOAQ/BDUEQAQxBD4EQAQ1BE8EIAA4BCAAMQRDBDQEQwRJBDUENQQgACcEFQQbBB4EEgQV BBoEEAQhAA0ADQAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg ACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAhBBsEEAQS BBAEIAAVBBwEIwQgACEAIQAhAA0ADQAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAg ACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACAAIAAgACAAIAAgACAAIAAgACAAIQQ7BDAEMgQwBCAAIARDBEEEOAQgACEAIQAhACEAIQAN AA0AIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAhBDsEMAQy BDAEIAAgBD4ENARDBCAAIQAhACEAIQAhACEAIQANAA0ADQANAA0ADQANAA0ADQANAA0AKgAqACoA KgAqACoAKgAgACAAKgAqACoAKgAqACAAIAAqACoAKgAgACAAKgAgACAAKgAqACoAIAAgACoAKgAq ACoAKgAgACAAKgAqACoAKgAqACoAKgANACoAKgAqACoAKgAqACoAKgAqAA0ADQANAA0ADQANAB4E MwQ7BDAEMgQ7BDUEPQQ4BDUEDQANAA0AIAAeBDEEQAQwBEkENQQ9BDgENQQgADoEIABHBDgEQgQw BEIENQQ7BE4EIAA4BCAAQQQ6BDAENwQ6BDAEIAAgACAALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4AIAAgACAAMQANAEkAIAAgACAAJwQ1BDsEPgQyBDUEOgQuACAAHAQ+BD0EPgQ/ BD4EOwQ4BDgEIAA4BCAANwQwBDIEOARBBDgEPAQ+BEEEQgRMBC4AIAAgACAALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuACAA IAAgADIADQBJAEkAIAAgACAAHQQwBEAEOgQ+BEIEOAQ6BDgELgAgABIESwQ8BDgEQAQwBD0EOAQ1 BCAAOAQgADIESwQ8BEsEMgQwBD0EOAQ1BC4AIAAgACAALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4AIAAgACAAMwANAEkASQBJACAAIAAgABAE OwQ6BD4EMwQ+BDsETAQuACAAGwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAAQQQ8BDUEQARCBDgELgAg ACAAIAAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAgACAAIAA1AA0ASQBWACAAIAAgAB8EQAQ+BD8E MAQzBDAEPQQ0BDAELgAgACkEOARCBCAAOAQgADwENQRHBCAAPAQ+BD0EPgQ/BD4EOwQ4BDkELgAg ACAAIAAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuACAAIAAgADcADQBWACAAIAAgABsENQQzBDAEOwQ4BDcEMARGBDgETwQgADIE OwQwBEEEQgQ4BC4AIAAeBDEESQQ1BEEEQgQyBD4EIAA8BDgEQAQwBCAAOAQgAD8EPgRABE8ENAQ6 BDAELgAgACAAIAAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4AIAAgACAAMQA1AA0AIAAeBDMEOwQwBDIEOwQ1 BD0EOAQ1BCAAIAAgAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4A LgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAuAC4ALgAu AC4ALgAuAC4ALgAuAC4ALgAgACAAIAAxADcADQANAA0ADQANAA0ADQANAA0ADQANAA0AIgAbBDUE MwQwBDsEOAQ3BDAERgQ4BE8EIAA8BD4EPQQ+BD8EPgQ7BDgEOQQuACAAEwQ7BD4EMQQwBDsETAQ9 BDAETwQgADEENQQ3BD4EPwQwBEEEPQQ+BEEEQgRMBC4AIgANAA0ADQANAA0AIARDBEEETAQsACAA PAQwBDkEIAAyADAAMQA1ACAAMwQ+BDQEMAQgAD4EQgQgACAELgAlBC4ADQANAA0ADQASBB8EIAAd BBMEDQANACoAKgAqACoAKgANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAABg3AQAaNwEARDcBAEY3AQBINwEAFDgBACY4AQBQOAEAUjgBAGo4 AQBsOAEAujgBAOg4AQD6OAEAYjoBAGQ6AQBmOgEAaDoBAIw6AQCOOgEAkjoBAJQ6AQC4OgEAujoB AL46AQDAOgEA3joBAOA6AQDkOgEA5joBABA7AQASOwEAFjsBABg7AQAqOwEALDsBAEA7AQBCOwEA CjwBABA8AQASPAEAKDwBACo8AQBsPAEAbjwBAHA8AQDEPAEAsD0BAN49AQDgPQEA4j0BAA4+AQAQ PgEA2j4BAPI+AQAiPwEAJD8BAD4/AQBWPwEAaj8BAGw/AQCqPwEA8ubi3trW2s/az9rLx9rA2rm1 ubXA2sDawNrA2sDawNrA2sDawOKxqrGqsaPio+Kf4pvim+Kf4qPin+Kj4gAGFmjWXBQAAAYWaFpv 0QAADBVohmwmABZohmwmAAAMFWgOfToAFmgOfToAAAYWaHsM5AAABhZomnd9AAAMFWgpQkUAFmia d30AAAwVaClCRQAWaClCRQAABhZokEbdAAAGFmjDBOEAAAwVaPpVpwAWaPpVpwAABhZo+lWnAAAG FmgpQkUAAAYWaEZu/AAABhZohmwmAAAXFWiWWk0AFmiGbCYAPioBQ0oaAGFKGgAaFWiWWk0AFmiG bCYANQiBPioBQ0oaAGFKGgA9qj8BALA/AQDUPwEA1j8BAOY/AQDyPwEA9D8BALRAAQC2QAEA/kAB AABBAQBIQQEASkEBAFBBAQBUQQEAVkEBAIpBAQCMQQEAnkEBAKBBAQCiQQEAHkIBAHxCAQBcRAEA bEQBAEZGAQBIRgEAWEYBAFpGAQCGRgEAnEYBAKZGAQCoRgEAzEYBAM5GAQBgRwEAYkcBAGhHAQCC RwEAhEcBAK5HAQCyRwEA7EcBAO5HAQD0RwEA9kcBAKJIAQCySAEA0EgBANJIAQD4SAEASkkBAHRJ AQB2SQEASEoBAPz4/Pj07fjp/On8+OXh18/Hv7u34bPhr+Go4ajhpOHt4e3hoKSgpKCkoJmgmaCV oLOgkbOgkQAAAAAAAAAAAAAAAAAAAAAGFmiFRf8AAAYWaBY9KAAADBVo5hrlABZo5hrlAAAGFmjm GuUAAAYWaPpVpwAADBVoKUJFABZoKUJFAAAGFmjWXBQAAAYWaC95FgAABhZoRm78AAAGFmjIIhIA AA8VaMgiEgAWaMgiEgA+KgEPFWjIIhIAFmgpQkUAPioBDxVoKUJFABZoKUJFAD4qARIVaJZaTQAW aClCRQA1CIE+KgEABhZoKUJFAAAGFmgcbuUAAAYWaHsM5AAADBVo+lWnABZo+lWnAAAGFmiad30A AAYWaIZsJgAABhZoWm/RADZISgEASkoBAHxKAQB+SgEAhkoBAIhKAQCeSgEAoEoBAOhKAQDwSgEA 8koBABhLAQAaSwEAIksBACRLAQA0SwEANksBADhLAQA6SwEAPEsBAJJLAQCeSwEAoksBAMxLAQDO SwEA5EsBAOZLAQD6SwEAEEwBABJMAQAWTAEAGEwBAFhMAQC6TAEAvEwBAMBMAQDCTAEAFE0BAFpN AQBcTQEAak0BAGxNAQAoTgEAKk4BACxOAQAwTgEAOE4BAFBOAQBmTgEAeE4BAJJOAQCoTgEAvk4B AMBOAQDmTgEA6E4BAOpOAQDsTgEA+E4BABZPAQBWTwEAWE8BAH5PAQCsTwEArk8BALBPAQC8TwEA yE8BAMxPAQDYTwEA4E8BAOJPAQD59fn1+fX58fX59fn1+fX59e3p5eHa5drl2uXW2uXW5dLW0tbS zsfOx87S1tLW0tbS1tLW4dbO0s7SztLO4cO/0r/Sv9K70gAAAAAAAAAAAAAAAAAAAAYWaEZu/AAA BhZoikOGAAAGFmiWWk0AAAwVaJhWZAAWaJhWZAAABhZomFZkAAAGFmiMCpwAAAYWaBxu5QAADBVo dmUZABZodmUZAAAGFmj4VUIAAAYWaHZlGQAABhZoSmU1AAAGFmgpQkUAAAYWaAQu+wAABhZohUX/ AAAMFWiFRf8AFmiFRf8AR+JPAQAAUAEAHFABAB5QAQBQUAEAcFABAHJQAQB4UAEAglABAIhQAQCc UAEAnlABAKRQAQC0UAEAzlABANJQAQDoUAEA7FABAPxQAQAcUQEApFEBAKhRAQAYUgEAtlIBAMxS AQASUwEALlMBADJTAQA+UwEAQlMBAFBTAQBgUwEAYlMBAKJTAQCkUwEAqlMBAK5TAQCwUwEA1lMB AEBUAQDGVAEAyFQBAExVAQCcVQEAulUBANpVAQAuVgEAPFYBAD5WAQBEVgEARlYBAExWAQD38u7m 7uLu2tXa1drV2tXa1drL2sbawr7C7sLuwr7C7rqzvq+hla+Rr76Nvo2+iYKJgokADBVo+FVCABZo +FVCAAAGFmhGbvwAAAYWaBwR2wAABhZoBC77AAAXFWiWWk0AFmiFRf8APioBQ0oaAGFKGgAaFWiW Wk0AFmiFRf8ANQiBPioBQ0oaAGFKGgAABhZohUX/AAAMFWh2ZRkAFmhKZTUAAAYWaPhVQgAABhZo HG7lAAAGFmiWWk0AAAkWaBxu5QA+KgESFWj4VUIAFmiMCpwANQiBPioBAAkWaIpDhgA+KgEPFWiW Wk0AFmiMCpwAPioBBhZoikOGAAAPFWgcbuUAFmiMCpwAPioBBhZojAqcAAAJFmhGbvwANQiBDxVo llpNABZojAqcADUIgQAzTFYBAE5WAQBgVgEAYlYBAApXAQAMVwEAElcBABRXAQAWVwEAGFcBACxX AQBOVwEAdFcBAHZXAQDKVwEA0FcBAOBXAQDiVwEA5FcBAG5YAQCCWAEAjlgBAMZYAQDeWAEA+FgB AB5ZAQAgWQEAylkBAMxZAQDsWQEAKloBAD5aAQBCWgEARFoBAHRaAQDeWgEAMlsBAJhbAQC0WwEA tlsBANZbAQDYWwEA2lsBAPZcAQA6XQEAPF0BAD5dAQBkXQEA+fX59e7q49/Tyr+0ramlqaWpoZ2Z oZmloaWh7qGVoZWhkaGVoZX5lfmhjZGhhX0AAAAAAAAAAAAAAA8VaCVpYQAWaIVF/wA+KgEPFWgl aWEAFmhaWZkAPioBBhZot1mtAAAGFmhaWZkAAAYWaBwR2wAABhZoBC77AAAGFmgPQ4cAAAYWaIVF /wAABhZo+FVCAAAGFmi7TzgAAAwVaEplNQAWaCcYzwAAFBVollpNABZoSmU1AENKGgBhShoAABQV aJZaTQAWaCcYzwBDShoAYUoaAAARFmj4VUIANQiBQ0oaAGFKGgAXFWiWWk0AFmgnGM8ANQiBQ0oa AGFKGgAGFmgnGM8AAAwVaHZlGQAWaCcYzwAABhZoHG7lAAAMFWiFRf8AFmiFRf8AAAYWaEZu/AAA DBVo+FVCABZo+FVCAC+kUwEADFcBAHZXAQCMYAEA6GMBADplAQCyZQEA4GUBABRmAQAuZgEAXGsB AFx0AQBodwEAZnoBAGh7AQBGfgEARn8BAIqBAQBUgwEAPoYBANiGAQCAiAEAEokBAPSKAQBOiwEA qIsBAIyMAQAekwEA/QAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAAAAAA AAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAA AAD4AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAA AAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAA AAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA 8wAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA7gAAAAAAAAAAAAAAAPgAAAAA AAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAABnZId5xgAABAAAZ2R2ZRkAAAQA AGdkJxjPAAABAAAAG2RdAQB0XQEAzF0BAM5dAQAaXgEAMl4BAOJeAQDkXgEA6F4BAPZeAQD4XgEA El8BAERfAQBGXwEASF8BAEpfAQCKYAEADGEBABRhAQBqYQEAeGEBAPRhAQD2YQEA+GEBAABiAQAG YgEACmIBAFxiAQCAYgEA9mIBAPhiAQAOYwEAEGMBAHxjAQCOYwEArGMBAK5jAQDmYwEA6GMBAOxj AQDuYwEAIGQBACJkAQAwZAEAtmQBAOZkAQAIZQEACmUBABZlAQAYZQEANGUBADZlAQA4ZQEAOmUB APfv6+fr5+Dn3ODn2NHn69jNyc3YzcXNxc3FzdjNwc3BzdjNusGzr+unn5vrxevF65frl5CMAAAA AAAAAAAAAAAGFmi7TzgAAAwVaHZlGQAWaIVF/wAABhZo5UCRAAAGFmh2ZRkAAA8VaHZlGQAWaHZl GQA1CIEPFWh2ZRkAFmiFRf8ANQiBBhZoESVmAAAMFWijRGoAFmjmKQwAAAwVaKNEagAWaKNEagAA BhZoo0RqAAAGFmgcEdsAAAYWaIpDhgAABhZo5ikMAAAMFWhXMHwAFmhXMHwAAAYWaAd9TQAABhZo FWRCAAAMFWgVZEIAFmgVZEIAAAYWaFcwfAAABhZohUX/AAAPFWglaWEAFmiFRf8APioBDxVoJWlh ABZoBC77AD4qAQA1OmUBADxlAQA+ZQEAsmUBALRlAQC2ZQEAzmUBANxlAQDgZQEA4mUBAORlAQAU ZgEAFmYBABhmAQAsZgEANGYBAFpmAQDuaAEA8GgBAGRpAQCIaQEA2GkBAPJpAQAoagEAWmsBAFxr AQBgawEAYmsBAHprAQB8awEAkGsBAJJrAQAEbQEABm0BADJtAQA0bQEARG0BAFxtAQDkbQEA7G0B AARuAQAGbgEACG4BACRuAQBobgEAam4BADJvAQBWbwEAYm8BAGRvAQCGbwEAnG8BAKhvAQCqbwEA rG8BALpvAQC8bwEAWnABAPz0/O/q5uLm7+rm7+rm3tbez97L3svey8/Hw7+4sLi/qb+pv6G/nb+Z v5m/lb+Rv5GVv5W/uKG4vwAGFmgELvsAAAYWaMMHRwAABhZoDn06AAAGFmhySQYAAA8VaMMHRwAW aLdZrQA1CIEMFWi3Wa0AFmi3Wa0AAA8VaDAzHgAWaLdZrQA1CIEMFWjDB0cAFmjDB0cAAAYWaLdZ rQAABhZo5ikMAAAGFmgRJWYAAAYWaDAzHgAADBVo5UCRABZo5UCRAAAPFWgwMx4AFmjlQJEANQiB BhZo5UCRAAAGFmijRGoAAAYWaIVF/wAACRZojXp2ADUIgQkWaBElZgA1CIEPFWiNenYAFmiNenYA NQiBBhZojXp2ADlacAEAXHABAGpwAQBscAEAnnABAKBwAQCicAEAunABAKZxAQCqcQEAGHMBANxz AQDecwEA4HMBAOJzAQD0cwEA9nMBADh0AQA6dAEAWHQBAFx0AQCqdAEAvnQBABx1AQBOdQEAXnUB AMZ1AQDkdQEA5nUBACh2AQBYdgEAlnYBALB2AQDAdgEAxHYBANp2AQDedgEA8nYBAPZ2AQAGdwEA CncBACR3AQAodwEAOHcBADp3AQA8dwEATHcBAGR3AQBmdwEAaHcBAAR4AQAYeAEAQHgBAEJ4AQB0 eAEAdngBAMZ4AQAceQEAnHkBALB5AQAEegEARHoBAEZ6AQBYegEAZnoBAGp6AQDkegEA+fH57ent 6e3l7eHd4d3h+eHZ4e3h0eHN4c3h5cnh5d3h3eHd4d3h3eHd4d3h6d3hxeG94cXhxeG54d3h6eHp 4bWxAAAAAAAAAAAAAAAAAAAAAAAAAAAGFmh2ZRkAAAYWaBElZgAABhZoSDbeAAAPFWgwMx4AFmhh NI8ANQiBBhZoMDMeAAAGFmi0SK0AAAYWaBRY6AAADxVodmUZABZoYTSPADUIgQYWaIpDhgAABhZo wwdHAAAGFmhhNI8AAAYWaHJJBgAABhZoBC77AAAGFmi3Wa0AAA8VaMMHRwAWaLdZrQA1CIEMFWjD B0cAFmjDB0cAQuR6AQBQewEAZHsBAGZ7AQBoewEASnwBAJx8AQDQfAEA0nwBAOR8AQD4fAEA+nwB ADB9AQDGfQEA1n0BAER+AQBGfgEASH4BALZ+AQDSfgEARH8BAEh/AQBWfwEAWH8BAHZ/AQCMfwEA jn8BABKAAQAUgAEAboABANiAAQDagAEAKoEBADSBAQA2gQEAOIEBAEqBAQCIgQEAjIEBAASCAQAG ggEAPoIBAHiCAQB6ggEAiIIBAIqCAQCMggEAnoIBAKCCAQC8ggEAvoIBAFKDAQBWgwEAeIMBAHyD AQAKhAEADIQBACCEAQAihAEAaoQBAMqEAQDihQEA9/Lr5+Pf29fT18/Xy8/LxOvn28Dr57znuOvn vOfbvNu4vLjbuOvnvOe0vLC8rLC8rLyo6+eh56HPoeed5wAAAAAABhZo5Wo7AAAMFWjaRXwAFmh2 ZRkAAAYWaMVU0AAABhZoVy18AAAGFmiHecYAAAYWaCt0tQAABhZoV17iAAAGFmjDB0cAAAYWaMR3 9gAADBVo9zx0ABZoHBHbAAAGFmi3CHkAAAYWaMBuKgAABhZo5llvAAAGFmhHHacAAAYWaAgongAA BhZoxTUZAAAGFmgcEdsAAAYWaHZlGQAADBVo9zx0ABZodmUZAAAJFmh2ZRkANQiBDxVodmUZABZo dmUZADUIgQA94oUBAOSFAQAQhgEAEoYBADyGAQA+hgEAwIYBAMKGAQDYhgEA2oYBALSHAQB+iAEA gIgBAIKIAQCOiAEAkIgBALCIAQC0iAEA8ogBAA6JAQASiQEAFIkBACCJAQAwiQEAjokBAJyJAQDq iQEA7IkBAEKKAQBEigEA9IoBAPaKAQAMiwEATIsBAE6LAQBQiwEAqIsBAKqLAQBCjAEAiIwBAIyM AQCOjAEAAo0BADqNAQBQjQEAVo0BAFiNAQD59fHt5vHi8dvx1/HT8czxzPHE8cTxvPG48bHxsfGp paGlqaWZpZWlkY2JhYl+AAAAAAAAAAAAAAAAAAAAAAAADBVoDn06ABZoDn06AAAGFmjrZd4AAAYW aE5f7wAABhZo/CbXAAAGFmjiFbkAAAYWaAd9TQAADxVoh3nGABZoh3nGADUIgQYWaJUl8AAABhZo h3nGAAAPFWh2ZRkAFmiHecYANQiBDBVo62XeABZodmUZAAAGFmhySQYAAA8VaHZlGQAWaHZlGQA+ KgEPFWh2ZRkAFmh2ZRkANQiBDBVo/CbXABZodmUZAAAGFmgcEdsAAAYWaCVjJAAADBVo9zx0ABZo dmUZAAAGFmhha98AAAwVaNpFfAAWaHZlGQAABhZoxVTQAAAGFmh2ZRkAAAYWaFM+DAAADBVoUz4M ABZoUz4MAC5YjQEAao0BAGyNAQDKjQEA5I0BAFKOAQB2jgEAjo4BAJKOAQCQjwEAOJABAICQAQCC kAEAnJABAJ6QAQCikAEApJEBAKiRAQDIkQEAzJEBANiRAQDakQEA6JEBAOqRAQDskQEATJIBAFiS AQBokgEAcpIBAISSAQCGkgEAlpIBAPCSAQAakwEAHJMBAB6TAQB6kwEArJMBABKUAQBClAEAXpQB AHaUAQCGlAEAkpQBAJSUAQCilAEAqJQBALaUAQDClAEAypUBANiVAQDalQEAepYBAHyWAQCmlgEA MJcBAJiXAQD38Ozo7OTg7Nzk2NHY0djkzcnN5M3kzeTFzcXBvbbBxc3Fr6vNq82nq82rzavNq5+r p5unq5erkwAAAAAAAAAAAAAGFmhxRFcAAAYWaIpDhgAABhZoqVHVAAAPFWipUdUAFmhqMG4ANQiB BhZoASuSAAAGFmhqMG4AAAwVaPwm1wAWaPwm1wAADBVoqmspABZoqmspAAAGFmiqaykAAAYWaMtS VQAABhZolHPxAAAGFmgxe0YAAAYWaEYPawAADBVo4hW5ABZo4hW5AAAGFmjiFbkAAAYWaKkaVQAA BhZoahu/AAAGFmhOX+8AAAYWaA59OgAABhZo/CbXAAAMFWgOfToAFmgOfToAAA8VaA59OgAWaE5f 7wA+KgEAOJiXAQCalwEAMJgBADSYAQBSmAEAlpgBAOKYAQDSmQEA5JkBAPyZAQD+mQEAAJoBAEya AQBqmgEAbpoBAIiaAQCgmgEAqpoBANiaAQDamgEAFJsBABibAQA4mwEAOpsBAFybAQB0mwEAdpsB AIqbAQCMmwEAnpsBAKCbAQC2mwEAuJsBANSbAQDWmwEAAJwBAAKcAQAWnAEAGJwBACacAQAqnAEA NJwBADacAQBEnAEARpwBAFycAQBenAEAkpwBAJacAQCYnAEAxJwBAMacAQDInAEA4pwBAOScAQAc nQEAMp0BAGqdAQCEnQEAmp0BALCdAQCynQEAzp0BADieAQBIngEA/Pjx7fjp+OXh+N3Z0cnF2cXZ xdnF2fzB2cXZxdnFvcW9tr3Fvba9xb3FvcW9xb2yq7LFq7LFsvyy/LKnxaej2QAABhZoAiBZAAAG FmgcbkIAAAwVaBNxGAAWaBNxGAAABhZoE3EYAAAMFWisRlIAFmisRlIAAAYWaKxGUgAABhZocjdS AAAGFmipUdUAAA8VaKlR1QAWaKlR1QA+KgEPFWipUdUAFmhvDIgAPioBBhZobwyIAAAGFmhqMG4A AAYWaDAzHgAABhZo+kTtAAAGFmj3PHQAAAYWaDx56wAADBVocURXABZocURXAAAGFmhxRFcAAAYW aDNZ3QBAHpMBAACaAQDmngEArqMBAEqtAQBItgEAtrgBAHC6AQC6ugEAAsEBAGTBAQDswQEAasIB AADDAQCSwwEAvMMBAADEAQBOxAEAmsQBANjEAQAIyQEAWskBAPrJAQAyygEAHtABAILQAQBk0wEA 8NMBAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6 AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA8wAAAAAA AAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAO4AAAAAAAAAAAAA AADuAAAAAAAAAAAAAAAA7gAAAAAAAAAAAAAAAO4AAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA7gAA AAAAAAAAAAAAAO4AAAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAA AAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPMAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA 8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAZ2RGD2sAAAEAAAAEAABnZOIVuQAABAAAZ2Qn GM8AABtIngEAfp4BAJCeAQDkngEA5p4BANSfAQDWnwEA7J8BAO6fAQD0nwEA9p8BABqgAQAcoAEA 8KABAPKgAQAWoQEAGKEBAEahAQBOoQEAvqEBAPKhAQBAogEAQqIBAJiiAQCeogEA5qMBAOijAQD8 owEA/qMBABKkAQAapAEALKQBAC6kAQDKqQEA+qkBAPypAQDCqgEAxKoBANKqAQDUqgEA3KoBAN6q AQDAqwEAwqsBANarAQDYqwEA3KsBAN6rAQAerAEANKwBAEisAQBIrQEASq0BAAyuAQAirgEAYq4B AGSuAQDksAEA5rABAOqwAQD2sAEA+LABAPywAQAEsgEABrIBAAqyAQAysgEANLIBADayAQD8+Pz0 8Onw6fDp8Onw6fDp8OXw4fDh8OHw3fDl8N3w3fDWzvDO1s7WzvDO1s7W8Nbw1vDHw7/Du8OzrMOz rMOzrMOzrAwVaNB8bQAWaGFAJgAADhZoYUAmAG1ICQRzSAkEAAYWaM1E8QAABhZofWGrAAAGFmhh QCYAAAwVaHFEVwAWaOIVuQAADwNqAAAAABZo4hW5AFUIAQwVaFh4RgAWaOIVuQAABhZoTjbWAAAG FmgQJ1oAAAYWaKlR1QAADBVo4hW5ABZo4hW5AAAGFmjiFbkAAAYWaG8MiAAABhZoRg9rAAAGFmj3 PHQARDayAQBoswEAarMBAG6zAQDUtAEA1rQBANi0AQDktAEA5rQBAOi0AQAotgEARLYBAEi2AQBM tgEAcLYBAHy2AQCQtgEAkrYBAAS3AQAWtwEArLcBALS3AQDUtwEAILgBAC64AQCKuAEAjrgBAJC4 AQC0uAEAtrgBAN64AQDguAEA9LgBAPa4AQD4uAEAGLkBACC5AQBuugEAcLoBAHa6AQB6ugEAfLoB AJa6AQCYugEAtroBALi6AQC6ugEAvLoBACS7AQAmuwEA/PTt/PTt/PTt/On86eXp5eHl3eXZ5dXZ 1dnp1c7Kw8q/w7vdysPZt6mdkYi3hLf8fQAMFWjvL+QAFmjvL+QAAAYWaO8v5AAAERZo7y/kAD4q AUNKGgBhShoAFxVoPHnrABZo7y/kAD4qAUNKGgBhShoAFxVoRg9rABZoWlmZAD4qAUNKGgBhShoA GhVoRg9rABZoWlmZADUIgT4qAUNKGgBhShoAAAYWaFpZmQAABhZoPHnrAAAGFmjhVaMAAAwVaCcY zwAWaCcYzwAABhZoJxjPAAAMFWi3Wa0AFmj7AhAAAAYWaLl0KgAABhZoRg9rAAAGFmiKQ4YAAAYW aM1E8QAABhZo+wIQAAAGFmj2dBwAAAwVaNB8bQAWaGFAJgAADhZoYUAmAG1ICQRzSAkEAAYWaGFA JgAxJrsBAEq7AQB+uwEAtLsBACy8AQBOvAEAlLwBALK8AQDGvAEAyLwBANC8AQDSvAEAUL0BAFK9 AQCuvQEA0r0BAPC9AQD8vQEAuL4BANK+AQDyvgEAAL8BACa/AQAovwEAmsABAJzAAQC0wAEAtsAB AMjAAQD+wAEACsEBADjBAQBiwQEAcsEBAHTBAQD4wQEA+sEBAGjCAQBqwgEAbsIBAHDCAQBywgEA ysIBAObCAQD8wgEA/sIBAADDAQACwwEADsMBACLDAQAywwEAkMMBAJLDAQCWwwEAvMMBAADEAQBO xAEAmsQBAJzEAQCexAEA1sQBANjEAQDaxAEAjMUBAK7FAQAmxgEAKsYBAPz49Pj0+Pz4/Pjw+PD4 /Oz87Ojs9Oz85N3k3eT81vz0/PT89PzW0s7SysLKu8rOyrezt8rOyq+rzsrOq8qvys7KpwYWaNBq sgAABhZogF5BAAAGFmh6MwUAAAYWaLRnfwAABhZomlzKAAAMFWguO2oAFmhGD2sAAA8VaNE0iQAW aEYPawA1CIEGFmhGD2sAAAYWaEZu/AAABhZo0TSJAAAMFWjvL+QAFmjvL+QAAAwVaDx56wAWaDx5 6wAABhZoijCJAAAGFmgOQOkAAAYWaKUiAQAABhZoTyXfAAAGFmg8eesAAAYWaGFAJgAABhZo7y/k AEIqxgEALMYBAGDHAQBoxwEAascBAGzHAQCYxwEAmscBAJ7HAQCgxwEAAMgBAALIAQAayAEAHMgB ACbIAQAqyAEANsgBADrIAQBQyAEAVMgBAFbIAQBqyAEACMkBAAzJAQBYyQEAWskBAM7JAQDayQEA 3MkBAOjJAQDqyQEA9skBAPjJAQD6yQEAAMoBAALKAQAGygEACMoBAC7KAQAwygEAMsoBADTKAQAC zAEAaswBAJjMAQCuzAEAtswBANDMAQD8+Pz48fjx7fzt/O387fzt/O387fzt6eLb18vAy7u0rdeo oNeUidfp14XXgYWBfQAAAAAAAAAAAAAABhZogyL6AAAGFmjRNIkAAAYWaNA17QAAFBVoRm78ABZo YUAmAENKGgBhShoAABcVaEZu/AAWaGFAJgA1CIFDShoAYUoaAA8VaCU9cgAWaGFAJgA1CIEJFmhG D2sANQiBDBVoRm78ABZoYUAmAAAMFWhGbvwAFmhGbvwAAAkWaEZu/AA1CIEUFWhsJIEAFmhhQCYA Q0oaAGFKGgAAFxVobCSBABZoYUAmADUIgUNKGgBhShoABhZoYUAmAAAMFWjbNzMAFmhhQCYAAAwV aNs3MwAWaP17GQAABhZoRm78AAAGFmhGD2sAAAwVaEooIQAWaEooIQAABhZo0GqyAAAGFmiKQ4YA L9DMAQDSzAEABM0BAAjNAQAwzQEAQs0BAHbNAQB4zQEAfs0BAIDNAQCYzQEAms0BAOzNAQAOzgEA LM4BAC7OAQBWzgEAWM4BAF7OAQB0zgEAgs4BADzPAQAa0AEAHNABAB7QAQAk0AEAJtABACrQAQAs 0AEAftABAILQAQCe0AEAotABADTRAQA60QEATtEBAFDRAQCG0QEANtMBAFTTAQBW0wEAWNMBAGDT AQBi0wEAZNMBAGrTAQBs0wEAcNMBAHLTAQC20wEA0tMBANTTAQDs0wEA8NMBAPn1+fXx9fnt5u3m 7eLe197X3uLe4tPM4se/07Oo0/Wk9aD1oPWcmKSYpJz1x7/Ts6iQiKjTAAAADhZoWgCIAENKGgBh ShoAAA4WaEZu/ABDShoAYUoaAAAGFmgNTIMAAAYWaNA17QAABhZogyL6AAAGFmj2dBwAABQVaEZu /AAWaAdE5ABDShoAYUoaAAAXFWhGbvwAFmgHROQANQiBQ0oaAGFKGgAPFWglPXIAFmgHROQANQiB CRZoRg9rADUIgQwVaAdE5AAWaAdE5AAABhZoB0TkAAAMFWieILgAFmieILgAAAYWaJ4guAAABhZo YUAmAAAMFWiZOCYAFmiZOCYAAAYWaJk4JgAABhZoZAamAAAGFmjRNIkAAAwVaNE0iQAWaNE0iQA1 8NMBAAjUAQAK1AEAGNQBANrUAQAG1QEACNUBAArVAQAM1QEADtUBABDVAQAg1gEAvtYBAMDWAQDC 1gEAxNYBAMbWAQAw1wEAWNcBAFrXAQBc1wEAXtcBAGDXAQBi1wEActcBAJLYAQCU2AEAltgBAJjY AQCk2AEArNgBAMDYAQDE2AEA2NgBANrYAQDs2AEA8NgBAPLYAQD+2AEAANkBAALZAQAE2QEABtkB AAjZAQA02QEARtkBAEzZAQBQ2QEAUtkBAGLZAQCc2QEAntkBAKDZAQCi2QEApNkBAKbZAQDQ2QEA 0tkBAOLZAQDm2QEA9/Pr8+Pc89jUzfPHvtjUzbq2utjUzbqyutjUzfO6867zuvO687rz2NTN87Lz srqyuqrz2NTNuqLNltQAFxVoBx9oABZoWgCIADUIgUNKHABhShwADxVo4hW5ABZo91zcADUIgQYW aOIVuQAABhZo73MuAAAGFmjbNzMAAAYWaIwKnAAABhZo91zcAAAQFWj3XNwAFmgHROQAQ0oWAAAK Fmj3XNwAQ0oWAAAMFWhaAIgAFmhaAIgAAAYWaFoAiAAABhZoBD2rAAAMFWgHROQAFmgHROQAAA8V aNs3MwAWaAdE5AA1CIEPFWjiFbkAFmgHROQANQiBBhZoB0TkAAAPFWhaAIgAFmgHROQANQiBADvw 0wEACtUBAMDWAQBa1wEAktgBAADZAQCe2QEAEtoBALDjAQBu5QEA5OUBABDpAQAg6gEAquoBAHrr AQCu6wEA8OwBAJjtAQB47wEAeu8BAHzvAQB+7wEA6u8BAPLvAQCE9wEACPsBANAGAgAQBwIAuAcC ALoHAgD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA /QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAA AAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAA AAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0A AAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAA AAAAAAAA/QAAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAA AP0AAAAAAAAAAAAAAAD9AAAAAAAAAAAAAAAA/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAHebZ AQAS2gEAGNoBAB7aAQAm2gEAKNoBAGTaAQBu2gEAltoBALbaAQDS2gEA5toBAAzbAQAY2wEAQtsB AGzbAQB22wEAbtwBAHLcAQCK3AEAjNwBAD7dAQBA3QEAYt0BAGTdAQDG3QEAyt0BANbdAQDY3QEA pN4BAKbeAQDc3gEA7N4BABzfAQCG3wEAkt8BALTfAQDo3wEAauABALrgAQBy4QEAtOEBALzhAQC+ 4QEATOIBAG7iAQB24gEAkuIBAPz07fTt6eXp29Tb1OnM6cTpwOnl6bnpuem16bGpsaWxobGZsZGx obGhiaGxgXmBAAAADxVoSighABZoBD2rADUIgQ8VaEooIQAWaM0OTAA1CIEPFWgEPasAFmgEPasA NQiBDxVoBD2rABZozQ5MAD4qAQ8VaAcfaAAWaM0OTAA1CIEGFmgEPasAAAYWaMVeAwAADxVosEVR ABZozQ5MAD4qAQYWaM0OTAAABhZokhgzAAAMFWiXBFIAFmiXBFIAAAYWaE8l3wAADxVoESVmABZo lwRSADUIgQ8VaE421gAWaJcEUgA1CIEMFmgEPasANQiBPioBABIVaIwKnAAWaJcEUgA1CIE+KgEA BhZoWgCIAAAGFmiXBFIAAAwVaAcfaAAWaAcfaAAADxVoBx9oABZoBx9oADUIgQYWaPdc3AAvkuIB AKDiAQCw4gEAvOIBADjjAQBc4wEAYuMBAIzjAQCO4wEAmuMBAKTjAQCm4wEArOMBAK7jAQCw4wEA tOMBALbjAQDO4wEA9uMBAALkAQAc5AEAHuQBADTkAQA25AEAUuQBAGjkAQCE5AEAiOQBANzkAQAO 5QEAHOUBAGrlAQBs5QEAbuUBAHDlAQD37+vn4+fj39fP48e7tLCp36GVkY2FfXh9bGVh32V4qZFc AAAAAAAAAAAAAAkWaBElZgA1CIEGFmhaAIgAAAwVaAQ9qwAWaAQ9qwAAFxVoWgCIABZojAqcADUI gUNKGgBhShoACRZoBD2rADUIgQ8VaIwKnAAWaIwKnAA1CIEPFWiMCpwAFmiSGDMANQiBBhZokhgz AAAGFmjNeAgAABcVaFoAiAAWaM14CAA1CIFDShoAYUoaAA8VaAcfaAAWaM14CAA1CIEMFWjNeAgA FmjNeAgAAAYWaBElZgAADBVolwRSABZolwRSAAAXFWiwRVEAFmg9Je0ANQiBQ0ocAGFKHAAPFWiw RVEAFmg9Je0ANQiBDxVoBD2rABZoPSXtADUIgQ8VaAQ9qwAWaAQ9qwA1CIEGFmgEPasAAAYWaD0l 7QAABhZozQ5MAAAGFmj3cXIAAA8VaEooIQAWaPdxcgA1CIEPFWgHH2gAFmgHH2gANQiBACJw5QEA cuUBAHTlAQB25QEA3uUBAODlAQDi5QEA5OUBADjmAQBE5gEAJucBAIbnAQCI5wEA9OcBACzoAQCs 6AEA3OgBAPboAQAM6QEADukBABDpAQAU6QEAyukBAODpAQDo6QEAIOoBACTqAQBa6gEAdOoBAHbq AQCo6gEAquoBAK7qAQCy6gEAyOoBAD7rAQBA6wEAeOsBAHrrAQCq6wEArOsBAK7rAQCw6wEAtOsB ALbrAQDk6wEA9/Pr49/31s/Lz8vPy8fLv8vHz8u7y7PLq7vLs8ury7vLx6PHm8uPz8uKhX52AAAA AAAAAA8VaPgWkgAWaPgWkgA+KgEMFWj4FpIAFmj4FpIAAAkWaOIVuQA1CIEJFmj4FpIANQiBFxVo 1mcMABZoDkDpADUIgUNKGgBhShoADxVo+BaSABZo+BaSADUIgQ8VaE421gAWaPgWkgA1CIEPFWgO QOkAFmgOQOkANQiBDxVoTjbWABZoDkDpADUIgQYWaE421gAADxVo+BaSABZoDkDpADUIgQYWaPgW kgAABhZoDkDpAAAMFWgOQOkAFmgOQOkAABEWaO0rAQA1CIFtSAkEc0gJBAYWaO0rAQAADxVojAqc ABZozXgIAD4qAQ8VaIwKnAAWaO0rAQA+KgEGFmjNeAgAAA8VaO0rAQAWaO0rAQA1CIEALeTrAQCi 7AEA6uwBAO7sAQDw7AEA8uwBAPTsAQD27AEA+OwBAAztAQA27QEASO0BAJLtAQCU7QEAlu0BAJjt AQCa7QEAnO0BAJ7tAQCg7QEAyO0BAMrtAQBi7gEAiO4BAIruAQCm7gEA2u4BAN7uAQDo7gEA7O4B AP7uAQAY7wEAGu8BAGLvAQBk7wEAcu8BAHTvAQB27wEAeO8BAHrvAQB87wEAfu8BAIjvAQCK7wEA ju8BAJDvAQCS7wEA+vPu5+La1s7G1sLWvtq+4trWzsbWuta+tr62vra+tr7Wvrqy2q2ppZ6WipaC dgAAFxVoTU3IABZodlfrADUIgUNKHABhShwADhZodlfrAENKHABhShwAABYWaE1NyABDShwAYUoc AG1ICQRzSAkEAA4WaO9zLgBDShwAYUocAAAMFWguO2oAFmi5dCoAAAYWaPdc3AAABhZoWlmZAAAJ FmjNeAgANQiBBhZo0DXtAAAGFmhONtYAAAYWaFoAiAAABhZo7SsBAAAGFmj9QZoAAA8VaFoAiAAW aM14CAA+KgEPFWhaAIgAFmiSGDMAPioBBhZozXgIAAAPFWjtKwEAFmjtKwEANQiBCRZoESVmADUI gQwVaA5A6QAWaPgWkgAACRZo+BaSADUIgQwVaPgWkgAWaPgWkgAACRZo1mcMAD4qAQAuku8BAOrv AQDy7wEAOvABAJjwAQCk8AEAuvABALzwAQAC8QEABPEBAAjxAQAS8QEAoPEBADryAQA88gEAWPIB AKbyAQCo8gEACPQBAAr0AQBU9QEAavUBANz2AQDk9gEAGPcBABr3AQAs9wEALvcBAIL3AQCE9wEA /vcBAB74AQBM+AEAePgBAMr4AQDM+AEAmvkBALD5AQA0+gEANvoBAHb6AQCQ+gEABvsBAAj7AQBI +wEAXvsBAOz7AQAK/AEAXP0BAGj9AQCi/QEAuP0BAGr+AQAI/wEAHv8BAK7/AQCw/wEAwv8BAOj/ AQA2AAIAUAACAF4AAgD48erm4ubq5tvi1+LTz9PL08vHy8PLu8vXy7fLs7evw6+rr6vPq8Orp6vm p6Onw6efp8Onm5+bo5ujm8ObAAYWaNlRiwAABhZodyrFAAAGFmgRJWYAAAYWaKocxgAABhZoaSgY AAAGFmhxVUkAAAYWaAQ9qwAABhZo0wW+AAAPFWjecMkAFmjWJ7YANQiBBhZo3nDJAAAGFmgWPSgA AAYWaNYntgAABhZoikOGAAAGFmjtCzMAAAYWaBtNdQAADBVo8xA7ABZoViTrAAAGFmjzEDsAAAYW aFYk6wAADBVoViTrABZoViTrAAAMFWhWJOsAFmjvcy4AAA4WaHZX6wBDShwAYUocAD1eAAIAYAAC AGwAAgCaAAIAlAECAAADAgAKAwIAHAMCAB4DAgAgAwIAIgMCADADAgAyAwIAXAMCAF4DAgBuAwIA cAMCAPYDAgBUBAIAegQCAIoEAgCqBAIArAQCAEQFAgBOBQIAWgUCAGQFAgBmBQIAhgUCAIwFAgCO BQIAngUCAKAFAgDIBQIAygUCAN4FAgD8BQIADgYCABAGAgBIBgIAWAYCAHoGAgCQBgIAzAYCAM4G AgDQBgIA1AYCAPAGAgD+BgIADAcCAA4HAgAQBwIAJgcCAFIHAgBuBwIAcAcCAHoHAgB8BwIApAcC APz49Pjw7PD87Pzs8Ojk6OTo4Ojg6NnV4NHg0eDw5PDk8Ojw6PDk8M3ozejwzcnwxcnBvcn0yayh rKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBVopX7lABZopX7lAENKGgBhShoAACAVaFJf 4wAWaKV+5QA1CIFCKglDShoAYUoaAHBoAACAAAAGFmiqHMYAAAYWaHEI4gAABhZoBD2rAAAGFmil fuUAAAYWaOV/kQAABhZo4gtvAAAGFmjSQuQAAAwVaNJC5AAWaNJC5AAABhZoASuSAAAGFmhaJnYA AAYWaO8xbgAABhZodyrFAAAGFmjRHGEAAAYWaBElZgAABhZo2VGLAAAGFmjecMkAOqQHAgCmBwIA qAcCAKoHAgCsBwIArgcCALAHAgCyBwIAtAcCALYHAgC4BwIAugcCABwIAgAiCAIAJAgCAE4IAgBU CAIAaggCAHAIAgB0CAIAiggCAIwIAgCkCAIApggCAKgIAgCqCAIA3ggCAPAIAgAWCQIAIAkCACYJ AgAsCQIAMAkCADwJAgA+CQIAQAkCAEoJAgDv4dPhyrzKvLClnpaOlo6GjoaOln9yZnKWX5aOloaW hpaOlo4AAAAAAAAMFWiNNGMAFmjlf5EAABcVaEoA0wAWaOV/kQA1CIFDSh4AYUoeABgVaP4yGAAW aOV/kQA1CIFCKgJwaDNm/wAADBVomTTsABZo5X+RAAAOFmgwMx4AQ0oUAGFKFAAADhZoESVmAENK FABhShQAAA4WaOV/kQBDShQAYUoUAAAMFWjvMW4AFmgEPasAABQVaKV+5QAWaKV+5QBDShoAYUoa AAAXFWgRJWYAFmilfuUANQiBQ0oaAGFKGgAaFmgwMx4ANQiBQioGQ0oaAGFKGgBwaP9mAAAAERZo MDMeADUIgUNKGgBhShoAGhZoMDMeADUIgUIqAkNKGgBhShoAcGgzZv8AABoWaDAzHgA1CIFCKgZD ShoAYUoaAHBo/wAAAAAgFWhSX+MAFmilfuUANQiBQioCQ0oaAGFKGgBwaDNm/wAkugcCAKgIAgCq CAIAeAkCAHoJAgAICgIACgoCAAwKAgAOCgIAEAoCABIKAgAUCgIAFgoCABgKAgAaCgIAHAoCAHQK AgCICgIAigoCAIwKAgCOCgIAkAoCAJIKAgCoCgIAqgoCAKwKAgD6AAAAAAAAAAAAAAAA+gAAAAAA AAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPgAAAAAAAAAAAAA AAD4AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAA AAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAPgAAAAAAAAA AAAAAADwAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAANsAAAAA AAAAAAAAAADbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAGdkpFxrAAAHAAADJAFhJAFnZKRcawAA BwAAAyQBYSQBZ2QEPasAAAcAAAMkAWEkAWdk/jIYAAABAAAABAAAZ2Tlf5EAABlKCQIAUgkCAFYJ AgBYCQIAYgkCAGQJAgBsCQIAdAkCAHYJAgB4CQIAegkCAKwJAgC2CQIAyAkCAM4JAgDUCQIA2AkC AOIJAgAECgIABgoCAAgKAgAKCgIADAoCABgKAgAcCgIA/PHfzd/Nu6+el4+Hj3+Ph3RjV2NTT0tH AAAAAAAAAAAAAAAAAAAAAAAABhZoBD2rAAAGFmgBK5IAAAYWaI1wWAAABhZopFxrAAAXFWhxCOIA Fmjlf5EANQiBQ0oyAGFKMgAgFWj+MhgAFmjlf5EANQiBQioGQ0oiAGFKIgBwaP8AAAAAFBVojTRj ABZo5X+RAENKHABhShwAAA4WaDAzHgBDShwAYUocAAAOFmjlf5EAQ0ocAGFKHAAADhZoESVmAENK HABhShwAAAwVaI00YwAWaOV/kQAAIBVoMDMeABZo5X+RADUIgUIqCENKHgBhSh4AcGj///8AABcV aEoA0wAWaOV/kQA1CIFDSiIAYUoiACMMKgEVaHEI4gAWaOV/kQA1CIFCKgZDSh4AYUoeAHBo/2YA ACMMKgEVaP4yGAAWaOV/kQA1CIFCKghDSh4AYUoeAHBo////ACMMKgEVaFJf4wAWaOV/kQA1CIFC KgZDSh4AYUoeAHBo/wAAABUVaP4yGAAWaOV/kQBCKghwaP///wAGFmjlf5EAGBwKAgAqCgIALAoC AC4KAgA4CgIAPAoCAEIKAgBGCgIASAoCAEwKAgBSCgIAVgoCAGAKAgBkCgIAcgoCAHQKAgB2CgIA eAoCAHoKAgB8CgIAfgoCAIAKAgCCCgIAhAoCAIYKAgCICgIAigoCAJAKAgCSCgIA797SwdKw0p/S sNLB0u/Sk4d7b2Nve4eTV1NPSAwVaO8xbgAWaI1wWAAABhZoBD2rAAAGFmiNcFgAABcVaNc7JQAW aAQ9qwA1CIFDSpAAYUqQABcVaKBZIgAWaAQ9qwA1CIFDSpoAYUqaABcVaKBZIgAWaAQ9qwA1CIFD SoQAYUqEABcVaKBZIgAWaAQ9qwA1CIFDSm4AYUpuABcVaKBZIgAWaAQ9qwA1CIFDSkIAYUpCABcV aGM3KAAWaAQ9qwA1CIFDSiIAYUoiACAVaJk07AAWaP4yGAA1CIFCKgRDSmQAYUpkAHBoAP8AAAAg FWiZNOwAFmj+MhgANQiBQioGQ0osAGFKLABwaP8AAAAAIBVomTTsABZo/jIYADUIgUIqAkNKCgBh SgoAcGgAAP8AABcVaNMQSwAWaP4yGAA1CIFDSigAYUooACAVaJk07AAWaP4yGAA1CIFCKgVDSigA YUooAHBo/wD/AAAgFWiZNOwAFmj+MhgANQiBQioFQ0oCAGFKAgBwaP8A/wAckgoCAJQKAgCoCgIA qgoCAKwKAgCuCgIA1goCAOgKAgBgCwIAYgsCAIwLAgCOCwIAkAsCAJYLAgCYCwIApAsCAKYLAgCo CwIAqgsCANYLAgDYCwIA9gsCACAMAgA0DAIANgwCAGAMAgBiDAIAZAwCAGgMAgBuDAIAcAwCAK4M AgCwDAIAuAwCAAQNAgAGDQIALg0CADANAgD16ubf5tTM5sjmwbXmqaGZoY6De+Z05sjmcMG15mdf e1/myOZwAA4WaO8xbgBDShwAYUocAAARFmjvMW4ANQiBQ0ocAGFKHAAGFmjSQuQAAAwVaKRcawAW aKRcawAADhZo0kLkAENKHABhShwAABQVaHZX6wAWaKRcawBDShwAYUocAAAUFWikXGsAFmikXGsA Q0ocAGFKHAAADhZobCGoAENKHABhShwAAA4WaKRcawBDShwAYUocAAAXFWhsIagAFmikXGsANQiB Q0ocAGFKHAAXFWjXOyUAFmikXGsANQiBbUgJBHNICQQMFWgrF/gAFmikXGsAAAYWaO8xbgAADhZo /jIYAENKHABhShwAABQVaKBZIgAWaKRcawBDShwAYUocAAAMFWjXOyUAFmikXGsAAAYWaKRcawAA FBVooFkiABZopFxrAENKIABhSiAAABQVaKBZIgAWaKRcawBDSiQAYUokACWsCgIAjgsCAGQMAgAy DQIAEg4CAOYOAgCkDwIAtBACALYQAgC4EAIAuhACALwQAgC+EAIAwBACAMIQAgDEEAIAxhACAMgQ AgDKEAIALhECADARAgAyEQIANBECADYRAgBuEQIAcBECAHIRAgB0EQIA+gAAAAAAAAAAAAAAAPoA AAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAA+gAAAAAAAAAAAAAAAPoAAAAAAAAAAAAAAAD6AAAAAAAA AAAAAAAA+gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAA APIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAA AAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAA AAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADy AAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAPIAAAAAAAAAAAAAAADyAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAcAAAMkAWEkAWdkpFxrAAAEAABnZKRcawAAGzANAgAyDQIAOA0CAD4N AgBADQIAUg0CAFQNAgB2DQIAeA0CAIINAgCoDQIAvA0CAAQOAgAGDgIADg4CABAOAgASDgIAFg4C ABwOAgAeDgIAMA4CADIOAgA0DgIANg4CAFoOAgBcDgIAog4CAK4OAgDWDgIA2g4CAOIOAgDkDgIA 5g4CAOgOAgDuDgIA8A4CAEQPAgBMDwIAbA8CAIIPAgCeDwIAoA8CAKIPAgCmDwIAug8CAIwQAgCO EAIArBACAK4QAgCwEAIAshACALQQAgC2EAIAuBACALoQAgDEEAIA+e3p3dXK1cLV6b7puum6+e3p 3dXC1cLVwum66brpuvnt6d3Vwum66bq26avpp+m2urbpn5SfjAAOFmilfuUAQ0ocAGFKHAAAFBVo 7zFuABZo5X+RAENKHABhShwAAA4WaKRcawBDShwAYUocAAAGFmjecMkAABQVaKBZIgAWaKRcawBD ShwAYUocAAAGFmjtDDgAAAYWaNJC5AAABhZo7zFuAAAOFmjSQuQAQ0ocAGFKHAAAFBVoTU3IABZo 7zFuAENKHABhShwAAA4WaO8xbgBDShwAYUocAAAXFWhNTcgAFmjvMW4ANQiBQ0ocAGFKHAAGFmik XGsAABcVaNc7JQAWaKRcawA1CIFtSAkEc0gJBAwVaCsX+AAWaKRcawA3xBACAMYQAgDIEAIAyhAC AMwQAgDOEAIA+hACAPwQAgAqEQIALhECADARAgAyEQIANBECADYRAgA4EQIAQhECAEgRAgBuEQIA dBECAHgRAgB6EQIAgBECAIIRAgCEEQIAhhECAIgRAgCKEQIAjBECAPXt4tbKv8q/tO2sobTWlo6W iu2C7XdrX1NfawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcVaKBZIgAWaKRcawA1CIFDSkIA YUpCABcVaKBZIgAWaKRcawA1CIFDSiwAYUosABcVaKBZIgAWaKRcawA1CIFDShYAYUoWABQVaKBZ IgAWaKRcawBDShYAYUoWAAAOFmhjNygAQ0ocAGFKHAAABhZopFxrAAAOFmhaJnYAQ0ocAGFKHAAA FBVoSi+fABZopFxrAENKHABhShwAABQVaNJC5AAWaKV+5QBDShwAYUocAAAOFmilfuUAQ0ocAGFK HAAAFBVo0kLkABZopFxrAENKHABhShwAABQVaKRcawAWaKRcawBDShwAYUocAAAXFWikXGsAFmik XGsANQiBQ0ocAGFKHAAXFWjSQuQAFmikXGsANQiBQ0ocAGFKHAAUFWjvMW4AFmjSQuQAQ0ocAGFK HAAADhZopFxrAENKHABhShwAABQVaO8xbgAWaKV+5QBDShwAYUocABt0EQIAgBECAIIRAgCOEQIA 9wAAAAAAAAAAAAAAAO8AAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAyQBYSQB Z2RsIagAAAcAAAMkAWEkAWdkpFxrAAAHAAADJAJhJAJnZKRcawAAA4wRAgCOEQIA8wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABcVaGwhqAAWaKRcawA1CIFDShYAYUoWAAABLAAxkGgBH7CCLiCwxkEhsKUG IrBSAyOQbgQkkG4EJbAAABewxAIYsMQCDJDEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBAAAARAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQyep5+brO EYyCAKoAS6kLAgAAAAMAAADgyep5+brOEYyCAKoAS6kLUAAAAGgAdAB0AHAAcwA6AC8ALwB2AGsA LgBjAG8AbQAvAGMAbAB1AGIANwA1ADAAMQA3ADUAOQA4AAAAeViB9Dsdf0ivLIJdxIUnYwAAAACl qwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhgIRABIAAQCcAA8ABAAAAAAAAAAAAAQAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAQPH/ AgBCAAwEAAAAAAAAAAAHAB4EMQRLBEcEPQRLBDkEAAACAAAAGABDShgAX0gBBGFKGABtSBkEc0gZ BHRIGQQAAAAAAAAAAAAAAAAAAAAAAABCAEFA8v+hAEIADAUAAAAAAAAAABUAHgRBBD0EPgQyBD0E PgQ5BCAASARABDgERARCBCAAMAQxBDcEMARGBDAEAAAAAFgAaUDz/7MAWAAMBQAAAAAAAAAADwAe BDEESwRHBD0EMARPBCAAQgQwBDEEOwQ4BEYEMAQAABwAF/YDAAA01gYAAQoDbAA01gYAAQUDAABh 9gMAAAIACwAAAC4Aa0D0/8EALgAABQAAAAAAAAAACgAdBDUEQgQgAEEEPwQ4BEEEOgQwBAAAAgAA AAAAAAA6AFVAogDxADoADAQAAB9GWAAAAAsAEwQ4BD8ENQRABEEEQQRLBDsEOgQwBAAADAA+KgFC KgJwaAAA/wAsAFdAogABASwADAAAAJ09bgAAAAcAIQRCBEAEPgQzBDgEOQQAAAYANQiBXAiBAAAA AHHiAAANAABcAgAOAP////8AAAAAMAAAADEAAABQAAAAUQAAAFIAAABTAAAAXQAAAF4AAACAAAAA wwEAAK8DAADfBAAAIwUAAGIFAACGBQAAhwUAAIsFAACRBQAAvwUAAMAFAAAVBgAAeQYAAPIGAAD8 BgAACgcAAAsHAABeCAAAjAoAACkLAAAqCwAAVQsAAFYLAADHCwAARQ0AAAcQAADkFAAAjRgAAPgb AABQHwAAUR8AAFIfAABTHwAAfx8AAIAfAAAmIQAAhCIAAM4iAAAUIwAALCMAAMAkAABZJQAAciUA AKIlAAAaJgAAayYAALwmAAAPJwAANScAAFAnAACeJwAAxicAAA0oAAAfKAAAMigAANkoAADtMgAA 4DMAAB84AABJOwAAQT4AACNAAAAkQAAAJUAAACZAAABPQAAAUEAAAOhBAADrRQAAwUYAAApHAAAZ RwAAP0cAAN5HAAAxSAAAgkgAAPZIAAAuSQAAZUkAALVJAAD6SQAA7k0AAD9SAAA2VAAAUVQAAIBU AACZVAAAtFQAANVUAAAnVgAAlFgAAPZaAABqWwAAz1wAAGBdAAA9XgAAeF4AAHleAAB6XgAAe14A AKZeAACnXgAAUWEAAI5mAACaZgAAzmYAAANnAAAeZwAASGcAAJhnAADGZwAA2WcAAFNoAABhaAAA 0WoAADdrAABWbQAAb20AAGxvAAAMcQAAVnIAADF1AABOdQAA3XYAAEt3AABPegAAe3oAAEd/AAB8 gwAAMIUAAGWFAADwiQAAnosAAEeMAACDjAAAmowAALSMAADBjAAAWI8AANiTAABelQAA3ZYAAF6X AADNmAAATZkAAG+aAABUmwAAyZwAABadAADqnQAAM54AACSfAABRnwAAfp8AAPCfAAA5owAAqqYA AB2pAACBqwAAT7AAAM60AAAFtgAA4rYAAAe3AAArugAAXLoAAKC6AADfugAAKrsAAHO7AACIuwAA qrsAANG7AAD3uwAAFrwAAC6+AABXvgAAp74AAMO+AAC5wQAA68EAAFzDAACiwwAAL8QAAArFAABX xQAA88UAACrGAAB5xgAAs8YAAILLAABhzAAAnMwAADLOAAC6zgAA/84AAGfPAACBzwAAItAAAHbQ AABm0QAAZ9EAAGjRAABp0QAAn9EAAKPRAABs1QAALtcAABLdAAAy3QAAht0AAIfdAAD+3QAA/90A AGbeAABn3gAArt4AAK/eAACw3gAAsd4AALLeAACz3gAAtN4AALXeAAC23gAAt94AALjeAADk3gAA 7t4AAO/eAADw3gAA8d4AAPLeAADz3gAA/t4AAP/eAAAA3wAAcd8AANzfAABD4AAAs+AAAB3hAAB8 4QAABOIAAAXiAAAG4gAAB+IAAAjiAAAJ4gAACuIAAAviAAAM4gAADeIAAA7iAAAP4gAAQeIAAELi AABD4gAAROIAAEXiAABh4gAAYuIAAGPiAABk4gAAauIAAGviAABz4gAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA AAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAA AACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAA AIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAA gAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACA AAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAA AACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAA AIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAA gAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACA AAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAA AAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAA AAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAA AAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAA AAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAA AAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAA AAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAA AAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAA AACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAA AJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAA mAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACY AAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgA AAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAA AAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAA ADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAA MAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAw AAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAA AAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAAAAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAA AAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAmAAAAAAwAAAA AAAAAIAAAACAAAAAAAAAAAAAAJgAAAAAMAAAAAAAAACAAAAAgAAAAAAAAAAAAACYAAAAADAAAAAA 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 AAC4uwAABMUAAO7SAAA82QAAMuEAABg3AQCqPwEASEoBAOJPAQBMVgEAZF0BADplAQBacAEA5HoB AOKFAQBYjQEAmJcBAEieAQA2sgEAJrsBACrGAQDQzAEA8NMBAObZAQCS4gEAcOUBAOTrAQCS7wEA XgACAKQHAgBKCQIAHAoCAJIKAgAwDQIAxBACAIwRAgCOEQIAdgAAAHkAAAB6AAAAewAAAHwAAAB9 AAAAfwAAAIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIoAAACLAAAAjAAAAI0A AACPAAAAkAAAAJEAAACSAAAAkwAAAJUAAACWAAAAlwAAAAkBAAAKAQAACwEAAAwBAAANAQAADwEA ABABAAARAQAAEgEAABMBAAAUAQAAFQEAABcBAAAYAQAAGQEAABoBAAAbAQAAHAEAAB4BAAAfAQAA IAEAACEBAAAiAQAAIwEAACQBAAAmAQAAJwEAACgBAAAqAQAAKwEAAC0BAAAABgAAFhYAADRUAAB+ lgAATsUAAKRTAQAekwEA8NMBALoHAgCsCgIAdBECAI4RAgB3AAAAfgAAAIkAAACOAAAAlAAAAA4B AAAWAQAAHQEAACUBAAApAQAALAEAAAAGAACOEQIAeAAAAEkBAAB0AQAAkAEAAKeuAAALrwAAE68A ABivAACKrwAAla8AAHHiAAATWBT/FYQTWBT/FYwTWBT/FYz//wwAAAAJAE8ATABFAF8ATABJAE4A SwAxAAkATwBMAEUAXwBMAEkATgBLADIACQBPAEwARQBfAEwASQBOAEsAMwAJAE8ATABFAF8ATABJ AE4ASwA0AAkATwBMAEUAXwBMAEkATgBLADcACQBPAEwARQBfAEwASQBOAEsAOAAJAE8ATABFAF8A TABJAE4ASwA5AAoATwBMAEUAXwBMAEkATgBLADEAMAAKAE8ATABFAF8ATABJAE4ASwAxADEACgBP AEwARQBfAEwASQBOAEsAMQAyAAkATwBMAEUAXwBMAEkATgBLADUACQBPAEwARQBfAEwASQBOAEsA NgAxJAAAMSQAADEkAAAxJAAAxHAAAMRwAADEcAAAxHAAABpzAAAacwAA3XYAAN12AABz4gAAAAAA AAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAAMiQAADIkAAAyJAAA MiQAAMVwAADFcAAAxXAAAMVwAAAbcwAAG3MAAPR2AAD0dgAAc+IAAAAAAADkAAAA9AAAAEEBAABD AQAAAgMAAAQDAADwBQAAAAYAAEkKAABUCgAAJg4AADEOAACCEQAAhhEAAIkRAACOEQAAPBMAAEQT AADNEwAA1RMAAK8WAAC/FgAAphcAAKsXAADFGAAAyhgAAHsaAAB+GgAAfxoAAIIaAAC9JgAAviYA AOMmAADoJgAAZyoAAHAqAAByKgAAeyoAAKkqAACzKgAAkCsAAJorAAC5LAAAxSwAAAo5AAAWOQAA GDkAACI5AABzOgAAeDoAAII6AACHOgAA4ToAAPE6AABYUAAAZ1AAADtUAABEVAAAVlQAAGNUAABk VAAAaFQAAGpUAAB4VAAAeVQAAH5UAACFVAAAjVQAAI9UAACXVAAAnlQAAKdUAACpVAAAslQAALlU AADAVAAAx1QAAM5UAADPVAAA01QAANpUAADvVAAA1FgAAOJYAACPWQAAnVkAAGNaAABxWgAATlsA AFxbAABqWwAAa1sAABBiAAAeYgAARGwAAEhsAABObQAAVG0AACxvAAA3bwAAlHAAAJ5wAAAVdgAA HnYAAJx3AACldwAAs3cAAL53AADufAAA+HwAAKN/AACyfwAA84AAAP6AAADJhAAAzIQAAMiRAADW kQAA7pIAAP2SAABrlAAAdJQAAP2aAAAJmwAApZsAAK+bAAA6ngAAQp4AAFagAABfoAAAYaAAAG+g AAC4ogAAw6IAANCiAADdogAAAqMAAAujAAAdowAAIqMAAHakAACHpAAAX6oAAGeqAAAiqwAAJqsA AMysAADUrAAAkK4AAJiuAAAMrwAAE68AAKSvAACsrwAAYrIAAG+yAAAntgAANLYAAPi5AAAEugAA BccAABLHAACSyQAAnskAAMDMAADMzAAA3MwAAOTMAADXzgAA5M4AAKjPAAC0zwAAjNIAAJnSAAAK 2gAAGNoAAHPiAAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwA BwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAH ABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcA HAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAcAAcAHAAHABwABwAc AAcAHAAHABwABwAcAAcAHAAHABwABwAAAAAA5wAAAOkAAACKAgAAjAIAAOsCAADtAgAAOwMAAK4D AADzBQAA9QUAAJUGAACbBgAAXAcAAGEHAAApCgAAKgoAALUKAAC3CgAALwsAAFQLAABhCwAAYwsA AGAMAABjDAAAGw0AAB0NAABgDQAAYg0AAP0NAAD/DQAAnxAAAKEQAADiEAAA5BAAAK4RAACwEQAA 4hIAAOQSAAAfFAAAJBQAAKwWAACuFgAANRcAADcXAACqFwAArBcAANUYAADWGAAAlBkAAJYZAAC3 GgAAuRoAAJMbAACVGwAA4RwAAOMcAABYHwAAfh8AAPkiAAD7IgAA0yUAANUlAADhJgAA4yYAAJ4n AACgJwAA5ycAAOknAAD1KAAA0yoAADosAAA8LAAATy4AAFkuAAAXMAAAHDAAAGcxAABrMQAAVjIA AFgyAACWNAAA1jQAAI01AACPNQAAIjgAACQ4AAC/OAAAwTgAAF06AABnOgAALTwAAC88AADsPgAA 7j4AACtAAABOQAAAbEEAAG5BAAA7QgAAPUIAAB9DAAAtQwAAfUMAAH9DAABRRAAA6kUAAHJGAAB0 RgAAxEYAANNGAAAJSAAAEEgAAAdJAAAJSQAAEEoAANRKAAAaUQAAHFEAAPlRAAD7UQAAw1IAAMVS AADlUwAA51MAAGRYAABwWAAAxlgAAMhYAAAkWgAAJloAAC9bAAAxWwAASF4AAEpeAACAXgAApV4A ACVfAAAuXwAAxl8AAMhfAACnZwAAtmcAAFNpAABVaQAALmsAADBrAAB0awAAdmsAAFRsAABgbAAA KG0AADBtAABdbwAAX28AAIxvAACObwAA53IAAOlyAAAddAAAH3QAAIZ0AACIdAAAEHcAABl3AACu dwAAsHcAAEZ4AABIeAAAoHoAAKd6AAApfAAAK3wAAJV9AACffQAAZn4AAEZ/AAC3gQAAuYEAAEGF AABQhQAAJYkAACeJAADJiQAAy4kAAMKKAADEigAAB4wAAAmMAAA3jAAAP4wAACiPAAAqjwAAvY8A AL+PAADikQAA0JMAAMqUAADWlAAAyZUAAMuVAABRlwAAU5cAAHCYAABymAAAUJoAAFKaAAAonAAA KpwAAEGeAABDngAAL58AADGfAACmnwAAqJ8AAF+gAABhoAAAwqIAAMSiAADKowAAzKMAALWnAAC3 pwAANaoAADeqAACSqgAAlKoAAL6sAADArAAAjK4AAI6uAADCsAAAxLAAAGOzAADNtAAAvbYAAL+2 AAAJuwAAC7sAADC7AAAyuwAAeb0AAOC9AAAswAAALsAAAHrDAACBwwAAucQAALvEAAArxgAAeMYA AFvIAABdyAAAUskAAFTJAAAlygAAJ8oAAIfKAACJygAA3soAAODKAABMywAAZ8sAAJnMAACbzAAA nMwAADHOAAAf0AAAIdAAAHPQAAB10AAAY9EAAGXRAABu0QAAhdEAABrSAAAf0gAAxtIAAMjSAAAt 0wAAMtMAADfUAAA81AAAddYAAHfWAABh3QAAZt0AAPndAAD73QAAX94AAGHeAACl3gAAp94AAHHf AACW3wAA3N8AAALgAABD4AAAZuAAALPgAADY4AAAHeEAADThAAA+4gAAQOIAAHPiAAAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHADMABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAzAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAMwAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAzAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcA GgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAa AAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAHABoA BwAaAAcAGgAHABoABwAaAAcAGgAHABoABwAzAAcAGgAHABoABwAaAAcAGgAHABoABwAaAAcAGgAH ABoABwAaAAcAMwAHADMABwAzAAcAMwAHADMABwAaAAcAAAAAAJMBAADEAQAAhwUAAJEFAAAqCwAA PAsAAEIMAAByDAAAlBAAAMwQAAAQFwAAThcAAFMfAABoHwAADycAADQnAACeJwAAxycAAB8oAAAx KAAA4DMAAAk0AAArQAAAO0AAAApHAAAZRwAAmVQAALZUAACRXgAAql4AAHdmAACNZgAAVmgAAGBo AABZbQAAbm0AAFJ6AABxegAAXIMAAH+DAAAwhQAAUoUAAIGLAAChiwAAMYwAAEiMAACEjAAAwIwA AJCkAACvpAAADroAACy6AACIuwAA07sAAKq+AADCvgAAw8cAAO/HAABizAAAZMwAAGfPAACAzwAA n9EAAKLRAAA21QAAbdUAAPDdAACw3gAAuN4AAPPeAAB+3wAA2t8AAOzfAABB4AAAU+AAALHgAADE 4AAAG+EAAHnhAAAP4gAAZOIAAHDiAABz4gAABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcA BQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAF AAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUABwAFAAcABQAHAAUA BwAFAAcABQAHAAUABwAFAAcABQAHAAAAAABz4gAABwCaAwAABAAAAAgAAADlAAAAAAAAAJkDAACC JgAA3noAAKUiAQDtKwEAKk8BAA1vAQAKfQEAPBoCABkPAwBHEQMAYCwDACA0AwDnUwMAPFgDAMVe AwDGFgQA2B8EAEogBADHSQQAEGkEABxzBABuGQUAejMFAGN2BQBxDAYAdCgGAHJJBgDSUQYApnYH ALstCAArRAgAm2MIAGBqCAA6bQgAzXgIAFAICQBgDgkAoisJAGZiCQAyMgoAUXsKAMZPCwBpegsA 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 qDTMANpKzAAzWM0ApHPNAKwQzgCdXM4Acl/OADYDzwAnGM8AxEzPAF50zwC5AtAAgwzQAFgi0AC6 ItAAxVTQAAcq0QD8N9EAYUvRAE9f0QBab9EAZzrSAPRb0gCHaNIASgDTAOwQ0wDJItQAfynUAIhM 1ACvBNUAsTfVAIlJ1QCpUdUAZlvVAIB91QBONtYA/CbXALtB1wAtHtgA9kbYAL4A2QCsM9kAoQja AEcU2gATJ9oA6iraACMK2wAcEdsAfi/bADRC2wDGbtsAUnLbACYL3ADDO9wA91zcABAK3QBcMN0A kEbdADNZ3QBpYd0AYHbdALUc3gAkId4AIiTeALsu3gDXNd4ASDbeAOtl3gBPJd8AYWvfADdv3wBe B+AAmy3gAGU74AAffuAAwwThAAAJ4QBrQ+EA1EvhABhO4QCAeeEAcQjiAFde4gC6YuIAqmfiAIRr 4gAKLOMAHU/jAFJf4wB7DOQA7y/kANJC5AAHROQATXfkAO0D5QACCOUA5hrlAJQh5QAcbuUA9XDl AKV+5QBjAuYALw/mAIog5wDfK+cAcDHnAFon6ABYPugA/k7oABRY6ACza+gAaHnoACgd6QAOQOkA ggPqABFH6gDkBOsAViTrAJdD6wB2V+sAKmzrADx56wC8I+wA0FTsAHJ67ABUfOwAvwXtAD0l7QDQ Ne0A+kTtAIRm7QDpfO0AAxzuAEMy7gBlPu8ATl/vAG0H8ABDGfAAlSXwAOIv8AARd/AAGi/xAM1E 8QCUc/EAmwfyAKAL8gAlbvIAjX/yAN0O8wDLJvMA9TPzALhD8wAIe/MAi37zAGl/8wAHCvQAoDD0 AGRV9ABdevQATS31AP1Q9QDiC/YAIA72AKQ29gA3a/YAxHf2AAR79gCvYPcAjnb3APE1+ABEPPgA Z3D5AFsG+gCDIvoANAz7AKIP+wBkJfsABC77AH07+wA7HPwAsFX8AEZu/ABNc/wAiHP8AEEh/QC1 aP0AFDX+AJY1/gDqW/4ALWL+ACcE/wCHEP8AUST/AIVF/wAfe/8A/0ADgAEALwAAAC8AAABQP9YC TgJOAi8AAAAAAAAALwAAAAAAAAACTAAAAAAAAAAAAwAAAAYAAAAHAAAAWQAAqnEAAHHiAADQAAAI AAAAANAAAA4AAAAA0AAAFAAAAADQAAAWAAAAANAAALoAAAAA0AAAMAEAAAD//wEAAAAHAFUAbgBr AG4AbwB3AG4A//8BAAgAAAAAAAAAAAAAAP//AQAAAAAA//8AAAIA//8AAAAA//8AAAIA//8AAAAA BAAAAEcWkAHMAAICBgMFBAUCAwT/OgDgQXgAwAkAAAAAAAAA/wEAAAAAAABUAGkAbQBlAHMAIABO AGUAdwAgAFIAbwBtAGEAbgAAADUWkAECAAUFAQIBBwYCBQcAAAAAAAAAEAAAAAAAAAAAAAAAgAAA AABTAHkAbQBiAG8AbAAAADMmkAHMAAILBgQCAgICAgT/OgDgQ3gAwAkAAAAAAAAA/wEAAAAAAABB AHIAaQBhAGwAAAA7JpABzAACCwYEAgICAgIE/zoA4EN4AMAJAAAAAAAAAP8BAAAAAAAAQQByAGkA YQBsACAAQwBZAFIAAAAiAAQAcQiIGADwxAIAAGgBAAAAAJMsNwc0MDcnAAAAABcAOwEAAMwhAACl wAAAAQBzAAAABAADEJoBAADMIQAApcAAAAEAcwAAAJoBAAAAAAAAIQMA8BAAAAABAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAApQZuBLQAtACBgTI0AAAAAAAAAAAAAAAAAAD+4QAA/uEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAA AAAAAAAJMoNRAPAQAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhQAAAAACjw/w8BAAE/ AADjBAAA////f////3////9/////f////3////9/////f3ZX6wAAAAAAMgAAAAAAAAAAAAAAAAAA AAAA//8SAAAAAAAAABUAGwQ1BDMEMAQ7BDgENwQwBEYEOARPBCAAPAQ+BD0EPgQ/BD4EOwQ4BDkE AAAAAAAACABQAG8AcwBlAGkAZABvAG4AAgBnAGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAA AAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAABsAQAAEAAAAAEAAACIAAAAAgAAAJAA AAADAAAAsAAAAAQAAAC8AAAABQAAANAAAAAHAAAA3AAAAAgAAADwAAAACQAAAPwAAAASAAAACAEA AAoAAAAoAQAADAAAADQBAAANAAAAQAEAAA4AAABMAQAADwAAAFQBAAAQAAAAXAEAABMAAABkAQAA AgAAAOMEAAAeAAAAGAAAAMvl4+Dr6Ofg9uj/IOzu7e7v7uvo6QAAAB4AAAAEAAAAAAAAAB4AAAAM AAAAUG9zZWlkb24AAAAAHgAAAAQAAAAAAAAAHgAAAAwAAABOb3JtYWwuZG90AAAeAAAABAAAAGdm AAAeAAAABAAAADIzAAAeAAAAGAAAAE1pY3Jvc29mdCBPZmZpY2UgV29yZAAAAEAAAAAAIkcBLAAA AEAAAAAAImGJLbfQAUAAAAAAmCdwZLfQAQMAAAABAAAAAwAAAMwhAAADAAAApcAAAAMAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAYBAgAAAAAAAAAAAAAAAAAA AAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rkQBAAAAAQAADAAAAAEA AABoAAAADwAAAHAAAAAFAAAAfAAAAAYAAACEAAAAEQAAAIwAAAAXAAAAlAAAAAsAAACcAAAAEAAA AKQAAAATAAAArAAAABYAAAC0AAAADQAAALwAAAAMAAAA3gAAAAIAAADjBAAAHgAAAAQAAAAAAAAA AwAAAJoBAAADAAAAcwAAAAMAAAD+4QAAAwAAAOYVCwALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAL AAAAAAAAAB4QAAABAAAAFgAAAMvl4+Dr6Ofg9uj/IOzu7e7v7uvo6QAMEAAAAgAAAB4AAAAJAAAA zeDn4uDt6OUAAwAAAAEAAAAAYAIAAAMAAAAAAAAAIAAAAAEAAAA4AAAAAgAAAEAAAAABAAAAAgAA AAwAAABfUElEX0hMSU5LUwACAAAA4wQAAEEAAAAYAgAAEgAAAAMAAABMAB4AAwAAAAYAAAADAAAA AAAAAAMAAAAFAAAAHwAAAFUAAABoAHQAdABwAHMAOgAvAC8AcgB1AC4AdwBpAGsAaQBwAGUAZABp AGEALgBvAHIAZwAvAHcAaQBrAGkALwAlAEQAMAAlAEEAMgAlAEQAMAAlAEIANQAlAEQAMQAlADgA MAAlAEQAMQAlADgAMAAlAEQAMAAlAEIARQAlAEQAMQAlADgAMAAlAEQAMAAlAEIAOAAlAEQAMQAl ADgAMQAlAEQAMQAlADgAMgAAAAAAHwAAAAEAAAAAABcLAwAAAEwAHQADAAAAAwAAAAMAAAAAAAAA AwAAAAUAAAAfAAAASQAAAGgAdAB0AHAAcwA6AC8ALwByAHUALgB3AGkAawBpAHAAZQBkAGkAYQAu AG8AcgBnAC8AdwBpAGsAaQAvACUARAAwACUAQQAyACUARAAwACUAQgA4ACUARAAxACUAOAAyACUA RAAxACUAOAAzACUARAAxACUAOAA4ACUARAAwACUAQgBBACUARAAwACUAQgA4AAAAAAAfAAAAAQAA AAAAFwsDAAAAZwBrAAMAAAAAAAAAAwAAAAAAAAADAAAABQAAAB8AAAAcAAAAaAB0AHQAcABzADoA LwAvAHYAawAuAGMAbwBtAC8AYwBsAHUAYgA3ADUAMAAxADcANQA5ADgAAAAfAAAAAQAAAAAAFwsA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAI AAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYA AAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAA ACUAAAAmAAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAA MwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA7AAAAPAAAAD0AAAA+AAAAPwAAAEAAAABB AAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAE8A AABQAAAAUQAAAFIAAABTAAAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAFsAAABcAAAAXQAA AF4AAABfAAAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAA bAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6 AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgA AACJAAAAigAAAIsAAACMAAAAjQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAA AJcAAACYAAAAmQAAAJoAAACbAAAAnAAAAJ0AAACeAAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAA pQAAAKYAAACnAAAAqAAAAKkAAACqAAAAqwAAAKwAAACtAAAArgAAAK8AAACwAAAAsQAAALIAAACz AAAAtAAAALUAAAC2AAAAtwAAALgAAAC5AAAAugAAALsAAAC8AAAAvQAAAL4AAAC/AAAAwAAAAMEA AADCAAAAwwAAAMQAAADFAAAAxgAAAMcAAADIAAAAyQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAA ANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADXAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA 3gAAAN8AAADgAAAA4QAAAOIAAADjAAAA5AAAAOUAAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADs AAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPcAAAD4AAAA+QAAAPoA AAD7AAAA/AAAAP0AAAD+AAAA/wAAAAABAAABAQAAAgEAAAMBAAAEAQAABQEAAAYBAAAHAQAACAEA AAkBAAAKAQAACwEAAAwBAAANAQAADgEAAA8BAAAQAQAAEQEAABIBAAATAQAAFAEAABUBAAAWAQAA FwEAABgBAAAZAQAAGgEAABsBAAAcAQAAHQEAAB4BAAAfAQAAIAEAACEBAAAiAQAAIwEAACQBAAAl AQAAJgEAACcBAAAoAQAAKQEAACoBAAArAQAALAEAAC0BAAAuAQAA/v///zABAAAxAQAAMgEAADMB AAA0AQAANQEAADYBAAD+////OAEAADkBAAA6AQAAOwEAADwBAAA9AQAAPgEAAD8BAABAAQAAQQEA AEIBAABDAQAARAEAAEUBAABGAQAARwEAAEgBAABJAQAASgEAAEsBAABMAQAATQEAAE4BAABPAQAA UAEAAFEBAABSAQAAUwEAAFQBAABVAQAAVgEAAFcBAABYAQAAWQEAAFoBAABbAQAAXAEAAF0BAABe AQAAXwEAAGABAABhAQAA/v///2MBAABkAQAAZQEAAGYBAABnAQAAaAEAAGkBAAD+////awEAAGwB AABtAQAAbgEAAG8BAABwAQAAcQEAAP7////9/////f////3///92AQAA/v////7////+//////// /////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUB//////////8DAAAABgkCAAAAAADA AAAAAAAARgAAAAAAAAAAAAAAADCvvpFkt9ABeAEAAIAAAAAAAAAARABhAHQAYQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAgH///////// //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAQAAABAAAAAAAAAxAFQA YQBiAGwAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAADgACAQEAAAAGAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcB AABbVQAAAAAAAFcAbwByAGQARABvAGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAaAAIBAgAAAAUAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC5cAgAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABp AG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgH///////////////8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiAQAAABAAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABT AHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAOAACAQQAAAD///// /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoBAAAAEAAAAAAAAAEAQwBv AG0AcABPAGIAagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAASAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/v////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////wEA/v8DCgAA/////wYJAgAAAAAAwAAAAAAAAEYfAAAAxO7q 8+zl7fIgTWljcm9zb2Z0IE9mZmljZSBXb3JkAAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1l bnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA ------=_NextPart_000_1FCA_01D0CE5D.9B270350-- From david@fromorbit.com Mon Aug 3 19:23:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 12E597F5A for ; Mon, 3 Aug 2015 19:23:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F3FF08F804B for ; Mon, 3 Aug 2015 17:23:27 -0700 (PDT) X-ASG-Debug-ID: 1438647802-04cb6c67402aa8b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id FvyyxbiHz6drd82b for ; Mon, 03 Aug 2015 17:23:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DbBgAyBcBV/20mLHlbgxojMWmCVaZRDAEBAQEBAQaKMIppBoV3BIE6TQEBAQEBAYELhFEvOyQMKAUlAzSILaUipj4ZhgaJal+CJAxBgTEFhxmFNIgshHuHT4FJRoZuhQeDJYghJoFKCwEBATUBHIFlLDGBBgEeB4EgAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Aug 2015 09:53:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMQ0a-0002LQ-9b for xfs@oss.sgi.com; Tue, 04 Aug 2015 10:23:08 +1000 Date: Tue, 4 Aug 2015 10:23:08 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: Release v4.2.0-rc1 Message-ID: <20150804002308.GX3902@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: Release v4.2.0-rc1 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="eJnRUKwClWJh1Khz" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438647802 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21323 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --eJnRUKwClWJh1Khz Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev= =2Egit has just been updated. Both the master branch and the for-next branch have been updated with all the pending work for a new release, and as such I've tagged it as an -rc1 release point. As nobody has commented on requests for bikeshedding about release numbering to reflect the changes I want to make to release cycles and libxfs updates, I've made an executive decision to make the release reflect the version of the libxfs/ code in the source tree. This means that major/minor release numbers will now follow the kernel release numbers. As such, this commits us to a release cadence similar to the kernel code and this release introduces tools to help us keep the userspace libxfs code up to date with the kernel changes. Because I expect some reaction to this, I haven't pushed this update to the "official" repository at git://oss.sgi.com/xfs/cmds/xfsprogs so that if people violently disagree with the release numbering I don't have to rebase the master branch there. I'll update this tree when the release numbering is set in concrete. There is a lot of change in this pre-release, and there are some potential pending changes that may also make the final release: - more OS X build changes - fixes for debian ppc64el build issues - bug fixes for whatever issues are found in wider testing And so speaking of testing, there are still a couple of issues I'm seeing that I haven't yet resolved: - xfs/003 appears to randomly fail on 1k block size - xfs/053 is still failing Any testing that people can do would be appreciated, whether it be build testing (as there's plenty of build infrastructure changes in this update) or runtime testing. Keep in mind that if you update an existing repo you will need to do a 'make realclean' first before trying to build the current tree, otherwise it will throw errors all over the place. Similarly,if you are jumping between a 3.2.4 and a 4.2.0-rc1 tree via checkouts, you should do a make realclean before the checkout that changes the version to ensure that the next build is clean. The new head of the master branch is commit: 7d8b708 xfsprogs: Release v4.2.0-rc1 New Commits: Brian Foster (40): [01792d3] xfs: create individual inode alloc. helper [f6580bc] xfs: update free inode record logic to support sparse inode= records [ff3263d] xfs: support min/max agbno args in block allocator [6bd8b7e] xfs: add sparse inode chunk alignment superblock field [62dc6cd] xfs: use sparse chunk alignment for min. inode allocation r= equirement [7f5cd45] xfs: sparse inode chunks feature helpers and mount requirem= ents [5f90a19] xfs: add fs geometry bit for sparse inode chunks [11640e3] xfs: introduce inode record hole mask for sparse inode chun= ks [fe8d48a] xfs: pass inode count through ordered icreate log item [2cf8771] xfs: helper to convert holemask to inode alloc. bitmap [6f4c54a] xfs: allocate sparse inode chunks on full chunk allocation = failure [c9005f4] xfs: randomly do sparse inode allocations in DEBUG mode [fa58183] xfs: filter out sparse regions from individual inode alloca= tion [7338c4b] xfs: only free allocated regions of inode chunks [5a3b2e0] xfs: skip unallocated regions of inode chunks in xfs_ifree_= cluster() [f895847] xfs: enable sparse inode chunks for v5 superblocks [6003fd8] mkfs: sparse inode chunk support [061e316] db: support sparse inode chunk inobt record and sb fields [b8db017] db: show sparse inodes feature state in version command out= put [48b7e37] growfs: display sparse inode status from xfs_info [aa6ce1f] repair: handle sparse format inobt record freecount correct= ly [37246b9] repair: remove duplicate field from aghdr_cnts [85ed3bc] repair: use ir_count for filesystems with sparse inode supp= ort [c749bd5] repair: scan and track sparse inode chunks correctly [3f05cea] repair: scan sparse finobt records correctly [4a7d321] repair: validate ir_count field for sparse format records [3e62b2c] repair: process sparse inode records correctly [c77c41e] repair: factor out sparse inodes from finobt reconstruction [824b581] repair: do not account sparse inodes in phase 5 cursor init. [c9dae79] repair: reconstruct sparse inode records correctly on disk [870b18f] repair: do not prefetch holes in sparse inode chunks [90c9ac9] repair: handle sparse inode alignment [9180183] metadump: reorder inode record sanity checks and inode buff= er read [04b21e4] metadump: support sparse inode records [ac9a3f7] repair: access helpers for on-disk inobt record freecount [2245818] repair: helper for inode chunk alignment and start/end ino = number verification [411c5e5] repair: helper to import on-disk inobt records to in-core t= rees [618ba57] repair: helper to transition inode blocks to inode state [23fc058] xfs: always log the inode on unwritten extent conversion [0d995d0] xfs: check min blks for random debug mode sparse allocations Christoph Hellwig (23): [d262295] libxfs: switch the remaining xfs_trans_dup user to xfs_tran= s_roll [7bcb840] libxfs: simplify xfs_trans_free_items [3d7434f] libxfs: remove the flags argument to xfs_trans_cancel [de5a3f4] xfs: saner xfs_trans_commit interface [0c2a7d4] xfsprogs: remove register keywords [ee6cd73] xfsprogs: remove __psint_t and __psunsigned_t [ccd6890] xfsprogs: remove the unused inst_t typedef [ca50065] xfsprogs: remove the uint_t typedef [0221169] xfsprogs: remove the uchar_t typedef [5d9edea] xfsprogs: remove boolean_t typedef [34a1c91] xfsprogs: remove non-Linux defintions for loff_t [d60ba95] xfsprogs: remove xfs_caddr_t [92acb89] xfs: return a void pointer from xfs_buf_offset [61e2fa7] xfsprogs: don't install internal header files [a2942ca] xfsprogs: remove unused macros from xfs_arch.h [cd36c33] xfsprogs: remove swab.h [77d9870] xfsprogs: only install *format.h headers in install-qa [5711848] xfsprogs: remove install-qa target [f8d9433] xfsprogs: use <>-style includes in installed headers [6b803e5] xfsprogs: simplify internal includes [1e6bc37] xfsprogs: move __be*/__le* types and __arch_pack to xfs_arc= h.h [24842c5] xfsprogs: move __u*/__s* typedefs to per-port headers [dcabd4e] xfsprogs: don't install platform_defs.h Dave Chinner (39): [f616e2b] libxfs: do all xfs->libxfs defines inside libxfs/ [5f6f366] xfs: kill unsupported superblock versions [ff105f7] libxfs: update to 3.16 kernel code [af43ca9] xfs: return is not a function [1e68581] xfs: Nuke XFS_ERROR macro [12b5319] libxfs: error negation rework [636b4d9] libxfs: restructure to match kernel layout [5a35bf2] libxfs: update to match 3.19-rc1 kernel code [19ebedc] libxfs: update to 4.1-rc2 code base [b626fb5] libxfs: directly include libxfs headers [9c79982] libxfs: disambiguate xfs.h [e515cca] libxfs: split out xfs->libxfs mappings [4071f72] libxfs: add xfs_bit.c [cebd391] xfsprogs: build fails to find platform_defs.h [337d9a2] build: populate include/xfs before building [5bb5f5d] libxfs-apply: CLI should specify source of commits [b08338d] progs: clean up libxfs.h includes [8fa16d6] libxfs-apply: allow commit range specification [e708d0f] progs: clean up libxlog.h includes [0ee451f] libxfs-apply: reduce output verbosity [897853d] progs: clean up all remaining xfs*h includes [a580497] libxfs-apply: auto-name patches for guilt [db60c38] libxfs-apply: ensure guilt import retains commit messages [7cc23f0] xfs: extent size hints can round up extents past MAXEXTLEN [a37f46d] xfs: xfs_attr_inactive leaves inconsistent attr fork state = behind [72bda06] xfs: xfs_alloc_fix_freelist() can use incore perag structur= es [5515b7c] xfs: factor out free space extent length check [4f86468] Merge branch 'progs-misc-fixes-1' into for-next [c98e644] xfs: sanitise error handling in xfs_alloc_fix_freelist [de04664] xfs: clean up XFS_MIN_FREELIST macros [36afcc3] Merge branch 'libxfs-4.2-rc1-update' into for-next [d530478] Merge branch 'progs-cleanup' into for-next [03b2805] Merge branch 'libxfs-commit-script' into for-next [7af0c6c] build: create include/xfs before installing headers [641842c] Merge branch 'progs-header-cleanup' into for-next [f31982a] repair: use sb_meta_uuid for checking of metadata headers [299c038] libxfs: fix uuid check durign inode allocation [92592be] Merge branch 'progs-misc-fixes-2' into for-next [7d8b708] xfsprogs: Release v4.2.0-rc1 Eric Sandeen (11): [aefc06c] libxfs: silence unused var warnings [b75ef5e] build: install PKGHFILES in install-dev [ae51960] libxlog: remove unused write-only var l_logsize [c63ce10] xfs_copy: fix copy of hard 4k devices [20cec86] mkfs.xfs: always use underlying fs sector size when mkfs'in= g a file [c40f279] xfs_repair: refuse to unset lazycount on V5 filesystems [76de6bb] xfs_repair: automatically enable -f (file) mode when needed [1f2d2b9] tools: libxfs kernel sync script [9c4e12f] xfsprogs: Add new sb_meta_uuid field, update userspace tool= s to manipulate it [a1b2cb5] xfs_copy: fix up initial sb buffer read on CRC fs [8d8a27c] xfs_repair: Fix malloc size of rt_ext_tree_ptr George Wang (1): [cbf3bea] xfs: use percpu_counter_read_positive for mp->m_icount Jan Tulak (4): [2a3a494] xfsprogs: blkid is now mandatory [1473570] xfsprogs: Search path for utilities unified [dd30c0a] xfsprogs: Don't Make .po files with gettext disabled [5d87ed9] xfsprogs: Use glibtoolize on osx Mike Grant (1): [90dd831] xfs_repair: include any realloc'ed buffers in final putbuf Theodore Ts'o (5): [c9a9018] xfsprogs: define NBBY if not defined by the system header f= iles [b9bc59c] xfsprogs: pull in libgen.h to get prototype for basename() [e14913c] xfsprogs: define and use BUILD_CC in configure.ac for cross= compilation [58d0d84] xfsprogs: avoid use of si_tid in struct xlog_split_item [919dbc7] xfsprogs: use "unsigned short" instead of ushort Code Diffstat: Makefile | 48 +- VERSION | 4 +- configure.ac | 19 +- copy/xfs_copy.c | 65 +- db/addr.c | 2 +- db/agf.c | 2 +- db/agfl.c | 2 +- db/agi.c | 2 +- db/attr.c | 4 +- db/attrset.c | 2 +- db/attrshort.c | 2 +- db/bit.c | 10 +- db/block.c | 18 +- db/bmap.c | 49 +- db/bmap.h | 12 +- db/bmroot.c | 6 +- db/btblock.c | 46 +- db/btblock.h | 3 + db/check.c | 253 +++--- db/command.c | 2 +- db/convert.c | 2 +- db/debug.c | 2 +- db/dir2.c | 70 +- db/dir2sf.c | 10 +- db/dquot.c | 2 +- db/echo.c | 2 +- db/faddr.c | 74 +- db/field.c | 24 +- db/field.h | 8 +- db/flist.c | 2 +- db/fprint.c | 2 +- db/frag.c | 12 +- db/freesp.c | 2 +- db/hash.c | 4 +- db/help.c | 2 +- db/init.c | 6 +- db/inode.c | 3 +- db/input.c | 2 +- db/io.c | 14 +- db/malloc.c | 2 +- db/metadump.c | 213 +++-- db/output.c | 2 +- db/print.c | 2 +- db/quit.c | 2 +- db/sb.c | 87 +- db/sig.c | 2 +- db/strvec.c | 2 +- db/symlink.c | 2 +- db/text.c | 2 +- db/type.c | 42 +- db/type.h | 1 + db/write.c | 2 +- debian/rules | 6 +- doc/CHANGES | 14 + estimate/xfs_estimate.c | 2 +- fsr/xfs_fsr.c | 13 +- growfs/xfs_growfs.c | 17 +- include/Makefile | 74 +- include/bitops.h | 6 + include/builddefs.in | 5 +- include/buildrules | 19 +- include/darwin.h | 15 +- include/dvh.h | 177 ---- include/freebsd.h | 17 +- include/fstyp.h | 43 - include/gnukfreebsd.h | 18 +- include/input.h | 2 +- include/irix.h | 21 +- include/libxfs.h | 776 +++-------------- include/libxlog.h | 17 +- include/linux.h | 13 +- include/path.h | 2 +- include/platform_defs.h.in | 105 +-- include/project.h | 3 +- include/swab.h | 194 ----- include/volume.h | 52 -- include/xfs.h | 28 +- include/xfs_ag.h | 279 ------ include/xfs_arch.h | 280 ++++-- include/xfs_dinode.h | 243 ------ include/xfs_dir2.h | 111 --- include/xfs_format.h | 454 ---------- include/xfs_inode.h | 106 +++ include/xfs_inum.h | 64 -- include/xfs_log_recover.h | 2 +- include/xfs_mount.h | 149 ++++ include/xfs_sb.h | 712 --------------- include/xfs_trace.h | 16 +- include/xfs_trans.h | 147 ++++ io/attr.c | 5 +- io/bmap.c | 4 +- io/fadvise.c | 5 +- io/fiemap.c | 4 +- io/file.c | 5 +- io/freeze.c | 5 +- io/fsync.c | 4 +- io/getrusage.c | 5 +- io/imap.c | 5 +- io/init.c | 6 +- io/inject.c | 5 +- io/io.h | 2 + io/link.c | 5 +- io/madvise.c | 5 +- io/mincore.c | 5 +- io/mmap.c | 5 +- io/open.c | 5 +- io/parent.c | 13 +- io/pread.c | 5 +- io/prealloc.c | 5 +- io/pwrite.c | 5 +- io/readdir.c | 5 +- io/resblks.c | 5 +- io/seek.c | 5 +- io/sendfile.c | 5 +- io/shutdown.c | 5 +- io/sync.c | 4 +- io/sync_file_range.c | 5 +- io/truncate.c | 5 +- libdisk/Makefile | 37 - libdisk/dm.c | 112 --- libdisk/drivers.c | 82 -- libdisk/drivers.h | 45 - libdisk/evms.c | 68 -- libdisk/evms.h | 32 - libdisk/fstype.c | 442 ---------- libdisk/fstype.h | 334 ------- libdisk/lvm.c | 117 --- libdisk/md.c | 119 --- libdisk/md.h | 67 -- libdisk/pttype.c | 118 --- libdisk/pttype.h | 50 -- libdisk/xvm.c | 93 -- libdisk/xvm.h | 53 -- libhandle/Makefile | 2 - libhandle/handle.c | 7 +- libhandle/jdm.c | 17 +- libxcmd/Makefile | 2 +- libxcmd/command.c | 6 +- libxcmd/help.c | 4 +- libxcmd/input.c | 4 +- libxcmd/paths.c | 6 +- libxcmd/projects.c | 2 +- libxcmd/quit.c | 4 +- libxfs/Makefile | 71 +- libxfs/cache.c | 15 +- libxfs/crc32.c | 4 +- libxfs/darwin.c | 6 +- libxfs/freebsd.c | 6 +- libxfs/init.c | 46 +- libxfs/irix.c | 6 +- libxfs/kmem.c | 2 +- libxfs/libxfs_api_defs.h | 110 +++ libxfs/libxfs_io.h | 236 +++++ libxfs/{xfs.h =3D> libxfs_priv.h} | 305 ++++--- libxfs/linux.c | 4 +- libxfs/logitem.c | 14 +- libxfs/radix-tree.c | 3 +- libxfs/rdwr.c | 41 +- libxfs/trans.c | 65 +- libxfs/util.c | 140 ++- libxfs/xfs_alloc.c | 462 ++++++---- {include =3D> libxfs}/xfs_alloc.h | 14 +- libxfs/xfs_alloc_btree.c | 101 +-- {include =3D> libxfs}/xfs_alloc_btree.h | 0 libxfs/xfs_attr.c | 479 +++++----- libxfs/xfs_attr_leaf.c | 475 ++++++---- {include =3D> libxfs}/xfs_attr_leaf.h | 13 +- libxfs/xfs_attr_remote.c | 112 ++- {include =3D> libxfs}/xfs_attr_remote.h | 0 {include =3D> libxfs}/xfs_attr_sf.h | 0 libxfs/xfs_bit.c | 118 +++ {include =3D> libxfs}/xfs_bit.h | 7 +- libxfs/xfs_bmap.c | 1179 +++++++++++++++++++------ {include =3D> libxfs}/xfs_bmap.h | 69 +- libxfs/xfs_bmap_btree.c | 228 +---- {include =3D> libxfs}/xfs_bmap_btree.h | 2 +- libxfs/xfs_btree.c | 231 +++-- {include =3D> libxfs}/xfs_btree.h | 67 +- {include =3D> libxfs}/xfs_cksum.h | 0 libxfs/xfs_da_btree.c | 513 +++++------ {include =3D> libxfs}/xfs_da_btree.h | 29 +- libxfs/xfs_da_format.c | 908 +++++++++++++++++++ {include =3D> libxfs}/xfs_da_format.h | 514 +---------- libxfs/xfs_dir2.c | 502 ++++++----- libxfs/xfs_dir2.h | 323 +++++++ libxfs/xfs_dir2_block.c | 205 ++--- libxfs/xfs_dir2_data.c | 275 +++--- libxfs/xfs_dir2_leaf.c | 436 +++++----- libxfs/xfs_dir2_node.c | 509 +++++------ libxfs/xfs_dir2_priv.h | 30 +- libxfs/xfs_dir2_sf.c | 394 +++------ libxfs/xfs_dquot_buf.c | 47 +- libxfs/xfs_format.h | 1501 ++++++++++++++++++++++++++++= ++++ {include =3D> libxfs}/xfs_fs.h | 9 +- libxfs/xfs_ialloc.c | 1117 ++++++++++++++++++------ {include =3D> libxfs}/xfs_ialloc.h | 40 +- libxfs/xfs_ialloc_btree.c | 193 ++-- {include =3D> libxfs}/xfs_ialloc_btree.h | 10 + libxfs/xfs_inode_buf.c | 78 +- {include =3D> libxfs}/xfs_inode_buf.h | 6 +- libxfs/xfs_inode_fork.c | 78 +- {include =3D> libxfs}/xfs_inode_fork.h | 3 +- {include =3D> libxfs}/xfs_log_format.h | 10 +- libxfs/xfs_log_rlimit.c | 16 +- {include =3D> libxfs}/xfs_quota_defs.h | 4 +- libxfs/xfs_rtbitmap.c | 69 +- libxfs/xfs_sb.c | 474 +++++----- libxfs/xfs_sb.h | 38 + {include =3D> libxfs}/xfs_shared.h | 39 +- libxfs/xfs_symlink_remote.c | 27 +- libxfs/xfs_trans_resv.c | 164 ++-- {include =3D> libxfs}/xfs_trans_resv.h | 8 +- {include =3D> libxfs}/xfs_trans_space.h | 9 +- {include =3D> libxfs}/xfs_types.h | 29 +- libxlog/Makefile | 2 +- libxlog/util.c | 9 +- libxlog/xfs_log_recover.c | 44 +- logprint/log_copy.c | 2 + logprint/log_dump.c | 2 + logprint/log_misc.c | 50 +- logprint/log_print_all.c | 6 +- logprint/log_print_trans.c | 2 + logprint/logprint.c | 8 +- logprint/logprint.h | 2 - m4/package_blkid.m4 | 20 +- m4/package_types.m4 | 41 - m4/package_utilies.m4 | 19 +- man/man8/mkfs.xfs.8 | 17 + man/man8/xfs_admin.8 | 11 +- man/man8/xfs_db.8 | 9 +- mdrestore/xfs_mdrestore.c | 4 +- mkfs/Makefile | 22 +- mkfs/fstyp.c | 59 -- mkfs/maxtrres.c | 5 +- mkfs/proto.c | 88 +- mkfs/xfs_mkfs.c | 220 ++--- po/de.po | 59 +- po/pl.po | 57 +- quota/edit.c | 4 +- quota/free.c | 2 +- quota/init.c | 6 +- quota/path.c | 4 +- quota/project.c | 4 +- quota/quot.c | 2 +- quota/quota.c | 2 +- quota/quota.h | 6 +- quota/report.c | 2 +- quota/state.c | 2 +- repair/agheader.c | 64 +- repair/agheader.h | 9 +- repair/attr_repair.c | 76 +- repair/attr_repair.h | 33 - repair/avl.c | 144 +-- repair/avl.h | 22 +- repair/avl64.c | 138 +-- repair/avl64.h | 6 +- repair/bmap.c | 38 +- repair/bmap.h | 20 +- repair/btree.c | 2 +- repair/dino_chunks.c | 207 +++-- repair/dinode.c | 190 ++-- repair/dinode.h | 12 +- repair/dir2.c | 169 ++-- repair/globals.c | 2 +- repair/globals.h | 14 - repair/incore.c | 8 +- repair/incore.h | 70 +- repair/incore_bmc.c | 12 +- repair/incore_ext.c | 32 +- repair/incore_ino.c | 11 +- repair/init.c | 2 +- repair/phase1.c | 10 +- repair/phase2.c | 4 +- repair/phase3.c | 2 +- repair/phase4.c | 8 +- repair/phase5.c | 81 +- repair/phase6.c | 394 +++++---- repair/phase7.c | 19 +- repair/prefetch.c | 55 +- repair/progress.c | 2 +- repair/rt.c | 16 +- repair/sb.c | 133 +-- repair/scan.c | 459 ++++++---- repair/scan.h | 12 +- repair/threads.c | 2 +- repair/versions.c | 67 +- repair/versions.h | 1 - repair/xfs_repair.c | 29 +- rtcp/xfs_rtcp.c | 4 +- tools/libxfs-apply | 284 ++++++ 290 files changed, 12324 insertions(+), 11896 deletions(-) delete mode 100644 include/dvh.h delete mode 100644 include/fstyp.h delete mode 100644 include/swab.h delete mode 100644 include/volume.h delete mode 100644 include/xfs_ag.h delete mode 100644 include/xfs_dinode.h delete mode 100644 include/xfs_dir2.h delete mode 100644 include/xfs_format.h create mode 100644 include/xfs_inode.h delete mode 100644 include/xfs_inum.h create mode 100644 include/xfs_mount.h delete mode 100644 include/xfs_sb.h create mode 100644 include/xfs_trans.h delete mode 100644 libdisk/Makefile delete mode 100644 libdisk/dm.c delete mode 100644 libdisk/drivers.c delete mode 100644 libdisk/drivers.h delete mode 100644 libdisk/evms.c delete mode 100644 libdisk/evms.h delete mode 100644 libdisk/fstype.c delete mode 100644 libdisk/fstype.h delete mode 100644 libdisk/lvm.c delete mode 100644 libdisk/md.c delete mode 100644 libdisk/md.h delete mode 100644 libdisk/pttype.c delete mode 100644 libdisk/pttype.h delete mode 100644 libdisk/xvm.c delete mode 100644 libdisk/xvm.h create mode 100644 libxfs/libxfs_api_defs.h create mode 100644 libxfs/libxfs_io.h rename libxfs/{xfs.h =3D> libxfs_priv.h} (63%) rename {include =3D> libxfs}/xfs_alloc.h (94%) rename {include =3D> libxfs}/xfs_alloc_btree.h (100%) rename {include =3D> libxfs}/xfs_attr_leaf.h (90%) rename {include =3D> libxfs}/xfs_attr_remote.h (100%) rename {include =3D> libxfs}/xfs_attr_sf.h (100%) create mode 100644 libxfs/xfs_bit.c rename {include =3D> libxfs}/xfs_bit.h (97%) rename {include =3D> libxfs}/xfs_bmap.h (72%) rename {include =3D> libxfs}/xfs_bmap_btree.h (98%) rename {include =3D> libxfs}/xfs_btree.h (91%) rename {include =3D> libxfs}/xfs_cksum.h (100%) rename {include =3D> libxfs}/xfs_da_btree.h (87%) create mode 100644 libxfs/xfs_da_format.c rename {include =3D> libxfs}/xfs_da_format.h (69%) create mode 100644 libxfs/xfs_dir2.h create mode 100644 libxfs/xfs_format.h rename {include =3D> libxfs}/xfs_fs.h (98%) rename {include =3D> libxfs}/xfs_ialloc.h (86%) rename {include =3D> libxfs}/xfs_ialloc_btree.h (86%) rename {include =3D> libxfs}/xfs_inode_buf.h (88%) rename {include =3D> libxfs}/xfs_inode_fork.h (99%) rename {include =3D> libxfs}/xfs_log_format.h (99%) rename {include =3D> libxfs}/xfs_quota_defs.h (97%) create mode 100644 libxfs/xfs_sb.h rename {include =3D> libxfs}/xfs_shared.h (91%) rename {include =3D> libxfs}/xfs_trans_resv.h (94%) rename {include =3D> libxfs}/xfs_trans_space.h (94%) rename {include =3D> libxfs}/xfs_types.h (82%) delete mode 100644 mkfs/fstyp.c create mode 100755 tools/libxfs-apply --=20 Dave Chinner david@fromorbit.com --eJnRUKwClWJh1Khz Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJVwAXrAAoJEK3oKUf0dfod+TwP/A1VOVzkaxQxFZW/ohz5T0kM Nrpa5lpJYnT/ifTB+MGqzhgKxXKoUdxbsc6kf+i8Vt2lsJPR4bg51HSJJyZ5WcSH r8bmbS/Pu1KKkK8/2HXwkmzBpQLmOlsAmUPWnL3PE3tG8FmxGUnAMLcjbdW1sR6d siOWpLUoOkRBqPabuSonDW+uSUDXYZfpVPE7p1ldt8533KQ2SK5wmTcwy+KgiGFO +KRZlz6Z7wwabpYxwiOs2E9+Wr+xLd6wiDqWJDlxQBO1UqiFZbDQSXNGko4leW+S gwi3CyJ/2y+QO9rAQjDN1HWMDeDTGXMT8DpoVfOlMZ/Ic6vZtF3A9L/WPoZyG6sn Tqs++ZL9b6kxaU1LV1obeckF1q1WalxZNuR0PeBW13PEV3DHUR0KXaraa/lSWC5Q QEbzRlK+Yn08fHlJDxPBoTGiZSs8uxMrrNgwQV0azrB6Ry/Pdqw+C1GpktIqebFY RrA+bztIC8zrivOH/PaQrdVEk+XkMTPcDITo+K+q0w8VQaQoxtCcMTC863vPSuJf ZQEUNKO5NBABqcBhWDXxeVJf+xPxNcOikWQiRKqv6psKp36UimPNVxr3W6D3pSWf /h/HSQf51sXdoJY794LnutWn+eWKwkgx/8u8E2l825uz1tLgGoUFKI10b9Mq3rmn MA38izdGeizdJWbIlp/S =RRBU -----END PGP SIGNATURE----- --eJnRUKwClWJh1Khz-- From judy@shengdongtrade.com Mon Aug 3 22:10:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=DEAR_FRIEND,HTML_FONT_FACE_BAD, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2538B7F5D for ; Mon, 3 Aug 2015 22:10:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13B8A304048 for ; Mon, 3 Aug 2015 20:10:32 -0700 (PDT) X-ASG-Debug-ID: 1438657826-04cb6c673e2ad490001-NocioJ Received: from m50-212.qiye.163.com (m50-212.qiye.163.com [123.125.50.212]) by cuda.sgi.com with ESMTP id GUTgXXVfbrcBEQ4L for ; Mon, 03 Aug 2015 20:10:27 -0700 (PDT) X-Barracuda-Envelope-From: judy@shengdongtrade.com X-Barracuda-Apparent-Source-IP: 123.125.50.212 Received: from IWOSFBO2ATQGL2O (unknown [106.117.28.155]) by smtp4 (Coremail) with SMTP id PtOowECpz0cgLcBVv8iuBA--.151S2; Tue, 04 Aug 2015 11:10:24 +0800 (CST) Date: Tue, 4 Aug 2015 11:10:25 +0800 From: "judy@shengdongtrade.com" To: xfs Reply-To: judy Subject: Re: Aluminum Ingot Disposition-Notification-To: "judy@shengdongtrade.com" X-ASG-Orig-Subj: Re: Aluminum Ingot X-Priority: 3 X-Has-Attach: no X-Mailer: Foxmail 7.0.1.92[cn] Mime-Version: 1.0 Message-ID: <2015080411102507683728@shengdongtrade.com> Content-Type: multipart/alternative; boundary="----=_001_NextPart688268167301_=----" X-CM-TRANSID:PtOowECpz0cgLcBVv8iuBA--.151S2 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUSARhUUUUU X-Originating-IP: [106.117.28.155] X-CM-SenderInfo: pmxg5qxvkh0wpgrqw3pudgvhhfrp/1tbiMgBM8VVir983tgAAsJ X-Barracuda-Connect: m50-212.qiye.163.com[123.125.50.212] X-Barracuda-Start-Time: 1438657827 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.61 X-Barracuda-Spam-Status: No, SCORE=1.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DEAR_FRIEND, HTML_FONT_FACE_BAD, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21325 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word This is a multi-part message in MIME format. ------=_001_NextPart688268167301_=---- Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 RGVhciBGcmllbmQsDQoNCkdyZWV0aW5ncyENCg0KT3VyIHByb2R1Y3QgaXMgQWx1bWluaXVtIElu Z290LExlYWQgSW5nb3QsWmluYyBJbmdvdDsNClNwZWNpZmljYXRpb246DQoxLnBhY2thZ2luZzog NTBrZy9idW5kbGUNCjIucHJvdmlkZSBGcmVlIFNhbXBsZSBmb3IgeW91ciByZWZlcmVuY2UuDQpI b3BlIHlvdSBjb3VsZCBpbnRlcmVzdGVkIGluIG91ciBwcm9kdWN0IGFuZCBkaXNjdXNzIGluIGZ1 cnRoZXIuDQoNClRoYW5rcyZSZWdhcmRzDQpBZGENCiANCkhlYmVpIFNoZW5nZG9uZyBJbXBvcnQg YW5kIEV4cG9ydCBUcmFkZSBDby4sTHRkDQoNClRlbDo4Ni0zMTEtODg5OTk1MTUNCkZheDo4Ni0z MTEtODg5OTk1MTUNCldlYnNpdGU6IHd3dy5zaGVuZ2RvbmctbWV0YWwuY29tDQpFLW1haWw6IGp1 ZHlAc2hlbmdkb25ndHJhZGUuY29tDQpTa3lwZTogamluZGFpOTk= ------=_001_NextPart688268167301_=---- Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable
= Dear=20 Friend,
 
Greetings!
 
= Our=20 product is Aluminium=20 Ingot,Lead Ingot,Zinc Ingot;
= Specification:
= 1.packaging:=20 50kg/bundle = 2.provide Free Sample for your=20 reference. = Hope=20 you could interested in our product and discuss in further. =   <= SPAN=20 style=3D"FONT-FAMILY: Tahoma; COLOR: rgb(0,0,0); FONT-SIZE: 12pt; FONT-WEI= GHT: normal">Thanks&Regards Ada  Hebei Shengdong Import and Export Trade=20 Co.,Ltd   Tel:86-311-88999515Fax:86-311-88999515<= /SPAN> Website: www.shengdong-metal.com E-mail: judy@shengdongtrade.com= Skype:=20 jindai99 =  <= /DIV> ------=_001_NextPart688268167301_=------ From sandeen@redhat.com Mon Aug 3 22:30:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CD29D7F50 for ; Mon, 3 Aug 2015 22:30:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6863FAC002 for ; Mon, 3 Aug 2015 20:30:38 -0700 (PDT) X-ASG-Debug-ID: 1438659037-04bdf06bd11e9360001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8gXwCmzhW5eHVb5H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 20:30:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 53277B66AB for ; Tue, 4 Aug 2015 03:30:37 +0000 (UTC) Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t743Uato012493 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 3 Aug 2015 23:30:37 -0400 Message-ID: <55C031DC.6050404@redhat.com> Date: Mon, 03 Aug 2015 20:30:36 -0700 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs_fsr: Fix parentheses around truth value Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs_fsr: Fix parentheses around truth value Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438659037 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Someone in the distant past must have responded to gcc's warning about parentheses around assignment used as a truth value by changing: while (ret = func() == 0) to: while ((ret = func() == 0)) While this shuts up gcc, it doesn't yield the proper result. If func () returns 0, func == 0 is true, and ret is assigned a value of 1. This does keep the while loop going, but it's a very strange way to go about it, and may someday yield confusing results. Fix this as: while ((ret = func()) == 0) so that ret gets the function return value as expected. Signed-off-by: Eric Sandeen --- diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index b46ad1f..b384565 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -716,7 +716,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) tmp_init(mntdir); while ((ret = xfs_bulkstat(fsfd, - &lastino, GRABSZ, &buf[0], &buflenout) == 0)) { + &lastino, GRABSZ, &buf[0], &buflenout)) == 0) { xfs_bstat_t *p; xfs_bstat_t *endp; From eguan@redhat.com Mon Aug 3 22:38:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5AA0D7F51 for ; Mon, 3 Aug 2015 22:38:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38A528F8035 for ; Mon, 3 Aug 2015 20:38:48 -0700 (PDT) X-ASG-Debug-ID: 1438659527-04bdf06bcf1e95a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bBvTtZlAkmpeP3FX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Aug 2015 20:38:47 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 362F583F7D for ; Tue, 4 Aug 2015 03:38:47 +0000 (UTC) Received: from localhost (dhcp-12-142.nay.redhat.com [10.66.12.142]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t743ciIi020238; Mon, 3 Aug 2015 23:38:46 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] xfsprogs: fix syntax error in include/buildmacros Date: Tue, 4 Aug 2015 11:38:29 +0800 X-ASG-Orig-Subj: [PATCH] xfsprogs: fix syntax error in include/buildmacros Message-Id: <1438659509-16656-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438659527 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There's an extra ";" in include/buildmacros, which causes make install-dev to fail ...... Installing libhandle-install-dev cd ../libhandle/.libs; ... if [ "x/usr/lib64" != "x/usr/lib64"; ]; ... /bin/sh: line 0: [: missing `]' /bin/sh: ]: command not found ...... This was introduced by 02ef543 libhandle: fix installation for symlinked /usr Signed-off-by: Eryu Guan --- include/buildmacros | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/buildmacros b/include/buildmacros index 4e4e8fa..a7c5d8a 100644 --- a/include/buildmacros +++ b/include/buildmacros @@ -77,7 +77,7 @@ INSTALL_LTLIB_DEV = \ ../$(INSTALL) -m 755 -d $(PKG_ROOT_LIB_DIR); \ ../$(INSTALL) -T so_base $(LIBNAME).lai $(PKG_ROOT_LIB_DIR); \ if [ "x$(shell readlink -f $(PKG_LIB_DIR))" != \ - "x$(shell readlink -f $(PKG_ROOT_LIB_DIR))"; ]; then \ + "x$(shell readlink -f $(PKG_ROOT_LIB_DIR))" ]; then \ ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).a $(PKG_ROOT_LIB_DIR)/$(LIBNAME).a; \ ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).la $(PKG_ROOT_LIB_DIR)/$(LIBNAME).la; \ ../$(INSTALL) -S $(PKG_ROOT_LIB_DIR)/$(LIBNAME).so $(PKG_LIB_DIR)/$(LIBNAME).so; \ -- 2.4.3 From lrhorer@mygrande.net Tue Aug 4 02:52:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=URI_HEX autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 819B27F7C for ; Tue, 4 Aug 2015 02:52:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14049AC001 for ; Tue, 4 Aug 2015 00:52:42 -0700 (PDT) X-ASG-Debug-ID: 1438674758-04bdf06bcf1eed50001-NocioJ Received: from mail02.lsn.net (mail02.lsn.net [66.90.130.128]) by cuda.sgi.com with ESMTP id qrVKrBDsC8r2KTPb for ; Tue, 04 Aug 2015 00:52:39 -0700 (PDT) X-Barracuda-Envelope-From: lrhorer@mygrande.net X-Barracuda-Apparent-Source-IP: 66.90.130.128 Received: from [192.168.1.121] (66-90-232-145.dyn.grandenetworks.net [66.90.232.145]) (authenticated bits=0) by mail02.lsn.net (8.14.4/8.13.6) with ESMTP id t747qURK001582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 4 Aug 2015 02:52:31 -0500 X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.98.4 at av01.lsn.net Message-ID: <55C06F41.4030502@mygrande.net> Date: Tue, 04 Aug 2015 02:52:33 -0500 From: Leslie Rhorer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Brian Foster CC: "Rhorer, Leslie" , Kris Rusocki , Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <03864DDC681E664EBF5D47682BE7D7CF0D3574DF@USADCWVEMBX07.corp.global.level3.com> <55AA5FCE.4080702@sandeen.net> <03864DDC681E664EBF5D47682BE7D7CF0D358740@USADCWVEMBX07.corp.global.level3.com> <55AAF73A.4040903@mygrande.net> <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55BE7C75.4060604@mygrande.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail02.lsn.net[66.90.130.128] X-Barracuda-Start-Time: 1438674759 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It's failing, again. The rsync job failed and when I attempt to untar the file in the image mount, it fails there, as well. See below. I formatted a 1.5T drive as xfs and mounted it under /media. I then dumped the failing FS to a file on /media using xfs_metadump and used xfs_mdrestore to create an image of the FS. I then mounted the image, copied over the tarball to its location, and ran tar to extract the files: RAID-Server:/# mount -o nouuid /media/md0.img /TEST RAID-Server:/# cd "/TEST/Server-Main/Equipment/Drive Controllers/HighPoint Adapters/Rocket 2722/Driver"/ RAID-Server:/TEST/Server-Main/Equipment/Drive Controllers/HighPoint Adapters/Rocket 2722/Driver# cp "/RAID/Server-Main/Equipment/Drive Controllers/HighPoint Adapters/Rocket 2722/Driver/RR_27xx.tar.gz" ./ RAID-Server:/TEST/Server-Main/Equipment/Drive Controllers/HighPoint Adapters/Rocket 2722/Driver# tar -xzvf RR_27xx.tar.gz DC7280/ DC7280/Linux/ DC7280/Linux/Opensource/ DC7280/Linux/Opensource/DC7280-linux-src-v1.0-110621-1313.tar.gz DC7280/Windows/ DC7280/Windows/Vista-Win2008-Win7/ DC7280/Windows/Vista-Win2008-Win7/x32/ DC7280/Windows/Vista-Win2008-Win7/x32/dc7280.cat DC7280/Windows/Vista-Win2008-Win7/x32/dc7280.inf DC7280/Windows/Vista-Win2008-Win7/x32/dc7280.sys DC7280/Windows/Vista-Win2008-Win7/x64/ DC7280/Windows/Vista-Win2008-Win7/x64/dc7280.cat DC7280/Windows/Vista-Win2008-Win7/x64/dc7280.inf DC7280/Windows/Vista-Win2008-Win7/x64/dc7280.sys DC7280/Windows/Vista-Win2008-Win7/Readme.txt DC7280/.ddinfo R272x/ R272x/Linux/ R272x/Linux/Opensource/ R272x/Linux/Opensource/partial/ R272x/Linux/Opensource/partial/include/ ... RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/pcitable RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/readme.txt RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/rhdd RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/rhel-install-step1.sh RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/rhel-install-step2.sh RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/ tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: Cannot mkdir: Structure needs cleaning RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/install.sh tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: Cannot mkdir: Input/output error tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/install.sh: Cannot open: No such file or directory RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/installmethod.py tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: Cannot mkdir: Input/output error tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/installmethod.py: Cannot open: No such file or directory RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modinfo tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: Cannot mkdir: Input/output error tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modinfo: Cannot open: No such file or directory RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modules.alias tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: Cannot mkdir: Input/output error tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modules.alias: Cannot open: No such file or directory RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modules.cgz gzip: tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: Cannot mkdir: Input/output errorstdin: Input/output error tar: Unexpected EOF in archive tar: RR274x/Driver/Linux/RHEL_CentOS: Cannot utime: Input/output error tar: RR274x/Driver/Linux/RHEL_CentOS: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x/Driver/Linux/RHEL_CentOS: Cannot change mode to rwxr-xr-x: Input/output error tar: RR274x/Driver/Linux: Cannot utime: Input/output error tar: RR274x/Driver/Linux: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x/Driver/Linux: Cannot change mode to rwxr-xr-x: Input/output error tar: RR274x/Driver: Cannot utime: Input/output error tar: RR274x/Driver: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x/Driver: Cannot change mode to rwxr-xr-x: Input/output error tar: RR274x: Cannot utime: Input/output error tar: RR274x: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x: Cannot change mode to rwxr-xr-x: Input/output error tar: Error is not recoverable: exiting now dmesg: [131329.013475] XFS (md0): Mounting V4 Filesystem [131329.918438] XFS (md0): Ending clean mount [131499.357099] XFS (md0): Mounting V4 Filesystem [131499.709248] XFS (md0): Ending clean mount [131874.545344] loop: module loaded [131874.549914] XFS (loop0): Mounting V4 Filesystem [131874.555540] XFS (loop0): Ending clean mount [132020.964431] XFS (loop0): xfs_iread: validation failed for inode 124656869424 failed [132020.964435] ffff88028b078000: 49 4e 00 00 03 02 00 00 00 30 00 70 00 00 03 e8 IN.......0.p.... [132020.964437] ffff88028b078010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 00 00 00 16 ..... .o........ [132020.964438] ffff88028b078020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c 00 00 00 20 .W7.+]"...a.... [132020.964440] ffff88028b078030: ff ff 00 d2 1b f6 27 90 00 00 00 00 00 00 00 00 ......'......... [132020.964454] XFS (loop0): Internal error xfs_iread at line 392 of file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. Caller xfs_iget+0x24b/0x690 [xfs] [132020.964457] CPU: 2 PID: 21474 Comm: tar Not tainted 3.16.0-4-amd64 #1 Debian 3.16.7-ckt11-1 [132020.964459] Hardware name: To be filled by O.E.M. To be filled by O.E.M./SABERTOOTH 990FX R2.0, BIOS 1503 01/11/2013 [132020.964460] 0000000000000001 ffffffff8150b405 ffff880424059800 ffffffffa09115cb [132020.964463] 0000018800000010 ffffffffa0916f6b ffff88030f5c6c00 ffff880424059800 [132020.964465] 0000000000000075 ffff8800ad1afe98 ffffffffa095cb3a ffffffffa0916f6b [132020.964467] Call Trace: [132020.964471] [] ? dump_stack+0x41/0x51 [132020.964478] [] ? xfs_corruption_error+0x5b/0x80 [xfs] [132020.964483] [] ? xfs_iget+0x24b/0x690 [xfs] [132020.964492] [] ? xfs_iread+0xea/0x400 [xfs] [132020.964497] [] ? xfs_iget+0x24b/0x690 [xfs] [132020.964503] [] ? xfs_iget+0x24b/0x690 [xfs] [132020.964511] [] ? xfs_ialloc+0xa6/0x500 [xfs] [132020.964517] [] ? kmem_zone_alloc+0x6e/0xe0 [xfs] [132020.964525] [] ? xfs_dir_ialloc+0x62/0x2a0 [xfs] [132020.964531] [] ? xfs_trans_reserve+0x1f5/0x200 [xfs] [132020.964538] [] ? xfs_create+0x489/0x700 [xfs] [132020.964541] [] ? kern_path_create+0xaa/0x190 [132020.964548] [] ? xfs_generic_create+0xca/0x250 [xfs] [132020.964550] [] ? vfs_mkdir+0xb0/0x160 [132020.964551] [] ? SyS_mkdirat+0xab/0xe0 [132020.964554] [] ? system_call_fast_compare_end+0x10/0x15 [132020.964555] XFS (loop0): Corruption detected. Unmount and run xfs_repair [132020.964564] XFS (loop0): Internal error xfs_trans_cancel at line 959 of file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. Caller xfs_create+0x2b2/0x700 [xfs] [132020.964566] CPU: 2 PID: 21474 Comm: tar Not tainted 3.16.0-4-amd64 #1 Debian 3.16.7-ckt11-1 [132020.964567] Hardware name: To be filled by O.E.M. To be filled by O.E.M./SABERTOOTH 990FX R2.0, BIOS 1503 01/11/2013 [132020.964568] 000000000000000c ffffffff8150b405 ffff8800ad1afe98 ffffffffa0925e07 [132020.964570] ffff880002530800 ffff880079e03ec8 ffff880424059800 ffffffffa09577d2 [132020.964571] 0000000000000001 ffff880079e03e20 ffff880079e03e1c ffff880079e03eb0 [132020.964573] Call Trace: [132020.964575] [] ? dump_stack+0x41/0x51 [132020.964581] [] ? xfs_trans_cancel+0xc7/0xf0 [xfs] [132020.964588] [] ? xfs_create+0x2b2/0x700 [xfs] [132020.964590] [] ? kern_path_create+0xaa/0x190 [132020.964596] [] ? xfs_generic_create+0xca/0x250 [xfs] [132020.964598] [] ? vfs_mkdir+0xb0/0x160 [132020.964600] [] ? SyS_mkdirat+0xab/0xe0 [132020.964602] [] ? system_call_fast_compare_end+0x10/0x15 [132020.964604] XFS (loop0): xfs_do_force_shutdown(0x8) called from line 960 of file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. Return address = 0xffffffffa0925e20 [132021.196487] XFS (loop0): Corruption of in-memory data detected. Shutting down filesystem [132021.196491] XFS (loop0): Please umount the filesystem and rectify the problem(s) [132024.791456] XFS (loop0): xfs_log_force: error 5 returned. [132054.854625] XFS (loop0): xfs_log_force: error 5 returned. [132084.917775] XFS (loop0): xfs_log_force: error 5 returned. [132114.980927] XFS (loop0): xfs_log_force: error 5 returned. [132145.044086] XFS (loop0): xfs_log_force: error 5 returned. [132175.107307] XFS (loop0): xfs_log_force: error 5 returned. [132205.170404] XFS (loop0): xfs_log_force: error 5 returned. [132235.233587] XFS (loop0): xfs_log_force: error 5 returned. On 8/2/2015 3:24 PM, Leslie Rhorer wrote: > > OK, this is goofy. It seems to be working, now. As usual, I've > been doing some work on the server this weekend, but I can't think of > anything I have done that would fix the issue. I did replace the > remaining good 4G RAM module with a pair of 8G RAM modules, but memtest > reported the remaining 4G module as good, and I verified the removed > module really was bad. I also replaced the removable drive carrier and > cables that were feeding the two SSDs, once of which was reporting > failures as noted in the syslog. It's hard for me to believe either of > those things could have been causing the issue, though. > > I attached a 1.5T external drive to the server and formatted it as > XFS in preparation to continue troubleshooting. To make sure of things, > I tried decompressing the tarball, again, and this time it worked all > the way to the end. I then deleted the entire directory structure > created by the tarball and decompressed the file again twice. I'll see > if the rsync process works. That will take a couple of days. > > On 7/28/2015 5:11 PM, Brian Foster wrote: >> On Tue, Jul 28, 2015 at 10:13:01AM -0500, Leslie Rhorer wrote: >>> On 7/28/2015 7:33 AM, Brian Foster wrote: >>>> On Tue, Jul 28, 2015 at 02:46:45AM -0500, Leslie Rhorer wrote: >>>>> On 7/20/2015 6:17 AM, Brian Foster wrote: >>>>>> On Sat, Jul 18, 2015 at 08:02:50PM -0500, Leslie Rhorer wrote: >>>>>>> >> ... >>>> >>>>> I then copied both the tarball and the image over to the root, >>>>> and while >>>>> the system would not let me create the image on the root, it did >>>>> let me copy >>>>> the image to the root. I then umounted the RAID array, mounted the >>>>> image, >>>>> and attempted to cd to the original directory in the image mount >>>>> where the >>>>> tarball was saved. That failed with an I/O error: >>>>> >>>> >>>> It sounds a bit strange for the mdrestore to fail on root but a cp of >>>> the resulting image to work. Do the resulting images have the same file >>>> size or is the rootfs copy truncated? If the latter, you could be >>>> missing part of the fs and thus any of the following tests are probably >>>> moot. >>> >>> Well, it can't be as large as it is reported, let's put it that way, >>> although the reported file size is the same. Ls claims it to be 16T in >>> size, which cannot be the case on a 100G partition. I forgot to >>> mention cp >>> does complain: >>> >>> RAID-Server:/# cp /RAID/TEST/RAIDfile.img ./ >>> cp: cannot lseek ‘./RAIDfile.img’: Invalid argument >>> >>> But it does the same thing on the backup server, and it works >>> there. I >>> tried a cmp, and it seems to be hung. It just may be taking a long >>> time, >>> however. >>> >> >> Yeah, you can't really trust the resulting image. It doesn't take much >> space to create a very large sparse file, but different filesystems have >> different maximum file size limits. The problem here is that some >> metadata near the beginning of the file might reference or depend on >> something near the end, and I/Os beyond the end of the file will >> probably result in errors. >> >> I'd probably try the nouuid approach since the hardware is similar as >> well as some of the other interesting suggestions that have been made to >> try and get the image on the rootfs and see what happens there too. >> >> Brian >> >>>> Brian >>>> >>>>> RAID-Server:/# cd "/media/Server-Main/Equipment/Drive >>>>> Controllers/HighPoint >>>>> Adapters/Rocket 2722/Driver/" >>>>> bash: cd: /media/Server-Main/Equipment/Drive Controllers/HighPoint >>>>> Adapters/Rocket 2722/Driver/: Input/output error >>>>> >>>>> I changed directories to a point two directories above the >>>>> previous attempt >>>>> and did a long listing: >>>>> >>>>> RAID-Server:/# cd "/media/Server-Main/Equipment/Drive >>>>> Controllers/HighPoint >>>>> Adapters" >>>>> RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>>> Adapters# ll >>>>> ls: cannot access RocketRAID 2722: Input/output error >>>>> total 4 >>>>> drwxr-xr-x 6 root lrhorer 4096 Jul 18 19:26 Rocket 2722 >>>>> ?????????? ? ? ? ? ? RocketRAID 2722 >>>>> >>>>> As you can see, Rocket 2722 is still there, but RocketRAID 2722 >>>>> is very >>>>> sick. Rocket 2722 is the parent of where the tarbal was, however, >>>>> so I did >>>>> a cd and an ll again: >>>>> >>>>> RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>>> Adapters# cd "Rocket 2722"/ >>>>> RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint >>>>> Adapters/Rocket 2722# ll >>>>> ls: cannot access BIOS: Input/output error >>>>> ls: cannot access Driver: Input/output error >>>>> ls: cannot access HighPoint RAID Management Software: Input/output >>>>> error >>>>> ls: cannot access Manual: Input/output error >>>>> total 248 >>>>> -rwxr--r-- 1 root lrhorer 245760 Nov 20 2008 autorun.exe >>>>> -rwxr--r-- 1 root lrhorer 51 Mar 21 2001 autorun.inf >>>>> ?????????? ? ? ? ? ? BIOS >>>>> ?????????? ? ? ? ? ? Driver >>>>> ?????????? ? ? ? ? ? HighPoint RAID >>>>> Management >>>>> Software >>>>> ?????????? ? ? ? ? ? Manual >>>>> -rwxr--r-- 1 root lrhorer 1134 Feb 5 2012 readme.txt >>>>> >>>>> So now, what? >>>>> >>>>> _______________________________________________ >>>>> xfs mailing list >>>>> xfs@oss.sgi.com >>>>> http://oss.sgi.com/mailman/listinfo/xfs >>>> >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs >> > From jtulak@redhat.com Tue Aug 4 03:39:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 61D887F9B for ; Tue, 4 Aug 2015 03:39:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5055E304039 for ; Tue, 4 Aug 2015 01:39:09 -0700 (PDT) X-ASG-Debug-ID: 1438677546-04cbb0416c23b5a0001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id JnrFWxs5omOEdLFf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 01:39:07 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t748ch1d008494; Tue, 4 Aug 2015 04:38:43 -0400 Date: Tue, 4 Aug 2015 04:38:42 -0400 (EDT) From: Jan Tulak To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Message-ID: <2026707053.2526927.1438677522777.JavaMail.zimbra@redhat.com> In-Reply-To: <20150803221629.GT3902@dastard> References: <1437397018-12864-1-git-send-email-jtulak@redhat.com> <1437397018-12864-2-git-send-email-jtulak@redhat.com> <20150802234250.GT16638@dastard> <1142980605.1953560.1438594488229.JavaMail.zimbra@redhat.com> <20150803221629.GT3902@dastard> Subject: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v2 1/4] xfsprogs: Prefix LIST_... macros to XFS_LIST_... Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.5.173] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: Prefix LIST_... macros to XFS_LIST_... Thread-Index: PdYjDanZ9+kyIyvpAZ5h9l8b2Z5Riw== X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1438677547 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Dave Chinner" > > /usr/include/sys/queue.h:417:9: note: previous definition is here > > #define LIST_HEAD(name, type) \ > > ^ > > (and the same for LIST_HEAD_INIT) > > > > sys/queue.h is not linked directly, but from many system libraries. > > A quick grep on /usr/include/ shows 24 header files including the queue, > > sys/mount.h one of them. And I didn't found a way how to avoid it. > > Ok, so 4.4BSD introduced these years ago. Now it rings a bell, but I > can't find the relevant thread I'm thinking of (google has become > almost useless as a mailing list search engine in recent times). > > I suspect that we are going to need an > > #undef LIST_HEAD > > somewhere in include/libxfs.h, libxfs/libxfs_priv.h and/or > include/list.h just to ensure we don't use the system definitions > (with a large comment explaining it). > Great! Putting it in libxfs/list.h seems to be enough. This header should be included anywhere where our lists are used, so I think there should be no risk of using the system definition anymore. I'm making an updated patch. Thanks for pointing on #undef. I'm sure I must have heard of it before, but as I never used it... :-) Cheers, Jan -- Jan Tulak jtulak@redhat.com From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 03:41:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2CE977FA9 for ; Tue, 4 Aug 2015 03:41:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA35EAC001 for ; Tue, 4 Aug 2015 01:41:19 -0700 (PDT) X-ASG-Debug-ID: 1438677677-04bdf06bcf1f0e80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id jv1OTXXEScStd3UW (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 01:41:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMXmf-0003Va-4G; Tue, 04 Aug 2015 08:41:17 +0000 Date: Tue, 4 Aug 2015 01:41:17 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v3 03/11] xfsprogs: undefined variable fix Message-ID: <20150804084117.GA12844@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 03/11] xfsprogs: undefined variable fix References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-4-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-4-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438677677 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 03:46:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 97C5E7FA8 for ; Tue, 4 Aug 2015 03:46:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 77E6B8F8033 for ; Tue, 4 Aug 2015 01:46:27 -0700 (PDT) X-ASG-Debug-ID: 1438677985-04bdf06bd11f1140001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id aYTDfhzONH5almfo (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 01:46:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMXrd-0006Xi-Mc; Tue, 04 Aug 2015 08:46:25 +0000 Date: Tue, 4 Aug 2015 01:46:25 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing Message-ID: <20150804084625.GB12844@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-5-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-5-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438677985 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > diff --git a/io/readdir.c b/io/readdir.c > index 20b8898..ed8f04d 100644 > --- a/io/readdir.c > +++ b/io/readdir.c > @@ -104,12 +104,16 @@ read_directory( > if (!dirent) > break; > > +#ifdef _DIRENT_HAVE_D_RECLEN > *total += dirent->d_reclen; > +#endif You probably want to use d_namen + sizeof(*dirent) to approimate the value if d_reclen doesn't exist. > count++; > > if (dump) { > dump_dirent(offset, dirent); > +#ifdef _DIRENT_HAVE_D_OFF > offset = dirent->d_off; > +#endif We're only using the offset for dumping the value, maybe setting it to 0 and adding a comment explaining it should go into the else branch here? From jtulak@redhat.com Tue Aug 4 04:01:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 536637FA8 for ; Tue, 4 Aug 2015 04:01:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFD48AC001 for ; Tue, 4 Aug 2015 02:01:21 -0700 (PDT) X-ASG-Debug-ID: 1438678879-04cbb0416d23c180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VlYld3Y1pvrllhOB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 02:01:20 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 990DA461F0; Tue, 4 Aug 2015 09:01:19 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7491HYx026859; Tue, 4 Aug 2015 05:01:18 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, david@fromorbit.com, Jan Tulak Subject: [PATCH v4 11/11] xfsprogs: prevent LIST_ macros conflicts Date: Tue, 4 Aug 2015 11:01:14 +0200 X-ASG-Orig-Subj: [PATCH v4 11/11] xfsprogs: prevent LIST_ macros conflicts Message-Id: <1438678874-23765-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-12-git-send-email-jtulak@redhat.com> References: <1438612789-17486-12-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438678880 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 BSD 4.4 added some LIST_ macros into system header files, which causes "macro redefined" warnings. To ensure we use our own macros, undefine the system ones at first. The conflicting macros are LIST_HEAD and LIST_HEAD_INIT Signed-off-by: Jan Tulak --- include/list.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/list.h b/include/list.h index 3f087a4..f92faed 100644 --- a/include/list.h +++ b/include/list.h @@ -19,6 +19,20 @@ #define __LIST_H__ /* + * This undef is here because BSD 4.4 added some LIST_ macros into system + * header file sys/queue.h. This header is included in many other system + * headers and thus causes "macro redefined" warnings. + * + * As OS X is kind of a derivate of BSD, this affects OS X too. + * + * To use our own LIST_ macros (copied from kernel code), we have to + * at first undefine the conflicting system macros. + * + */ +#undef LIST_HEAD +#undef LIST_HEAD_INIT + +/* * Simple, generic doubly-linked list implementation. */ -- 2.4.3 From jtulak@redhat.com Tue Aug 4 04:21:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E511D7FA8 for ; Tue, 4 Aug 2015 04:21:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D226A8F8049 for ; Tue, 4 Aug 2015 02:21:46 -0700 (PDT) X-ASG-Debug-ID: 1438680104-04cbb0416d23ce70001-NocioJ Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by cuda.sgi.com with ESMTP id AqijA2SACwKowdAM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 02:21:44 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.39 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t749LMGg004821; Tue, 4 Aug 2015 05:21:22 -0400 Date: Tue, 4 Aug 2015 05:21:22 -0400 (EDT) From: Jan Tulak To: Christoph Hellwig Cc: xfs@oss.sgi.com Message-ID: <1716990041.2536058.1438680082030.JavaMail.zimbra@redhat.com> In-Reply-To: <20150804084625.GB12844@infradead.org> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-5-git-send-email-jtulak@redhat.com> <20150804084625.GB12844@infradead.org> Subject: Re: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.5.173] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: Add ifdef dirent checks where it was missing Thread-Index: aQVV3HpZwNRI0tBIINsG7WTyCs2beA== X-Barracuda-Connect: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Start-Time: 1438680104 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21333 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Christoph Hellwig" > To: "Jan Tulak" > Cc: hch@infradead.org, xfs@oss.sgi.com > Sent: Tuesday, August 4, 2015 10:46:25 AM > Subject: Re: [PATCH v3 04/11] xfsprogs: Add ifdef dirent checks where it was missing > > > diff --git a/io/readdir.c b/io/readdir.c > > index 20b8898..ed8f04d 100644 > > --- a/io/readdir.c > > +++ b/io/readdir.c > > @@ -104,12 +104,16 @@ read_directory( > > if (!dirent) > > break; > > > > +#ifdef _DIRENT_HAVE_D_RECLEN > > *total += dirent->d_reclen; > > +#endif > > You probably want to use d_namen + sizeof(*dirent) to approimate > the value if d_reclen doesn't exist. > > > count++; > > > > if (dump) { > > dump_dirent(offset, dirent); > > +#ifdef _DIRENT_HAVE_D_OFF > > offset = dirent->d_off; > > +#endif > > We're only using the offset for dumping the value, maybe setting > it to 0 and adding a comment explaining it should go into the else > branch here? > That sounds reasonable, sending an updated patch. Thanks. :-) Jan -- Jan Tulak jtulak@redhat.com From jtulak@redhat.com Tue Aug 4 04:25:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B39E17FA8 for ; Tue, 4 Aug 2015 04:25:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4E7F0AC001 for ; Tue, 4 Aug 2015 02:25:24 -0700 (PDT) X-ASG-Debug-ID: 1438680322-04cbb0416c23d020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ga6KZBcP5Fzx8w7p (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 02:25:23 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 42BB75A; Tue, 4 Aug 2015 09:25:22 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t749PKOo015729; Tue, 4 Aug 2015 05:25:21 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing Date: Tue, 4 Aug 2015 11:25:14 +0200 X-ASG-Orig-Subj: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing Message-Id: <1438680314-23950-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1438612789-17486-5-git-send-email-jtulak@redhat.com> References: <1438612789-17486-5-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438680323 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add check for _DIRENT_HAVED_RECLEN/_OFF to read_directory(). In dump_dirent() these checks already are used, but they were missing in read_directory. Signed-off-by: Jan Tulak --- io/readdir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/io/readdir.c b/io/readdir.c index 20b8898..ddd62c9 100644 --- a/io/readdir.c +++ b/io/readdir.c @@ -104,12 +104,24 @@ read_directory( if (!dirent) break; +#ifdef _DIRENT_HAVE_D_RECLEN *total += dirent->d_reclen; +#else + *total += dirent->d_namlen + sizeof(*dirent); +#endif count++; if (dump) { dump_dirent(offset, dirent); +#ifdef _DIRENT_HAVE_D_OFF offset = dirent->d_off; +#else + /* Some platforms don't have dirent->d_off, but because it is + * used only for dumping the value, it should be safe to only + * set it to zero in such case. + */ + offset = 0; +#endif } } -- 2.4.3 From www-data@cpro28489.publiccloud.com.br Tue Aug 4 05:48:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E13F87FA6 for ; Tue, 4 Aug 2015 05:48:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0D76304039 for ; Tue, 4 Aug 2015 03:48:43 -0700 (PDT) X-ASG-Debug-ID: 1438685320-04bdf06bd11f6530001-NocioJ Received: from cpro28489.publiccloud.com.br (cpro28489.publiccloud.com.br [191.252.2.188]) by cuda.sgi.com with ESMTP id cJX9qz1KqY55vcUK for ; Tue, 04 Aug 2015 03:48:40 -0700 (PDT) X-Barracuda-Envelope-From: www-data@cpro28489.publiccloud.com.br X-Barracuda-Apparent-Source-IP: 191.252.2.188 Received: by cpro28489.publiccloud.com.br (Postfix, from userid 33) id 12EDE31621; Tue, 4 Aug 2015 07:46:12 -0300 (BRT) To: xfs@oss.sgi.com Subject: 14-Limpe seu nome por apenas 100,00 X-PHP-Originating-Script: 0:s.php X-ASG-Orig-Subj: 14-Limpe seu nome por apenas 100,00 From: Super Credito MIME-Version: 1.0 Content-type: text/html; charset=iso-8859-1 X-Mailer: PHP/5.5.9-1ubuntu4.9 Message-Id: <20150804104612.12EDE31621@cpro28489.publiccloud.com.br> Date: Tue, 4 Aug 2015 07:46:12 -0300 (BRT) X-Barracuda-Connect: cpro28489.publiccloud.com.br[191.252.2.188] X-Barracuda-Start-Time: 1438685320 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21334 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message

Removemos SPC, SERASA, CCF, PROTESTOS, CHECK-CHECK e BACEN
POR APENAS 100,00. Temos a solução em no maximo 04 horas.
Não responda este email.
informações somente pelo email abaixo:
---------------------
screditonovo@bol.com.br
---------------------

From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:16:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C9407FA4 for ; Tue, 4 Aug 2015 06:16:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AE9930404E for ; Tue, 4 Aug 2015 04:16:37 -0700 (PDT) X-ASG-Debug-ID: 1438686995-04bdf06bd21f75a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8eML7cmEdSAw7BFT (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:16:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaCx-00053w-Pk; Tue, 04 Aug 2015 11:16:35 +0000 Date: Tue, 4 Aug 2015 04:16:35 -0700 From: Christoph Hellwig To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: fix syntax error in include/buildmacros Message-ID: <20150804111635.GA18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix syntax error in include/buildmacros References: <1438659509-16656-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438659509-16656-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438686995 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 04, 2015 at 11:38:29AM +0800, Eryu Guan wrote: > There's an extra ";" in include/buildmacros, which causes make > install-dev to fail > > ...... > Installing libhandle-install-dev > cd ../libhandle/.libs; ... if [ "x/usr/lib64" != "x/usr/lib64"; ]; ... > /bin/sh: line 0: [: missing `]' > /bin/sh: ]: command not found > ...... > > This was introduced by > 02ef543 libhandle: fix installation for symlinked /usr Thanks, loosk like some shells are stricter than others here. Reviewed-by: Christoph Hellwig From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:17:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B6277FA4 for ; Tue, 4 Aug 2015 06:17:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C1D2304039 for ; Tue, 4 Aug 2015 04:17:27 -0700 (PDT) X-ASG-Debug-ID: 1438687029-04cb6c673d2bc660001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 2veFQDMd7GRriSal (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:17:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaDV-0005AW-P1; Tue, 04 Aug 2015 11:17:09 +0000 Date: Tue, 4 Aug 2015 04:17:09 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_fsr: Fix parentheses around truth value Message-ID: <20150804111709.GB18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_fsr: Fix parentheses around truth value References: <55C031DC.6050404@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C031DC.6050404@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687030 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:17:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E077C7FA4 for ; Tue, 4 Aug 2015 06:17:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0DFD8F8049 for ; Tue, 4 Aug 2015 04:17:31 -0700 (PDT) X-ASG-Debug-ID: 1438687050-04cbb0416e241990001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5gY5wrsl8zYoZpdo (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:17:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaDp-0005EM-Vx; Tue, 04 Aug 2015 11:17:29 +0000 Date: Tue, 4 Aug 2015 04:17:29 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v3 05/11] xfsprogs: Change OS X-specific CFLAGS/LDFLAGS Message-ID: <20150804111729.GC18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 05/11] xfsprogs: Change OS X-specific CFLAGS/LDFLAGS References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-6-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-6-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687050 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:18:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A7DC07FA4 for ; Tue, 4 Aug 2015 06:18:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 86FDB8F804B for ; Tue, 4 Aug 2015 04:18:14 -0700 (PDT) X-ASG-Debug-ID: 1438687092-04cbb0416d241a30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HMAIoFecdySRiUdJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:18:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaEW-0005MI-ML; Tue, 04 Aug 2015 11:18:12 +0000 Date: Tue, 4 Aug 2015 04:18:12 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing Message-ID: <20150804111812.GD18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing References: <1438612789-17486-5-git-send-email-jtulak@redhat.com> <1438680314-23950-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438680314-23950-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687093 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 04, 2015 at 11:25:14AM +0200, Jan Tulak wrote: > Add check for _DIRENT_HAVED_RECLEN/_OFF to read_directory(). > In dump_dirent() these checks already are used, but they were > missing in read_directory. Needs to be fixed to avoid > 80 char lines. Otherwise looks good: Reviewed-by: Christoph Hellwig From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:18:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 569647FA4 for ; Tue, 4 Aug 2015 06:18:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5CB5AC001 for ; Tue, 4 Aug 2015 04:18:43 -0700 (PDT) X-ASG-Debug-ID: 1438687121-04cb6c673e2bc7c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id I85UJfr2fQiKASfC (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:18:42 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaEz-0005ST-GB; Tue, 04 Aug 2015 11:18:41 +0000 Date: Tue, 4 Aug 2015 04:18:41 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v3 06/11] xfsprogs: Add includes required for OS X builds Message-ID: <20150804111841.GE18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 06/11] xfsprogs: Add includes required for OS X builds References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-7-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-7-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687121 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS First hunk looks good: Reviewed-by: Christoph Hellwig Second hunk won't apply now that libdisk is gone. From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:21:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 787537FA4 for ; Tue, 4 Aug 2015 06:21:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 24F2DAC002 for ; Tue, 4 Aug 2015 04:21:05 -0700 (PDT) X-ASG-Debug-ID: 1438687263-04bdf06bd21f7910001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gnzoukBPIBAoV3HF (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:21:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaHH-00087m-Dp; Tue, 04 Aug 2015 11:21:03 +0000 Date: Tue, 4 Aug 2015 04:21:03 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf Message-ID: <20150804112103.GF18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-9-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-9-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687263 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Can't you just use something like: AC_CHECK_DECL([fls], [AC_DEFINE([HAVE_FLS_PROTOTYPE], [1], [Define to 1 if have fls prototype])], [], [#include ]) From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:21:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CE957FA4 for ; Tue, 4 Aug 2015 06:21:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0CC27304032 for ; Tue, 4 Aug 2015 04:21:54 -0700 (PDT) X-ASG-Debug-ID: 1438687313-04cb6c673f2bca60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id PXRZkJ2oWN6BiMfZ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:21:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaI5-0000Ji-Oe; Tue, 04 Aug 2015 11:21:53 +0000 Date: Tue, 4 Aug 2015 04:21:53 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 09/11] xfsprogs: Add mntent.h check into autoconf Message-ID: <20150804112153.GG18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 09/11] xfsprogs: Add mntent.h check into autoconf References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-10-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-10-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687314 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Why not just AC_CHECK_HEADERS([mntent.h]) ? From BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 4 06:22:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 31CF07FA4 for ; Tue, 4 Aug 2015 06:22:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2218C30404E for ; Tue, 4 Aug 2015 04:22:23 -0700 (PDT) X-ASG-Debug-ID: 1438687341-04cb6c673d2bcaf0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 3RFvvb7smWB8mDd7 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 04:22:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+651fa2cb4ffecf0ba699+4363+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMaIX-0000eM-Dg; Tue, 04 Aug 2015 11:22:21 +0000 Date: Tue, 4 Aug 2015 04:22:21 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 11/11] xfsprogs: prevent LIST_ macros conflicts Message-ID: <20150804112221.GH18906@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v4 11/11] xfsprogs: prevent LIST_ macros conflicts References: <1438612789-17486-12-git-send-email-jtulak@redhat.com> <1438678874-23765-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438678874-23765-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1438687341 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From jtulak@redhat.com Tue Aug 4 07:13:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC78A7FA6 for ; Tue, 4 Aug 2015 07:13:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7F39304051 for ; Tue, 4 Aug 2015 05:13:13 -0700 (PDT) X-ASG-Debug-ID: 1438690390-04cbb0416f243b60001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id ThpLBe75bKEDf0zV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 05:13:11 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t74CCQdH029388; Tue, 4 Aug 2015 08:12:26 -0400 Date: Tue, 4 Aug 2015 08:12:26 -0400 (EDT) From: Jan Tulak To: Christoph Hellwig Cc: xfs@oss.sgi.com Message-ID: <117593154.2602203.1438690346097.JavaMail.zimbra@redhat.com> In-Reply-To: <20150804112103.GF18906@infradead.org> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-9-git-send-email-jtulak@redhat.com> <20150804112103.GF18906@infradead.org> Subject: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.5.173] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: Add fls check into autoconf Thread-Index: rKhlVe58roOeHqFtk4fDOsPRBZOZ7w== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1438690391 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21336 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Christoph Hellwig" > To: "Jan Tulak" > Cc: hch@infradead.org, xfs@oss.sgi.com > Sent: Tuesday, August 4, 2015 1:21:03 PM > Subject: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf > > Can't you just use something like: > > AC_CHECK_DECL([fls], > [AC_DEFINE([HAVE_FLS_PROTOTYPE], [1], > [Define to 1 if have fls prototype])], > [], > [#include ]) > You mean to replace the entire autoconf part of the patch with this? I will try it. Autoconf is still a bit of a black magic for me, so I used the already existing checks. :-) Cheers, Jan -- Jan Tulak jtulak@redhat.com From bfoster@redhat.com Tue Aug 4 07:19:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=URI_HEX autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5A1A7FA6 for ; Tue, 4 Aug 2015 07:19:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A304F304048 for ; Tue, 4 Aug 2015 05:19:38 -0700 (PDT) X-ASG-Debug-ID: 1438690776-04cb6c67402bf330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id W3usnmaAyZLWQ4yd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 05:19:37 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 1088F344F58; Tue, 4 Aug 2015 12:19:35 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t74CJZHv025483; Tue, 4 Aug 2015 08:19:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 340E7122E55; Tue, 4 Aug 2015 08:19:34 -0400 (EDT) Date: Tue, 4 Aug 2015 08:19:34 -0400 From: Brian Foster To: Leslie Rhorer Cc: Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble Message-ID: <20150804121933.GB59490@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS File system in trouble References: <03864DDC681E664EBF5D47682BE7D7CF0D358740@USADCWVEMBX07.corp.global.level3.com> <55AAF73A.4040903@mygrande.net> <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <55C06F41.4030502@mygrande.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438690777 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 04, 2015 at 02:52:33AM -0500, Leslie Rhorer wrote: > It's failing, again. The rsync job failed and when I attempt to untar the > file in the image mount, it fails there, as well. See below. I formatted a > 1.5T drive as xfs and mounted it under /media. I then dumped the failing FS > to a file on /media using xfs_metadump and used xfs_mdrestore to create an > image of the FS. I then mounted the image, copied over the tarball to its > location, and ran tar to extract the files: > Ok, so is this a reliable reproducer? If so, does it reproduce on your separate hardware? If so, can you share the (compressed) metadump somewhere? Brian > RAID-Server:/# mount -o nouuid /media/md0.img /TEST > > RAID-Server:/# cd "/TEST/Server-Main/Equipment/Drive Controllers/HighPoint > Adapters/Rocket 2722/Driver"/ > > RAID-Server:/TEST/Server-Main/Equipment/Drive Controllers/HighPoint > Adapters/Rocket 2722/Driver# cp "/RAID/Server-Main/Equipment/Drive > Controllers/HighPoint Adapters/Rocket 2722/Driver/RR_27xx.tar.gz" ./ > > RAID-Server:/TEST/Server-Main/Equipment/Drive Controllers/HighPoint > Adapters/Rocket 2722/Driver# tar -xzvf RR_27xx.tar.gz > DC7280/ > DC7280/Linux/ > DC7280/Linux/Opensource/ > DC7280/Linux/Opensource/DC7280-linux-src-v1.0-110621-1313.tar.gz > DC7280/Windows/ > DC7280/Windows/Vista-Win2008-Win7/ > DC7280/Windows/Vista-Win2008-Win7/x32/ > DC7280/Windows/Vista-Win2008-Win7/x32/dc7280.cat > DC7280/Windows/Vista-Win2008-Win7/x32/dc7280.inf > DC7280/Windows/Vista-Win2008-Win7/x32/dc7280.sys > DC7280/Windows/Vista-Win2008-Win7/x64/ > DC7280/Windows/Vista-Win2008-Win7/x64/dc7280.cat > DC7280/Windows/Vista-Win2008-Win7/x64/dc7280.inf > DC7280/Windows/Vista-Win2008-Win7/x64/dc7280.sys > DC7280/Windows/Vista-Win2008-Win7/Readme.txt > DC7280/.ddinfo > R272x/ > R272x/Linux/ > R272x/Linux/Opensource/ > R272x/Linux/Opensource/partial/ > R272x/Linux/Opensource/partial/include/ > > ... > > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/pcitable > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/readme.txt > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/rhdd > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/rhel-install-step1.sh > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-i386/rhel-install-step2.sh > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/ > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: > Cannot mkdir: Structure needs cleaning > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/install.sh > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: > Cannot mkdir: Input/output error > tar: > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/install.sh: > Cannot open: No such file or directory > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/installmethod.py > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: > Cannot mkdir: Input/output error > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/installmethod.py: > Cannot open: No such file or directory > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modinfo > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: > Cannot mkdir: Input/output error > tar: > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modinfo: > Cannot open: No such file or directory > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modules.alias > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: > Cannot mkdir: Input/output error > tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modules.alias: > Cannot open: No such file or directory > RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64/modules.cgz > > gzip: tar: RR274x/Driver/Linux/RHEL_CentOS/rr274x_3x-rhel_centos-4u8-x86_64: > Cannot mkdir: Input/output errorstdin: Input/output error > > tar: Unexpected EOF in archive > tar: RR274x/Driver/Linux/RHEL_CentOS: Cannot utime: Input/output error > tar: RR274x/Driver/Linux/RHEL_CentOS: Cannot change ownership to uid 0, gid > 1000: Input/output error > tar: RR274x/Driver/Linux/RHEL_CentOS: Cannot change mode to rwxr-xr-x: > Input/output error > tar: RR274x/Driver/Linux: Cannot utime: Input/output error > tar: RR274x/Driver/Linux: Cannot change ownership to uid 0, gid 1000: > Input/output error > tar: RR274x/Driver/Linux: Cannot change mode to rwxr-xr-x: Input/output > error > tar: RR274x/Driver: Cannot utime: Input/output error > tar: RR274x/Driver: Cannot change ownership to uid 0, gid 1000: Input/output > error > tar: RR274x/Driver: Cannot change mode to rwxr-xr-x: Input/output error > tar: RR274x: Cannot utime: Input/output error > tar: RR274x: Cannot change ownership to uid 0, gid 1000: Input/output error > tar: RR274x: Cannot change mode to rwxr-xr-x: Input/output error > tar: Error is not recoverable: exiting now > > > dmesg: > [131329.013475] XFS (md0): Mounting V4 Filesystem > [131329.918438] XFS (md0): Ending clean mount > [131499.357099] XFS (md0): Mounting V4 Filesystem > [131499.709248] XFS (md0): Ending clean mount > [131874.545344] loop: module loaded > [131874.549914] XFS (loop0): Mounting V4 Filesystem > [131874.555540] XFS (loop0): Ending clean mount > [132020.964431] XFS (loop0): xfs_iread: validation failed for inode > 124656869424 failed > [132020.964435] ffff88028b078000: 49 4e 00 00 03 02 00 00 00 30 00 70 00 00 > 03 e8 IN.......0.p.... > [132020.964437] ffff88028b078010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 00 00 > 00 16 ..... .o........ > [132020.964438] ffff88028b078020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c 00 00 > 00 20 .W7.+]"...a.... > [132020.964440] ffff88028b078030: ff ff 00 d2 1b f6 27 90 00 00 00 00 00 00 > 00 00 ......'......... > [132020.964454] XFS (loop0): Internal error xfs_iread at line 392 of file > /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. Caller > xfs_iget+0x24b/0x690 [xfs] > [132020.964457] CPU: 2 PID: 21474 Comm: tar Not tainted 3.16.0-4-amd64 #1 > Debian 3.16.7-ckt11-1 > [132020.964459] Hardware name: To be filled by O.E.M. To be filled by > O.E.M./SABERTOOTH 990FX R2.0, BIOS 1503 01/11/2013 > [132020.964460] 0000000000000001 ffffffff8150b405 ffff880424059800 > ffffffffa09115cb > [132020.964463] 0000018800000010 ffffffffa0916f6b ffff88030f5c6c00 > ffff880424059800 > [132020.964465] 0000000000000075 ffff8800ad1afe98 ffffffffa095cb3a > ffffffffa0916f6b > [132020.964467] Call Trace: > [132020.964471] [] ? dump_stack+0x41/0x51 > [132020.964478] [] ? xfs_corruption_error+0x5b/0x80 [xfs] > [132020.964483] [] ? xfs_iget+0x24b/0x690 [xfs] > [132020.964492] [] ? xfs_iread+0xea/0x400 [xfs] > [132020.964497] [] ? xfs_iget+0x24b/0x690 [xfs] > [132020.964503] [] ? xfs_iget+0x24b/0x690 [xfs] > [132020.964511] [] ? xfs_ialloc+0xa6/0x500 [xfs] > [132020.964517] [] ? kmem_zone_alloc+0x6e/0xe0 [xfs] > [132020.964525] [] ? xfs_dir_ialloc+0x62/0x2a0 [xfs] > [132020.964531] [] ? xfs_trans_reserve+0x1f5/0x200 [xfs] > [132020.964538] [] ? xfs_create+0x489/0x700 [xfs] > [132020.964541] [] ? kern_path_create+0xaa/0x190 > [132020.964548] [] ? xfs_generic_create+0xca/0x250 [xfs] > [132020.964550] [] ? vfs_mkdir+0xb0/0x160 > [132020.964551] [] ? SyS_mkdirat+0xab/0xe0 > [132020.964554] [] ? > system_call_fast_compare_end+0x10/0x15 > [132020.964555] XFS (loop0): Corruption detected. Unmount and run xfs_repair > [132020.964564] XFS (loop0): Internal error xfs_trans_cancel at line 959 of > file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. Caller > xfs_create+0x2b2/0x700 [xfs] > [132020.964566] CPU: 2 PID: 21474 Comm: tar Not tainted 3.16.0-4-amd64 #1 > Debian 3.16.7-ckt11-1 > [132020.964567] Hardware name: To be filled by O.E.M. To be filled by > O.E.M./SABERTOOTH 990FX R2.0, BIOS 1503 01/11/2013 > [132020.964568] 000000000000000c ffffffff8150b405 ffff8800ad1afe98 > ffffffffa0925e07 > [132020.964570] ffff880002530800 ffff880079e03ec8 ffff880424059800 > ffffffffa09577d2 > [132020.964571] 0000000000000001 ffff880079e03e20 ffff880079e03e1c > ffff880079e03eb0 > [132020.964573] Call Trace: > [132020.964575] [] ? dump_stack+0x41/0x51 > [132020.964581] [] ? xfs_trans_cancel+0xc7/0xf0 [xfs] > [132020.964588] [] ? xfs_create+0x2b2/0x700 [xfs] > [132020.964590] [] ? kern_path_create+0xaa/0x190 > [132020.964596] [] ? xfs_generic_create+0xca/0x250 [xfs] > [132020.964598] [] ? vfs_mkdir+0xb0/0x160 > [132020.964600] [] ? SyS_mkdirat+0xab/0xe0 > [132020.964602] [] ? > system_call_fast_compare_end+0x10/0x15 > [132020.964604] XFS (loop0): xfs_do_force_shutdown(0x8) called from line 960 > of file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. Return > address = 0xffffffffa0925e20 > [132021.196487] XFS (loop0): Corruption of in-memory data detected. Shutting > down filesystem > [132021.196491] XFS (loop0): Please umount the filesystem and rectify the > problem(s) > [132024.791456] XFS (loop0): xfs_log_force: error 5 returned. > [132054.854625] XFS (loop0): xfs_log_force: error 5 returned. > [132084.917775] XFS (loop0): xfs_log_force: error 5 returned. > [132114.980927] XFS (loop0): xfs_log_force: error 5 returned. > [132145.044086] XFS (loop0): xfs_log_force: error 5 returned. > [132175.107307] XFS (loop0): xfs_log_force: error 5 returned. > [132205.170404] XFS (loop0): xfs_log_force: error 5 returned. > [132235.233587] XFS (loop0): xfs_log_force: error 5 returned. > > > On 8/2/2015 3:24 PM, Leslie Rhorer wrote: > > > > OK, this is goofy. It seems to be working, now. As usual, I've > >been doing some work on the server this weekend, but I can't think of > >anything I have done that would fix the issue. I did replace the > >remaining good 4G RAM module with a pair of 8G RAM modules, but memtest > >reported the remaining 4G module as good, and I verified the removed > >module really was bad. I also replaced the removable drive carrier and > >cables that were feeding the two SSDs, once of which was reporting > >failures as noted in the syslog. It's hard for me to believe either of > >those things could have been causing the issue, though. > > > > I attached a 1.5T external drive to the server and formatted it as > >XFS in preparation to continue troubleshooting. To make sure of things, > >I tried decompressing the tarball, again, and this time it worked all > >the way to the end. I then deleted the entire directory structure > >created by the tarball and decompressed the file again twice. I'll see > >if the rsync process works. That will take a couple of days. > > > >On 7/28/2015 5:11 PM, Brian Foster wrote: > >>On Tue, Jul 28, 2015 at 10:13:01AM -0500, Leslie Rhorer wrote: > >>>On 7/28/2015 7:33 AM, Brian Foster wrote: > >>>>On Tue, Jul 28, 2015 at 02:46:45AM -0500, Leslie Rhorer wrote: > >>>>>On 7/20/2015 6:17 AM, Brian Foster wrote: > >>>>>>On Sat, Jul 18, 2015 at 08:02:50PM -0500, Leslie Rhorer wrote: > >>>>>>> > >>... > >>>> > >>>>> I then copied both the tarball and the image over to the root, > >>>>>and while > >>>>>the system would not let me create the image on the root, it did > >>>>>let me copy > >>>>>the image to the root. I then umounted the RAID array, mounted the > >>>>>image, > >>>>>and attempted to cd to the original directory in the image mount > >>>>>where the > >>>>>tarball was saved. That failed with an I/O error: > >>>>> > >>>> > >>>>It sounds a bit strange for the mdrestore to fail on root but a cp of > >>>>the resulting image to work. Do the resulting images have the same file > >>>>size or is the rootfs copy truncated? If the latter, you could be > >>>>missing part of the fs and thus any of the following tests are probably > >>>>moot. > >>> > >>> Well, it can't be as large as it is reported, let's put it that way, > >>>although the reported file size is the same. Ls claims it to be 16T in > >>>size, which cannot be the case on a 100G partition. I forgot to > >>>mention cp > >>>does complain: > >>> > >>>RAID-Server:/# cp /RAID/TEST/RAIDfile.img ./ > >>>cp: cannot lseek ‘./RAIDfile.img’: Invalid argument > >>> > >>> But it does the same thing on the backup server, and it works > >>>there. I > >>>tried a cmp, and it seems to be hung. It just may be taking a long > >>>time, > >>>however. > >>> > >> > >>Yeah, you can't really trust the resulting image. It doesn't take much > >>space to create a very large sparse file, but different filesystems have > >>different maximum file size limits. The problem here is that some > >>metadata near the beginning of the file might reference or depend on > >>something near the end, and I/Os beyond the end of the file will > >>probably result in errors. > >> > >>I'd probably try the nouuid approach since the hardware is similar as > >>well as some of the other interesting suggestions that have been made to > >>try and get the image on the rootfs and see what happens there too. > >> > >>Brian > >> > >>>>Brian > >>>> > >>>>>RAID-Server:/# cd "/media/Server-Main/Equipment/Drive > >>>>>Controllers/HighPoint > >>>>>Adapters/Rocket 2722/Driver/" > >>>>>bash: cd: /media/Server-Main/Equipment/Drive Controllers/HighPoint > >>>>>Adapters/Rocket 2722/Driver/: Input/output error > >>>>> > >>>>> I changed directories to a point two directories above the > >>>>>previous attempt > >>>>>and did a long listing: > >>>>> > >>>>>RAID-Server:/# cd "/media/Server-Main/Equipment/Drive > >>>>>Controllers/HighPoint > >>>>>Adapters" > >>>>>RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint > >>>>>Adapters# ll > >>>>>ls: cannot access RocketRAID 2722: Input/output error > >>>>>total 4 > >>>>>drwxr-xr-x 6 root lrhorer 4096 Jul 18 19:26 Rocket 2722 > >>>>>?????????? ? ? ? ? ? RocketRAID 2722 > >>>>> > >>>>> As you can see, Rocket 2722 is still there, but RocketRAID 2722 > >>>>>is very > >>>>>sick. Rocket 2722 is the parent of where the tarbal was, however, > >>>>>so I did > >>>>>a cd and an ll again: > >>>>> > >>>>>RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint > >>>>>Adapters# cd "Rocket 2722"/ > >>>>>RAID-Server:/media/Server-Main/Equipment/Drive Controllers/HighPoint > >>>>>Adapters/Rocket 2722# ll > >>>>>ls: cannot access BIOS: Input/output error > >>>>>ls: cannot access Driver: Input/output error > >>>>>ls: cannot access HighPoint RAID Management Software: Input/output > >>>>>error > >>>>>ls: cannot access Manual: Input/output error > >>>>>total 248 > >>>>>-rwxr--r-- 1 root lrhorer 245760 Nov 20 2008 autorun.exe > >>>>>-rwxr--r-- 1 root lrhorer 51 Mar 21 2001 autorun.inf > >>>>>?????????? ? ? ? ? ? BIOS > >>>>>?????????? ? ? ? ? ? Driver > >>>>>?????????? ? ? ? ? ? HighPoint RAID > >>>>>Management > >>>>>Software > >>>>>?????????? ? ? ? ? ? Manual > >>>>>-rwxr--r-- 1 root lrhorer 1134 Feb 5 2012 readme.txt > >>>>> > >>>>> So now, what? > >>>>> > >>>>>_______________________________________________ > >>>>>xfs mailing list > >>>>>xfs@oss.sgi.com > >>>>>http://oss.sgi.com/mailman/listinfo/xfs > >>>> > >>> > >>>_______________________________________________ > >>>xfs mailing list > >>>xfs@oss.sgi.com > >>>http://oss.sgi.com/mailman/listinfo/xfs > >> > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Tue Aug 4 09:20:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 67AC77FAD for ; Tue, 4 Aug 2015 09:20:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C168304090 for ; Tue, 4 Aug 2015 07:20:12 -0700 (PDT) X-ASG-Debug-ID: 1438698002-04cb6c673e2c5860001-NocioJ Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by cuda.sgi.com with ESMTP id EQRCUEFO6pU5fRiv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 07:20:03 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.37 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t74EJehP039423; Tue, 4 Aug 2015 10:19:40 -0400 Date: Tue, 4 Aug 2015 10:19:40 -0400 (EDT) From: Jan Tulak To: Christoph Hellwig Cc: xfs@oss.sgi.com Message-ID: <773923690.2696215.1438697980321.JavaMail.zimbra@redhat.com> In-Reply-To: <20150804111812.GD18906@infradead.org> References: <1438612789-17486-5-git-send-email-jtulak@redhat.com> <1438680314-23950-1-git-send-email-jtulak@redhat.com> <20150804111812.GD18906@infradead.org> Subject: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.5.173] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: Add ifdef dirent checks where it was missing Thread-Index: /v3s+UanmCD+CLaT2Kj94hyqO5KtcA== X-Barracuda-Connect: mx5-phx2.redhat.com[209.132.183.37] X-Barracuda-Start-Time: 1438698002 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21338 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Christoph Hellwig" > > Needs to be fixed to avoid > 80 char lines. > I don't see any >80 char line in this patch. O_o The longest line is 73 in the code and 62 in commit message. Though... maybe it can be a tab width issue? I use four spaces for a tab... Cheers, Jan -- Jan Tulak jtulak@redhat.com From ferseiti@linux.vnet.ibm.com Tue Aug 4 10:24:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 207307FA8 for ; Tue, 4 Aug 2015 10:24:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F24348F8049 for ; Tue, 4 Aug 2015 08:24:13 -0700 (PDT) X-ASG-Debug-ID: 1438701851-04cb6c67402c9560001-NocioJ Received: from e24smtp04.br.ibm.com (e24smtp04.br.ibm.com [32.104.18.25]) by cuda.sgi.com with ESMTP id FVnDsDtp1Idf3Lo7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 08:24:12 -0700 (PDT) X-Barracuda-Envelope-From: ferseiti@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 32.104.18.25 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.25] Received: from /spool/local by e24smtp04.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 4 Aug 2015 12:24:10 -0300 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.25] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.25] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.25] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.25] Received: from d24dlp01.br.ibm.com (9.18.248.204) by e24smtp04.br.ibm.com (10.172.0.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 4 Aug 2015 12:24:08 -0300 X-Helo: d24dlp01.br.ibm.com X-MailFrom: ferseiti@linux.vnet.ibm.com X-RcptTo: xfs@oss.sgi.com Received: from d24relay01.br.ibm.com (d24relay01.br.ibm.com [9.8.31.16]) by d24dlp01.br.ibm.com (Postfix) with ESMTP id 0D8E83520078 for ; Tue, 4 Aug 2015 11:23:02 -0400 (EDT) Received: from d24av04.br.ibm.com (d24av04.br.ibm.com [9.8.31.97]) by d24relay01.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t74FOUdO5071038 for ; Tue, 4 Aug 2015 12:24:30 -0300 Received: from d24av04.br.ibm.com (localhost [127.0.0.1]) by d24av04.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t74FO6ZF013716 for ; Tue, 4 Aug 2015 12:24:06 -0300 Received: from oc0745135144.ibm.com (oc0745135144.ibm.com.br.ibm.com [9.18.235.179]) by d24av04.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t74FO6RG013703; Tue, 4 Aug 2015 12:24:06 -0300 Message-ID: <55C0D916.1010102@linux.vnet.ibm.com> Date: Tue, 04 Aug 2015 12:24:06 -0300 From: Fernando Seiti Furusato User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner , 793495@bugs.debian.org CC: Daniel Bast , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el In-Reply-To: <20150802221301.GO3902@dastard> Content-Type: multipart/mixed; boundary="------------050603000107000200000907" X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15080415-0029-0000-0000-00000429E7F1 X-Barracuda-Connect: e24smtp04.br.ibm.com[32.104.18.25] X-Barracuda-Start-Time: 1438701852 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a multi-part message in MIME format. --------------050603000107000200000907 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi Dave. I have just noticed that for config.guess and config.sub to be updated, no autoreconf or dh_autotools-dev is needed, because of how Makefile was made. In Makefile, @row 80: LIBTOOLIZE_INSTALL = `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` configure: libtoolize -c $(LIBTOOLIZE_INSTALL) -f cp include/install-sh . aclocal -I m4 autoconf This runs libtoolize -c -i which updates those files. The file debian/rules runs `make default`, which at some point calls the target above (`make configure`). But the file configure already exists, so it does not run. Curiously, running `dpkg-buildpackage` twice, causes configure file to be deleted, and the build completes without errors. So, answering to your question: > Nowdays, the generated files in the 3.2.4 tarball created via a > 'make dist' rule. I run that on an up to date debian unstable box > with autoconfig 2.69 installed to generate the files, so the > question I have is this: why is an up-to-date build box generating > "out of date" configure/m4 scripts? What, exactly, is out of date, > and how do I ensure that the pre-build config files are correctly > up-to-date? The configure file comes shipped with the debian package, so that specific file is not re-generated and is always out of date. By the looks of the Makefile, there is no need to include autoreconf or autotools-dev in debian/rules, but to force `make distclean` to `rm configure`. Attached is a patch that summarizes that, but for some reason it does not work when running with parallel jobs enabled. But you can get the idea :) Regards. -- Fernando Seiti Furusato IBM Linux Technology Center --------------050603000107000200000907 Content-Type: text/plain; charset=UTF-8; name="patch_xfsprogs.debdiff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="patch_xfsprogs.debdiff" diff -Nru xfsprogs-3.2.4/debian/changelog xfsprogs-3.2.4ppc64el1/debian/changelog --- xfsprogs-3.2.4/debian/changelog 2015-07-30 03:45:12.000000000 -0400 +++ xfsprogs-3.2.4ppc64el1/debian/changelog 2015-08-04 11:07:37.000000000 -0400 @@ -1,3 +1,10 @@ +xfsprogs (3.2.4ppc64el1) UNRELEASED; urgency=medium + + * debian/rules: removed usage of dh_autoreconf since it is not necessary. + * Makefile: change distclean target to remove configure every time. + + -- Fernando Seiti Furusato Tue, 04 Aug 2015 11:07:01 -0400 + xfsprogs (3.2.4) unstable; urgency=low * New upstream release diff -Nru xfsprogs-3.2.4/debian/rules xfsprogs-3.2.4ppc64el1/debian/rules --- xfsprogs-3.2.4/debian/rules 2014-11-09 19:51:18.000000000 -0500 +++ xfsprogs-3.2.4ppc64el1/debian/rules 2015-08-04 11:06:56.000000000 -0400 @@ -35,7 +35,6 @@ .census: @echo "== dpkg-buildpackage: configure" 1>&2 $(checkdir) - AUTOHEADER=/bin/true dh_autoreconf $(options) $(MAKE) include/platform_defs.h touch .census @@ -58,7 +57,6 @@ $(MAKE) distclean -rm -rf $(dirme) $(dirdev) $(dirdi) -rm -f debian/*substvars debian/files* debian/*.debhelper - dh_autoreconf_clean dh_clean binary-indep: diff -Nru xfsprogs-3.2.4/Makefile xfsprogs-3.2.4ppc64el1/Makefile --- xfsprogs-3.2.4/Makefile 2013-10-10 17:07:16.000000000 -0400 +++ xfsprogs-3.2.4ppc64el1/Makefile 2015-08-04 11:06:40.000000000 -0400 @@ -116,7 +116,7 @@ $(Q)$(MAKE) $(MAKEOPTS) -C $* install-qa distclean: clean - $(Q)rm -f $(LDIRT) + $(Q)rm -f $(LDIRT) $(CONFIGURE) realclean: distclean $(Q)rm -f $(CONFIGURE) .gitcensus --------------050603000107000200000907-- From debbugs@buxtehude.debian.org Tue Aug 4 10:27:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 133827FA8 for ; Tue, 4 Aug 2015 10:27:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B49468F8049 for ; Tue, 4 Aug 2015 08:27:11 -0700 (PDT) X-ASG-Debug-ID: 1438702029-04bdf06bd0203960001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id zdKGrWeoJZTDzZjJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 08:27:09 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZMe7P-0001Ta-Ce; Tue, 04 Aug 2015 15:27:07 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Fernando Seiti Furusato , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Fernando Seiti Furusato Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Tue, 04 Aug 2015 15:27:05 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.14387018634605 (code B ref 793495); Tue, 04 Aug 2015 15:27:05 +0000 Received: (at 793495) by bugs.debian.org; 4 Aug 2015 15:24:23 +0000 Received: from e24smtp04.br.ibm.com ([32.104.18.25]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_CAMELLIA_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1ZMe4k-0001Bd-Qc for 793495@bugs.debian.org; Tue, 04 Aug 2015 15:24:23 +0000 Received: from /spool/local by e24smtp04.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for <793495@bugs.debian.org> from ; Tue, 4 Aug 2015 12:24:10 -0300 Received: from d24dlp02.br.ibm.com (9.18.248.206) by e24smtp04.br.ibm.com (10.172.0.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 4 Aug 2015 12:24:08 -0300 X-Helo: d24dlp02.br.ibm.com X-MailFrom: ferseiti@linux.vnet.ibm.com X-RcptTo: 793495@bugs.debian.org Received: from d24relay01.br.ibm.com (d24relay01.br.ibm.com [9.8.31.16]) by d24dlp02.br.ibm.com (Postfix) with ESMTP id 248CC1DC0071 for <793495@bugs.debian.org>; Tue, 4 Aug 2015 11:23:06 -0400 (EDT) Received: from d24av04.br.ibm.com (d24av04.br.ibm.com [9.8.31.97]) by d24relay01.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t74FOUt64591752 for <793495@bugs.debian.org>; Tue, 4 Aug 2015 12:24:30 -0300 Received: from d24av04.br.ibm.com (localhost [127.0.0.1]) by d24av04.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t74FO6Z9013716 for <793495@bugs.debian.org>; Tue, 4 Aug 2015 12:24:06 -0300 Received: from oc0745135144.ibm.com (oc0745135144.ibm.com.br.ibm.com [9.18.235.179]) by d24av04.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t74FO6RG013703; Tue, 4 Aug 2015 12:24:06 -0300 Message-ID: <55C0D916.1010102@linux.vnet.ibm.com> Date: Tue, 04 Aug 2015 12:24:06 -0300 From: Fernando Seiti Furusato User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner , 793495@bugs.debian.org CC: Daniel Bast , xfs@oss.sgi.com, Breno Leitao References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> In-Reply-To: <20150802221301.GO3902@dastard> Content-Type: multipart/mixed; boundary="------------050603000107000200000907" X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15080415-0029-0000-0000-00000429E7F0 X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438702029 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. --------------050603000107000200000907 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi Dave. I have just noticed that for config.guess and config.sub to be updated, no autoreconf or dh_autotools-dev is needed, because of how Makefile was made. In Makefile, @row 80: LIBTOOLIZE_INSTALL = `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` configure: libtoolize -c $(LIBTOOLIZE_INSTALL) -f cp include/install-sh . aclocal -I m4 autoconf This runs libtoolize -c -i which updates those files. The file debian/rules runs `make default`, which at some point calls the target above (`make configure`). But the file configure already exists, so it does not run. Curiously, running `dpkg-buildpackage` twice, causes configure file to be deleted, and the build completes without errors. So, answering to your question: > Nowdays, the generated files in the 3.2.4 tarball created via a > 'make dist' rule. I run that on an up to date debian unstable box > with autoconfig 2.69 installed to generate the files, so the > question I have is this: why is an up-to-date build box generating > "out of date" configure/m4 scripts? What, exactly, is out of date, > and how do I ensure that the pre-build config files are correctly > up-to-date? The configure file comes shipped with the debian package, so that specific file is not re-generated and is always out of date. By the looks of the Makefile, there is no need to include autoreconf or autotools-dev in debian/rules, but to force `make distclean` to `rm configure`. Attached is a patch that summarizes that, but for some reason it does not work when running with parallel jobs enabled. But you can get the idea :) Regards. -- Fernando Seiti Furusato IBM Linux Technology Center --------------050603000107000200000907 Content-Type: text/plain; charset=UTF-8; name="patch_xfsprogs.debdiff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="patch_xfsprogs.debdiff" diff -Nru xfsprogs-3.2.4/debian/changelog xfsprogs-3.2.4ppc64el1/debian/changelog --- xfsprogs-3.2.4/debian/changelog 2015-07-30 03:45:12.000000000 -0400 +++ xfsprogs-3.2.4ppc64el1/debian/changelog 2015-08-04 11:07:37.000000000 -0400 @@ -1,3 +1,10 @@ +xfsprogs (3.2.4ppc64el1) UNRELEASED; urgency=medium + + * debian/rules: removed usage of dh_autoreconf since it is not necessary. + * Makefile: change distclean target to remove configure every time. + + -- Fernando Seiti Furusato Tue, 04 Aug 2015 11:07:01 -0400 + xfsprogs (3.2.4) unstable; urgency=low * New upstream release diff -Nru xfsprogs-3.2.4/debian/rules xfsprogs-3.2.4ppc64el1/debian/rules --- xfsprogs-3.2.4/debian/rules 2014-11-09 19:51:18.000000000 -0500 +++ xfsprogs-3.2.4ppc64el1/debian/rules 2015-08-04 11:06:56.000000000 -0400 @@ -35,7 +35,6 @@ .census: @echo "== dpkg-buildpackage: configure" 1>&2 $(checkdir) - AUTOHEADER=/bin/true dh_autoreconf $(options) $(MAKE) include/platform_defs.h touch .census @@ -58,7 +57,6 @@ $(MAKE) distclean -rm -rf $(dirme) $(dirdev) $(dirdi) -rm -f debian/*substvars debian/files* debian/*.debhelper - dh_autoreconf_clean dh_clean binary-indep: diff -Nru xfsprogs-3.2.4/Makefile xfsprogs-3.2.4ppc64el1/Makefile --- xfsprogs-3.2.4/Makefile 2013-10-10 17:07:16.000000000 -0400 +++ xfsprogs-3.2.4ppc64el1/Makefile 2015-08-04 11:06:40.000000000 -0400 @@ -116,7 +116,7 @@ $(Q)$(MAKE) $(MAKEOPTS) -C $* install-qa distclean: clean - $(Q)rm -f $(LDIRT) + $(Q)rm -f $(LDIRT) $(CONFIGURE) realclean: distclean $(Q)rm -f $(CONFIGURE) .gitcensus --------------050603000107000200000907-- From jtulak@redhat.com Tue Aug 4 10:30:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB17B7FA8 for ; Tue, 4 Aug 2015 10:30:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8EF5C8F8037 for ; Tue, 4 Aug 2015 08:30:55 -0700 (PDT) X-ASG-Debug-ID: 1438702252-04bdf06bd1203d20001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id 6pMdKFWlEVt2VBOb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Aug 2015 08:30:53 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t74FUUVb001249; Tue, 4 Aug 2015 11:30:30 -0400 Date: Tue, 4 Aug 2015 11:30:30 -0400 (EDT) From: Jan Tulak To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com Message-ID: <1050814645.2742881.1438702230663.JavaMail.zimbra@redhat.com> In-Reply-To: <55BFA2C5.20408@redhat.com> References: <1156743222.24471614.1436281858017.JavaMail.zimbra@redhat.com> <1436346893-11831-1-git-send-email-jtulak@redhat.com> <1508777144.956841.1437482376774.JavaMail.zimbra@redhat.com> <20150726162530.GE29329@infradead.org> <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> <55BFA2C5.20408@redhat.com> Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v3] xfsprogs: blkid is now mandatory Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.5.173] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: blkid is now mandatory Thread-Index: JhqfBJDlOd0lG3U0QhbqN3FEWFEHlw== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1438702253 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.03 X-Barracuda-Spam-Status: No, SCORE=0.03 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain ----- Original Message ----- > From: "Eric Sandeen" > To: "Jan Tulak" , "Christoph Hellwig" > Cc: xfs@oss.sgi.com > Sent: Monday, August 3, 2015 7:20:05 PM > Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory > > On 8/3/15 3:40 AM, Jan Tulak wrote: > > > > > > ----- Original Message ----- > >> From: "Christoph Hellwig" > >> > >> On Tue, Jul 21, 2015 at 08:39:36AM -0400, Jan Tulak wrote: > >>> I just found that while it is possible to get blkid on OS X, it is > >>> in 1.0.0 version which doesn't have blkid_probe_get function. > >>> I'm examining whether it is possible to get an updated version there, > >>> but right now, this patch breaks OS X support. Unfortunately I didn't > >>> noticed of this before, as the OS X port was terribly out of date. > >>> > >>> So this patch shouldn't be included until I find how to get around. > >> > >> I don't think this is a lbocker given that OSX support doesn't > >> even work. > >> > >> To the contrary I'd really prefer to go in ASAP to avoid anyone > >> relying on it longer than nessecary. > > > > I tried to get newer blkid on OSX, but so far without a big success > > (well, it looks like a kind of a small dependency hell that would > > have to be ported, with bigger or smaller effort...). With regards > > on the priorities, I think if we can make the OS X support in > > "manual patching required" way, then? > > > > So lets include this patch, and just note it OS X doc "you have to revert > > commit XXX and re-apply any changes to the relevant code"? > > IIRC block device signature detection isn't really required, it's just > a nice-to-have; perhaps if blkid isn't present, that functionality can > simply be disabled? Signature detection (if I understand you correctly 'signature of existing FS') could be really disabled, I think. That would take care of check_overwrite(). However, blkid is also used in get_topology. That one calls blkid_get_topology, which uses blkid's functions for finding out sector and io sizes. What I really can do is to say "on osx, you can mkfs only files," and cut out the blkid parts. But it limits the usage on OS X even further. Although, the removed code for non-blkid systems used platform_findsizes as fallback. Are there some ugly, terrible monsters who would jump from under the bed when doing that? However, this patch affects only mkfs. It still should be possible to use xfs_db and xfs_repair even on block devices. Cheers, Jan -- Jan Tulak jtulak@redhat.com From sandeen@sandeen.net Tue Aug 4 11:24:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCDB37FAE for ; Tue, 4 Aug 2015 11:24:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4E635AC004 for ; Tue, 4 Aug 2015 09:24:35 -0700 (PDT) X-ASG-Debug-ID: 1438705473-04bdf06bd0207450001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id z0vD9gspfQsK19kO for ; Tue, 04 Aug 2015 09:24:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1604161C8FDF; Tue, 4 Aug 2015 11:24:28 -0500 (CDT) Message-ID: <55C0E73B.1000904@sandeen.net> Date: Tue, 04 Aug 2015 09:24:27 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Jan Tulak , Eric Sandeen CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory References: <1156743222.24471614.1436281858017.JavaMail.zimbra@redhat.com> <1436346893-11831-1-git-send-email-jtulak@redhat.com> <1508777144.956841.1437482376774.JavaMail.zimbra@redhat.com> <20150726162530.GE29329@infradead.org> <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> <55BFA2C5.20408@redhat.com> <1050814645.2742881.1438702230663.JavaMail.zimbra@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfsprogs: blkid is now mandatory In-Reply-To: <1050814645.2742881.1438702230663.JavaMail.zimbra@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438705474 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21341 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/4/15 8:30 AM, Jan Tulak wrote: > > > ----- Original Message ----- >> From: "Eric Sandeen" >> To: "Jan Tulak" , "Christoph Hellwig" >> Cc: xfs@oss.sgi.com >> Sent: Monday, August 3, 2015 7:20:05 PM >> Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory >> >> On 8/3/15 3:40 AM, Jan Tulak wrote: >>> >>> >>> ----- Original Message ----- >>>> From: "Christoph Hellwig" >>>> >>>> On Tue, Jul 21, 2015 at 08:39:36AM -0400, Jan Tulak wrote: >>>>> I just found that while it is possible to get blkid on OS X, it is >>>>> in 1.0.0 version which doesn't have blkid_probe_get function. >>>>> I'm examining whether it is possible to get an updated version there, >>>>> but right now, this patch breaks OS X support. Unfortunately I didn't >>>>> noticed of this before, as the OS X port was terribly out of date. >>>>> >>>>> So this patch shouldn't be included until I find how to get around. >>>> >>>> I don't think this is a lbocker given that OSX support doesn't >>>> even work. >>>> >>>> To the contrary I'd really prefer to go in ASAP to avoid anyone >>>> relying on it longer than nessecary. >>> >>> I tried to get newer blkid on OSX, but so far without a big success >>> (well, it looks like a kind of a small dependency hell that would >>> have to be ported, with bigger or smaller effort...). With regards >>> on the priorities, I think if we can make the OS X support in >>> "manual patching required" way, then? >>> >>> So lets include this patch, and just note it OS X doc "you have to revert >>> commit XXX and re-apply any changes to the relevant code"? >> >> IIRC block device signature detection isn't really required, it's just >> a nice-to-have; perhaps if blkid isn't present, that functionality can >> simply be disabled? > > Signature detection (if I understand you correctly 'signature of existing > FS') could be really disabled, I think. That would take care of > check_overwrite(). However, blkid is also used in get_topology. That one > calls blkid_get_topology, which uses blkid's functions for finding out > sector and io sizes. Well, it would be sane to default to 512 sectors; if that fails it'll be obvious fairly quickly, and the user can always use the command line to specify 4k sectors (or stripe alignment, etc) manually. > What I really can do is to say "on osx, you can mkfs only files," and cut bleah! ;) > out the blkid parts. But it limits the usage on OS X even further. > Although, the removed code for non-blkid systems used platform_findsizes > as fallback. Are there some ugly, terrible monsters who would jump from > under the bed when doing that? Well, the old findsizes was there for this reason, but now it's gone ;) > However, this patch affects only mkfs. It still should be possible to use > xfs_db and xfs_repair even on block devices. I don't know how invasive it'd be, but I think in the absence of blkid, we should still work, but lose signature detection, and fall back to geometry defaults. -Eric From ac@a.wandaec.net Tue Aug 4 15:42:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=DEAR_SOMETHING,FREEMAIL_FROM, SUBJ_ALL_CAPS,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 59D1A7FAE for ; Tue, 4 Aug 2015 15:42:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42C0A304032 for ; Tue, 4 Aug 2015 13:42:46 -0700 (PDT) X-ASG-Debug-ID: 1438720964-04cbb0416f25fec0001-NocioJ Received: from a.wandaec.net ([175.154.101.194]) by cuda.sgi.com with SMTP id vdw6tIpGstW2vMwy for ; Tue, 04 Aug 2015 13:42:44 -0700 (PDT) X-Barracuda-Envelope-From: ac@a.wandaec.net X-Barracuda-Apparent-Source-IP: 175.154.101.194 Received: from 58.251.146.26 (HELO BHBDZWQB); Wed, 5 Aug 2015 04:42:37 +0800 Date: Wed, 5 Aug 2015 04:42:18 +0800 From: "jane" <3207947485@qq.com> Reply-To: sales@shop-led.net To: "xfs" Subject: LED LED BULBS Message-ID: <201508050442188434634@a.wandaec.net> X-ASG-Orig-Subj: LED LED BULBS X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[175.154.101.194] X-Barracuda-Start-Time: 1438720964 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.47 X-Barracuda-Spam-Status: No, SCORE=2.47 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, RDNS_NONE, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 RGVhciBzaXJzIG9yIG1hZGFtLA0KDQpUaGlzIGlzIGphbmUgZnJvbSBTaGVuemhlbiBSdWlzaGVu ZyBJbnRlcm5hdGlvbmFsIEluZHVzdHJpYWwsd2hvIHNwZWNpYWxpemUgaW4gbWFudWZhY3R1cmlu ZyBMRUQgbGlnaHQgLGJ1bGIsZG93biBsaWdodCBhbmQgc29tZSByZWxhdGVkIGl0ZW1zLA0KDQpB bGwgb2Ygb3VyIGl0ZW1zIGFyZSB3aXRoIGV4Y2VsbGVudCBxdWFsaXR5IGFuZCByZWFzb25hYmxl IHByaWNlIUhvcGUgdG8gZW50ZXIgYnVzaW5lc3Mgd2l0aCB5b3UhDQoNCg0KRW5jbG9zZWQgaXMg b3VyIGNvbXBhbnkgY2F0YWxvZ3VlLlBscyBraW5kbHkgY2hlY2sgYW5kIHJldmVydCBhdCB5b3Vy IGVhcmxpc3QhDQoNClRoYW5rcyBhbmQgYmVzdCByZWdhcmRzLA0KamFuZQ0KDQpTaGVuemhlbiBS dWlzaGVuZyBJbnRlcm5hdGlvbmFsIEluZHVzdHJpYWwgTGltaXRlZA0Kd2ViOnd3dy5zaG9wLWxl ZC5uZXQgDQptYWlsOmphbmVAc2hvcC1sZWQubmV0ICAzMjA3OTQ3NDg1QHFxLmNvbQ0KUlVJIFNI RU5HIElOVEVSTkFUSU9OQUwgSU5EVVNUUklBTCBMSU1JVEVEDQpGICsgODYtMDc1NS04MzE0Njgx MiAgICBNKyA4Ni0xMzEzODU5ODgyOQ0KU2t5cGU6amFuZUBzaG9wLWxlZC5uZXQgICAgIFFROjMy MDc5NDc0ODU= From david@fromorbit.com Tue Aug 4 17:43:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A6AB67FAE for ; Tue, 4 Aug 2015 17:43:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2BF60AC001 for ; Tue, 4 Aug 2015 15:42:58 -0700 (PDT) X-ASG-Debug-ID: 1438728175-04cb6c673e2e3830001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id xOSR6QG9bDL8Mv9h for ; Tue, 04 Aug 2015 15:42:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DRBgCYP8FV/20mLHlbgxuBPalOAQEBAQEBBpsaAgIBAQKBO00BAQEBAQGBC4QkAQEEOhwjEAgDDgoJJQ8FJQMhE4gtyk4BAQEHAgEfGYYGhTCEOQZJB4QsBYcXhl+HBIxOgUmHNoYkijQmggsfgWUsMYEGAR4HgSABAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 08:12:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMkuu-00051O-QP; Wed, 05 Aug 2015 08:42:40 +1000 Date: Wed, 5 Aug 2015 08:42:40 +1000 From: Dave Chinner To: Leslie Rhorer Cc: Brian Foster , Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble Message-ID: <20150804224240.GU16638@dastard> X-ASG-Orig-Subj: Re: XFS File system in trouble References: <03864DDC681E664EBF5D47682BE7D7CF0D358740@USADCWVEMBX07.corp.global.level3.com> <55AAF73A.4040903@mygrande.net> <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C06F41.4030502@mygrande.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438728175 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21349 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 04, 2015 at 02:52:33AM -0500, Leslie Rhorer wrote: > It's failing, again. The rsync job failed and when I attempt to > untar the file in the image mount, it fails there, as well. See > below. I formatted a 1.5T drive as xfs and mounted it under /media. > I then dumped the failing FS to a file on /media using xfs_metadump > and used xfs_mdrestore to create an image of the FS. I then mounted > the image, copied over the tarball to its location, and ran tar to > extract the files: > > [131874.545344] loop: module loaded > [131874.549914] XFS (loop0): Mounting V4 Filesystem ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > [131874.555540] XFS (loop0): Ending clean mount > [132020.964431] XFS (loop0): xfs_iread: validation failed for inode 124656869424 failed > [132020.964435] ffff88028b078000: 49 4e 00 00 03 02 00 00 00 30 00 70 00 00 03 e8 IN.......0.p.... > [132020.964437] ffff88028b078010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 00 00 00 16 ..... .o........ > [132020.964438] ffff88028b078020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c 00 00 00 20 .W7.+]"...a.... > [132020.964440] ffff88028b078030: ff ff 00 d2 1b f6 27 90 00 00 00 00 00 00 00 00 ......'......... > [132020.964454] XFS (loop0): Internal error xfs_iread at line 392 of > file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. > Caller xfs_iget+0x24b/0x690 [xfs] That's a different error to all the ones you've previously posted. This is an inode allocation that has found a bad inode on disk. Decoding the 64 bytes above: di_magic = 0x494e di_mode = 0 di_version = 3 <<< That's *wrong* di_format = 2 di_onlink = 0 di_uid = 0x300070 <<< Looks unlikely di_gid = 0x3e8 ---- di_nlink = 0 di_projlo = 0x620 <<< should be zero di_projhi = 0xb06f <<< should be zero di_pad[6] = 0x1 0x2e 0 0 0 0 <<< should be zero di_flushiter = 0x16 <<< should be zero for v3 inode --- di_atime di_mtime di_ctime di_size = 0x20ffff00d2 <<< should be zero ---- di_nblocks = 0x1bf6279000000000 <<< should be zero di_extsize = 0 ---- You've just created and mounted a v4 filesystem, which means it is using v2 inodes. This inode read back as a v3 inode, with lots of crap in places where there should be zeros for either v2 or v3 inodes. This does not look like a filesystem problem - it's clear that what has come from disk (or a cached memory buffer) is full of garbage and contains invalid configuration, and the filesystem has quite correctly detected the corruption and shut down. The filesystem would give the same errors if it tried to *write* such a corrupt block, so we know what was just been detected has not come from the filesytem code... FWIW, I've occasionally seen this sort of thing happen when a power supply had gone bad - it wasn't bad enough to make things fail, it ust caused transient issues under load that manifest as corruptions and crashes. Given that you've already found one set of hardware problems and the corruption patterns are unlike any filesystem/storage problem I've ever seen, I'd suggest that you still have some kind of hardware issue... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 4 17:58:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 294247FB1 for ; Tue, 4 Aug 2015 17:58:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB8C6AC001 for ; Tue, 4 Aug 2015 15:58:36 -0700 (PDT) X-ASG-Debug-ID: 1438729112-04bdf06bd221ef50001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4PVGBtRNDvdweNDc for ; Tue, 04 Aug 2015 15:58:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2COBgAPQ8FV/20mLHlbgxuBPalOAQEBAQEBBpsaBAICgTxNAQEBAQEBgQuEIwEBAQMBOhwjBQsIAxgJJQ8FJQMhE4gmB8pJAQEBAQYCAR8ZhgaFMIUIB4QsBZR6jE6ZVyaEDywxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 08:28:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMlA3-00052O-5r; Wed, 05 Aug 2015 08:58:19 +1000 Date: Wed, 5 Aug 2015 08:58:19 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el Message-ID: <20150804225819.GV16638@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C0D916.1010102@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438729112 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21350 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 04, 2015 at 12:24:06PM -0300, Fernando Seiti Furusato wrote: > Hi Dave. > > I have just noticed that for config.guess and config.sub to be updated, no > autoreconf or dh_autotools-dev is needed, because of how Makefile was made. > > In Makefile, @row 80: > > LIBTOOLIZE_INSTALL = `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` > > configure: > libtoolize -c $(LIBTOOLIZE_INSTALL) -f > cp include/install-sh . > aclocal -I m4 > autoconf > > This runs libtoolize -c -i which updates those files. > > The file debian/rules runs `make default`, which at some point calls the target > above (`make configure`). But the file configure already exists, so it does not > run. Right. Intentionally so. .... > diff -Nru xfsprogs-3.2.4/Makefile xfsprogs-3.2.4ppc64el1/Makefile > --- xfsprogs-3.2.4/Makefile 2013-10-10 17:07:16.000000000 -0400 > +++ xfsprogs-3.2.4ppc64el1/Makefile 2015-08-04 11:06:40.000000000 -0400 > @@ -116,7 +116,7 @@ > $(Q)$(MAKE) $(MAKEOPTS) -C $* install-qa > > distclean: clean > - $(Q)rm -f $(LDIRT) > + $(Q)rm -f $(LDIRT) $(CONFIGURE) > > realclean: distclean > $(Q)rm -f $(CONFIGURE) .gitcensus That makes distclean do the same thing that realclean does and, as that commit I pointed out previously, has been intentionally separated in the build system. You could make the debian/rules file simply call 'make realclean' rather than 'make distclean' to acheive this without changing the main makefile. Either way, however, I don't think that's the problem. Darrick Wong noted on #xfs that his builds of xfsprogs on ppc64el from a tarball don't fail at all. His libtool chain is: > host-triplet: powerpc64le-unknown-linux-gnu > libtoolize: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 > automake: automake (GNU automake) 1.14.1 > autoconf: autoconf (GNU Autoconf) 2.69 Which is similar to mine, but libtoolize is slightly older (and I'm on x86_64-pc-linux-gnu). It turns out that the reason the build works on his machines is that someone had made a small manual change to /usr/share/aclocal/libtool.m4: --- a/libtool.m4 2014-02-11 04:58:49.000000000 -0800 +++ b/libtool.m4 2015-07-31 13:48:23.375432372 -0700 @@ -1312,7 +1312,7 @@ rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext i.e. the problem looks to be that the libtool package shipped in debian/unstable does not support ppc64el correctly.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 4 18:00:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D97A87FB1 for ; Tue, 4 Aug 2015 18:00:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA131304053 for ; Tue, 4 Aug 2015 16:00:23 -0700 (PDT) X-ASG-Debug-ID: 1438729213-04bdf06bcf21f090001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4JqhArK5iuHIH6cp for ; Tue, 04 Aug 2015 16:00:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DSBgAPQ8FV/20mLHlbgxuBPalOAQEBAQEBBpsaAgIBAQKBPE0BAQEBAQGBC4QjAQEBBDocIwwECAMOBwMJJQ8FJQMhE4gtykkBAQgCIBmGBoUwhQgHhCwFlHqMToFJhCKTbCaEDywxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 08:30:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMlBg-00052c-Ad; Wed, 05 Aug 2015 09:00:00 +1000 Date: Wed, 5 Aug 2015 09:00:00 +1000 From: Dave Chinner To: Jan Tulak Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing Message-ID: <20150804230000.GW16638@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing References: <1438612789-17486-5-git-send-email-jtulak@redhat.com> <1438680314-23950-1-git-send-email-jtulak@redhat.com> <20150804111812.GD18906@infradead.org> <773923690.2696215.1438697980321.JavaMail.zimbra@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <773923690.2696215.1438697980321.JavaMail.zimbra@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438729213 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21350 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 04, 2015 at 10:19:40AM -0400, Jan Tulak wrote: > ----- Original Message ----- > > From: "Christoph Hellwig" > > > > Needs to be fixed to avoid > 80 char lines. > > > > I don't see any >80 char line in this patch. O_o > The longest line is 73 in the code and 62 in commit > message. Though... maybe it can be a tab width issue? > I use four spaces for a tab... 8 spaces to a tab, please. Same coding style rules as for writing kernel code. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Tue Aug 4 18:03:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C66747FB1 for ; Tue, 4 Aug 2015 18:03:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63480AC005 for ; Tue, 4 Aug 2015 16:03:24 -0700 (PDT) X-ASG-Debug-ID: 1438729386-04bdf06bd221f2d0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id qiDAqgKAbcTuo6NY (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 16:03:06 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZMlEd-0001eo-Q9; Tue, 04 Aug 2015 23:03:03 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Dave Chinner , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Tue, 04 Aug 2015 23:03:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.14387291164872 (code B ref 793495); Tue, 04 Aug 2015 23:03:02 +0000 Received: (at 793495) by bugs.debian.org; 4 Aug 2015 22:58:36 +0000 Received: from ipmail07.adl2.internode.on.net ([150.101.137.131]) by buxtehude.debian.org with esmtp (Exim 4.84) (envelope-from ) id 1ZMlAK-0001GG-Ej for 793495@bugs.debian.org; Tue, 04 Aug 2015 22:58:36 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2COBgAPQ8FV/20mLHlbgxuBPalOAQEBAQEBBpsaBAICgTxNAQEBAQEBgQuEIwEBAQMBOhwjBQsIAxgJJQ8FJQMhE4gmB8pJAQEBAQYCAR8ZhgaFMIUIB4QsBZR6jE6ZVyaEDywxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 08:28:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMlA3-00052O-5r; Wed, 05 Aug 2015 08:58:19 +1000 Date: Wed, 5 Aug 2015 08:58:19 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Message-ID: <20150804225819.GV16638@dastard> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C0D916.1010102@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438729386 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21350 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 04, 2015 at 12:24:06PM -0300, Fernando Seiti Furusato wrote: > Hi Dave. > > I have just noticed that for config.guess and config.sub to be updated, no > autoreconf or dh_autotools-dev is needed, because of how Makefile was made. > > In Makefile, @row 80: > > LIBTOOLIZE_INSTALL = `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` > > configure: > libtoolize -c $(LIBTOOLIZE_INSTALL) -f > cp include/install-sh . > aclocal -I m4 > autoconf > > This runs libtoolize -c -i which updates those files. > > The file debian/rules runs `make default`, which at some point calls the target > above (`make configure`). But the file configure already exists, so it does not > run. Right. Intentionally so. .... > diff -Nru xfsprogs-3.2.4/Makefile xfsprogs-3.2.4ppc64el1/Makefile > --- xfsprogs-3.2.4/Makefile 2013-10-10 17:07:16.000000000 -0400 > +++ xfsprogs-3.2.4ppc64el1/Makefile 2015-08-04 11:06:40.000000000 -0400 > @@ -116,7 +116,7 @@ > $(Q)$(MAKE) $(MAKEOPTS) -C $* install-qa > > distclean: clean > - $(Q)rm -f $(LDIRT) > + $(Q)rm -f $(LDIRT) $(CONFIGURE) > > realclean: distclean > $(Q)rm -f $(CONFIGURE) .gitcensus That makes distclean do the same thing that realclean does and, as that commit I pointed out previously, has been intentionally separated in the build system. You could make the debian/rules file simply call 'make realclean' rather than 'make distclean' to acheive this without changing the main makefile. Either way, however, I don't think that's the problem. Darrick Wong noted on #xfs that his builds of xfsprogs on ppc64el from a tarball don't fail at all. His libtool chain is: > host-triplet: powerpc64le-unknown-linux-gnu > libtoolize: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 > automake: automake (GNU automake) 1.14.1 > autoconf: autoconf (GNU Autoconf) 2.69 Which is similar to mine, but libtoolize is slightly older (and I'm on x86_64-pc-linux-gnu). It turns out that the reason the build works on his machines is that someone had made a small manual change to /usr/share/aclocal/libtool.m4: --- a/libtool.m4 2014-02-11 04:58:49.000000000 -0800 +++ b/libtool.m4 2015-07-31 13:48:23.375432372 -0700 @@ -1312,7 +1312,7 @@ rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext i.e. the problem looks to be that the libtool package shipped in debian/unstable does not support ppc64el correctly.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From ritahockeyslenders@gmail.com Tue Aug 4 18:08:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, SUBJ_ALL_CAPS,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 40F157FB2 for ; Tue, 4 Aug 2015 18:08:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 135458F8039 for ; Tue, 4 Aug 2015 16:07:57 -0700 (PDT) X-ASG-Debug-ID: 1438729674-04bdf06bcf21f680001-NocioJ Received: from mail-vk0-f67.google.com (mail-vk0-f67.google.com [209.85.213.67]) by cuda.sgi.com with ESMTP id WdHrI8BzpDv6V9KD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 16:07:55 -0700 (PDT) X-Barracuda-Envelope-From: ritahockeyslenders@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.67 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.67] Received: by vkhg129 with SMTP id g129so640516vkh.1 for ; Tue, 04 Aug 2015 16:07:54 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.67] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.67] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=hgreAVtoFAuZvh/3s4XAmL2DZ7isfag8WKUl9ck688o=; b=E3vhf/LemlTS1R0dpO/pfLrTcXBqE60YlYjZ4fnp60tQ/0YKIi889j6FEhLj0Q9+fz 6ZmfvCwV/g+Bs8UpX6UhdKMGMOpbbED5E7Hw9vsobd2+dIp2qXEpPfrv1pO9gGw20Fbg mlq1QeedMjps5w/+t0f/B/75EHUrLQJ2RjS1vVkAUOEalQFd+nEBERh/BI2t7xzGUPJQ JXShdk565RgzYkQj1kudy0Z+Cl+vShh35mZ4Nj7XUEZsKnJKk7y+9ljMVj5/eb0hecjf 1tn2a6t6zrR9nZYLXoeWGWU7SPCOgmmjCxUHzLUjurihvpWWEx05FV2YCrD77Uf57y4r Iu3A== MIME-Version: 1.0 X-Received: by 10.52.166.18 with SMTP id zc18mr8347544vdb.41.1438729674247; Tue, 04 Aug 2015 16:07:54 -0700 (PDT) Received: by 10.31.194.194 with HTTP; Tue, 4 Aug 2015 16:07:54 -0700 (PDT) Reply-To: jodenhockeyscompany247@gmail.com Date: Wed, 5 Aug 2015 00:07:54 +0100 Message-ID: Subject: LOAN OFFER From: rita hockeys X-ASG-Orig-Subj: LOAN OFFER To: undisclosed-recipients:; Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vk0-f67.google.com[209.85.213.67] X-Barracuda-Start-Time: 1438729675 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MJ1576, BSF_SC0_MV0646, BSF_SC3_MJ4114, DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21350 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_MV0646 Custom rule MV0646 1.50 BSF_SC0_MJ1576 Custom Rule MJ1576 0.50 BSF_SC3_MJ4114 Custom Rule MJ4114 Hello Are you financially squeezed? * Are you seeking funding to repay loans and debts * Are you seeking funding to create your own business? * Are you in need of private loans or business for various purposes? * Are you seek loans to to carry out large projects * Do you seek funding for various other processes? we give out loan in 2% interest rate contact us via email (jodenhockeyscompany247@gmail.com) From 3AovBVQQQA9EFx8PGEHE1.zzGzEx.zB9K2FBFF.F35.zB9@photos-server.bounces.google.com Tue Aug 4 23:03:25 2015 Return-Path: <3AovBVQQQA9EFx8PGEHE1.zzGzEx.zB9K2FBFF.F35.zB9@photos-server.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 49ABB7FC3 for ; Tue, 4 Aug 2015 23:03:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E8DB304051 for ; Tue, 4 Aug 2015 21:03:22 -0700 (PDT) X-ASG-Debug-ID: 1438747394-04cb6c673e2f11e0001-NocioJ Received: from mail-ig0-f202.google.com (mail-ig0-f202.google.com [209.85.213.202]) by cuda.sgi.com with ESMTP id 6O8z0FJccgHZXa2T (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 04 Aug 2015 21:03:17 -0700 (PDT) X-Barracuda-Envelope-From: 3AovBVQQQA9EFx8PGEHE1.zzGzEx.zB9K2FBFF.F35.zB9@photos-server.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.213.202 X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.213.202] Received: by igr7 with SMTP id 7so2587226igr.1 for ; Tue, 04 Aug 2015 21:03:14 -0700 (PDT) X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.213.202] X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.213.202] X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; bh=RrMChRFtZeV5hElDFRzzPmJI6LOMz5H4dAu349A1W50=; b=Wl1FWdvsYa0wOyH9+ipm2H4chnKxjIeEflZIqWScOuKKFfBuShDJWHWb0ra+56+tW4 UGoSixjlRW71s90qJlQNeS47aQj3E307ICvZzq7kVSWAmhDT5N7CzFlriPWcHzVndNnV 1MUitCAdJoh7ywRbsKayjgXchqaFKFecxcTBde8NQDfjfCLx2fGbu8JOQD7YctcI4cEO +J7x78PAAF3STDzRmfdjSE19+shTqsOB/kIcjkeOGobGO+0iyaPVcTevEQY8sGP5boud OHDEgw0LzltU50Cimh9uasbjJzdX7vQ4XlLe5jiOwqNSyKHscGBK1Z3Qn8+nGXVS+K57 jbhA== MIME-Version: 1.0 X-Received: by 10.182.97.134 with SMTP id ea6mr6305518obb.10.1438747394783; Tue, 04 Aug 2015 21:03:14 -0700 (PDT) Reply-To: "Remotely management advertising player / Attn: Technical Manager" Message-ID: <047d7b2e4eea633a43051c887b58@google.com> Date: Wed, 05 Aug 2015 04:03:14 +0000 Subject: =?GB2312?B?UmVtb3RlbHkgbWFuYWdlbWVudCBhZHZlcnRpc2luZyBwbGF5ZXIgLyBBdHRuOiBUZWNobg==?= =?GB2312?B?aWNhbCBNYW5hZ2Vy0+vE+rmyz+3By8/gsuGhow==?= From: "Remotely management advertising player / Attn: Technical Manager" X-ASG-Orig-Subj: =?GB2312?B?UmVtb3RlbHkgbWFuYWdlbWVudCBhZHZlcnRpc2luZyBwbGF5ZXIgLyBBdHRuOiBUZWNobg==?= =?GB2312?B?aWNhbCBNYW5hZ2Vy0+vE+rmyz+3By8/gsuGhow==?= To: xfs@oss.sgi.com Content-Type: multipart/related; boundary=047d7b2e4eea633a1c051c887b56 X-Barracuda-Connect: mail-ig0-f202.google.com[209.85.213.202] X-Barracuda-Start-Time: 1438747397 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21357 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b2e4eea633a1c051c887b56 Content-Type: multipart/alternative; boundary=047d7b2e4eea633a18051c887b55 --047d7b2e4eea633a18051c887b55 Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Dear Sirs, After visiting your web-site I decided to contact your esteemed company as one of the leaders of digital signage field . CMP-web1 is a low cost digital signage solution, consist of digital signage player and content management software. The solution offer local and central scheduling via internet or TF card. Zone type displays and full screen digital posters are available also. I would appreciate if you forward this letter to Technical Manager or to other expert responsible for technical integration of new products in your company, or provide me with his contact for we could discuss all the details of our future cooperation. Your early reply is highly appreciated . Anna https://picasaweb.google.com/lh/sredir?uname=109132628578376999921&target=ALBUM&id=6166760080884701521&authkey=Gv1sRgCISA8Ke6jr7NVg&invite=CNT-pZID&feat=email --047d7b2e4eea633a18051c887b55 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable
=D1=FB=C7=EB=C4=FA=B9=DB=BF=B4 Remotely management advertising p= layer / Attn: Technical Manager =B5=C4=CF=E0=B2=E1=A3=BA MSP2000
MSP2000
2015=C4=EA6=D4=C230=C8=D5
=CC=E1=B9=A9=D5=DF=A3=BARemotely management advertising player / Attn: T= echnical Manager
=B2=E9=BF=B4=CF=E0=B2=E1
=C0=B4= =D7=D4 Remotely management advertising player / Attn: Technical Manager =B5= =C4=CF=FB=CF=A2=A3=BA
Dear Sirs,

After visiting your web-site I decided to conta= ct your esteemed company as one of the leaders of digital signage field .
CMP-web1 is a low cost digital signage solution, consist of digital s= ignage player and content management software. The solution offer local and= central scheduling via internet or TF card. Zone type displays and full sc= reen digital posters are available also.

I would appreciate if you= forward this letter to Technical Manager or to other expert responsible fo= r technical integration of new products in your company, or provide me with= his contact for we could discuss all the details of our future cooperation= .

Your early reply is highly appreciated .


Anna
=D2=AA=B7=D6=CF=ED=C4=FA=B5=C4=D5=D5=C6=AC=BB=F2=D4=DA=C5=F3=D3=D1= =D3=EB=C4=FA=B7=D6=CF=ED=D5=D5=C6=AC=CA=B1=CA=D5=B5=BD=CD=A8=D6=AA=A3=AC=C7= =EB=BB=F1=C8=A1=CA=F4=D3=DA=C4=FA= =D7=D4=BC=BA=B5=C4=C3=E2=B7=D1 Picasa =CD=F8=C2=E7=CF=E0=B2=E1=D5=CA=BB=A7<= /a>=A1=A3
--047d7b2e4eea633a18051c887b55-- --047d7b2e4eea633a1c051c887b56 Content-Type: image/gif; name="picasaweblogo-zh_CN.gif" Content-Disposition: attachment; filename="picasaweblogo-zh_CN.gif" Content-Transfer-Encoding: base64 Content-ID: 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 --047d7b2e4eea633a1c051c887b56 Content-Type: image/jpeg; name="email.jpg" Content-Disposition: attachment; filename="email.jpg" Content-Transfer-Encoding: base64 Content-ID: <6166760080884701521> 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 --047d7b2e4eea633a1c051c887b56-- From jtulak@redhat.com Wed Aug 5 04:48:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B10577FC1 for ; Wed, 5 Aug 2015 04:48:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 822FC8F8039 for ; Wed, 5 Aug 2015 02:48:24 -0700 (PDT) X-ASG-Debug-ID: 1438768103-04bdf06bcf234d20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hm49mpCm5fGrkyNf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 02:48:23 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id EBDEDA2052; Wed, 5 Aug 2015 09:48:22 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t759mLam018774; Wed, 5 Aug 2015 05:48:22 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH v5 04/11] xfsprogs: Add ifdef dirent checks where it was missing Date: Wed, 5 Aug 2015 11:48:15 +0200 X-ASG-Orig-Subj: [PATCH v5 04/11] xfsprogs: Add ifdef dirent checks where it was missing Message-Id: <1438768095-389-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1438680314-23950-1-git-send-email-jtulak@redhat.com> References: <1438680314-23950-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438768103 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 CHANGED: text width fix Add check for _DIRENT_HAVED_RECLEN/_OFF to read_directory(). In dump_dirent() these checks already are used, but they were missing in read_directory. Signed-off-by: Jan Tulak --- io/readdir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/io/readdir.c b/io/readdir.c index 7b0edbc..151b72e 100644 --- a/io/readdir.c +++ b/io/readdir.c @@ -103,12 +103,24 @@ read_directory( if (!dirent) break; +#ifdef _DIRENT_HAVE_D_RECLEN *total += dirent->d_reclen; +#else + *total += dirent->d_namlen + sizeof(*dirent); +#endif count++; if (dump) { dump_dirent(offset, dirent); +#ifdef _DIRENT_HAVE_D_OFF offset = dirent->d_off; +#else + /* Some platforms don't have dirent->d_off, but because + * it is used only for dumping the value, it should be + * safe to only set it to zero in such case. + */ + offset = 0; +#endif } } -- 2.4.3 From jtulak@redhat.com Wed Aug 5 04:50:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6C8477FC6 for ; Wed, 5 Aug 2015 04:50:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16CDAAC00C for ; Wed, 5 Aug 2015 02:50:08 -0700 (PDT) X-ASG-Debug-ID: 1438768206-04bdf06bd2234e00001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id x7waXV0QWW9kh4Vg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 02:50:06 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t759nbt7011330; Wed, 5 Aug 2015 05:49:37 -0400 Date: Wed, 5 Aug 2015 05:49:37 -0400 (EDT) From: Jan Tulak To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Message-ID: <955551007.3098690.1438768177102.JavaMail.zimbra@redhat.com> In-Reply-To: <20150804230000.GW16638@dastard> References: <1438612789-17486-5-git-send-email-jtulak@redhat.com> <1438680314-23950-1-git-send-email-jtulak@redhat.com> <20150804111812.GD18906@infradead.org> <773923690.2696215.1438697980321.JavaMail.zimbra@redhat.com> <20150804230000.GW16638@dastard> Subject: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.6.144] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: Add ifdef dirent checks where it was missing Thread-Index: XykxJ9qwGGyQhKyAqiHaNrq3jt8uRg== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1438768206 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Dave Chinner" > To: "Jan Tulak" > Cc: "Christoph Hellwig" , xfs@oss.sgi.com > Sent: Wednesday, August 5, 2015 1:00:00 AM > Subject: Re: [PATCH v4 04/11] xfsprogs: Add ifdef dirent checks where it was missing > > On Tue, Aug 04, 2015 at 10:19:40AM -0400, Jan Tulak wrote: > > ----- Original Message ----- > > > From: "Christoph Hellwig" > > > > > > Needs to be fixed to avoid > 80 char lines. > > > > > > > I don't see any >80 char line in this patch. O_o > > The longest line is 73 in the code and 62 in commit > > message. Though... maybe it can be a tab width issue? > > I use four spaces for a tab... > > 8 spaces to a tab, please. Same coding style rules as for writing > kernel code. ;) All right, fixed patch sent. :-) Cheers, Jan -- Jan Tulak jtulak@redhat.com From dave@fromorbit.com Wed Aug 5 06:09:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D764D7FC6 for ; Wed, 5 Aug 2015 06:09:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6E99304051 for ; Wed, 5 Aug 2015 04:09:02 -0700 (PDT) X-ASG-Debug-ID: 1438772936-04bdf06bcf236b60003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ZLFHgQghCwjOQkIQ for ; Wed, 05 Aug 2015 04:09:00 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH4lwhHwFlH+OHYc3kGgmgUoBCzgcgWUsMYEGgUYBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H0-Mx for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nQ-MH for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/10] xfs: configurable error behaviour via sysfs Date: Wed, 5 Aug 2015 21:08:33 +1000 X-ASG-Orig-Subj: [PATCH 02/10] xfs: configurable error behaviour via sysfs Message-Id: <1438772921-28715-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772940 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We need to be able to change the way XFS behaviours in error conditions depending on the type of underlying storage. This is necessary for handling non-traditional block devices with extended error cases, such as thin provisioned devices that can return ENOSPC as an IO error. Introduce the basic sysfs infrastructure needed to define and configure error behaviours. This is done to be generic enough to extend to configuring behaviour in other error conditions, such as ENOMEM, which also has different desired behaviours according to machine configuration. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 9 +++++- fs/xfs/xfs_mount.h | 27 +++++++++++++++++ fs/xfs/xfs_sysfs.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_sysfs.h | 3 ++ 4 files changed, 123 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index a094e47..4245b7f3 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -693,10 +693,14 @@ xfs_mountfs( if (error) goto out; - error = xfs_uuid_mount(mp); + error = xfs_error_sysfs_init(mp); if (error) goto out_remove_sysfs; + error = xfs_uuid_mount(mp); + if (error) + goto out_remove_error_sysfs; + /* * Set the minimum read and write sizes */ @@ -967,6 +971,8 @@ xfs_mountfs( xfs_da_unmount(mp); out_remove_uuid: xfs_uuid_unmount(mp); + out_remove_error_sysfs: + xfs_error_sysfs_del(mp); out_remove_sysfs: xfs_sysfs_del(&mp->m_kobj); out: @@ -1052,6 +1058,7 @@ xfs_unmountfs( #endif xfs_free_perag(mp); + xfs_error_sysfs_del(mp); xfs_sysfs_del(&mp->m_kobj); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 7999e91..e51c63c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -37,6 +37,31 @@ enum { XFS_LOWSP_MAX, }; +/* + * Error Configuration + * + * Error classes define the subsystem the configuration belongs to. + * Error numbers define the errors that are configurable. + * Failure types describe when an error is considered fatal. + */ +enum { + XFS_ERR_CLASS_MAX, +}; +enum { + XFS_ERR_ERRNO_MAX, +}; +enum { + XFS_ERR_FAIL_DEFAULT, + XFS_ERR_FAIL_NEVER, + XFS_ERR_FAIL_SLOW, + XFS_ERR_FAIL_FAST, +}; + +struct xfs_error_cfg { + struct xfs_kobj kobj; + int fail_speed; +}; + typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ @@ -127,6 +152,8 @@ typedef struct xfs_mount { int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ struct xfs_kobj m_kobj; + struct xfs_kobj m_error_kobj; + struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX]; struct workqueue_struct *m_buf_workqueue; struct workqueue_struct *m_data_workqueue; diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index aa03670..017dcfb 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -17,10 +17,14 @@ */ #include "xfs.h" -#include "xfs_sysfs.h" +#include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sysfs.h" #include "xfs_log.h" #include "xfs_log_priv.h" +#include "xfs_mount.h" struct xfs_sysfs_attr { struct attribute attr; @@ -237,3 +241,83 @@ struct kobj_type xfs_log_ktype = { .sysfs_ops = &xfs_log_ops, .default_attrs = xfs_log_attrs, }; + +/* + * Metadata IO error configuration + * + * The sysfs structure here is: + * ...xfs//error/// + * + * where allows use to discriminate between data IO and metadata IO, + * and any other future type of IO (e.g. special inode or directory error + * handling) we care to support. + */ +static struct attribute *xfs_error_attrs[] = { + NULL, +}; + +static inline struct xfs_error_cfg * +to_error_cfg(struct kobject *kobject) +{ + struct xfs_kobj *kobj = to_kobj(kobject); + return container_of(kobj, struct xfs_error_cfg, kobj); +} + +static ssize_t +xfs_error_show( + struct kobject *kobject, + struct attribute *attr, + char *buf) +{ + struct xfs_error_cfg *cfg = to_error_cfg(kobject); + struct xfs_sysfs_attr *xfs_attr = to_attr(attr); + + return xfs_attr->show ? xfs_attr->show(buf, cfg) : 0; +} + +static ssize_t +xfs_error_store( + struct kobject *kobject, + struct attribute *attr, + const char *buf, + size_t count) +{ + struct xfs_error_cfg *cfg = to_error_cfg(kobject); + struct xfs_sysfs_attr *xfs_attr = to_attr(attr); + + return xfs_attr->store ? xfs_attr->store(buf, count, cfg) : 0; +} + +static struct sysfs_ops xfs_error_ops = { + .show = xfs_error_show, + .store = xfs_error_store, +}; + +struct kobj_type xfs_error_cfg_ktype = { + .release = xfs_sysfs_release, + .sysfs_ops = &xfs_error_ops, + .default_attrs = xfs_error_attrs, +}; + +struct kobj_type xfs_error_ktype = { + .release = xfs_sysfs_release, +}; + +int +xfs_error_sysfs_init( + struct xfs_mount *mp) +{ + int error; + + /* .../xfs//error/ */ + error = xfs_sysfs_init(&mp->m_error_kobj, &xfs_error_ktype, + &mp->m_kobj, "error"); + return error; +} + +void +xfs_error_sysfs_del( + struct xfs_mount *mp) +{ + xfs_sysfs_del(&mp->m_error_kobj); +} diff --git a/fs/xfs/xfs_sysfs.h b/fs/xfs/xfs_sysfs.h index 240eee3..1f662d8 100644 --- a/fs/xfs/xfs_sysfs.h +++ b/fs/xfs/xfs_sysfs.h @@ -57,4 +57,7 @@ xfs_sysfs_del( wait_for_completion(&kobj->complete); } +int xfs_error_sysfs_init(struct xfs_mount *mp); +void xfs_error_sysfs_del(struct xfs_mount *mp); + #endif /* __XFS_SYSFS_H__ */ -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 12D7C7FC7 for ; Wed, 5 Aug 2015 06:09:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6F07304053 for ; Wed, 5 Aug 2015 04:09:02 -0700 (PDT) X-ASG-Debug-ID: 1438772939-04bdf06bd2236b70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ziJrDPmuM8Vy6m3d for ; Wed, 05 Aug 2015 04:09:00 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH45sBYcbjWSmPCaBSgELOByBZSwxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H2-NU for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007na-Mu for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/10] xfs: add configurable error support to metadata buffers Date: Wed, 5 Aug 2015 21:08:35 +1000 X-ASG-Orig-Subj: [PATCH 04/10] xfs: add configurable error support to metadata buffers Message-Id: <1438772921-28715-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772939 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner With the error configuration handle for async metadata write errors in place, we can now add initial support to the IO error processing in xfs_buf_iodone_error(). Add an infrastructure function to look up the configuration handle, and rearrange the error handling to prepare the way for different error handling conigurations to be used. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.h | 1 + fs/xfs/xfs_buf_item.c | 112 ++++++++++++++++++++++++++++++-------------------- fs/xfs/xfs_mount.h | 3 ++ fs/xfs/xfs_sysfs.c | 17 ++++++++ 4 files changed, 88 insertions(+), 45 deletions(-) diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 68c8f2d..ed0ea41 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -181,6 +181,7 @@ typedef struct xfs_buf { unsigned int b_page_count; /* size of page array */ unsigned int b_offset; /* page offset in first page */ int b_error; /* error code on I/O */ + int b_last_error; /* previous async I/O error */ const struct xfs_buf_ops *b_ops; #ifdef XFS_BUF_LOCK_TRACKING diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index ee63961..a09ae26 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -924,35 +924,22 @@ xfs_buf_do_callbacks( } } -/* - * This is the iodone() function for buffers which have had callbacks - * attached to them by xfs_buf_attach_iodone(). It should remove each - * log item from the buffer's list and call the callback of each in turn. - * When done, the buffer's fsprivate field is set to NULL and the buffer - * is unlocked with a call to iodone(). - */ -void -xfs_buf_iodone_callbacks( +static bool +xfs_buf_iodone_callback_error( struct xfs_buf *bp) { struct xfs_log_item *lip = bp->b_fspriv; struct xfs_mount *mp = lip->li_mountp; static ulong lasttime; static xfs_buftarg_t *lasttarg; - - if (likely(!bp->b_error)) - goto do_callbacks; + struct xfs_error_cfg *cfg; /* * If we've already decided to shutdown the filesystem because of * I/O errors, there's no point in giving this a retry. */ - if (XFS_FORCED_SHUTDOWN(mp)) { - xfs_buf_stale(bp); - bp->b_flags |= XBF_DONE; - trace_xfs_buf_item_iodone(bp, _RET_IP_); - goto do_callbacks; - } + if (XFS_FORCED_SHUTDOWN(mp)) + goto out_stale; if (bp->b_target != lasttarg || time_after(jiffies, (lasttime + 5*HZ))) { @@ -961,45 +948,80 @@ xfs_buf_iodone_callbacks( } lasttarg = bp->b_target; + /* synchronous writes will have callers process the error */ + if (!(bp->b_flags & XBF_ASYNC)) + goto out_stale; + + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); + ASSERT(bp->b_iodone != NULL); + /* * If the write was asynchronous then no one will be looking for the - * error. Clear the error state and write the buffer out again. - * - * XXX: This helps against transient write errors, but we need to find - * a way to shut the filesystem down if the writes keep failing. - * - * In practice we'll shut the filesystem down soon as non-transient - * errors tend to affect the whole device and a failing log write - * will make us give up. But we really ought to do better here. + * error. If this is the first failure of this type, clear the error + * state and write the buffer out again. This means we always retry an + * async write failure at least once, but we also need to set the buffer + * up to behave correctly now for repeated failures. */ - if (XFS_BUF_ISASYNC(bp)) { - ASSERT(bp->b_iodone != NULL); - - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); + cfg = xfs_error_get_cfg(mp, XFS_ERR_METADATA, bp->b_error); + if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL)) || + bp->b_last_error != bp->b_error) { + bp->b_flags |= (XBF_WRITE | XBF_ASYNC | + XBF_DONE | XBF_WRITE_FAIL); + bp->b_last_error = bp->b_error; + xfs_buf_ioerror(bp, 0); + xfs_buf_submit(bp); + return true; + } - xfs_buf_ioerror(bp, 0); /* errno of 0 unsets the flag */ + /* + * Repeated failure on an async write. Take action according to the + * error configuration we have been set up to use. + */ + if (cfg->fail_speed == XFS_ERR_FAIL_FAST) + goto permanent_error; - if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { - bp->b_flags |= XBF_WRITE | XBF_ASYNC | - XBF_DONE | XBF_WRITE_FAIL; - xfs_buf_submit(bp); - } else { - xfs_buf_relse(bp); - } - - return; - } + /* still a transient error, higher layers will retry */ + xfs_buf_ioerror(bp, 0); + xfs_buf_relse(bp); + return true; /* - * If the write of the buffer was synchronous, we want to make - * sure to return the error to the caller of xfs_bwrite(). + * Permanent error - we need to trigger a shutdown if we haven't already + * to indicate that inconsistency will result from this action. */ +permanent_error: + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); +out_stale: xfs_buf_stale(bp); bp->b_flags |= XBF_DONE; - trace_xfs_buf_error_relse(bp, _RET_IP_); + return false; +} + +/* + * This is the iodone() function for buffers which have had callbacks attached + * to them by xfs_buf_attach_iodone(). We need to iterate the items on the + * callback list, mark the buffer as having no more callbacks and then push the + * buffer through IO completion processing. + */ +void +xfs_buf_iodone_callbacks( + struct xfs_buf *bp) +{ + /* + * If there is an error, process it. Some errors require us + * to run callbacks after failure processing is done so we + * detect that and take appropriate action. + */ + if (bp->b_error && xfs_buf_iodone_callback_error(bp)) + return; + + /* + * Successful IO or permanent error. Either way, we can clear the + * retry state here in preparation for the next error that may occur. + */ + bp->b_last_error = 0; -do_callbacks: xfs_buf_do_callbacks(bp); bp->b_fspriv = NULL; bp->b_iodone = NULL; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 753060f..21caa5a 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -366,4 +366,7 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); extern void xfs_set_low_space_thresholds(struct xfs_mount *); +struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp, + int error_class, int error); + #endif /* __XFS_MOUNT_H__ */ diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index cb7ced0..3667d33 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -355,3 +355,20 @@ xfs_error_sysfs_del( xfs_sysfs_del(&mp->m_error_meta_kobj); xfs_sysfs_del(&mp->m_error_kobj); } + +struct xfs_error_cfg * +xfs_error_get_cfg( + struct xfs_mount *mp, + int error_class, + int error) +{ + struct xfs_error_cfg *cfg; + + switch (error) { + default: + cfg = &mp->m_error_cfg[error_class][XFS_ERR_DEFAULT]; + break; + } + + return cfg; +} -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0F6B57FC8 for ; Wed, 5 Aug 2015 06:09:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D1D408F804B for ; Wed, 5 Aug 2015 04:09:03 -0700 (PDT) X-ASG-Debug-ID: 1438772936-04bdf06bcf236b60004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id AVqnfulix5dJrKE2 for ; Wed, 05 Aug 2015 04:09:02 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH45sBZR/pjwmgUoBCzgcgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H5-PZ for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007np-Ov for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/10] xfs: add "fail at unmount" error handling configuration Date: Wed, 5 Aug 2015 21:08:38 +1000 X-ASG-Orig-Subj: [PATCH 07/10] xfs: add "fail at unmount" error handling configuration Message-Id: <1438772921-28715-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772941 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If we take "retry forever" literally on metadata IO errors, we can hang an unmount retries those writes forever. This is the default behaviour, unfortunately. Add a error configuration option for this behaviour and default it to "fail" so that an unmount will trigger actual errors, a shutdown and allow the unmount to succeed. It will be noisy, though, as it will log the errors and shutdown that occurs. To do this, we need to mark the filesystem as being in the process of unmounting. Do this with a mount flag that is added at the appropriate time (i.e. before the blocking AIL sync). We also need to add this flag if mount fails after the initial phase of log recovery has been run. The config is done by a separate boolean sysfs option rather than a new fail_speed enum, as fail_at_unmount is relevant to both XFS_ERR_FAIL_NEVER and XFS_ERR_FAIL_SLOW options. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 4 ++++ fs/xfs/xfs_mount.c | 9 +++++++++ fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_sysfs.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index c785698..cf8aec0 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -999,6 +999,10 @@ xfs_buf_iodone_callback_error( break; } + /* At unmount we may treat errors differently */ + if ((mp->m_flags & XFS_MOUNT_UNMOUNTING) && cfg->fail_at_unmount) + goto permanent_error; + /* still a transient error, higher layers will retry */ xfs_buf_ioerror(bp, 0); xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4245b7f3..c2096a0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -960,6 +960,7 @@ xfs_mountfs( out_rele_rip: IRELE(rip); out_log_dealloc: + mp->m_flags |= XFS_MOUNT_UNMOUNTING; xfs_log_unmount(mp); out_fail_wait: if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) @@ -1009,6 +1010,14 @@ xfs_unmountfs( xfs_log_force(mp, XFS_LOG_SYNC); /* + * We now need to tell the world we are unmounting. This will allow + * us to detect that the filesystem is going away and we should error + * out anything that we have been retrying in the background. This will + * prevent neverending retries iin AIL pushing from hanging the unmount. + */ + mp->m_flags |= XFS_MOUNT_UNMOUNTING; + + /* * Flush all pending changes from the AIL. */ xfs_ail_push_all_sync(mp->m_ail); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a684a72b..c86fe43 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -64,6 +64,7 @@ struct xfs_error_cfg { int fail_speed; int max_retries; /* INT_MAX = retry forever */ unsigned long retry_timeout; /* in jiffies, 0 = no timeout */ + bool fail_at_unmount; }; typedef struct xfs_mount { @@ -186,6 +187,7 @@ typedef struct xfs_mount { #define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops must be synchronous except for space allocations */ +#define XFS_MOUNT_UNMOUNTING (1ULL << 1) /* filesystem is unmounting */ #define XFS_MOUNT_WAS_CLEAN (1ULL << 3) #define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem operations, typically for diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 1f078e1..921b079 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -361,10 +361,43 @@ retry_timeout_seconds_show( } XFS_SYSFS_ATTR_RW(retry_timeout_seconds); +static ssize_t +fail_at_unmount_store( + const char *buf, + size_t count, + void *data) +{ + struct xfs_error_cfg *cfg = data; + int ret; + int val; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + if (val < 0 || val > 1) + return -EINVAL; + + cfg->fail_at_unmount = val; + return count; +} + +static ssize_t +fail_at_unmount_show( + char *buf, + void *data) +{ + struct xfs_error_cfg *cfg = data; + + return snprintf(buf, PAGE_SIZE, "%d\n", cfg->fail_at_unmount); +} +XFS_SYSFS_ATTR_RW(fail_at_unmount); + static struct attribute *xfs_error_attrs[] = { ATTR_LIST(failure_speed), ATTR_LIST(max_retries), ATTR_LIST(retry_timeout_seconds), + ATTR_LIST(fail_at_unmount), NULL, }; @@ -426,6 +459,7 @@ struct xfs_error_init { int fail_speed; int max_retries; int retry_timeout; /* in seconds */ + bool fail_at_unmount; }; static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { @@ -433,6 +467,7 @@ static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { .fail_speed = XFS_ERR_FAIL_NEVER, .max_retries = INT_MAX, .retry_timeout = 0, + .fail_at_unmount = true, }, }; @@ -466,6 +501,7 @@ xfs_error_sysfs_init_class( cfg->max_retries = init[i].max_retries; cfg->retry_timeout = msecs_to_jiffies( init[i].retry_timeout * MSEC_PER_SEC); + cfg->fail_at_unmount = init[i].fail_at_unmount; } return 0; -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D4497FC9 for ; Wed, 5 Aug 2015 06:09:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2BA77304051 for ; Wed, 5 Aug 2015 04:09:04 -0700 (PDT) X-ASG-Debug-ID: 1438772939-04bdf06bd2236b70002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id TC92udLk2DSkhz0i for ; Wed, 05 Aug 2015 04:09:02 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH4pXhBUFjE+IMKY8JoFKAQuCOSwxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H7-QC for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nz-Pb for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/10] xfs: disable specific error configurations Date: Wed, 5 Aug 2015 21:08:40 +1000 X-ASG-Orig-Subj: [PATCH 09/10] xfs: disable specific error configurations Message-Id: <1438772921-28715-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772941 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Different error classes are going to need different error to be configured, so we don't want them all to be visible in sysfs. Add a configuration check into the config initialisation an lookup code to determine if the default should be used for a specific error. If so, the sysfs entry is not created, and on lookup the default config is returned. Add ENOMEM at this point to exercise this code, as it will be used later when adding a kmem error failure class. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_sysfs.c | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 7d62450..876b86b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -53,6 +53,7 @@ enum { XFS_ERR_EIO, XFS_ERR_ENOSPC, XFS_ERR_ENODEV, + XFS_ERR_ENOMEM, XFS_ERR_ERRNO_MAX, }; enum { diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 019e859..fa46ca4 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -484,6 +484,9 @@ static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { { .name = "ENODEV", .fail_speed = XFS_ERR_FAIL_FAST, }, + { .name = "ENOMEM", + .fail_speed = XFS_ERR_FAIL_DEFAULT, + }, }; static int @@ -507,12 +510,17 @@ xfs_error_sysfs_init_class( for (i = 0; i < XFS_ERR_ERRNO_MAX; i++) { cfg = &mp->m_error_cfg[class][i]; + + /* skip errors that are not configurable for this class */ + cfg->fail_speed = init[i].fail_speed; + if (cfg->fail_speed == XFS_ERR_FAIL_DEFAULT) + continue; + error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, parent_kobj, init[i].name); if (error) goto out_error; - cfg->fail_speed = init[i].fail_speed; cfg->max_retries = init[i].max_retries; cfg->retry_timeout = msecs_to_jiffies( init[i].retry_timeout * MSEC_PER_SEC); @@ -567,7 +575,8 @@ xfs_error_sysfs_del( for (j = 0; j < XFS_ERR_ERRNO_MAX; j++) { cfg = &mp->m_error_cfg[i][j]; - xfs_sysfs_del(&cfg->kobj); + if (cfg->fail_speed != XFS_ERR_FAIL_DEFAULT) + xfs_sysfs_del(&cfg->kobj); } } xfs_sysfs_del(&mp->m_error_meta_kobj); @@ -592,10 +601,15 @@ xfs_error_get_cfg( case ENODEV: cfg = &mp->m_error_cfg[error_class][XFS_ERR_ENODEV]; break; - default: - cfg = &mp->m_error_cfg[error_class][XFS_ERR_DEFAULT]; + case ENOMEM: + cfg = &mp->m_error_cfg[error_class][XFS_ERR_ENOMEM]; break; + default: + return &mp->m_error_cfg[error_class][XFS_ERR_DEFAULT]; } + /* The error may not be not configurable, so uses default behaviour */ + if (cfg->fail_speed == XFS_ERR_FAIL_DEFAULT) + return &mp->m_error_cfg[error_class][XFS_ERR_DEFAULT]; return cfg; } -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 914667FC7 for ; Wed, 5 Aug 2015 06:09:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 619F4304053 for ; Wed, 5 Aug 2015 04:09:01 -0700 (PDT) X-ASG-Debug-ID: 1438772936-04bdf06bcf236b60002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id bCtJile1GvLfC1KG for ; Wed, 05 Aug 2015 04:08:59 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH4pXhBUFlH+mPCaBSgELOByBZSwxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H1-NF for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nV-Mb for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/10] xfs: introduce metadata IO error class Date: Wed, 5 Aug 2015 21:08:34 +1000 X-ASG-Orig-Subj: [PATCH 03/10] xfs: introduce metadata IO error class Message-Id: <1438772921-28715-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772939 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we have the basic infrastructure, add the first error class so we can build up the infrastructure in a meaningful way. Add the metadata async write IO error class and sysfs entry, and introduce a default configuration that matches the existing behaviour of XFS_ERR_FAIL_NEVER for async write metadata buffers. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.h | 3 +++ fs/xfs/xfs_sysfs.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index e51c63c..753060f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -45,9 +45,11 @@ enum { * Failure types describe when an error is considered fatal. */ enum { + XFS_ERR_METADATA, XFS_ERR_CLASS_MAX, }; enum { + XFS_ERR_DEFAULT, XFS_ERR_ERRNO_MAX, }; enum { @@ -153,6 +155,7 @@ typedef struct xfs_mount { /* low free space thresholds */ struct xfs_kobj m_kobj; struct xfs_kobj m_error_kobj; + struct xfs_kobj m_error_meta_kobj; struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX]; struct workqueue_struct *m_buf_workqueue; diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 017dcfb..cb7ced0 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -307,11 +307,34 @@ int xfs_error_sysfs_init( struct xfs_mount *mp) { + struct xfs_error_cfg *cfg; int error; /* .../xfs//error/ */ error = xfs_sysfs_init(&mp->m_error_kobj, &xfs_error_ktype, &mp->m_kobj, "error"); + if (error) + return error; + + /* .../xfs//error/metadata/ */ + error = xfs_sysfs_init(&mp->m_error_meta_kobj, &xfs_error_ktype, + &mp->m_error_kobj, "metadata"); + if (error) + goto out_error; + + cfg = &mp->m_error_cfg[XFS_ERR_METADATA][XFS_ERR_DEFAULT]; + error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, + &mp->m_error_meta_kobj, "Default"); + if (error) + goto out_error_meta; + cfg->fail_speed = XFS_ERR_FAIL_NEVER; + + return 0; + +out_error_meta: + xfs_sysfs_del(&mp->m_error_meta_kobj); +out_error: + xfs_sysfs_del(&mp->m_error_kobj); return error; } @@ -319,5 +342,16 @@ void xfs_error_sysfs_del( struct xfs_mount *mp) { + struct xfs_error_cfg *cfg; + int i, j; + + for (i = 0; i < XFS_ERR_CLASS_MAX; i++) { + for (j = 0; j < XFS_ERR_ERRNO_MAX; j++) { + cfg = &mp->m_error_cfg[i][j]; + + xfs_sysfs_del(&cfg->kobj); + } + } + xfs_sysfs_del(&mp->m_error_meta_kobj); xfs_sysfs_del(&mp->m_error_kobj); } -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 024787FC8 for ; Wed, 5 Aug 2015 06:09:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BC6738F804B for ; Wed, 5 Aug 2015 04:09:04 -0700 (PDT) X-ASG-Debug-ID: 1438772936-04bdf06bcf236b60005-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id lPlTI9Y7hr3dX8Xh for ; Wed, 05 Aug 2015 04:09:03 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH4pXhBUFjE+IMKY8JoFKAQuCOSwxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H6-Pu for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nu-PI for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/10] xfs: add configuration handles for specific errors Date: Wed, 5 Aug 2015 21:08:39 +1000 X-ASG-Orig-Subj: [PATCH 08/10] xfs: add configuration handles for specific errors Message-Id: <1438772921-28715-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772942 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner now most of the infrastructure is in place, we can start adding support for configuring specific errors such as ENODEV, ENOSPC, EIO, etc. Add these error configurations and configure them all to have appropriate behaviours. That is, all will use the "fail never, fail at unmount" default except for ENODEV, which is an unrecoverable error so it will be configured as a "fail fast" error. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.h | 3 +++ fs/xfs/xfs_sysfs.c | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index c86fe43..7d62450 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -50,6 +50,9 @@ enum { }; enum { XFS_ERR_DEFAULT, + XFS_ERR_EIO, + XFS_ERR_ENOSPC, + XFS_ERR_ENODEV, XFS_ERR_ERRNO_MAX, }; enum { diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 921b079..019e859 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -469,6 +469,21 @@ static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { .retry_timeout = 0, .fail_at_unmount = true, }, + { .name = "EIO", + .fail_speed = XFS_ERR_FAIL_NEVER, + .max_retries = INT_MAX, + .retry_timeout = 0, + .fail_at_unmount = true, + }, + { .name = "ENOSPC", + .fail_speed = XFS_ERR_FAIL_NEVER, + .max_retries = INT_MAX, + .retry_timeout = 0, + .fail_at_unmount = true, + }, + { .name = "ENODEV", + .fail_speed = XFS_ERR_FAIL_FAST, + }, }; static int @@ -568,6 +583,15 @@ xfs_error_get_cfg( struct xfs_error_cfg *cfg; switch (error) { + case EIO: + cfg = &mp->m_error_cfg[error_class][XFS_ERR_EIO]; + break; + case ENOSPC: + cfg = &mp->m_error_cfg[error_class][XFS_ERR_ENOSPC]; + break; + case ENODEV: + cfg = &mp->m_error_cfg[error_class][XFS_ERR_ENODEV]; + break; default: cfg = &mp->m_error_cfg[error_class][XFS_ERR_DEFAULT]; break; -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3C6877FDB for ; Wed, 5 Aug 2015 06:09:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 099E4304051 for ; Wed, 5 Aug 2015 04:09:05 -0700 (PDT) X-ASG-Debug-ID: 1438772941-04bdf06bd1236b70003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7Zwjt3XySEtEyqWB for ; Wed, 05 Aug 2015 04:09:04 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH45sBYcbhTSIMKY8JoFKAQs4HIFlLDGCTAEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H8-QZ for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007o4-Pt for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/10] xfs: add kmem error configuration class Date: Wed, 5 Aug 2015 21:08:41 +1000 X-ASG-Orig-Subj: [PATCH 10/10] xfs: add kmem error configuration class Message-Id: <1438772921-28715-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772943 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner For configuring how to handle memory allocation failures. I'm not yet sure how to hook it into the memory allocation calls - that will be done in a later patch; this just demonstrates how multiple classes are configured and initialised. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.h | 3 ++- fs/xfs/xfs_sysfs.c | 77 +++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 876b86b..03162cd 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -46,6 +46,7 @@ enum { */ enum { XFS_ERR_METADATA, + XFS_ERR_KMEM, XFS_ERR_CLASS_MAX, }; enum { @@ -162,7 +163,7 @@ typedef struct xfs_mount { /* low free space thresholds */ struct xfs_kobj m_kobj; struct xfs_kobj m_error_kobj; - struct xfs_kobj m_error_meta_kobj; + struct xfs_kobj m_error_class_kobj[XFS_ERR_CLASS_MAX]; struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX]; struct workqueue_struct *m_buf_workqueue; diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index fa46ca4..cbbc36a 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -484,26 +484,50 @@ static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { { .name = "ENODEV", .fail_speed = XFS_ERR_FAIL_FAST, }, - { .name = "ENOMEM", + { /* ENOMEM */ .fail_speed = XFS_ERR_FAIL_DEFAULT, }, }; +static const struct xfs_error_init xfs_error_kmem_init[XFS_ERR_ERRNO_MAX] = { + { .name = "Default", + .fail_speed = XFS_ERR_FAIL_NEVER, + .max_retries = INT_MAX, + .retry_timeout = 0, + .fail_at_unmount = false, + }, + { /* EIO */ + .fail_speed = XFS_ERR_FAIL_DEFAULT, + }, + { /* ENOSPC */ + .fail_speed = XFS_ERR_FAIL_DEFAULT, + }, + { /* ENODEV */ + .fail_speed = XFS_ERR_FAIL_DEFAULT, + }, + { .name = "ENOMEM", + .fail_speed = XFS_ERR_FAIL_NEVER, + .max_retries = INT_MAX, + .retry_timeout = 0, + .fail_at_unmount = false, + }, +}; + static int xfs_error_sysfs_init_class( struct xfs_mount *mp, int class, const char *parent_name, - struct xfs_kobj *parent_kobj, const struct xfs_error_init init[]) { + struct xfs_kobj *class_kobj = &mp->m_error_class_kobj[class]; struct xfs_error_cfg *cfg; int error; int i; ASSERT(class < XFS_ERR_CLASS_MAX); - error = xfs_sysfs_init(parent_kobj, &xfs_error_ktype, + error = xfs_sysfs_init(class_kobj, &xfs_error_ktype, &mp->m_error_kobj, parent_name); if (error) return error; @@ -516,8 +540,9 @@ xfs_error_sysfs_init_class( if (cfg->fail_speed == XFS_ERR_FAIL_DEFAULT) continue; + ASSERT(init[i].name); error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, - parent_kobj, init[i].name); + class_kobj, init[i].name); if (error) goto out_error; @@ -534,10 +559,28 @@ out_error: cfg = &mp->m_error_cfg[class][i]; xfs_sysfs_del(&cfg->kobj); } - xfs_sysfs_del(parent_kobj); + xfs_sysfs_del(class_kobj); return error; } +static void +xfs_error_sysfs_del_class( + struct xfs_mount *mp, + int class) +{ + struct xfs_error_cfg *cfg; + int i; + + for (i = 0; i < XFS_ERR_ERRNO_MAX; i++) { + cfg = &mp->m_error_cfg[class][i]; + + if (cfg->fail_speed != XFS_ERR_FAIL_DEFAULT) + xfs_sysfs_del(&cfg->kobj); + } + + xfs_sysfs_del(&mp->m_error_class_kobj[class]); +} + int xfs_error_sysfs_init( struct xfs_mount *mp) @@ -551,14 +594,19 @@ xfs_error_sysfs_init( return error; /* .../xfs//error/metadata/ */ - error = xfs_error_sysfs_init_class(mp, XFS_ERR_METADATA, - "metadata", &mp->m_error_meta_kobj, - xfs_error_meta_init); + error = xfs_error_sysfs_init_class(mp, XFS_ERR_METADATA, "metadata", + xfs_error_meta_init); if (error) goto out_error; + error = xfs_error_sysfs_init_class(mp, XFS_ERR_KMEM, "kmem", + xfs_error_kmem_init); + if (error) + goto out_error_meta; return 0; +out_error_meta: + xfs_error_sysfs_del_class(mp, XFS_ERR_METADATA); out_error: xfs_sysfs_del(&mp->m_error_kobj); return error; @@ -568,18 +616,11 @@ void xfs_error_sysfs_del( struct xfs_mount *mp) { - struct xfs_error_cfg *cfg; - int i, j; + int i; - for (i = 0; i < XFS_ERR_CLASS_MAX; i++) { - for (j = 0; j < XFS_ERR_ERRNO_MAX; j++) { - cfg = &mp->m_error_cfg[i][j]; + for (i = 0; i < XFS_ERR_CLASS_MAX; i++) + xfs_error_sysfs_del_class(mp, i); - if (cfg->fail_speed != XFS_ERR_FAIL_DEFAULT) - xfs_sysfs_del(&cfg->kobj); - } - } - xfs_sysfs_del(&mp->m_error_meta_kobj); xfs_sysfs_del(&mp->m_error_kobj); } -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F111E7FC6 for ; Wed, 5 Aug 2015 06:09:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C13F98F8049 for ; Wed, 5 Aug 2015 04:09:00 -0700 (PDT) X-ASG-Debug-ID: 1438772936-04bdf06bcf236b60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oTfAHaMQGWc46Q3E for ; Wed, 05 Aug 2015 04:08:57 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A+CwDi7cFV/20mLHlbgxurCAEBAQEBAQYFnGhNAQEBAQEBgQtBBYQ6O4ECA4hhpEamQoYfjmwFjE+FLIMEml6LXiaBSgELAYI4LIJ9AQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006Gy-MD for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nI-LL for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC, PATCH 00/10] xfs: configurable error behaviours Date: Wed, 5 Aug 2015 21:08:31 +1000 X-ASG-Orig-Subj: [RFC, PATCH 00/10] xfs: configurable error behaviours Message-Id: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772936 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is my first pass at introducing a framework for configuring the error handling behaviour of various subsystems in XFS. This is being driven by the need to handle things like ENOSPC from thin provisioned block devices in a sane manner, as well as from the mm/ side of the kernel for more configurable memory allocation failure behaviour. The patchset introduces the concepts of: - "failure speed", which defines the obvious behaviour of the error handlers. "fast" will fail immediately, "slow" will fail after a bound number of retries or timeout, and "never" means exactly that. The current behaviour is "never", and this patchset mostly leaves the default behaviour configured this way. - "error class", which is the subsystem or error location the error handlers configure the behaviour for. "metadata" configures async write errors in metadata buffers, "kmem" configures memory allocation failure behaviour and we'll add others as we see fit. - "error handler", which is the specific error the configuration applies to. For IO errors, it's obvious that EIO, ENOSPC, ENODEV, etc are errors that need to be handled in different ways. But for the kmem class, the only error is ENOMEM, so while that it is currently configured that way, the error handlers are more likely to refer to failures in transaction context, in buffer allocation context, etc. IOWs, the name and failure context can change, but the same "failure speed" definition still applies. As a result, the infrastructure is quite flexible - anywhere you have a struct xfs_mount you can look up an error handling configuration and apply it appropriately for that context. The patchset really only implements a metadata buffer async write IO error context handler, but that is just the tip of the iceberg.... I've tried to make the initialisation as generic and simple as possible. It's all table based, so all the default values are in one place and easy to find - you don't have to touch the initialisation code to modify the default error config, or to add new errors. Only sysfs handlers need to be added for new error classes and handlers. The current sysfs layout looks like this: $ find /sys/fs/xfs/vdc/error /sys/fs/xfs/vdc/error /sys/fs/xfs/vdc/error/kmem /sys/fs/xfs/vdc/error/kmem/ENOMEM /sys/fs/xfs/vdc/error/kmem/ENOMEM/max_retries /sys/fs/xfs/vdc/error/kmem/ENOMEM/failure_speed /sys/fs/xfs/vdc/error/kmem/ENOMEM/fail_at_unmount /sys/fs/xfs/vdc/error/kmem/ENOMEM/retry_timeout_seconds /sys/fs/xfs/vdc/error/kmem/Default /sys/fs/xfs/vdc/error/kmem/Default/max_retries /sys/fs/xfs/vdc/error/kmem/Default/failure_speed /sys/fs/xfs/vdc/error/kmem/Default/fail_at_unmount /sys/fs/xfs/vdc/error/kmem/Default/retry_timeout_seconds /sys/fs/xfs/vdc/error/metadata /sys/fs/xfs/vdc/error/metadata/EIO /sys/fs/xfs/vdc/error/metadata/EIO/max_retries /sys/fs/xfs/vdc/error/metadata/EIO/failure_speed /sys/fs/xfs/vdc/error/metadata/EIO/fail_at_unmount /sys/fs/xfs/vdc/error/metadata/EIO/retry_timeout_seconds /sys/fs/xfs/vdc/error/metadata/ENODEV /sys/fs/xfs/vdc/error/metadata/ENODEV/max_retries /sys/fs/xfs/vdc/error/metadata/ENODEV/failure_speed /sys/fs/xfs/vdc/error/metadata/ENODEV/fail_at_unmount /sys/fs/xfs/vdc/error/metadata/ENODEV/retry_timeout_seconds /sys/fs/xfs/vdc/error/metadata/ENOSPC /sys/fs/xfs/vdc/error/metadata/ENOSPC/max_retries /sys/fs/xfs/vdc/error/metadata/ENOSPC/failure_speed /sys/fs/xfs/vdc/error/metadata/ENOSPC/fail_at_unmount /sys/fs/xfs/vdc/error/metadata/ENOSPC/retry_timeout_seconds /sys/fs/xfs/vdc/error/metadata/Default /sys/fs/xfs/vdc/error/metadata/Default/max_retries /sys/fs/xfs/vdc/error/metadata/Default/failure_speed /sys/fs/xfs/vdc/error/metadata/Default/fail_at_unmount /sys/fs/xfs/vdc/error/metadata/Default/retry_timeout_seconds $ Which shows the classes and error handlers, and how different classes can have different error handlers. The patchset runs through xfstests without problems on the default configuration it sets. Note that the default config for the metadata class now sets "fail at unmount" so errors that have been retries indefinitely will fail at unmount and trigger a shutdown at that point. This is preferable to hanging unmount as currently happens. Anyway, have a play, have a poke, and let me know what you think... Cheers, Dave. From dave@fromorbit.com Wed Aug 5 06:09:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E04AC7FEC for ; Wed, 5 Aug 2015 06:09:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8971CAC007 for ; Wed, 5 Aug 2015 04:09:04 -0700 (PDT) X-ASG-Debug-ID: 1438772941-04bdf06bd1236b70002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8nX8pLfPHUgzeiK2 for ; Wed, 05 Aug 2015 04:09:02 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH45sBYcZhTaBKocGpjwmgUoBCzgcgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H4-P9 for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nk-OH for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/10] xfs: add configuration of error failure speed Date: Wed, 5 Aug 2015 21:08:37 +1000 X-ASG-Orig-Subj: [PATCH 06/10] xfs: add configuration of error failure speed Message-Id: <1438772921-28715-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772942 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner On reception of an error, we can fail immediately, perform some bound amount of retries or retry indefinitely. The current behaviour we have is to retry forever. However, we'd like the ability to choose what behaviour we have, and that requires the ability to configure the behaviour through the new sysfs interfaces. Add configuration options for fail fast, slow or never to reflect the three choices above. Fail fast or fail never don't require any other options, but "fail slow" needs configuration to bound the retry behaviour. Add both a maximum retry count and a retry timeout so that we can bound by time and/or physical IO attempts. Finally, plumb these into xfs_buf_iodone error processing so that the error behaviour follows the selected configuration. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.h | 23 +++++++++- fs/xfs/xfs_buf_item.c | 22 +++++++++- fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_sysfs.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 164 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index ed0ea41..afc2d2b 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -181,7 +181,28 @@ typedef struct xfs_buf { unsigned int b_page_count; /* size of page array */ unsigned int b_offset; /* page offset in first page */ int b_error; /* error code on I/O */ - int b_last_error; /* previous async I/O error */ + + /* + * async write failure retry count. Initialised to zero on the first + * failure, then when it exceeds the maximum configured without a + * success the write is considered to be failed permanently and the + * iodone handler will take appropriate action. + * + * For retry timeouts, we record the jiffie of the first failure. This + * means that we can change the retry timeout and it on the next error + * it will be checked against the newly configured timeout. This + * prevents buffers getting stuck in retry loops with a really long + * timeout. + * + * last_error is used to ensure that we are getting repeated errors, not + * different errors. e.g. a block device might change ENOSPC to EIO when + * a failure timeout occurs, so we want to re-initialise the error + * retry behaviour appropriately when that happens. + */ + int b_retries; + unsigned long b_first_retry_time; /* in jiffies */ + int b_last_error; + const struct xfs_buf_ops *b_ops; #ifdef XFS_BUF_LOCK_TRACKING diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index a09ae26..c785698 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -968,6 +968,9 @@ xfs_buf_iodone_callback_error( bp->b_flags |= (XBF_WRITE | XBF_ASYNC | XBF_DONE | XBF_WRITE_FAIL); bp->b_last_error = bp->b_error; + bp->b_retries = 0; + bp->b_first_retry_time = jiffies; + xfs_buf_ioerror(bp, 0); xfs_buf_submit(bp); return true; @@ -977,9 +980,25 @@ xfs_buf_iodone_callback_error( * Repeated failure on an async write. Take action according to the * error configuration we have been set up to use. */ - if (cfg->fail_speed == XFS_ERR_FAIL_FAST) + switch (cfg->fail_speed) { + case XFS_ERR_FAIL_FAST: goto permanent_error; + case XFS_ERR_FAIL_SLOW: + if (++bp->b_retries > cfg->max_retries) + goto permanent_error; + if (!cfg->retry_timeout) + break; + if (time_after(jiffies, + cfg->retry_timeout + bp->b_first_retry_time)) + goto permanent_error; + break; + + case XFS_ERR_FAIL_NEVER: + default: + break; + } + /* still a transient error, higher layers will retry */ xfs_buf_ioerror(bp, 0); xfs_buf_relse(bp); @@ -1021,6 +1040,7 @@ xfs_buf_iodone_callbacks( * retry state here in preparation for the next error that may occur. */ bp->b_last_error = 0; + bp->b_retries = 0; xfs_buf_do_callbacks(bp); bp->b_fspriv = NULL; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 21caa5a..a684a72b 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -62,6 +62,8 @@ enum { struct xfs_error_cfg { struct xfs_kobj kobj; int fail_speed; + int max_retries; /* INT_MAX = retry forever */ + unsigned long retry_timeout; /* in jiffies, 0 = no timeout */ }; typedef struct xfs_mount { diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 9d66095..1f078e1 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -252,7 +252,119 @@ struct kobj_type xfs_log_ktype = { * and any other future type of IO (e.g. special inode or directory error * handling) we care to support. */ +static ssize_t +failure_speed_store( + const char *buf, + size_t count, + void *data) +{ + struct xfs_error_cfg *cfg = data; + char *str = kstrdup(buf, GFP_KERNEL); + char *sp; + int len; + + if (!str) + return -ENOMEM; + + sp = strstrip(str); + len = strlen(sp); + if (strncmp(sp, "fast", len) == 0) + cfg->fail_speed = XFS_ERR_FAIL_FAST; + else if (strncmp(sp, "slow", len) == 0) + cfg->fail_speed = XFS_ERR_FAIL_SLOW; + else if (strncmp(sp, "never", len) == 0) + cfg->fail_speed = XFS_ERR_FAIL_NEVER; + else + count = -EINVAL; + kfree(str); + return count; +} + +static ssize_t +failure_speed_show( + char *buf, + void *data) +{ + struct xfs_error_cfg *cfg = data; + + if (cfg->fail_speed == XFS_ERR_FAIL_FAST) + return snprintf(buf, PAGE_SIZE, "[fast] slow never\n"); + if (cfg->fail_speed == XFS_ERR_FAIL_SLOW) + return snprintf(buf, PAGE_SIZE, "fast [slow] never\n"); + return snprintf(buf, PAGE_SIZE, "fast slow [never]\n"); +} +XFS_SYSFS_ATTR_RW(failure_speed); + +static ssize_t +max_retries_store( + const char *buf, + size_t count, + void *data) +{ + struct xfs_error_cfg *cfg = data; + int ret; + int val; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + if (val < 0 || val > INT_MAX) + return -EINVAL; + + cfg->max_retries = val; + return count; +} + +static ssize_t +max_retries_show( + char *buf, + void *data) +{ + struct xfs_error_cfg *cfg = data; + + return snprintf(buf, PAGE_SIZE, "%d\n", cfg->max_retries); +} +XFS_SYSFS_ATTR_RW(max_retries); + +static ssize_t +retry_timeout_seconds_store( + const char *buf, + size_t count, + void *data) +{ + struct xfs_error_cfg *cfg = data; + int ret; + int val; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + /* 1 day timeout maximum */ + if (val < 0 || val > 86400) + return -EINVAL; + + cfg->retry_timeout = msecs_to_jiffies(val * MSEC_PER_SEC); + return count; +} + +static ssize_t +retry_timeout_seconds_show( + char *buf, + void *data) +{ + struct xfs_error_cfg *cfg = data; + + return snprintf(buf, PAGE_SIZE, "%ld\n", + jiffies_to_msecs(cfg->retry_timeout) * MSEC_PER_SEC); +} +XFS_SYSFS_ATTR_RW(retry_timeout_seconds); + static struct attribute *xfs_error_attrs[] = { + ATTR_LIST(failure_speed), + ATTR_LIST(max_retries), + ATTR_LIST(retry_timeout_seconds), NULL, }; @@ -312,11 +424,15 @@ struct kobj_type xfs_error_ktype = { struct xfs_error_init { char *name; int fail_speed; + int max_retries; + int retry_timeout; /* in seconds */ }; static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { { .name = "Default", .fail_speed = XFS_ERR_FAIL_NEVER, + .max_retries = INT_MAX, + .retry_timeout = 0, }, }; @@ -347,6 +463,9 @@ xfs_error_sysfs_init_class( goto out_error; cfg->fail_speed = init[i].fail_speed; + cfg->max_retries = init[i].max_retries; + cfg->retry_timeout = msecs_to_jiffies( + init[i].retry_timeout * MSEC_PER_SEC); } return 0; -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5426D7FED for ; Wed, 5 Aug 2015 06:09:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3252AC008 for ; Wed, 5 Aug 2015 04:09:04 -0700 (PDT) X-ASG-Debug-ID: 1438772939-04bdf06bd2236b70003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Z5hiPp7iYJ3Yi9ZQ for ; Wed, 05 Aug 2015 04:09:03 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH4pXhBUFjE+IMIdjnlkmgUoBC4I5LDGCTAEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006H3-OY for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nf-ND for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/10] xfs: introduce table-based init for error behaviours Date: Wed, 5 Aug 2015 21:08:36 +1000 X-ASG-Orig-Subj: [PATCH 05/10] xfs: introduce table-based init for error behaviours Message-Id: <1438772921-28715-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772943 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Before we start expanding the number of error classes and errors we can configure behaviour for, we need a simple and clear way to define the default behaviour that we initialised each mount with. Introduce a table based method for keeping the initial configuration in, and apply that to the existing initialisation code. Signed-off-by: Dave Chinner --- fs/xfs/xfs_sysfs.c | 72 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 3667d33..9d66095 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -303,11 +303,67 @@ struct kobj_type xfs_error_ktype = { .release = xfs_sysfs_release, }; +/* + * Error initialisation tables. These need to be ordered in the same + * order as the enums used to index the array. All class init tables need to + * define a "default" behaviour as the first entry, all other entries can be + * empty. + */ +struct xfs_error_init { + char *name; + int fail_speed; +}; + +static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { + { .name = "Default", + .fail_speed = XFS_ERR_FAIL_NEVER, + }, +}; + +static int +xfs_error_sysfs_init_class( + struct xfs_mount *mp, + int class, + const char *parent_name, + struct xfs_kobj *parent_kobj, + const struct xfs_error_init init[]) +{ + struct xfs_error_cfg *cfg; + int error; + int i; + + ASSERT(class < XFS_ERR_CLASS_MAX); + + error = xfs_sysfs_init(parent_kobj, &xfs_error_ktype, + &mp->m_error_kobj, parent_name); + if (error) + return error; + + for (i = 0; i < XFS_ERR_ERRNO_MAX; i++) { + cfg = &mp->m_error_cfg[class][i]; + error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, + parent_kobj, init[i].name); + if (error) + goto out_error; + + cfg->fail_speed = init[i].fail_speed; + } + return 0; + +out_error: + /* unwind the entries that succeeded */ + for (i--; i >= 0; i--) { + cfg = &mp->m_error_cfg[class][i]; + xfs_sysfs_del(&cfg->kobj); + } + xfs_sysfs_del(parent_kobj); + return error; +} + int xfs_error_sysfs_init( struct xfs_mount *mp) { - struct xfs_error_cfg *cfg; int error; /* .../xfs//error/ */ @@ -317,22 +373,14 @@ xfs_error_sysfs_init( return error; /* .../xfs//error/metadata/ */ - error = xfs_sysfs_init(&mp->m_error_meta_kobj, &xfs_error_ktype, - &mp->m_error_kobj, "metadata"); + error = xfs_error_sysfs_init_class(mp, XFS_ERR_METADATA, + "metadata", &mp->m_error_meta_kobj, + xfs_error_meta_init); if (error) goto out_error; - cfg = &mp->m_error_cfg[XFS_ERR_METADATA][XFS_ERR_DEFAULT]; - error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, - &mp->m_error_meta_kobj, "Default"); - if (error) - goto out_error_meta; - cfg->fail_speed = XFS_ERR_FAIL_NEVER; - return 0; -out_error_meta: - xfs_sysfs_del(&mp->m_error_meta_kobj); out_error: xfs_sysfs_del(&mp->m_error_kobj); return error; -- 2.1.4 From dave@fromorbit.com Wed Aug 5 06:09:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 947297FF4 for ; Wed, 5 Aug 2015 06:09:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2CF50AC007 for ; Wed, 5 Aug 2015 04:09:03 -0700 (PDT) X-ASG-Debug-ID: 1438772941-04bdf06bd1236b70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UF9kvC0nwznGLAjL for ; Wed, 05 Aug 2015 04:09:01 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DWCgDi7cFV/20mLHlbgxuBPalLAQEBAQEBBpxtTQEBAQEBAYELQQWDXgEFJy8zCBgxOQMbGYgtywiGH45sBZR/jh2HN4VLix0mgUoBCzgcgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 20:38:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZMwYt-0006Gz-Mf for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZMwYt-0007nL-Lx for xfs@oss.sgi.com; Wed, 05 Aug 2015 21:08:43 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/10] xfs: remove XBF_DONE flag wrapper macros Date: Wed, 5 Aug 2015 21:08:32 +1000 X-ASG-Orig-Subj: [PATCH 01/10] xfs: remove XBF_DONE flag wrapper macros Message-Id: <1438772921-28715-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> References: <1438772921-28715-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438772941 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner They only set/clear/check a flag, no need for obfuscating this with a macro. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 2 +- fs/xfs/xfs_buf.h | 4 ---- fs/xfs/xfs_buf_item.c | 6 +++--- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_log.c | 4 ++-- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 2 +- fs/xfs/xfs_trans_buf.c | 4 ++-- 8 files changed, 11 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 004b45c..6252a0b 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -644,7 +644,7 @@ xfs_buf_read_map( if (bp) { trace_xfs_buf_read(bp, flags, _RET_IP_); - if (!XFS_BUF_ISDONE(bp)) { + if (!(bp->b_flags & XBF_DONE)) { XFS_STATS_INC(xb_get_read); bp->b_ops = ops; _xfs_buf_read(bp, flags); diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 331c1cc..68c8f2d 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -319,10 +319,6 @@ void xfs_buf_stale(struct xfs_buf *bp); #define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XBF_STALE) #define XFS_BUF_ISSTALE(bp) ((bp)->b_flags & XBF_STALE) -#define XFS_BUF_DONE(bp) ((bp)->b_flags |= XBF_DONE) -#define XFS_BUF_UNDONE(bp) ((bp)->b_flags &= ~XBF_DONE) -#define XFS_BUF_ISDONE(bp) ((bp)->b_flags & XBF_DONE) - #define XFS_BUF_ASYNC(bp) ((bp)->b_flags |= XBF_ASYNC) #define XFS_BUF_UNASYNC(bp) ((bp)->b_flags &= ~XBF_ASYNC) #define XFS_BUF_ISASYNC(bp) ((bp)->b_flags & XBF_ASYNC) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 1816334..ee63961 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -470,7 +470,7 @@ xfs_buf_item_unpin( xfs_buf_hold(bp); bp->b_flags |= XBF_ASYNC; xfs_buf_ioerror(bp, -EIO); - XFS_BUF_UNDONE(bp); + bp->b_flags &= ~XBF_DONE; xfs_buf_stale(bp); xfs_buf_ioend(bp); } @@ -949,7 +949,7 @@ xfs_buf_iodone_callbacks( */ if (XFS_FORCED_SHUTDOWN(mp)) { xfs_buf_stale(bp); - XFS_BUF_DONE(bp); + bp->b_flags |= XBF_DONE; trace_xfs_buf_item_iodone(bp, _RET_IP_); goto do_callbacks; } @@ -995,7 +995,7 @@ xfs_buf_iodone_callbacks( * sure to return the error to the caller of xfs_bwrite(). */ xfs_buf_stale(bp); - XFS_BUF_DONE(bp); + bp->b_flags |= XBF_DONE; trace_xfs_buf_error_relse(bp, _RET_IP_); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4156e37..b42aa39 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3260,7 +3260,7 @@ cluster_corrupt_out: * mark it as stale and brelse. */ if (bp->b_iodone) { - XFS_BUF_UNDONE(bp); + bp->b_flags &= ~XBF_DONE; xfs_buf_stale(bp); xfs_buf_ioerror(bp, -EIO); xfs_buf_ioend(bp); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6b5a84a..a3c16b9 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3906,7 +3906,7 @@ xfs_log_force_umount( log->l_flags & XLOG_ACTIVE_RECOVERY) { mp->m_flags |= XFS_MOUNT_FS_SHUTDOWN; if (mp->m_sb_bp) - XFS_BUF_DONE(mp->m_sb_bp); + mp->m_sb_bp->b_flags |= XBF_DONE; return 0; } @@ -3936,7 +3936,7 @@ xfs_log_force_umount( spin_lock(&log->l_icloglock); mp->m_flags |= XFS_MOUNT_FS_SHUTDOWN; if (mp->m_sb_bp) - XFS_BUF_DONE(mp->m_sb_bp); + mp->m_sb_bp->b_flags |= XBF_DONE; /* * Mark the log and the iclogs with IO error flags to prevent any diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 6f83d12..78abbe45 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4488,7 +4488,7 @@ xlog_do_recover( * updates, re-read in the superblock and reverify it. */ bp = xfs_getsb(log->l_mp, 0); - XFS_BUF_UNDONE(bp); + bp->b_flags &= ~XBF_DONE; ASSERT(!(XFS_BUF_ISWRITE(bp))); XFS_BUF_READ(bp); XFS_BUF_UNASYNC(bp); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 461e791..a094e47 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1261,7 +1261,7 @@ xfs_getsb( } xfs_buf_hold(bp); - ASSERT(XFS_BUF_ISDONE(bp)); + ASSERT(bp->b_flags & XBF_DONE); return bp; } diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 7579841..ed6f61f 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -155,7 +155,7 @@ xfs_trans_get_buf_map( ASSERT(xfs_buf_islocked(bp)); if (XFS_FORCED_SHUTDOWN(tp->t_mountp)) { xfs_buf_stale(bp); - XFS_BUF_DONE(bp); + bp->b_flags |= XBF_DONE; } ASSERT(bp->b_transp == tp); @@ -518,7 +518,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, * inside the b_bdstrat callback so that this won't get written to * disk. */ - XFS_BUF_DONE(bp); + bp->b_flags |= XBF_DONE; ASSERT(atomic_read(&bip->bli_refcount) > 0); bp->b_iodone = xfs_buf_iodone_callbacks; -- 2.1.4 From bfoster@redhat.com Wed Aug 5 06:56:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 902D77F98 for ; Wed, 5 Aug 2015 06:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6BA3830404E for ; Wed, 5 Aug 2015 04:56:10 -0700 (PDT) X-ASG-Debug-ID: 1438775769-04bdf06bd2237cd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Sl8RQIuJOD27kU3l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 04:56:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id DACF4AC859 for ; Wed, 5 Aug 2015 11:56:08 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t75Bu8ux008192 for ; Wed, 5 Aug 2015 07:56:08 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 810ED122E55; Wed, 5 Aug 2015 07:56:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: relocate sparse inode mount warning Date: Wed, 5 Aug 2015 07:56:06 -0400 X-ASG-Orig-Subj: [PATCH] xfs: relocate sparse inode mount warning Message-Id: <1438775767-59687-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438775769 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The sparse inodes feature is currently considered experimental. We warn at mount time from xfs_mount_validate_sb(). This function is part of the superblock verifier codepath, however, which means it could be invoked repeatedly on superblock reads or writes. This is currently only noticeable from userspace, where mkfs produces multiple warnings at format time. As mkfs warnings were not the intent of this change, relocate the mount time warning to xfs_fs_fill_super(), which is only invoked once and only in kernel space. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_sb.c | 3 --- fs/xfs/xfs_super.c | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 21009db..4742514 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -186,9 +186,6 @@ xfs_mount_validate_sb( if (xfs_sb_version_hassparseinodes(sbp)) { uint32_t align; - xfs_alert(mp, - "EXPERIMENTAL sparse inode feature enabled. Use at your own risk!"); - align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize >> sbp->sb_blocklog; if (sbp->sb_inoalignmt != align) { diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 1fb16562..f98ce83 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1528,6 +1528,10 @@ xfs_fs_fill_super( } } + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) + xfs_alert(mp, + "EXPERIMENTAL sparse inode feature enabled. Use at your own risk!"); + error = xfs_mountfs(mp); if (error) goto out_filestream_unmount; -- 2.1.0 From bfoster@redhat.com Wed Aug 5 06:56:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C2B187FA4 for ; Wed, 5 Aug 2015 06:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 917E48F804B for ; Wed, 5 Aug 2015 04:56:10 -0700 (PDT) X-ASG-Debug-ID: 1438775769-04cbb0416d27ff60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id O83DfbW5zGBFYJFC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 04:56:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id DBEC92B9DE5 for ; Wed, 5 Aug 2015 11:56:08 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t75Bu8fv008194 for ; Wed, 5 Aug 2015 07:56:08 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AE6151228EA; Wed, 5 Aug 2015 07:56:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] libxfs: remove sparse inode mount warning Date: Wed, 5 Aug 2015 07:56:07 -0400 X-ASG-Orig-Subj: [PATCH] libxfs: remove sparse inode mount warning Message-Id: <1438775767-59687-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1438775767-59687-1-git-send-email-bfoster@redhat.com> References: <1438775767-59687-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438775769 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The sparse inodes experimental feature warning fires multiple times during mkfs because the warning is emitted as part of the superblock verifier codepath. The warning is intended as a mount-time warning only and has been relocated as such in the kernel repo. Remove the warning from libxfs such that it is not emitted from userspace. Signed-off-by: Brian Foster --- libxfs/xfs_sb.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index ab30dc5..039596e 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -180,9 +180,6 @@ xfs_mount_validate_sb( if (xfs_sb_version_hassparseinodes(sbp)) { uint32_t align; - xfs_alert(mp, - "EXPERIMENTAL sparse inode feature enabled. Use at your own risk!"); - align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize >> sbp->sb_blocklog; if (sbp->sb_inoalignmt != align) { -- 2.1.0 From bounce@boomjets.fr Wed Aug 5 07:02:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=HTML_IMAGE_ONLY_16, HTML_MESSAGE,HTML_SHORT_LINK_IMG_2,T_DKIM_INVALID,T_KHOP_FOREIGN_CLICK autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 72E4A7FA4 for ; Wed, 5 Aug 2015 07:02:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 500498F8049 for ; Wed, 5 Aug 2015 05:02:13 -0700 (PDT) X-ASG-Debug-ID: 1438776129-04cbb0416d280100001-NocioJ Received: from adedata.eurowh.com (adedata.eurowh.com [212.83.188.4]) by cuda.sgi.com with ESMTP id cKzLjnzUhGkGVnaC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 05:02:10 -0700 (PDT) X-Barracuda-Envelope-From: bounce@boomjets.fr X-Barracuda-Apparent-Source-IP: 212.83.188.4 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=boomjets.fr; s=default; h=Content-Transfer-Encoding:Content-Type:List-Unsubscribe:MIME-Version:Reply-To:From:Date:Message-ID:Subject:To; bh=65DFIlandPubnuxFoYyqoSEhF8ZUrtIWe8Sfe82F+TM=; b=TJeWJEja5re/Ga0FT8gjmozV/2XuEA0uCQpU/SFAq3cuoMUfgZobXaduJt/AcCEAePvT5GzZbNMICx14LaUf3CXeR1pUJMRyhA7xrhPBXDILGarW5k1VDkrYbmtLP7LHwpX8QicHMfAXGnbGfzGoX+KT+ymQ/smqlt+o2uQDEU19Gvn9MCOb74MQ9rTfkKmLbBbz67oWmcLN+tTq4M3YgXu43C+jglgjyody4jUrsScCpVxIu7ana7LxTUUTK8SnXCyYDNoG5fYkDDY4j/P50/GNilptVYlf5GQASqR1zBliYIDZzAx8G2vQD5EdvARFSWbw/C4MFM086ZjnxGN2og==; Received: from boomjeto by adedata.eurowh.com with local (Exim 4.85) (envelope-from ) id 1ZMxOa-0005Dm-Va for xfs@oss.sgi.com; Wed, 05 Aug 2015 14:02:08 +0200 To: xfs@oss.sgi.com Subject: =?UTF-8?B?Q2libGVyIGxhIHByZW1pw6hyZSBwYWdlIEdvb2dsZSDDoCBsYSByZW50csOpZSAh?= Message-ID: <8f5d5e20cc5d85ee3fb2e46401d95a0c@boomjets.fr> X-ASG-Orig-Subj: =?UTF-8?B?Q2libGVyIGxhIHByZW1pw6hyZSBwYWdlIEdvb2dsZSDDoCBsYSByZW50csOpZSAh?= Date: Wed, 05 Aug 2015 09:40:13 +0000 From: "Altech" Reply-To: referencement@boomjets.fr MIME-Version: 1.0 X-Mailer-LID: 9 List-Unsubscribe: X-Mailer-RecptId: 801074 X-Mailer-SID: 11 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_391e4c43996839ba99a370749e1e731a" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - adedata.eurowh.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [505 505] / [47 12] X-AntiAbuse: Sender Address Domain - boomjets.fr X-Get-Message-Sender-Via: adedata.eurowh.com: authenticated_id: boomjeto/from_h X-Barracuda-Connect: adedata.eurowh.com[212.83.188.4] X-Barracuda-Start-Time: 1438776129 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.87 X-Barracuda-Spam-Status: No, SCORE=0.87 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_16, HTML_MESSAGE, HTML_SHORT_LINK_IMG_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.24 HTML_SHORT_LINK_IMG_2 HTML is very short with a linked image --b1_391e4c43996839ba99a370749e1e731a Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Pour visualiser en ligne cette lettre d'information cliquez-ici http://boomjets.fr/display.php?M=801074&C=fe8a35a41110a7ae35da37d08ac3f0d8&S=11&L=9&N=4 Se désinscrire et ne plus recevoir de message de notre part :http://boomjets.fr/unsubscribe.php?M=801074&C=fe8a35a41110a7ae35da37d08ac3f0d8&L=9&N=11 --b1_391e4c43996839ba99a370749e1e731a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit referencement de votre site internet

Pour visualiser en ligne cette lettre d'information cliquez-ici

R

Se désinscrire et ne plus recevoir de message de notre part 

--b1_391e4c43996839ba99a370749e1e731a-- From ferseiti@linux.vnet.ibm.com Wed Aug 5 08:00:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BAC37FA8 for ; Wed, 5 Aug 2015 08:00:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0842E304064 for ; Wed, 5 Aug 2015 06:00:11 -0700 (PDT) X-ASG-Debug-ID: 1438779609-04cbb0416c281430001-NocioJ Received: from e24smtp01.br.ibm.com (e24smtp01.br.ibm.com [32.104.18.85]) by cuda.sgi.com with ESMTP id JdO73D89yuQBwu7s (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 06:00:10 -0700 (PDT) X-Barracuda-Envelope-From: ferseiti@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 32.104.18.85 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.85] Received: from /spool/local by e24smtp01.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 5 Aug 2015 10:00:08 -0300 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.85] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.85] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.85] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.85] Received: from d24dlp01.br.ibm.com (9.18.248.204) by e24smtp01.br.ibm.com (10.172.0.143) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 5 Aug 2015 10:00:05 -0300 X-Helo: d24dlp01.br.ibm.com X-MailFrom: ferseiti@linux.vnet.ibm.com X-RcptTo: xfs@oss.sgi.com Received: from d24relay02.br.ibm.com (d24relay02.br.ibm.com [9.13.184.26]) by d24dlp01.br.ibm.com (Postfix) with ESMTP id D3004352006E for ; Wed, 5 Aug 2015 08:58:58 -0400 (EDT) Received: from d24av03.br.ibm.com (d24av03.br.ibm.com [9.8.31.95]) by d24relay02.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t75CwRKr27263362 for ; Wed, 5 Aug 2015 09:58:27 -0300 Received: from d24av03.br.ibm.com (localhost [127.0.0.1]) by d24av03.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t75D03KK020507 for ; Wed, 5 Aug 2015 10:00:04 -0300 Received: from oc0745135144.ibm.com ([9.78.143.6]) by d24av03.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t75D02b7020459; Wed, 5 Aug 2015 10:00:02 -0300 Message-ID: <55C208D2.4060907@linux.vnet.ibm.com> Date: Wed, 05 Aug 2015 10:00:02 -0300 From: Fernando Seiti Furusato User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el In-Reply-To: <20150804225819.GV16638@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15080513-1524-0000-0000-00000345C2F7 X-Barracuda-Connect: e24smtp01.br.ibm.com[32.104.18.85] X-Barracuda-Start-Time: 1438779610 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/04/2015 07:58 PM, Dave Chinner wrote: > That makes distclean do the same thing that realclean does and, as > that commit I pointed out previously, has been intentionally > separated in the build system. You could make the debian/rules file > simply call 'make realclean' rather than 'make distclean' to acheive > this without changing the main makefile. Either way, however, I > don't think that's the problem. Yes, except I tried changing debian/rules to use realclean before coming up with that idea and it broke the build. make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' ./configure $LOCAL_CONFIGURE_OPTIONS configure: error: cannot find install-sh, install.sh, or shtool in . "."/. Makefile:89: recipe for target 'include/builddefs' failed make[1]: *** [include/builddefs] Error 1 make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' debian/rules:36: recipe for target '.census' failed make: *** [.census] Error 2 > Darrick Wong noted on #xfs that his builds of xfsprogs on ppc64el > from a tarball don't fail at all. His libtool chain is: When I build xfsprog on ppc64el from a tarball, it does not fail at all either. But in my case, specifically, it is because the tarball does not come with a configure file (which would solve the problem I pointed out), so Makefile generates it and runs libtoolize -c -i which updates the configuration files needed. > >> host-triplet: powerpc64le-unknown-linux-gnu >> libtoolize: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 >> automake: automake (GNU automake) 1.14.1 >> autoconf: autoconf (GNU Autoconf) 2.69 > > Which is similar to mine, but libtoolize is slightly older (and I'm > on x86_64-pc-linux-gnu). It turns out that the reason the build > works on his machines is that someone had made a small manual change > to /usr/share/aclocal/libtool.m4: > > --- a/libtool.m4 2014-02-11 04:58:49.000000000 -0800 > +++ b/libtool.m4 2015-07-31 13:48:23.375432372 -0700 > @@ -1312,7 +1312,7 @@ > rm -rf conftest* > ;; > > -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ > +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ > s390*-*linux*|s390*-*tpf*|sparc*-*linux*) > # Find out which ABI we are using. > echo 'int i;' > conftest.$ac_ext > > i.e. the problem looks to be that the libtool package shipped in > debian/unstable does not support ppc64el correctly.... Actually powerpc*-*linux* covers the triplet for ppc64el, as seen in: >> host-triplet: powerpc64le-unknown-linux-gnu So ppc*-*linux* does not make difference for ppc64el, if that is what you refer to. IMHO, if the debian src package xfsprogs came just like it comes in git://oss.sgi.com/xfs/cmds/xfsprogs, ie clean, the build would not fail. Thanks and regards. -- Fernando Seiti Furusato IBM Linux Technology Center From debbugs@buxtehude.debian.org Wed Aug 5 08:03:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 475DB7FA8 for ; Wed, 5 Aug 2015 08:03:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BC252AC00A for ; Wed, 5 Aug 2015 06:03:22 -0700 (PDT) X-ASG-Debug-ID: 1438779793-04cbb0416d281580001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 79gmVFGvVHCWFh4t (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 05 Aug 2015 06:03:13 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZMyLg-0007rf-NU; Wed, 05 Aug 2015 13:03:12 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Fernando Seiti Furusato , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Fernando Seiti Furusato Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 05 Aug 2015 13:03:10 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143877962028928 (code B ref 793495); Wed, 05 Aug 2015 13:03:10 +0000 Received: (at 793495) by bugs.debian.org; 5 Aug 2015 13:00:20 +0000 Received: from e24smtp02.br.ibm.com ([32.104.18.86]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_CAMELLIA_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1ZMyIt-0007Uu-Ph for 793495@bugs.debian.org; Wed, 05 Aug 2015 13:00:20 +0000 Received: from /spool/local by e24smtp02.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for <793495@bugs.debian.org> from ; Wed, 5 Aug 2015 10:00:07 -0300 Received: from d24dlp01.br.ibm.com (9.18.248.204) by e24smtp02.br.ibm.com (10.172.0.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 5 Aug 2015 10:00:05 -0300 X-Helo: d24dlp01.br.ibm.com X-MailFrom: ferseiti@linux.vnet.ibm.com X-RcptTo: 793495@bugs.debian.org Received: from d24relay01.br.ibm.com (d24relay01.br.ibm.com [9.8.31.16]) by d24dlp01.br.ibm.com (Postfix) with ESMTP id EB7543520078 for <793495@bugs.debian.org>; Wed, 5 Aug 2015 08:58:58 -0400 (EDT) Received: from d24av03.br.ibm.com (d24av03.br.ibm.com [9.8.31.95]) by d24relay01.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t75D0R0K3870734 for <793495@bugs.debian.org>; Wed, 5 Aug 2015 10:00:27 -0300 Received: from d24av03.br.ibm.com (localhost [127.0.0.1]) by d24av03.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t75D03KE020507 for <793495@bugs.debian.org>; Wed, 5 Aug 2015 10:00:03 -0300 Received: from oc0745135144.ibm.com ([9.78.143.6]) by d24av03.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t75D02b7020459; Wed, 5 Aug 2015 10:00:02 -0300 Message-ID: <55C208D2.4060907@linux.vnet.ibm.com> Date: Wed, 05 Aug 2015 10:00:02 -0300 From: Fernando Seiti Furusato User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> In-Reply-To: <20150804225819.GV16638@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15080513-0021-0000-0000-000003497058 X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438779793 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21367 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 08/04/2015 07:58 PM, Dave Chinner wrote: > That makes distclean do the same thing that realclean does and, as > that commit I pointed out previously, has been intentionally > separated in the build system. You could make the debian/rules file > simply call 'make realclean' rather than 'make distclean' to acheive > this without changing the main makefile. Either way, however, I > don't think that's the problem. Yes, except I tried changing debian/rules to use realclean before coming up with that idea and it broke the build. make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' ./configure $LOCAL_CONFIGURE_OPTIONS configure: error: cannot find install-sh, install.sh, or shtool in . "."/. Makefile:89: recipe for target 'include/builddefs' failed make[1]: *** [include/builddefs] Error 1 make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' debian/rules:36: recipe for target '.census' failed make: *** [.census] Error 2 > Darrick Wong noted on #xfs that his builds of xfsprogs on ppc64el > from a tarball don't fail at all. His libtool chain is: When I build xfsprog on ppc64el from a tarball, it does not fail at all either. But in my case, specifically, it is because the tarball does not come with a configure file (which would solve the problem I pointed out), so Makefile generates it and runs libtoolize -c -i which updates the configuration files needed. > >> host-triplet: powerpc64le-unknown-linux-gnu >> libtoolize: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 >> automake: automake (GNU automake) 1.14.1 >> autoconf: autoconf (GNU Autoconf) 2.69 > > Which is similar to mine, but libtoolize is slightly older (and I'm > on x86_64-pc-linux-gnu). It turns out that the reason the build > works on his machines is that someone had made a small manual change > to /usr/share/aclocal/libtool.m4: > > --- a/libtool.m4 2014-02-11 04:58:49.000000000 -0800 > +++ b/libtool.m4 2015-07-31 13:48:23.375432372 -0700 > @@ -1312,7 +1312,7 @@ > rm -rf conftest* > ;; > > -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ > +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ > s390*-*linux*|s390*-*tpf*|sparc*-*linux*) > # Find out which ABI we are using. > echo 'int i;' > conftest.$ac_ext > > i.e. the problem looks to be that the libtool package shipped in > debian/unstable does not support ppc64el correctly.... Actually powerpc*-*linux* covers the triplet for ppc64el, as seen in: >> host-triplet: powerpc64le-unknown-linux-gnu So ppc*-*linux* does not make difference for ppc64el, if that is what you refer to. IMHO, if the debian src package xfsprogs came just like it comes in git://oss.sgi.com/xfs/cmds/xfsprogs, ie clean, the build would not fail. Thanks and regards. -- Fernando Seiti Furusato IBM Linux Technology Center From david@fromorbit.com Wed Aug 5 08:47:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AF0E27FAE for ; Wed, 5 Aug 2015 08:47:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B67EAC004 for ; Wed, 5 Aug 2015 06:47:46 -0700 (PDT) X-ASG-Debug-ID: 1438782462-04cb6c67402ffdd0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7KJDOXY1G029shfu for ; Wed, 05 Aug 2015 06:47:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CSBgBrE8JV/20mLHlbgxtUaalEDAEBAQEBAQaVKYV7BAICgUBNAQEBAQEBgQuEIwEBAQMBOhwjEAgDGAklDwUlAyETiCYHy2YBAQEBBgEBAQEBHRmGBoUwhQkHhCwFhxmGYIcGhH+HVYFJRoNdk3wmgg4cgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 23:17:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMz2X-0006bk-5H; Wed, 05 Aug 2015 23:47:29 +1000 Date: Wed, 5 Aug 2015 23:47:29 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el Message-ID: <20150805134729.GX16638@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C208D2.4060907@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438782462 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21367 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 05, 2015 at 10:00:02AM -0300, Fernando Seiti Furusato wrote: > On 08/04/2015 07:58 PM, Dave Chinner wrote: > > >That makes distclean do the same thing that realclean does and, as > >that commit I pointed out previously, has been intentionally > >separated in the build system. You could make the debian/rules file > >simply call 'make realclean' rather than 'make distclean' to acheive > >this without changing the main makefile. Either way, however, I > >don't think that's the problem. > Yes, except I tried changing debian/rules to use realclean before coming up > with that idea and it broke the build. > > make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' > ./configure $LOCAL_CONFIGURE_OPTIONS > configure: error: cannot find install-sh, install.sh, or shtool in . "."/. > Makefile:89: recipe for target 'include/builddefs' failed > make[1]: *** [include/builddefs] Error 1 > make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' > debian/rules:36: recipe for target '.census' failed > make: *** [.census] Error 2 make realclean also removes the .census file, so it appears that the debian package build has a dependency on it. Still, that's a side issue, because we still don't exactly what is causing the configure script to fail. > >Darrick Wong noted on #xfs that his builds of xfsprogs on ppc64el > >from a tarball don't fail at all. His libtool chain is: > When I build xfsprog on ppc64el from a tarball, it does not fail at all either. > But in my case, specifically, it is because the tarball does not come with > a configure file (which would solve the problem I pointed out), so Makefile > generates it and runs libtoolize -c -i which updates the configuration files > needed. You seem to be talking about 2 different tarballs here. The tarballs I release most definitely have a configure script in them: $ tar tfv xfsprogs-4.2.0-rc1.tar.gz |grep configure -rw-r--r-- dave/dave 3098 2015-08-04 11:16 xfsprogs-4.2.0-rc1/configure.ac -rwxr-xr-x dave/dave 469084 2015-08-04 14:25 xfsprogs-4.2.0-rc1/configure So I don't know where you are getting xfsprogs tarballs without configure scripts from. To clear up any confusion, can you please explain exactly what you are building (step by step for the dummies in the audience like me) so we all understand exactly what context the build is failing in? > >> host-triplet: powerpc64le-unknown-linux-gnu > >> libtoolize: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 > >> automake: automake (GNU automake) 1.14.1 > >> autoconf: autoconf (GNU Autoconf) 2.69 > > > >Which is similar to mine, but libtoolize is slightly older (and I'm > >on x86_64-pc-linux-gnu). It turns out that the reason the build > >works on his machines is that someone had made a small manual change > >to /usr/share/aclocal/libtool.m4: > > > >--- a/libtool.m4 2014-02-11 04:58:49.000000000 -0800 > >+++ b/libtool.m4 2015-07-31 13:48:23.375432372 -0700 > >@@ -1312,7 +1312,7 @@ > > rm -rf conftest* > > ;; > > > >-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ > >+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ > > s390*-*linux*|s390*-*tpf*|sparc*-*linux*) > > # Find out which ABI we are using. > > echo 'int i;' > conftest.$ac_ext > > > >i.e. the problem looks to be that the libtool package shipped in > >debian/unstable does not support ppc64el correctly.... > > Actually powerpc*-*linux* covers the triplet for ppc64el, as seen in: > >> host-triplet: powerpc64le-unknown-linux-gnu > So ppc*-*linux* does not make difference for ppc64el, if that is what you > refer to. Did you actually try it? Sure, it may not be the reason that it builds correctly on Darrick's machine, but the fact is that Darricks' environment successfully builds packages from the official xfsprogs tarballs without problems and yours doesn't. The above change is the only thing that is non-standard in Darrick's environment, so it's an obvious change to try even if it makes no sense to you. And it still doesn't change the situation: we can't fix the problem until we understand what is causing it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Wed Aug 5 08:51:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 591E57CBF for ; Wed, 5 Aug 2015 08:51:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC650AC002 for ; Wed, 5 Aug 2015 06:51:07 -0700 (PDT) X-ASG-Debug-ID: 1438782665-04cb6c673f2fff10001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id XkTuoQfvrOHSCaa7 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 05 Aug 2015 06:51:06 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZMz5z-0003yT-Nz; Wed, 05 Aug 2015 13:51:03 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Dave Chinner , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 05 Aug 2015 13:51:01 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143878246514114 (code B ref 793495); Wed, 05 Aug 2015 13:51:01 +0000 Received: (at 793495) by bugs.debian.org; 5 Aug 2015 13:47:45 +0000 Received: from ipmail07.adl2.internode.on.net ([150.101.137.131]) by buxtehude.debian.org with esmtp (Exim 4.84) (envelope-from ) id 1ZMz2n-0003eh-Hu for 793495@bugs.debian.org; Wed, 05 Aug 2015 13:47:45 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CSBgBrE8JV/20mLHlbgxtUaalEDAEBAQEBAQaVKYV7BAICgUBNAQEBAQEBgQuEIwEBAQMBOhwjEAgDGAklDwUlAyETiCYHy2YBAQEBBgEBAQEBHRmGBoUwhQkHhCwFhxmGYIcGhH+HVYFJRoNdk3wmgg4cgWUsMYJMAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2015 23:17:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZMz2X-0006bk-5H; Wed, 05 Aug 2015 23:47:29 +1000 Date: Wed, 5 Aug 2015 23:47:29 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Message-ID: <20150805134729.GX16638@dastard> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C208D2.4060907@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438782666 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21367 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 05, 2015 at 10:00:02AM -0300, Fernando Seiti Furusato wrote: > On 08/04/2015 07:58 PM, Dave Chinner wrote: > > >That makes distclean do the same thing that realclean does and, as > >that commit I pointed out previously, has been intentionally > >separated in the build system. You could make the debian/rules file > >simply call 'make realclean' rather than 'make distclean' to acheive > >this without changing the main makefile. Either way, however, I > >don't think that's the problem. > Yes, except I tried changing debian/rules to use realclean before coming up > with that idea and it broke the build. > > make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' > ./configure $LOCAL_CONFIGURE_OPTIONS > configure: error: cannot find install-sh, install.sh, or shtool in . "."/. > Makefile:89: recipe for target 'include/builddefs' failed > make[1]: *** [include/builddefs] Error 1 > make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' > debian/rules:36: recipe for target '.census' failed > make: *** [.census] Error 2 make realclean also removes the .census file, so it appears that the debian package build has a dependency on it. Still, that's a side issue, because we still don't exactly what is causing the configure script to fail. > >Darrick Wong noted on #xfs that his builds of xfsprogs on ppc64el > >from a tarball don't fail at all. His libtool chain is: > When I build xfsprog on ppc64el from a tarball, it does not fail at all either. > But in my case, specifically, it is because the tarball does not come with > a configure file (which would solve the problem I pointed out), so Makefile > generates it and runs libtoolize -c -i which updates the configuration files > needed. You seem to be talking about 2 different tarballs here. The tarballs I release most definitely have a configure script in them: $ tar tfv xfsprogs-4.2.0-rc1.tar.gz |grep configure -rw-r--r-- dave/dave 3098 2015-08-04 11:16 xfsprogs-4.2.0-rc1/configure.ac -rwxr-xr-x dave/dave 469084 2015-08-04 14:25 xfsprogs-4.2.0-rc1/configure So I don't know where you are getting xfsprogs tarballs without configure scripts from. To clear up any confusion, can you please explain exactly what you are building (step by step for the dummies in the audience like me) so we all understand exactly what context the build is failing in? > >> host-triplet: powerpc64le-unknown-linux-gnu > >> libtoolize: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 > >> automake: automake (GNU automake) 1.14.1 > >> autoconf: autoconf (GNU Autoconf) 2.69 > > > >Which is similar to mine, but libtoolize is slightly older (and I'm > >on x86_64-pc-linux-gnu). It turns out that the reason the build > >works on his machines is that someone had made a small manual change > >to /usr/share/aclocal/libtool.m4: > > > >--- a/libtool.m4 2014-02-11 04:58:49.000000000 -0800 > >+++ b/libtool.m4 2015-07-31 13:48:23.375432372 -0700 > >@@ -1312,7 +1312,7 @@ > > rm -rf conftest* > > ;; > > > >-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ > >+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ > > s390*-*linux*|s390*-*tpf*|sparc*-*linux*) > > # Find out which ABI we are using. > > echo 'int i;' > conftest.$ac_ext > > > >i.e. the problem looks to be that the libtool package shipped in > >debian/unstable does not support ppc64el correctly.... > > Actually powerpc*-*linux* covers the triplet for ppc64el, as seen in: > >> host-triplet: powerpc64le-unknown-linux-gnu > So ppc*-*linux* does not make difference for ppc64el, if that is what you > refer to. Did you actually try it? Sure, it may not be the reason that it builds correctly on Darrick's machine, but the fact is that Darricks' environment successfully builds packages from the official xfsprogs tarballs without problems and yours doesn't. The above change is the only thing that is non-standard in Darrick's environment, so it's an obvious change to try even if it makes no sense to you. And it still doesn't change the situation: we can't fix the problem until we understand what is causing it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From ferseiti@linux.vnet.ibm.com Wed Aug 5 10:53:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 597447FAE for ; Wed, 5 Aug 2015 10:53:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4705430405F for ; Wed, 5 Aug 2015 08:53:01 -0700 (PDT) X-ASG-Debug-ID: 1438789978-04cbb0416e2859f0001-NocioJ Received: from e24smtp02.br.ibm.com (e24smtp02.br.ibm.com [32.104.18.86]) by cuda.sgi.com with ESMTP id RabJTkuKH4qg1rnN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Aug 2015 08:52:59 -0700 (PDT) X-Barracuda-Envelope-From: ferseiti@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 32.104.18.86 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.86] Received: from /spool/local by e24smtp02.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 5 Aug 2015 12:52:57 -0300 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.86] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.86] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.86] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/32.104.18.86] Received: from d24dlp02.br.ibm.com (9.18.248.206) by e24smtp02.br.ibm.com (10.172.0.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 5 Aug 2015 12:52:56 -0300 X-Helo: d24dlp02.br.ibm.com X-MailFrom: ferseiti@linux.vnet.ibm.com X-RcptTo: xfs@oss.sgi.com Received: from d24relay03.br.ibm.com (d24relay03.br.ibm.com [9.13.184.25]) by d24dlp02.br.ibm.com (Postfix) with ESMTP id E042E1DC007C for ; Wed, 5 Aug 2015 11:51:52 -0400 (EDT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.8.31.93]) by d24relay03.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t75FpQja54526116 for ; Wed, 5 Aug 2015 12:51:27 -0300 Received: from d24av02.br.ibm.com (localhost [127.0.0.1]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t75FqpVu029787 for ; Wed, 5 Aug 2015 12:52:51 -0300 Received: from oc0745135144.ibm.com ([9.8.10.53]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t75FqoM9029775; Wed, 5 Aug 2015 12:52:50 -0300 Message-ID: <55C23152.3030801@linux.vnet.ibm.com> Date: Wed, 05 Aug 2015 12:52:50 -0300 From: Fernando Seiti Furusato User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> <20150805134729.GX16638@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el In-Reply-To: <20150805134729.GX16638@dastard> Content-Type: multipart/mixed; boundary="------------060709010009080302030403" X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15080515-0021-0000-0000-00000349E652 X-Barracuda-Connect: e24smtp02.br.ibm.com[32.104.18.86] X-Barracuda-Start-Time: 1438789979 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a multi-part message in MIME format. --------------060709010009080302030403 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi Dave! On 08/05/2015 10:47 AM, Dave Chinner wrote: > make realclean also removes the .census file, so it appears that > the debian package build has a dependency on it. Still, that's a > side issue, because we still don't exactly what is causing the > configure script to fail. Right. The immediate reason is because config.guess and config.sub are not being updated. Once they are updated, configure will not fail. When I copy them, manually, from /usr/share/libtool/config/, the build does not fail. > You seem to be talking about 2 different tarballs here. The > tarballs I release most definitely have a configure script in them: > > $ tar tfv xfsprogs-4.2.0-rc1.tar.gz |grep configure > -rw-r--r-- dave/dave 3098 2015-08-04 11:16 xfsprogs-4.2.0-rc1/configure.ac > -rwxr-xr-x dave/dave 469084 2015-08-04 14:25 xfsprogs-4.2.0-rc1/configure > > So I don't know where you are getting xfsprogs tarballs without > configure scripts from. My apologies, it was a confusion of my part. I was looking at the git tree. The tarball does come with configure. But the config.{guess,sub} that come with it are up-to-date, differently of what comes with the debian src package. I generated a diff from them, which is attached. Also, the version I have here is not 4.2.0-rc1, it is the one found at the git repository I mentioned. Is that not correct? > > To clear up any confusion, can you please explain exactly what you > are building (step by step for the dummies in the audience like me) > so we all understand exactly what context the build is failing in? > Ok. Just clarifying that what actually fails is the debian package, exclusively. The ones found in xfs.org (actually oss.sgi.com/xfs) build flawlessly. Originally I used sbuild, but manually this is what I do: # apt-get source xfsprogs # cd xfsprogs-3.2.4/ # apt-get build-dep xfsprogs ... # dpkg-buildpackage I am attaching the build log because it is a bit long. >> Actually powerpc*-*linux* covers the triplet for ppc64el, as seen in: >>>> host-triplet: powerpc64le-unknown-linux-gnu >> So ppc*-*linux* does not make difference for ppc64el, if that is what you >> refer to. > > Did you actually try it? Yes, I changed that line 1315 in /usr/share/aclocal/libtool.m4 to look the same as you showed, but the build failed anyway. > > Sure, it may not be the reason that it builds correctly on Darrick's > machine, but the fact is that Darricks' environment successfully > builds packages from the official xfsprogs tarballs without > problems and yours doesn't. The above change is the only thing that > is non-standard in Darrick's environment, so it's an obvious change > to try even if it makes no sense to you. I understand that. A correction though: mine builds from the official xfsprogs source or tarballs without problems too. It is the Debian source package that fails, exclusively. > > And it still doesn't change the situation: we can't fix the problem > until we understand what is causing it.... What is causing it is: the old files config.guess and config.sub in the source package. Whether shipping updated ones or not shipping the configure file would be the quick solution to this. Again, it is an exclusive problem with the Debian package. I am curious about something I have just noticed (while writing this e-mail). Running apt-get source xfsprogs gets a tarball xfsprogs_3.2.4.tar.gz Shouldn't it be the exact same file I get from: http://ftp.br.debian.org/debian/pool/main/x/xfsprogs/xfsprogs_3.2.4.tar.gz Because they differ. And the latter does not fail at all. I am sorry for any confusion I might be causing :) Thanks and regards. -- Fernando Seiti Furusato IBM Linux Technology Center --------------060709010009080302030403 Content-Type: text/x-log; name="xfs_build.log" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="xfs_build.log" dpkg-buildpackage: source package xfsprogs dpkg-buildpackage: source version 3.2.4 dpkg-buildpackage: source distribution unstable dpkg-buildpackage: source changed by Nathan Scott dpkg-source --before-build xfsprogs-3.2.4 dpkg-buildpackage: host architecture ppc64el debian/rules clean == dpkg-buildpackage: clean test -f debian/rules rm -f built .census mkfs/mkfs.xfs-xfsprogs-udeb /usr/bin/make distclean make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' rm -rf debian/xfsprogs debian/xfslibs-dev debian/xfsprogs-udeb rm -f debian/*substvars debian/files* debian/*.debhelper dh_autoreconf_clean dh_clean rm -f debian/xfsprogs.substvars rm -f debian/xfsprogs.*.debhelper rm -rf debian/xfsprogs/ rm -f debian/xfslibs-dev.substvars rm -f debian/xfslibs-dev.*.debhelper rm -rf debian/xfslibs-dev/ rm -f debian/xfsprogs-udeb.substvars rm -f debian/xfsprogs-udeb.*.debhelper rm -rf debian/xfsprogs-udeb/ rm -f debian/*.debhelper.log rm -f debian/files find . \( \( \ \( -path .\*/.git -o -path .\*/.svn -o -path .\*/.bzr -o -path .\*/.hg -o -path .\*/CVS \) -prune -o -type f -a \ \( -name '#*#' -o -name '.*~' -o -name '*~' -o -name DEADJOE \ -o -name '*.orig' -o -name '*.rej' -o -name '*.bak' \ -o -name '.*.orig' -o -name .*.rej -o -name '.SUMS' \ -o -name TAGS -o \( -path '*/.deps/*' -a -name '*.P' \) \ \) -exec rm -f {} + \) -o \ \( -type d -a -name autom4te.cache -prune -exec rm -rf {} + \) \) dpkg-source -b xfsprogs-3.2.4 dpkg-source: warning: no source format specified in debian/source/format, see dpkg-source(1) dpkg-source: info: using source format `1.0' dpkg-source: info: building xfsprogs in xfsprogs_3.2.4.tar.gz dpkg-source: info: building xfsprogs in xfsprogs_3.2.4.dsc debian/rules build test -f debian/rules == dpkg-buildpackage: installer if [ ! -f mkfs/mkfs.xfs-xfsprogs-udeb ]; then \ export DEBUG=-DNDEBUG DISTRIBUTION=debian INSTALL_USER=root INSTALL_GROUP=root LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes --enable-blkid=yes" ; export OPTIMIZER=-Os LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no" ; /usr/bin/make include/platform_defs.h; \ for dir in include libxfs libdisk mkfs; do \ /usr/bin/make -C $dir; \ done; \ mv mkfs/mkfs.xfs mkfs/mkfs.xfs-xfsprogs-udeb; \ /usr/bin/make distclean; \ fi make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' ./configure $LOCAL_CONFIGURE_OPTIONS checking build system type... ./config.guess: unable to guess system type This script, last modified 2012-02-10, has failed to recognize the operating system you are using. It is advised that you download the most up to date version of the config scripts from http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD and http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD If the version you run (./config.guess) is already up to date, please send the following data and any information you think might be pertinent to in order to provide the needed information to handle your system. config.guess timestamp = 2012-02-10 uname -m = ppc64le uname -r = 3.16.0-4-powerpc64le uname -s = Linux uname -v = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) /usr/bin/uname -p = /bin/uname -X = hostinfo = /bin/universe = /usr/bin/arch -k = /bin/arch = /usr/bin/oslevel = /usr/convex/getsysinfo = UNAME_MACHINE = ppc64le UNAME_RELEASE = 3.16.0-4-powerpc64le UNAME_SYSTEM = Linux UNAME_VERSION = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) configure: error: cannot guess build type; you must specify one Makefile:89: recipe for target 'include/builddefs' failed make[1]: *** [include/builddefs] Error 1 make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/include' Makefile:19: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/include' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/libxfs' Makefile:6: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/libxfs' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/libdisk' Makefile:6: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/libdisk' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/mkfs' Makefile:6: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/mkfs' mv: cannot stat ‘mkfs/mkfs.xfs’: No such file or directory make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' == dpkg-buildpackage: configure test -f debian/rules AUTOHEADER=/bin/true dh_autoreconf find ! -ipath "./debian/*" -a ! \( -path '*/.git/*' -o -path '*/.hg/*' -o -path '*/.bzr/*' -o -path '*/.svn/*' -o -path '*/CVS/*' \) -a -type f -exec md5sum {} \; > debian/autoreconf.before autoreconf -f -i libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. libtoolize: copying file `./ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. libtoolize: copying file `m4/libtool.m4' libtoolize: copying file `m4/ltoptions.m4' libtoolize: copying file `m4/ltsugar.m4' libtoolize: copying file `m4/ltversion.m4' libtoolize: copying file `m4/lt~obsolete.m4' libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. find ! -ipath "./debian/*" -a ! \( -path '*/.git/*' -o -path '*/.hg/*' -o -path '*/.bzr/*' -o -path '*/.svn/*' -o -path '*/CVS/*' \) -a -type f -exec md5sum {} \; > debian/autoreconf.after export DEBUG=-DNDEBUG DISTRIBUTION=debian INSTALL_USER=root INSTALL_GROUP=root LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes --enable-blkid=yes" ; /usr/bin/make include/platform_defs.h make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' ./configure $LOCAL_CONFIGURE_OPTIONS checking build system type... ./config.guess: unable to guess system type This script, last modified 2012-02-10, has failed to recognize the operating system you are using. It is advised that you download the most up to date version of the config scripts from http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD and http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD If the version you run (./config.guess) is already up to date, please send the following data and any information you think might be pertinent to in order to provide the needed information to handle your system. config.guess timestamp = 2012-02-10 uname -m = ppc64le uname -r = 3.16.0-4-powerpc64le uname -s = Linux uname -v = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) /usr/bin/uname -p = /bin/uname -X = hostinfo = /bin/universe = /usr/bin/arch -k = /bin/arch = /usr/bin/oslevel = /usr/convex/getsysinfo = UNAME_MACHINE = ppc64le UNAME_RELEASE = 3.16.0-4-powerpc64le UNAME_SYSTEM = Linux UNAME_VERSION = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) configure: error: cannot guess build type; you must specify one Makefile:89: recipe for target 'include/builddefs' failed make[1]: *** [include/builddefs] Error 1 make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' debian/rules:36: recipe for target '.census' failed make: *** [.census] Error 2 dpkg-buildpackage: error: debian/rules build gave error exit status 2 --------------060709010009080302030403 Content-Type: text/x-patch; name="config_guess_sub.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="config_guess_sub.diff" diff -purN debian/config.guess git/config.guess --- debian/config.guess 2015-08-05 11:03:57.168020710 -0400 +++ git/config.guess 2015-08-05 11:04:09.964035700 -0400 @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2014-03-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -22,19 +20,17 @@ timestamp='2012-02-10' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` | UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in @@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} @@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -801,10 +820,13 @@ EOF i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -852,21 +874,21 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,59 +901,54 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build @@ -950,54 +967,63 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1201,6 +1227,9 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1227,19 +1256,31 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) @@ -1256,7 +1297,7 @@ EOF NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; - NSE-?:NONSTOP_KERNEL:*:*) + NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) @@ -1330,157 +1371,6 @@ EOF exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <. @@ -26,11 +20,12 @@ timestamp='2012-04-18' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -73,9 +68,7 @@ Report bugs and patches to X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E1087FAE for ; Wed, 5 Aug 2015 10:57:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1F69F304075 for ; Wed, 5 Aug 2015 08:57:07 -0700 (PDT) X-ASG-Debug-ID: 1438790224-04bdf06bd023da60001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 2Vs6hMizfWfzEHas (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 05 Aug 2015 08:57:04 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZN13w-0006WW-8C; Wed, 05 Aug 2015 15:57:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Fernando Seiti Furusato , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Fernando Seiti Furusato Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Wed, 05 Aug 2015 15:57:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143878998923030 (code B ref 793495); Wed, 05 Aug 2015 15:57:02 +0000 Received: (at 793495) by bugs.debian.org; 5 Aug 2015 15:53:09 +0000 Received: from e24smtp02.br.ibm.com ([32.104.18.86]) by buxtehude.debian.org with esmtps (TLS1.0:RSA_CAMELLIA_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1ZN108-0005yI-Ba for 793495@bugs.debian.org; Wed, 05 Aug 2015 15:53:09 +0000 Received: from /spool/local by e24smtp02.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for <793495@bugs.debian.org> from ; Wed, 5 Aug 2015 12:52:56 -0300 Received: from d24dlp02.br.ibm.com (9.18.248.206) by e24smtp02.br.ibm.com (10.172.0.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 5 Aug 2015 12:52:53 -0300 X-Helo: d24dlp02.br.ibm.com X-MailFrom: ferseiti@linux.vnet.ibm.com X-RcptTo: 793495@bugs.debian.org Received: from d24relay01.br.ibm.com (d24relay01.br.ibm.com [9.8.31.16]) by d24dlp02.br.ibm.com (Postfix) with ESMTP id 5102E1DC007C for <793495@bugs.debian.org>; Wed, 5 Aug 2015 11:51:51 -0400 (EDT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.8.31.93]) by d24relay01.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t75FrEgw3489882 for <793495@bugs.debian.org>; Wed, 5 Aug 2015 12:53:16 -0300 Received: from d24av02.br.ibm.com (localhost [127.0.0.1]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t75FqpVo029787 for <793495@bugs.debian.org>; Wed, 5 Aug 2015 12:52:51 -0300 Received: from oc0745135144.ibm.com ([9.8.10.53]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t75FqoM9029775; Wed, 5 Aug 2015 12:52:50 -0300 Message-ID: <55C23152.3030801@linux.vnet.ibm.com> Date: Wed, 05 Aug 2015 12:52:50 -0300 From: Fernando Seiti Furusato User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> <20150805134729.GX16638@dastard> In-Reply-To: <20150805134729.GX16638@dastard> Content-Type: multipart/mixed; boundary="------------060709010009080302030403" X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15080515-0021-0000-0000-00000349E64A X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438790224 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. --------------060709010009080302030403 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi Dave! On 08/05/2015 10:47 AM, Dave Chinner wrote: > make realclean also removes the .census file, so it appears that > the debian package build has a dependency on it. Still, that's a > side issue, because we still don't exactly what is causing the > configure script to fail. Right. The immediate reason is because config.guess and config.sub are not being updated. Once they are updated, configure will not fail. When I copy them, manually, from /usr/share/libtool/config/, the build does not fail. > You seem to be talking about 2 different tarballs here. The > tarballs I release most definitely have a configure script in them: > > $ tar tfv xfsprogs-4.2.0-rc1.tar.gz |grep configure > -rw-r--r-- dave/dave 3098 2015-08-04 11:16 xfsprogs-4.2.0-rc1/configure.ac > -rwxr-xr-x dave/dave 469084 2015-08-04 14:25 xfsprogs-4.2.0-rc1/configure > > So I don't know where you are getting xfsprogs tarballs without > configure scripts from. My apologies, it was a confusion of my part. I was looking at the git tree. The tarball does come with configure. But the config.{guess,sub} that come with it are up-to-date, differently of what comes with the debian src package. I generated a diff from them, which is attached. Also, the version I have here is not 4.2.0-rc1, it is the one found at the git repository I mentioned. Is that not correct? > > To clear up any confusion, can you please explain exactly what you > are building (step by step for the dummies in the audience like me) > so we all understand exactly what context the build is failing in? > Ok. Just clarifying that what actually fails is the debian package, exclusively. The ones found in xfs.org (actually oss.sgi.com/xfs) build flawlessly. Originally I used sbuild, but manually this is what I do: # apt-get source xfsprogs # cd xfsprogs-3.2.4/ # apt-get build-dep xfsprogs ... # dpkg-buildpackage I am attaching the build log because it is a bit long. >> Actually powerpc*-*linux* covers the triplet for ppc64el, as seen in: >>>> host-triplet: powerpc64le-unknown-linux-gnu >> So ppc*-*linux* does not make difference for ppc64el, if that is what you >> refer to. > > Did you actually try it? Yes, I changed that line 1315 in /usr/share/aclocal/libtool.m4 to look the same as you showed, but the build failed anyway. > > Sure, it may not be the reason that it builds correctly on Darrick's > machine, but the fact is that Darricks' environment successfully > builds packages from the official xfsprogs tarballs without > problems and yours doesn't. The above change is the only thing that > is non-standard in Darrick's environment, so it's an obvious change > to try even if it makes no sense to you. I understand that. A correction though: mine builds from the official xfsprogs source or tarballs without problems too. It is the Debian source package that fails, exclusively. > > And it still doesn't change the situation: we can't fix the problem > until we understand what is causing it.... What is causing it is: the old files config.guess and config.sub in the source package. Whether shipping updated ones or not shipping the configure file would be the quick solution to this. Again, it is an exclusive problem with the Debian package. I am curious about something I have just noticed (while writing this e-mail). Running apt-get source xfsprogs gets a tarball xfsprogs_3.2.4.tar.gz Shouldn't it be the exact same file I get from: http://ftp.br.debian.org/debian/pool/main/x/xfsprogs/xfsprogs_3.2.4.tar.gz Because they differ. And the latter does not fail at all. I am sorry for any confusion I might be causing :) Thanks and regards. -- Fernando Seiti Furusato IBM Linux Technology Center --------------060709010009080302030403 Content-Type: text/x-log; name="xfs_build.log" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="xfs_build.log" dpkg-buildpackage: source package xfsprogs dpkg-buildpackage: source version 3.2.4 dpkg-buildpackage: source distribution unstable dpkg-buildpackage: source changed by Nathan Scott dpkg-source --before-build xfsprogs-3.2.4 dpkg-buildpackage: host architecture ppc64el debian/rules clean == dpkg-buildpackage: clean test -f debian/rules rm -f built .census mkfs/mkfs.xfs-xfsprogs-udeb /usr/bin/make distclean make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' rm -rf debian/xfsprogs debian/xfslibs-dev debian/xfsprogs-udeb rm -f debian/*substvars debian/files* debian/*.debhelper dh_autoreconf_clean dh_clean rm -f debian/xfsprogs.substvars rm -f debian/xfsprogs.*.debhelper rm -rf debian/xfsprogs/ rm -f debian/xfslibs-dev.substvars rm -f debian/xfslibs-dev.*.debhelper rm -rf debian/xfslibs-dev/ rm -f debian/xfsprogs-udeb.substvars rm -f debian/xfsprogs-udeb.*.debhelper rm -rf debian/xfsprogs-udeb/ rm -f debian/*.debhelper.log rm -f debian/files find . \( \( \ \( -path .\*/.git -o -path .\*/.svn -o -path .\*/.bzr -o -path .\*/.hg -o -path .\*/CVS \) -prune -o -type f -a \ \( -name '#*#' -o -name '.*~' -o -name '*~' -o -name DEADJOE \ -o -name '*.orig' -o -name '*.rej' -o -name '*.bak' \ -o -name '.*.orig' -o -name .*.rej -o -name '.SUMS' \ -o -name TAGS -o \( -path '*/.deps/*' -a -name '*.P' \) \ \) -exec rm -f {} + \) -o \ \( -type d -a -name autom4te.cache -prune -exec rm -rf {} + \) \) dpkg-source -b xfsprogs-3.2.4 dpkg-source: warning: no source format specified in debian/source/format, see dpkg-source(1) dpkg-source: info: using source format `1.0' dpkg-source: info: building xfsprogs in xfsprogs_3.2.4.tar.gz dpkg-source: info: building xfsprogs in xfsprogs_3.2.4.dsc debian/rules build test -f debian/rules == dpkg-buildpackage: installer if [ ! -f mkfs/mkfs.xfs-xfsprogs-udeb ]; then \ export DEBUG=-DNDEBUG DISTRIBUTION=debian INSTALL_USER=root INSTALL_GROUP=root LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes --enable-blkid=yes" ; export OPTIMIZER=-Os LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no" ; /usr/bin/make include/platform_defs.h; \ for dir in include libxfs libdisk mkfs; do \ /usr/bin/make -C $dir; \ done; \ mv mkfs/mkfs.xfs mkfs/mkfs.xfs-xfsprogs-udeb; \ /usr/bin/make distclean; \ fi make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' ./configure $LOCAL_CONFIGURE_OPTIONS checking build system type... ./config.guess: unable to guess system type This script, last modified 2012-02-10, has failed to recognize the operating system you are using. It is advised that you download the most up to date version of the config scripts from http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD and http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD If the version you run (./config.guess) is already up to date, please send the following data and any information you think might be pertinent to in order to provide the needed information to handle your system. config.guess timestamp = 2012-02-10 uname -m = ppc64le uname -r = 3.16.0-4-powerpc64le uname -s = Linux uname -v = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) /usr/bin/uname -p = /bin/uname -X = hostinfo = /bin/universe = /usr/bin/arch -k = /bin/arch = /usr/bin/oslevel = /usr/convex/getsysinfo = UNAME_MACHINE = ppc64le UNAME_RELEASE = 3.16.0-4-powerpc64le UNAME_SYSTEM = Linux UNAME_VERSION = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) configure: error: cannot guess build type; you must specify one Makefile:89: recipe for target 'include/builddefs' failed make[1]: *** [include/builddefs] Error 1 make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/include' Makefile:19: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/include' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/libxfs' Makefile:6: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/libxfs' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/libdisk' Makefile:6: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/libdisk' make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4/mkfs' Makefile:6: ../include/builddefs: No such file or directory make[1]: *** No rule to make target '../include/builddefs'. Stop. make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4/mkfs' mv: cannot stat ‘mkfs/mkfs.xfs’: No such file or directory make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' == dpkg-buildpackage: configure test -f debian/rules AUTOHEADER=/bin/true dh_autoreconf find ! -ipath "./debian/*" -a ! \( -path '*/.git/*' -o -path '*/.hg/*' -o -path '*/.bzr/*' -o -path '*/.svn/*' -o -path '*/CVS/*' \) -a -type f -exec md5sum {} \; > debian/autoreconf.before autoreconf -f -i libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. libtoolize: copying file `./ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. libtoolize: copying file `m4/libtool.m4' libtoolize: copying file `m4/ltoptions.m4' libtoolize: copying file `m4/ltsugar.m4' libtoolize: copying file `m4/ltversion.m4' libtoolize: copying file `m4/lt~obsolete.m4' libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. find ! -ipath "./debian/*" -a ! \( -path '*/.git/*' -o -path '*/.hg/*' -o -path '*/.bzr/*' -o -path '*/.svn/*' -o -path '*/CVS/*' \) -a -type f -exec md5sum {} \; > debian/autoreconf.after export DEBUG=-DNDEBUG DISTRIBUTION=debian INSTALL_USER=root INSTALL_GROUP=root LOCAL_CONFIGURE_OPTIONS="--enable-readline=yes --enable-blkid=yes" ; /usr/bin/make include/platform_defs.h make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' ./configure $LOCAL_CONFIGURE_OPTIONS checking build system type... ./config.guess: unable to guess system type This script, last modified 2012-02-10, has failed to recognize the operating system you are using. It is advised that you download the most up to date version of the config scripts from http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD and http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD If the version you run (./config.guess) is already up to date, please send the following data and any information you think might be pertinent to in order to provide the needed information to handle your system. config.guess timestamp = 2012-02-10 uname -m = ppc64le uname -r = 3.16.0-4-powerpc64le uname -s = Linux uname -v = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) /usr/bin/uname -p = /bin/uname -X = hostinfo = /bin/universe = /usr/bin/arch -k = /bin/arch = /usr/bin/oslevel = /usr/convex/getsysinfo = UNAME_MACHINE = ppc64le UNAME_RELEASE = 3.16.0-4-powerpc64le UNAME_SYSTEM = Linux UNAME_VERSION = #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) configure: error: cannot guess build type; you must specify one Makefile:89: recipe for target 'include/builddefs' failed make[1]: *** [include/builddefs] Error 1 make[1]: Leaving directory '/home/xfsprogs/xfsprogs-3.2.4' debian/rules:36: recipe for target '.census' failed make: *** [.census] Error 2 dpkg-buildpackage: error: debian/rules build gave error exit status 2 --------------060709010009080302030403 Content-Type: text/x-patch; name="config_guess_sub.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="config_guess_sub.diff" diff -purN debian/config.guess git/config.guess --- debian/config.guess 2015-08-05 11:03:57.168020710 -0400 +++ git/config.guess 2015-08-05 11:04:09.964035700 -0400 @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2012-02-10' +timestamp='2014-03-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -22,19 +20,17 @@ timestamp='2012-02-10' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -138,6 +132,27 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` | UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in @@ -200,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} @@ -302,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -801,10 +820,13 @@ EOF i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -852,21 +874,21 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in @@ -879,59 +901,54 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build @@ -950,54 +967,63 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1201,6 +1227,9 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1227,19 +1256,31 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) @@ -1256,7 +1297,7 @@ EOF NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; - NSE-?:NONSTOP_KERNEL:*:*) + NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) @@ -1330,157 +1371,6 @@ EOF exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <. @@ -26,11 +20,12 @@ timestamp='2012-04-18' # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -73,9 +68,7 @@ Report bugs and patches to X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 359597FB7 for ; Wed, 5 Aug 2015 17:57:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B6912AC002 for ; Wed, 5 Aug 2015 15:57:19 -0700 (PDT) X-ASG-Debug-ID: 1438815436-04cbb0416d28f270001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id dziHTYcvmWaFnEy4 for ; Wed, 05 Aug 2015 15:57:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DbBgCgk8JV/20mLHlVBoMbgT2pVAabJAICAQECgU9NAQEBAQEBgQuEJAEBBDocIxAIAw4KCSUPBSUDIROILc09AQEIAgEfGYYGhTCERkMHhCwFlH+MVIFJhCOIX4sdJoILAxyBZSwxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Aug 2015 08:27:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZN7cN-0007xa-3A; Thu, 06 Aug 2015 08:57:03 +1000 Date: Thu, 6 Aug 2015 08:57:03 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH v3 10/11] xfsprogs: replace obsolete memalign with posix_memalign Message-ID: <20150805225703.GY16638@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 10/11] xfsprogs: replace obsolete memalign with posix_memalign References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-11-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438612789-17486-11-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438815436 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 03, 2015 at 04:39:48PM +0200, Jan Tulak wrote: > Memalign from was marked obsolete in favor of a posix > variant from . So replace all calls and remove > includes. This also enhances support on other posix platforms, > which doesn't have . > > Because posix_memalign returns any error as a return code, not in > errno, change relevant checks in code (and add a missing one). .... > @@ -74,12 +74,18 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len) > ssize_t zsize, bytes; > char *z; > int fd; > + int ret; > > zsize = min(BDSTRAT_SIZE, BBTOB(len)); > - if ((z = memalign(libxfs_device_alignment(), zsize)) == NULL) { > + ret = posix_memalign( > + (void **)&z, > + libxfs_device_alignment(), > + zsize > + ); Unusual function call formatting. Please use the form the rest of the code uses. i.e: ret = posix_memalign((void **)&z, libxfs_device_alignment(), zsize); (same for the rest of the patch). Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Wed Aug 5 18:10:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57D507FB7 for ; Wed, 5 Aug 2015 18:10:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22964304059 for ; Wed, 5 Aug 2015 16:10:00 -0700 (PDT) X-ASG-Debug-ID: 1438815005-04bdf06bd22477c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id bqBrwMa1USM6DO64 for ; Wed, 05 Aug 2015 15:50:05 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ChBgCeksJV/20mLHlbgxuBPalTBpx7TQEBAQEBAYELhQA7GGoDNIgtpxamXYYfiVSBA4QVBZR/ml6LXiaBSgEBCAEBAQGCNywxgQWBRwEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Aug 2015 08:20:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZN7VQ-0007wl-21 for xfs@oss.sgi.com; Thu, 06 Aug 2015 08:49:52 +1000 Received: from dave by disappointment with local (Exim 4.86_RC4) (envelope-from ) id 1ZN7VQ-0008E7-15 for xfs@oss.sgi.com; Thu, 06 Aug 2015 08:49:52 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] db: fix uninitialised variable warnings Date: Thu, 6 Aug 2015 08:49:52 +1000 X-ASG-Orig-Subj: [PATCH] db: fix uninitialised variable warnings Message-Id: <1438814992-31588-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438815005 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner New versions of gcc barf on the conversion table code in db/convert.c. Shut it up by initialising the conversion array. Signed-off-by: Dave Chinner --- db/convert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/convert.c b/db/convert.c index 09f9225..a337abe 100644 --- a/db/convert.c +++ b/db/convert.c @@ -157,7 +157,7 @@ convert_f(int argc, char **argv) { ctype_t c; int conmask; - cval_t cvals[NCTS]; + cval_t cvals[NCTS] = {}; int i; int mask; __uint64_t v; -- 2.1.4 From david@fromorbit.com Wed Aug 5 19:21:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C1E77FAE for ; Wed, 5 Aug 2015 19:21:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67304304032 for ; Wed, 5 Aug 2015 17:21:22 -0700 (PDT) X-ASG-Debug-ID: 1438820478-04cbb0416e290ac0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id sjmuGXKPA79jkMVB for ; Wed, 05 Aug 2015 17:21:19 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CkBwDHp8JV/20mLHlbgxtUaalDDAEBAQEBAQaVNoVxAgIBAQKBSk0BAQEBAQGBC4QjAQEBAwE6HCMFCwgDGAklDwUlAyETiCYHDs0XAQEBAQYBAQEBAR0ZhgaFMIQmEQFRB4QsBYcahmCHBoR/h1WBSUaPN4goJoQPLDEBAQEBgQqBPgEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Aug 2015 09:51:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZN8vh-00086c-5C; Thu, 06 Aug 2015 10:21:05 +1000 Date: Thu, 6 Aug 2015 10:21:05 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el Message-ID: <20150806002105.GZ16638@dastard> X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> <20150805134729.GX16638@dastard> <55C23152.3030801@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C23152.3030801@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438820478 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21382 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 05, 2015 at 12:52:50PM -0300, Fernando Seiti Furusato wrote: > Hi Dave! > > On 08/05/2015 10:47 AM, Dave Chinner wrote: > > >make realclean also removes the .census file, so it appears that > >the debian package build has a dependency on it. Still, that's a > >side issue, because we still don't exactly what is causing the > >configure script to fail. > Right. The immediate reason is because config.guess and config.sub are not > being updated. Once they are updated, configure will not fail. When I copy them, > manually, from /usr/share/libtool/config/, the build does not fail. > > >You seem to be talking about 2 different tarballs here. The > >tarballs I release most definitely have a configure script in them: > > > >$ tar tfv xfsprogs-4.2.0-rc1.tar.gz |grep configure > >-rw-r--r-- dave/dave 3098 2015-08-04 11:16 xfsprogs-4.2.0-rc1/configure.ac > >-rwxr-xr-x dave/dave 469084 2015-08-04 14:25 xfsprogs-4.2.0-rc1/configure > > > >So I don't know where you are getting xfsprogs tarballs without > >configure scripts from. > My apologies, it was a confusion of my part. I was looking at the git tree. > The tarball does come with configure. But the config.{guess,sub} that come with > it are up-to-date, differently of what comes with the debian src package. > I generated a diff from them, which is attached. > Also, the version I have here is not 4.2.0-rc1, it is the one found at the git > repository I mentioned. Is that not correct? I released 4.2.0-rc1 to the dev tree on kernel.org. I didn't update the tree on oss.sgi.com or make an official release tarball because it's a developer pre-release. And there's a couple of things under discussion that that might require a rebase of the tree, so that's another reason for not making an "official" release. .... > A correction though: mine builds from the official xfsprogs source or tarballs > without problems too. > It is the Debian source package that fails, exclusively. Ok, that clears up the confusion. Thanks for explaining what is happening to the dummy in the audience (me). > I am curious about something I have just noticed (while writing this e-mail). > Running apt-get source xfsprogs gets a tarball xfsprogs_3.2.4.tar.gz > Shouldn't it be the exact same file I get from: > http://ftp.br.debian.org/debian/pool/main/x/xfsprogs/xfsprogs_3.2.4.tar.gz > Because they differ. And the latter does not fail at all. No idea - that's definitely a distro issue ;) > make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' > ./configure $LOCAL_CONFIGURE_OPTIONS > checking build system type... ./config.guess: unable to guess system type > > This script, last modified 2012-02-10, has failed to recognize This is what I found about an hour before reading this email. On #xfs: [06/08/15 09:32] now that "last modified <$timestamp>" is important [06/08/15 09:33] because that tells us what version was used to generate the script [06/08/15 09:34] in the version shipped in the 3.2.4 tarball, it is: [06/08/15 09:34] timestamp='2014-03-23' [06/08/15 09:34] and it clearly has entries for ppc64le in it > ppc64:Linux:*:*) > - echo powerpc64-unknown-linux-gnu > + echo powerpc64-unknown-linux-${LIBC} > exit ;; > ppc:Linux:*:*) > - echo powerpc-unknown-linux-gnu > + echo powerpc-unknown-linux-${LIBC} > + exit ;; > + ppc64le:Linux:*:*) > + echo powerpc64le-unknown-linux-${LIBC} > + exit ;; > + ppcle:Linux:*:*) > + echo powerpcle-unknown-linux-${LIBC} > exit ;; That hunk shows why it is failing - no ppc64le:Linux match in the old script. Nathan is already looking into it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From debbugs@buxtehude.debian.org Wed Aug 5 19:24:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 91FC97FAE for ; Wed, 5 Aug 2015 19:24:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F30BFAC002 for ; Wed, 5 Aug 2015 17:24:08 -0700 (PDT) X-ASG-Debug-ID: 1438820646-04cbb0416e290c70001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id 2kVdFsYvbVeAiI5X (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 05 Aug 2015 17:24:07 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZN8yZ-0006Ko-Uc; Thu, 06 Aug 2015 00:24:03 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Dave Chinner , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Dave Chinner Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Thu, 06 Aug 2015 00:24:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.143882048123737 (code B ref 793495); Thu, 06 Aug 2015 00:24:02 +0000 Received: (at 793495) by bugs.debian.org; 6 Aug 2015 00:21:21 +0000 Received: from ipmail07.adl2.internode.on.net ([150.101.137.131]) by buxtehude.debian.org with esmtp (Exim 4.84) (envelope-from ) id 1ZN8vx-0006AX-LP for 793495@bugs.debian.org; Thu, 06 Aug 2015 00:21:21 +0000 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CkBwDHp8JV/20mLHlbgxtUaalDDAEBAQEBAQaVNoVxAgIBAQKBSk0BAQEBAQGBC4QjAQEBAwE6HCMFCwgDGAklDwUlAyETiCYHDs0XAQEBAQYBAQEBAR0ZhgaFMIQmEQFRB4QsBYcahmCHBoR/h1WBSUaPN4goJoQPLDEBAQEBgQqBPgEBAQ Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Aug 2015 09:51:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZN8vh-00086c-5C; Thu, 06 Aug 2015 10:21:05 +1000 Date: Thu, 6 Aug 2015 10:21:05 +1000 From: Dave Chinner To: Fernando Seiti Furusato Cc: 793495@bugs.debian.org, Daniel Bast , xfs@oss.sgi.com, Breno Leitao Message-ID: <20150806002105.GZ16638@dastard> References: <55BB9271.6000300@gmx.net> <55BBEF4F.6070809@linux.vnet.ibm.com> <20150801225230.GR16638@dastard> <41BF7556-AAAB-4F22-B8C2-8991A0917DE2@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> <20150805134729.GX16638@dastard> <55C23152.3030801@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C23152.3030801@linux.vnet.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438820646 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21382 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 05, 2015 at 12:52:50PM -0300, Fernando Seiti Furusato wrote: > Hi Dave! > > On 08/05/2015 10:47 AM, Dave Chinner wrote: > > >make realclean also removes the .census file, so it appears that > >the debian package build has a dependency on it. Still, that's a > >side issue, because we still don't exactly what is causing the > >configure script to fail. > Right. The immediate reason is because config.guess and config.sub are not > being updated. Once they are updated, configure will not fail. When I copy them, > manually, from /usr/share/libtool/config/, the build does not fail. > > >You seem to be talking about 2 different tarballs here. The > >tarballs I release most definitely have a configure script in them: > > > >$ tar tfv xfsprogs-4.2.0-rc1.tar.gz |grep configure > >-rw-r--r-- dave/dave 3098 2015-08-04 11:16 xfsprogs-4.2.0-rc1/configure.ac > >-rwxr-xr-x dave/dave 469084 2015-08-04 14:25 xfsprogs-4.2.0-rc1/configure > > > >So I don't know where you are getting xfsprogs tarballs without > >configure scripts from. > My apologies, it was a confusion of my part. I was looking at the git tree. > The tarball does come with configure. But the config.{guess,sub} that come with > it are up-to-date, differently of what comes with the debian src package. > I generated a diff from them, which is attached. > Also, the version I have here is not 4.2.0-rc1, it is the one found at the git > repository I mentioned. Is that not correct? I released 4.2.0-rc1 to the dev tree on kernel.org. I didn't update the tree on oss.sgi.com or make an official release tarball because it's a developer pre-release. And there's a couple of things under discussion that that might require a rebase of the tree, so that's another reason for not making an "official" release. .... > A correction though: mine builds from the official xfsprogs source or tarballs > without problems too. > It is the Debian source package that fails, exclusively. Ok, that clears up the confusion. Thanks for explaining what is happening to the dummy in the audience (me). > I am curious about something I have just noticed (while writing this e-mail). > Running apt-get source xfsprogs gets a tarball xfsprogs_3.2.4.tar.gz > Shouldn't it be the exact same file I get from: > http://ftp.br.debian.org/debian/pool/main/x/xfsprogs/xfsprogs_3.2.4.tar.gz > Because they differ. And the latter does not fail at all. No idea - that's definitely a distro issue ;) > make[1]: Entering directory '/home/xfsprogs/xfsprogs-3.2.4' > ./configure $LOCAL_CONFIGURE_OPTIONS > checking build system type... ./config.guess: unable to guess system type > > This script, last modified 2012-02-10, has failed to recognize This is what I found about an hour before reading this email. On #xfs: [06/08/15 09:32] now that "last modified <$timestamp>" is important [06/08/15 09:33] because that tells us what version was used to generate the script [06/08/15 09:34] in the version shipped in the 3.2.4 tarball, it is: [06/08/15 09:34] timestamp='2014-03-23' [06/08/15 09:34] and it clearly has entries for ppc64le in it > ppc64:Linux:*:*) > - echo powerpc64-unknown-linux-gnu > + echo powerpc64-unknown-linux-${LIBC} > exit ;; > ppc:Linux:*:*) > - echo powerpc-unknown-linux-gnu > + echo powerpc-unknown-linux-${LIBC} > + exit ;; > + ppc64le:Linux:*:*) > + echo powerpc64le-unknown-linux-${LIBC} > + exit ;; > + ppcle:Linux:*:*) > + echo powerpcle-unknown-linux-${LIBC} > exit ;; That hunk shows why it is failing - no ppc64le:Linux match in the old script. Nathan is already looking into it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From nscott@redhat.com Thu Aug 6 02:11:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF3E97F61 for ; Thu, 6 Aug 2015 02:11:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B8F708F8037 for ; Thu, 6 Aug 2015 00:10:58 -0700 (PDT) X-ASG-Debug-ID: 1438845056-04bdf06bd22524b0001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id axmumAUCl2GIHTZj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 00:10:56 -0700 (PDT) X-Barracuda-Envelope-From: nscott@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail20.collab.prod.int.phx2.redhat.com (zmail20.collab.prod.int.phx2.redhat.com [10.5.83.23]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t767AgrN016895; Thu, 6 Aug 2015 03:10:42 -0400 Date: Thu, 6 Aug 2015 03:10:42 -0400 (EDT) From: Nathan Scott Reply-To: Nathan Scott To: Dave Chinner , 793495@bugs.debian.org, Fernando Seiti Furusato Cc: xfs@oss.sgi.com, Breno Leitao , Daniel Bast Message-ID: <207352255.5354564.1438845042677.JavaMail.zimbra@redhat.com> In-Reply-To: <20150806002105.GZ16638@dastard> References: <55BB9271.6000300@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> <20150805134729.GX16638@dastard> <55C23152.3030801@linux.vnet.ibm.com> <20150806002105.GZ16638@dastard> Subject: Re: Bug#793495: xfsprogs fails to build on debian ppc64el MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Bug#793495: xfsprogs fails to build on debian ppc64el Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.64.51.180] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF37 (Linux)/8.0.6_GA_5922) Thread-Topic: Bug#793495: xfsprogs fails to build on debian ppc64el Thread-Index: Q6TwFs0wrmq7Azt4LbqaCevp4rUlUg== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1438845056 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21390 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > On Wed, Aug 05, 2015 at 12:52:50PM -0300, Fernando Seiti Furusato wrote: > > [...] > > It is the Debian source package that fails, exclusively. > [...] > That hunk shows why it is failing - no ppc64le:Linux match in the > old script. Nathan is already looking into it... So, yeah, its definitely got something to do with the local setup here inserting configure-generated files that are dated. I build the .debs from a tagged git repo checkout (without the generated files initially) so they do get inserted locally. Having re-installed all autoconf-related packages now on that machine, as well as constructing an entirely new unstable VM for builds :P ... the problem has resolved itself and I see config.sub with ppc64le bits too. I'll do a build and upload (source-unchanged) 3.2.4-1 package to make sure its resolved on the build servers. Thanks to all for looking into it so closely! cheers. -- Nathan From debbugs@buxtehude.debian.org Thu Aug 6 02:15:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AC2EF7F66 for ; Thu, 6 Aug 2015 02:15:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 95083304032 for ; Thu, 6 Aug 2015 00:15:08 -0700 (PDT) X-ASG-Debug-ID: 1438845306-04cb6c673f317440001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id SP1lFJuidF8UsDYT (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 06 Aug 2015 00:15:07 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZNFOK-0002bQ-7v; Thu, 06 Aug 2015 07:15:04 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#793495: xfsprogs fails to build on debian ppc64el Reply-To: Nathan Scott , 793495@bugs.debian.org X-ASG-Orig-Subj: Bug#793495: xfsprogs fails to build on debian ppc64el Resent-From: Nathan Scott Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Thu, 06 Aug 2015 07:15:02 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 793495 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: fixed-upstream security upstream X-Debian-PR-Source: xfsprogs Received: via spool by 793495-submit@bugs.debian.org id=B793495.14388450489302 (code B ref 793495); Thu, 06 Aug 2015 07:15:02 +0000 Received: (at 793495) by bugs.debian.org; 6 Aug 2015 07:10:48 +0000 Received: from mx3-phx2.redhat.com ([209.132.183.24]) by buxtehude.debian.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1ZNFKC-0002PL-9g for 793495@bugs.debian.org; Thu, 06 Aug 2015 07:10:48 +0000 Received: from zmail20.collab.prod.int.phx2.redhat.com (zmail20.collab.prod.int.phx2.redhat.com [10.5.83.23]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id t767AgrN016895; Thu, 6 Aug 2015 03:10:42 -0400 Date: Thu, 6 Aug 2015 03:10:42 -0400 (EDT) From: Nathan Scott To: Dave Chinner , 793495@bugs.debian.org, Fernando Seiti Furusato Cc: xfs@oss.sgi.com, Breno Leitao , Daniel Bast Message-ID: <207352255.5354564.1438845042677.JavaMail.zimbra@redhat.com> In-Reply-To: <20150806002105.GZ16638@dastard> References: <55BB9271.6000300@gmx.net> <20150802221301.GO3902@dastard> <55C0D916.1010102@linux.vnet.ibm.com> <20150804225819.GV16638@dastard> <55C208D2.4060907@linux.vnet.ibm.com> <20150805134729.GX16638@dastard> <55C23152.3030801@linux.vnet.ibm.com> <20150806002105.GZ16638@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.64.51.180] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF37 (Linux)/8.0.6_GA_5922) Thread-Topic: Bug#793495: xfsprogs fails to build on debian ppc64el Thread-Index: Q6TwFs0wrmq7Azt4LbqaCevp4rUlUg== X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438845307 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > On Wed, Aug 05, 2015 at 12:52:50PM -0300, Fernando Seiti Furusato wrote: > > [...] > > It is the Debian source package that fails, exclusively. > [...] > That hunk shows why it is failing - no ppc64le:Linux match in the > old script. Nathan is already looking into it... So, yeah, its definitely got something to do with the local setup here inserting configure-generated files that are dated. I build the .debs from a tagged git repo checkout (without the generated files initially) so they do get inserted locally. Having re-installed all autoconf-related packages now on that machine, as well as constructing an entirely new unstable VM for builds :P ... the problem has resolved itself and I see config.sub with ppc64le bits too. I'll do a build and upload (source-unchanged) 3.2.4-1 package to make sure its resolved on the build servers. Thanks to all for looking into it so closely! cheers. -- Nathan From ftpmaster@ftp-master.debian.org Thu Aug 6 02:19:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D12007F7D for ; Thu, 6 Aug 2015 02:19:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A8BC8F8049 for ; Thu, 6 Aug 2015 00:19:46 -0700 (PDT) X-ASG-Debug-ID: 1438845583-04bdf06bd2252830001-NocioJ Received: from mailly.debian.org (mailly.debian.org [82.195.75.114]) by cuda.sgi.com with ESMTP id gCRGLMJqHcB1Mfx6 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 06 Aug 2015 00:19:44 -0700 (PDT) X-Barracuda-Envelope-From: ftpmaster@ftp-master.debian.org X-Barracuda-Apparent-Source-IP: 82.195.75.114 Received: from franck.debian.org ([138.16.160.12]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=franck.debian.org,EMAIL=hostmaster@franck.debian.org (verified) by mailly.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84) (envelope-from ) id 1ZNFSo-0007vo-W5 for xfs@oss.sgi.com; Thu, 06 Aug 2015 07:19:43 +0000 Received: from dak-unpriv by franck.debian.org with local (Exim 4.84) (envelope-from ) id 1ZNFSn-0001XZ-UE for xfs@oss.sgi.com; Thu, 06 Aug 2015 07:19:41 +0000 To: xfs@oss.sgi.com From: Debian FTP Masters Subject: Processing of xfsprogs_3.2.4-1_i386.changes Date: Thu, 06 Aug 2015 07:19:41 +0000 X-ASG-Orig-Subj: Processing of xfsprogs_3.2.4-1_i386.changes X-Debian: DAK X-DAK: DAK Precedence: bulk Auto-Submitted: auto-generated X-Debian-Package: xfsprogs Message-Id: X-Barracuda-Connect: mailly.debian.org[82.195.75.114] X-Barracuda-Start-Time: 1438845584 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21390 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfsprogs_3.2.4-1_i386.changes uploaded successfully to localhost along with the files: xfsprogs_3.2.4-1.dsc xfsprogs_3.2.4-1.tar.gz xfslibs-dev_3.2.4-1_i386.deb xfsprogs-udeb_3.2.4-1_i386.udeb xfsprogs_3.2.4-1_i386.deb Greetings, Your Debian queue daemon (running on host franck.debian.org) From envelope@ftp-master.debian.org Thu Aug 6 02:33:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 38DC97F85 for ; Thu, 6 Aug 2015 02:33:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 17D4030404E for ; Thu, 6 Aug 2015 00:33:56 -0700 (PDT) X-ASG-Debug-ID: 1438846433-04cb6c673f317ad0001-NocioJ Received: from mailly.debian.org (mailly.debian.org [82.195.75.114]) by cuda.sgi.com with ESMTP id 2hajtN4ZLnA4KZfx (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 06 Aug 2015 00:33:54 -0700 (PDT) X-Barracuda-Envelope-From: envelope@ftp-master.debian.org X-Barracuda-Apparent-Source-IP: 82.195.75.114 Received: from franck.debian.org ([138.16.160.12]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=franck.debian.org,EMAIL=hostmaster@franck.debian.org (verified) by mailly.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84) (envelope-from ) id 1ZNFgW-0000JJ-CU; Thu, 06 Aug 2015 07:33:52 +0000 Received: from dak by franck.debian.org with local (Exim 4.84) (envelope-from ) id 1ZNFgV-0003Kq-4b; Thu, 06 Aug 2015 07:33:51 +0000 From: Debian FTP Masters To: XFS Development Team , Nathan Scott X-DAK: dak process-upload X-Debian: DAK X-Debian-Package: xfsprogs Precedence: bulk Auto-Submitted: auto-generated MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Subject: xfsprogs_3.2.4-1_i386.changes ACCEPTED into unstable Message-Id: X-ASG-Orig-Subj: xfsprogs_3.2.4-1_i386.changes ACCEPTED into unstable Date: Thu, 06 Aug 2015 07:33:51 +0000 X-Barracuda-Connect: mailly.debian.org[82.195.75.114] X-Barracuda-Start-Time: 1438846434 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21390 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Accepted: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Format: 1.8 Date: Thu, 06 Aug 2015 16:26:57 +1000 Source: xfsprogs Binary: xfsprogs xfslibs-dev xfsprogs-udeb Architecture: source i386 Version: 3.2.4-1 Distribution: unstable Urgency: low Maintainer: XFS Development Team Changed-By: Nathan Scott Description: xfslibs-dev - XFS filesystem-specific static libraries and headers xfsprogs - Utilities for managing the XFS filesystem xfsprogs-udeb - A stripped-down version of xfsprogs, for debian-installer (udeb) Changes: xfsprogs (3.2.4-1) unstable; urgency=low . * New upstream release * Fix xfs_metadump information leak (CVE-2012-2150) Checksums-Sha1: 937683ee5db2a6627127b89c7dbc59af4e2dd989 1788 xfsprogs_3.2.4-1.dsc 38a876cc06284b3e7e514629a243d2a8b9300b35 1505783 xfsprogs_3.2.4-1.tar.gz f975db7beff25c854c84544ae7fc9c07c5410140 31772 xfslibs-dev_3.2.4-1_i386.deb c3ae8694bd59db51155bfc9e5dcf7018fdbd5dae 145960 xfsprogs-udeb_3.2.4-1_i386.udeb 30671bc8addb9956950ee5ef68993ae1f0af493d 727256 xfsprogs_3.2.4-1_i386.deb Checksums-Sha256: 5e16f102e689d42e1afca2cdee30248e8420625abc5665f676eb3168ad4cb77e 1788 xfsprogs_3.2.4-1.dsc 659b61b93bfa0aabed05d0e961ce13bab200110126d9c14ed8915f5bacfb0456 1505783 xfsprogs_3.2.4-1.tar.gz 392d0fa1ee14a3e87ddf711fcd3e7a8066b302d51cd27460267974fdcd43abea 31772 xfslibs-dev_3.2.4-1_i386.deb 7fee9076cf9ecddef0202bdf4af840994f2025bdb77fc78a63f55f32a90675e2 145960 xfsprogs-udeb_3.2.4-1_i386.udeb 8266738d86d7f635a5d7ae7cf9d43d707aa33f4fddfb55ca1f062690d67e51bb 727256 xfsprogs_3.2.4-1_i386.deb Files: 21ec1c7c38f74c36d7a490438803092b 1788 admin optional xfsprogs_3.2.4-1.dsc 418b0b5378ef37e98a9d4b51b66e2a94 1505783 admin optional xfsprogs_3.2.4-1.tar.gz bfd935b574ac1cdca54a214928dd7a19 31772 libdevel extra xfslibs-dev_3.2.4-1_i386.deb 91fc35043652ca36ab86afe4e0fdceb2 145960 debian-installer optional xfsprogs-udeb_3.2.4-1_i386.udeb ec93b29dc21dec70c6a9e243e7191b67 727256 admin optional xfsprogs_3.2.4-1_i386.deb Package-Type: udeb -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAEBCAAGBQJVwwAfAAoJEP4IQu423YwMmwcP/0zfcSgDK1VDf8+VobfBYaYQ sES2lFzDutwz39OqDw9g0wlyID+vvZi6R6j3PIw4qC0lBYTNmD34xLAc/Iyo9vgF GAQVhoenFml6cDju8bL98Etn8UbFN65DUI0+UJb9Xe0/bI9qg/aeoL6jiexOlUjk RsKuiQDVhqVnNxlrf+Dxm7Pa7IIMhcWE8uGFuSOo5Cx7EgaxAS8oI4UnWl6ITM9H AYtlEszlPAMmxQ3MgFrXGc58IVovfO+WLWJO19WIY+BZpWQMu5JR7r0La6tdVl/R WXNop1Ou8NvUOAPkmXCCtbRjRMjTtl+pTOfQ6tdEHa5iSaxh6LBVhdauGRnI1GYF iVBc6bmOcSCe1Q+8oSe9b8s7MAZqN1/wgnE7SlIhdjsgPzY+JbYYe42qE/WLrmzu /5RSdDwblMdkzqJdwgXf25gbH7/tq70eVoe3qR4LxuoZdsSL+Re4y5CVzWJ0pT6V kv59RrJRlPs802SAZh/Y2T8XwqGcR0i1LNZZClS4223igsvyZPuP6eWDDp4/Z9Xy Af/+5NGe/GKFeocOUFNaXPa5VyU8pF/aTHHSoIe95FxnxZjAaDUpQoT2bfe8RyCE xMPlPd08/YicPy7UxJiJtby9j5g/1jvrxgIVqETv27tkUjeMFHIjx7w/VftUSd7b 7ibJwLY3EGNcUKkr9rX0 =bkI6 -----END PGP SIGNATURE----- Thank you for your contribution to Debian. From dv@vollmann.ch Thu Aug 6 02:55:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB00C7F84 for ; Thu, 6 Aug 2015 02:55:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C1F1C8F8035 for ; Thu, 6 Aug 2015 00:55:00 -0700 (PDT) X-ASG-Debug-ID: 1438847697-04cb6c673e3182b0001-NocioJ Received: from p-smtp-as-02.sunrise.ch (p-smtp-as-01.sunrise.ch [212.35.39.69]) by cuda.sgi.com with ESMTP id 4C3jH6uyTQJUy7YS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 00:54:58 -0700 (PDT) X-Barracuda-Envelope-From: dv@vollmann.ch X-Barracuda-Apparent-Source-IP: 212.35.39.69 Received: from [192.168.26.4] (212-98-43-140.static.adslpremium.ch [212.98.43.140]) by p-smtp-as-02.sunrise.ch (8.14.4/8.14.4) with ESMTP id t767sukC029889; Thu, 6 Aug 2015 09:54:56 +0200 Message-ID: <55C312CF.2040408@vollmann.ch> Date: Thu, 06 Aug 2015 09:54:55 +0200 From: Detlef Vollmann User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfsdump doesn't compile: undefined reference to 'min' Content-Type: multipart/mixed; boundary="------------010409060606010109010604" X-ASG-Orig-Subj: xfsdump doesn't compile: undefined reference to 'min' X-Barracuda-Connect: p-smtp-as-01.sunrise.ch[212.35.39.69] X-Barracuda-Start-Time: 1438847698 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21390 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. --------------010409060606010109010604 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit > commit 5a2985233c390d59d2a9757b119cb0e001c87a96 > Author: Dave Chinner > Date: Fri Jul 18 08:02:26 2014 +1000 > > dump: don't redefine min() or max() > > They are included from other header files. The message doesn't say from which header and configure doesn't test for it. If I compile it (cross-compilation, gcc, uclibc, xfsprogs 3.1.11, xfsdump 3.1.4), I get lots of errors: warning: implicit declaration of function 'max' undefined reference to 'min' Attached is a pragmatic patch. Detlef PS: I'm not on the list. --------------010409060606010109010604 Content-Type: text/x-patch; name="001-minmax.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="001-minmax.patch" diff --git a/common/util.h b/common/util.h index 86ea8d2..460aea5 100644 --- a/common/util.h +++ b/common/util.h @@ -66,6 +66,12 @@ extern intgen_t read_buf( char *bufp, rrbfp_t return_read_buf_funcp, intgen_t *statp ); +#ifndef min +#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif +#ifndef max +#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif /* strncpyterm - like strncpy, but guarantees the destination is null-terminated diff --git a/restore/dirattr.c b/restore/dirattr.c index fcfa0c8..6413c15 100644 --- a/restore/dirattr.c +++ b/restore/dirattr.c @@ -51,6 +51,10 @@ /* structure definitions used locally ****************************************/ +#ifndef max +#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif + /* node handle limits */ #ifdef DIRATTRCHK diff --git a/restore/namreg.c b/restore/namreg.c index 41362d1..4630605 100644 --- a/restore/namreg.c +++ b/restore/namreg.c @@ -34,6 +34,10 @@ /* structure definitions used locally ****************************************/ +#ifndef max +#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif + #define NAMREG_AVGLEN 10 /* persistent context for a namreg - placed in first page diff --git a/restore/node.c b/restore/node.c index 4cc8fb0..97d46e1 100644 --- a/restore/node.c +++ b/restore/node.c @@ -30,6 +30,13 @@ #include "node.h" #include "mmap.h" +#ifndef max +#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif +#ifndef min +#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif + extern size_t pgsz; extern size_t pgmask; --------------010409060606010109010604-- From jtulak@redhat.com Thu Aug 6 08:14:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A7E77F76 for ; Thu, 6 Aug 2015 08:14:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 189B58F8035 for ; Thu, 6 Aug 2015 06:14:30 -0700 (PDT) X-ASG-Debug-ID: 1438866867-04cb6c674031ec80001-NocioJ Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by cuda.sgi.com with ESMTP id qmCAflT3h3cuojwC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 06:14:28 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.39 Received: from zmail22.collab.prod.int.phx2.redhat.com (zmail22.collab.prod.int.phx2.redhat.com [10.5.83.26]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76DDFKq005549; Thu, 6 Aug 2015 09:13:16 -0400 Date: Thu, 6 Aug 2015 09:13:15 -0400 (EDT) From: Jan Tulak To: Eric Sandeen Cc: Eric Sandeen , Christoph Hellwig , xfs@oss.sgi.com Message-ID: <1490980415.3591793.1438866795648.JavaMail.zimbra@redhat.com> In-Reply-To: <55C0E73B.1000904@sandeen.net> References: <1156743222.24471614.1436281858017.JavaMail.zimbra@redhat.com> <1436346893-11831-1-git-send-email-jtulak@redhat.com> <1508777144.956841.1437482376774.JavaMail.zimbra@redhat.com> <20150726162530.GE29329@infradead.org> <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> <55BFA2C5.20408@redhat.com> <1050814645.2742881.1438702230663.JavaMail.zimbra@redhat.com> <55C0E73B.1000904@sandeen.net> Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH v3] xfsprogs: blkid is now mandatory Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.36.6.150] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC44 (Mac)/8.0.6_GA_5922) Thread-Topic: xfsprogs: blkid is now mandatory Thread-Index: 1auRDOxazJRNXnDlRDhyDwMTnN+M0A== X-Barracuda-Connect: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Start-Time: 1438866868 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > From: "Eric Sandeen" > > Signature detection (if I understand you correctly 'signature of existing > > FS') could be really disabled, I think. That would take care of > > check_overwrite(). However, blkid is also used in get_topology. That one > > calls blkid_get_topology, which uses blkid's functions for finding out > > sector and io sizes. > > Well, it would be sane to default to 512 sectors; if that fails it'll > be obvious fairly quickly, and the user can always use the command line > to specify 4k sectors (or stripe alignment, etc) manually. > > > What I really can do is to say "on osx, you can mkfs only files," and cut > > bleah! ;) > > > out the blkid parts. But it limits the usage on OS X even further. > > Although, the removed code for non-blkid systems used platform_findsizes > > as fallback. Are there some ugly, terrible monsters who would jump from > > under the bed when doing that? > > Well, the old findsizes was there for this reason, but now it's gone ;) platform_findsizes is still there, in the "is file" branch. Small ifdef can put it instead of blkid... > > > However, this patch affects only mkfs. It still should be possible to use > > xfs_db and xfs_repair even on block devices. > > I don't know how invasive it'd be, but I think in the absence of blkid, > we should still work, but lose signature detection, and fall back to geometry > defaults. It looks like it works. Though I need to do some testing before I send the patch. Unfortunately, making FS tests without the ability to mount it on the machine requires USB drive shuffling and it is hard to automate it... :-) What I think about is whether to write some warning in autoconf. Because it is easy to forget to install libblkid-dev package on linux and with this patch, it chancan change the behaviour unexpectedly when using autoconf for blkid detection. Or maybe I could require blkid by default, and disable it with an argument like LOCAL_CONFIGURE_OPTIONS="--enable-blkid=no". I think the config option is a better way - it can't happen you disable it just because you forget to install a package. Cheers, Jan -- Jan Tulak jtulak@redhat.com From bfoster@redhat.com Thu Aug 6 12:44:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 894B87F74 for ; Thu, 6 Aug 2015 12:44:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6CE618F8068 for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883075-04cb6c673d326200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f6irCHuGJPQl3pf6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id E02BBDAD03 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYwl018001 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 362231230E0; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 07/11] xfs: icreate log item recovery and cancellation tracepoints Date: Thu, 6 Aug 2015 13:44:28 -0400 X-ASG-Orig-Subj: [PATCH 07/11] xfs: icreate log item recovery and cancellation tracepoints Message-Id: <1438883072-28706-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883075 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Various log items have recovery tracepoints to identify whether a particular log item is recovered or cancelled. Add the equivalent tracepoints for the icreate transaction. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 5 ++++- fs/xfs/xfs_trace.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a7ba078..76248bf 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3105,9 +3105,12 @@ xlog_recover_do_icreate_pass2( * done easily. */ if (xlog_check_buffer_cancelled(log, - XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) + XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) { + trace_xfs_log_recover_icreate_cancel(log, icl); return 0; + } + trace_xfs_log_recover_icreate_recover(log, icl); xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, be32_to_cpu(icl->icl_gen)); return 0; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 8d916d3..9aeeb21 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2089,6 +2089,40 @@ DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_recover); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_cancel); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_skip); +DECLARE_EVENT_CLASS(xfs_log_recover_icreate_item_class, + TP_PROTO(struct xlog *log, struct xfs_icreate_log *in_f), + TP_ARGS(log, in_f), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(unsigned int, count) + __field(unsigned int, isize) + __field(xfs_agblock_t, length) + __field(unsigned int, gen) + ), + TP_fast_assign( + __entry->dev = log->l_mp->m_super->s_dev; + __entry->agno = be32_to_cpu(in_f->icl_ag); + __entry->agbno = be32_to_cpu(in_f->icl_agbno); + __entry->count = be32_to_cpu(in_f->icl_count); + __entry->isize = be32_to_cpu(in_f->icl_isize); + __entry->length = be32_to_cpu(in_f->icl_length); + __entry->gen = be32_to_cpu(in_f->icl_gen); + ), + TP_printk("dev %d:%d agno %u agbno %u count %u isize %u length %u " + "gen %u", MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, __entry->agbno, __entry->count, __entry->isize, + __entry->length, __entry->gen) +) +#define DEFINE_LOG_RECOVER_ICREATE_ITEM(name) \ +DEFINE_EVENT(xfs_log_recover_icreate_item_class, name, \ + TP_PROTO(struct xlog *log, struct xfs_icreate_log *in_f), \ + TP_ARGS(log, in_f)) + +DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_cancel); +DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_recover); + DECLARE_EVENT_CLASS(xfs_discard_class, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len), -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CBD6F7F7B for ; Thu, 6 Aug 2015 12:44:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B83E68F8068 for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883075-04cb6c6740326220001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ov2sjfBmsacpomCh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:36 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 3FE1819F96F for ; Thu, 6 Aug 2015 17:44:35 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYiM031729 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 256541230E2; Thu, 6 Aug 2015 13:44:33 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 08/11] xfs: fix broken icreate log item cancellation Date: Thu, 6 Aug 2015 13:44:29 -0400 X-ASG-Orig-Subj: [PATCH 08/11] xfs: fix broken icreate log item cancellation Message-Id: <1438883072-28706-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883075 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode cluster buffers are invalidated and cancelled when inode chunks are freed to notify log recovery that previous logged updates to the metadata buffer should be skipped. This ensures that log recovery does not overwrite buffers that might have already been reused. On v4 filesystems, inode chunk allocation and inode updates are logged via the cluster buffers and thus cancellation is easily detected via buffer cancellation items. v5 filesystems use the new icreate transaction, which uses logical logging and ordered buffers to log a full inode chunk allocation at once. The resulting icreate item often spans multiple inode cluster buffers. Log recovery checks for cancelled buffers when processing icreate log items, but it has a couple problems. First, it uses the full length of the inode chunk rather than the cluster size. Second, it uses the length in FSB units rather than BB units. Either of these problems prevent icreate recovery from identifying cancelled buffers and thus inode initialization proceeds unconditionally. Update xlog_recover_do_icreate_pass2() to iterate the icreate range in cluster sized increments and check each increment for cancellation. Since icreate is currently only used for the minimum atomic inode chunk allocation, we expect that either all or none of the buffers will be cancelled. Cancel the icreate if at least one buffer is cancelled to avoid making a bad situation worse by initializing a partial inode chunk, but detect such anomalies and warn the user. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 49 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 76248bf..62a9b57 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3037,6 +3037,11 @@ xlog_recover_do_icreate_pass2( unsigned int count; unsigned int isize; xfs_agblock_t length; + int blks_per_cluster; + int bb_per_cluster; + int cancel_count; + int nbufs; + int i; icl = (struct xfs_icreate_log *)item->ri_buf[0].i_addr; if (icl->icl_type != XFS_LI_ICREATE) { @@ -3095,25 +3100,45 @@ xlog_recover_do_icreate_pass2( } /* - * Inode buffers can be freed. Do not replay the inode initialisation as - * we could be overwriting something written after this inode buffer was - * cancelled. + * The icreate transaction can cover multiple cluster buffers and these + * buffers could have been freed and reused. Check the individual + * buffers for cancellation so we don't overwrite anything written after + * a cancellation. + */ + blks_per_cluster = xfs_icluster_size_fsb(mp); + bb_per_cluster = XFS_FSB_TO_BB(mp, blks_per_cluster); + nbufs = length / blks_per_cluster; + for (i = 0, cancel_count = 0; i < nbufs; i++) { + xfs_daddr_t daddr; + + daddr = XFS_AGB_TO_DADDR(mp, agno, + agbno + i * blks_per_cluster); + if (xlog_check_buffer_cancelled(log, daddr, bb_per_cluster, 0)) + cancel_count++; + } + + /* + * We currently only use icreate for a single allocation at a time. This + * means we should expect either all or none of the buffers to be + * cancelled. Be conservative and skip replay if at least one buffer is + * cancelled, but warn the user that something is awry if the buffers + * are not consistent. * - * XXX: we need to iterate all buffers and only init those that are not - * cancelled. I think that a more fine grained factoring of - * xfs_ialloc_inode_init may be appropriate here to enable this to be - * done easily. + * XXX: This must be refined to only skip cancelled clusters once we use + * icreate for multiple chunk allocations. */ - if (xlog_check_buffer_cancelled(log, - XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) { + ASSERT(!cancel_count || cancel_count == nbufs); + if (cancel_count) { + if (cancel_count != nbufs) + xfs_warn(mp, + "WARNING: partial inode chunk cancellation, skipped icreate."); trace_xfs_log_recover_icreate_cancel(log, icl); return 0; } trace_xfs_log_recover_icreate_recover(log, icl); - xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); - return 0; + return xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, + length, be32_to_cpu(icl->icl_gen)); } STATIC void -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C693D7F77 for ; Thu, 6 Aug 2015 12:44:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4893304067 for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883075-04cb6c6740326210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3Wx3z5KvFO5m0qYN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E087583F87 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiY9a010712 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E3259122F4C; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery Date: Thu, 6 Aug 2015 13:44:26 -0400 X-ASG-Orig-Subj: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery Message-Id: <1438883072-28706-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883075 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The EFI is initialized with a reference count of 2. One for the EFI to ensure the item makes it to the AIL and one for the subsequently created EFD to release the EFI once the EFD is committed. Log recovery uses the EFI in a similar manner, but implements a hack to remove both references in one call once the EFD is handled. Update log recovery to use EFI reference counting in a manner consistent with the log. When an EFI is encountered during recovery, an EFI item is allocated and inserted to the AIL directly. Since the EFI reference is typically dropped when the EFI is unpinned and this is analogous with AIL insertion, drop the EFI reference at this point. When a corresponding EFD is encountered in the log, this indicates that the extents were freed, no processing is required and the EFI can be dropped. Update xlog_recover_efd_pass2() to simply drop the EFD reference at this point rather than open code the AIL removal and EFI free. Remaining EFIs (i.e., with no corresponding EFD) are processed in xlog_recover_finish(). An EFD transaction is allocated and the extents are freed, which transfers ownership of the EFI reference to the EFD item in the log. Signed-off-by: Brian Foster --- fs/xfs/xfs_extfree_item.c | 57 +++++++++++++++++------------------------------ fs/xfs/xfs_log_recover.c | 43 ++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index aceb54f..2b2acac 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -47,34 +47,6 @@ xfs_efi_item_free( } /* - * Freeing the efi requires that we remove it from the AIL if it has already - * been placed there. However, the EFI may not yet have been placed in the AIL - * when called by xfs_efi_release() from EFD processing due to the ordering of - * committed vs unpin operations in bulk insert operations. Hence the reference - * count to ensure only the last caller frees the EFI. - */ -STATIC void -__xfs_efi_release( - struct xfs_efi_log_item *efip) -{ - struct xfs_ail *ailp = efip->efi_item.li_ailp; - - if (atomic_dec_and_test(&efip->efi_refcount)) { - spin_lock(&ailp->xa_lock); - /* - * We don't know whether the EFI made it to the AIL. Remove it - * if so. Note that xfs_trans_ail_delete() drops the AIL lock. - */ - if (efip->efi_item.li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); - else - spin_unlock(&ailp->xa_lock); - xfs_efi_item_free(efip); - } -} - -/* * This returns the number of iovecs needed to log the given efi item. * We only need 1 iovec for an efi item. It just logs the efi_log_format * structure. @@ -304,20 +276,31 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) } /* - * This is called by the efd item code below to release references to the given - * efi item. Each efd calls this with the number of extents that it has - * logged, and when the sum of these reaches the total number of extents logged - * by this efi item we can free the efi item. + * Freeing the efi requires that we remove it from the AIL if it has already + * been placed there. However, the EFI may not yet have been placed in the AIL + * when called by xfs_efi_release() from EFD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the reference + * count to ensure only the last caller frees the EFI. */ void xfs_efi_release(struct xfs_efi_log_item *efip) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); + struct xfs_ail *ailp = efip->efi_item.li_ailp; - __xfs_efi_release(efip); - /* efip may now have been freed, do not reference it again. */ + if (atomic_dec_and_test(&efip->efi_refcount)) { + spin_lock(&ailp->xa_lock); + /* + * We don't know whether the EFI made it to the AIL. Remove it + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. + */ + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); + else + spin_unlock(&ailp->xa_lock); + + xfs_efi_item_free(efip); + } } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3433b7b..a74ff68 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2933,16 +2933,16 @@ xlog_recover_efi_pass2( struct xlog_recover_item *item, xfs_lsn_t lsn) { - int error; - xfs_mount_t *mp = log->l_mp; - xfs_efi_log_item_t *efip; - xfs_efi_log_format_t *efi_formatp; + int error; + struct xfs_mount *mp = log->l_mp; + struct xfs_efi_log_item *efip; + struct xfs_efi_log_format *efi_formatp; efi_formatp = item->ri_buf[0].i_addr; efip = xfs_efi_init(mp, efi_formatp->efi_nextents); - if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), - &(efip->efi_format)))) { + error = xfs_efi_copy_format(&(item->ri_buf[0]), &(efip->efi_format)); + if (error) { xfs_efi_item_free(efip); return error; } @@ -2950,20 +2950,23 @@ xlog_recover_efi_pass2( spin_lock(&log->l_ailp->xa_lock); /* - * xfs_trans_ail_update() drops the AIL lock. + * The EFI has two references. One for the EFD and one for EFI to ensure + * it makes it into the AIL. Insert the EFI into the AIL directly and + * drop the EFI reference. Note that xfs_trans_ail_update() drops the + * AIL lock. */ xfs_trans_ail_update(log->l_ailp, &efip->efi_item, lsn); + xfs_efi_release(efip); return 0; } /* - * This routine is called when an efd format structure is found in - * a committed transaction in the log. It's purpose is to cancel - * the corresponding efi if it was still in the log. To do this - * it searches the AIL for the efi with an id equal to that in the - * efd format structure. If we find it, we remove the efi from the - * AIL and free it. + * This routine is called when an EFD format structure is found in a committed + * transaction in the log. Its purpose is to cancel the corresponding EFI if it + * was still in the log. To do this it searches the AIL for the EFI with an id + * equal to that in the EFD format structure. If we find it we drop the EFD + * reference, which removes the EFI from the AIL and frees it. */ STATIC int xlog_recover_efd_pass2( @@ -2985,8 +2988,8 @@ xlog_recover_efd_pass2( efi_id = efd_formatp->efd_efi_id; /* - * Search for the efi with the id in the efd format structure - * in the AIL. + * Search for the EFI with the id in the EFD format structure in the + * AIL. */ spin_lock(&ailp->xa_lock); lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); @@ -2995,18 +2998,18 @@ xlog_recover_efd_pass2( efip = (xfs_efi_log_item_t *)lip; if (efip->efi_format.efi_id == efi_id) { /* - * xfs_trans_ail_delete() drops the - * AIL lock. + * Drop the EFD reference to the EFI. This + * removes the EFI from the AIL and frees it. */ - xfs_trans_ail_delete(ailp, lip, - SHUTDOWN_CORRUPT_INCORE); - xfs_efi_item_free(efip); + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip); spin_lock(&ailp->xa_lock); break; } } lip = xfs_trans_ail_cursor_next(ailp, &cur); } + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 017D77F74 for ; Thu, 6 Aug 2015 12:44:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 74B6EAC00A for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883074-04cb6c673f326200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rMcjfpNad30e5dE7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 663F9D0A9A for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiXQG017987 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8996A122EB9; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 00/11] xfs: miscellaneous logging, recovery, umount fixes Date: Thu, 6 Aug 2015 13:44:21 -0400 X-ASG-Orig-Subj: [PATCH 00/11] xfs: miscellaneous logging, recovery, umount fixes Message-Id: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883074 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This series includes a bunch of bug fixes from doing some log recovery testing. It started with an RFC of the EFI/EFD bits and expanded to include more fixes as problems were discovered. Patch 1 removes the superfluous EFI/EFD extent count reference tracking. Patches 2-6 make a couple cleanups and fix the explicit EFI/EFD reference counting to avoid leaving EFI items on the AIL in the event of error. Patches 7-8 fix handling of cancelled icreate transactions in log recovery. Patch 9 is a repost of a previous log recovery fix. Patches 10-11 fix a couple more mount related crash/hang issues. Just about all of these problems were reproduced by running repeated fsstress/godown workloads against XFS. This set has gone ~150 iterations of said testing before hitting some kind of recovery time directory corruption in the form of a dir. block write verifier failure. I'll see if it is reproducible, but I don't think it's related to anything here since I haven't touched directory code... Brian v1: - Updated EFI/EFD tracking semantics based on rfc comments. - Added more cleanups/fixes to series. rfc: http://oss.sgi.com/pipermail/xfs/2015-July/042617.html Brian Foster (11): xfs: disentagle EFI release from the extent count xfs: return committed status from xfs_trans_roll() xfs: fix efi/efd error handling to avoid fs shutdown hangs xfs: ensure EFD trans aborts on log recovery extent free failure xfs: use EFI refcount consistently in log recovery xfs: don't leave EFIs on AIL on mount failure xfs: icreate log item recovery and cancellation tracepoints xfs: fix broken icreate log item cancellation xfs: checksum log record ext headers based on record size xfs: clean up root inode properly on mount failure xfs: fix btree cursor error cleanups fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_bmap_util.c | 84 +++++++++++++++----------- fs/xfs/xfs_extfree_item.c | 118 +++++++++++++++++------------------- fs/xfs/xfs_extfree_item.h | 1 + fs/xfs/xfs_itable.c | 3 +- fs/xfs/xfs_log.c | 23 +++++-- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_log_recover.c | 147 +++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_mount.c | 37 ++++++++---- fs/xfs/xfs_trace.h | 34 +++++++++++ fs/xfs/xfs_trans.c | 15 ++++- fs/xfs/xfs_trans.h | 2 +- 13 files changed, 307 insertions(+), 163 deletions(-) -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4A937F76 for ; Thu, 6 Aug 2015 12:44:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 520DFAC005 for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883074-04cb6c6740326200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WwCLgiDzZZ8K7Vb8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 4A10FA2C25 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiXXn010703 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A25091228EA; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 02/11] xfs: return committed status from xfs_trans_roll() Date: Thu, 6 Aug 2015 13:44:23 -0400 X-ASG-Orig-Subj: [PATCH 02/11] xfs: return committed status from xfs_trans_roll() Message-Id: <1438883072-28706-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883074 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Some callers need to make error handling decisions based on whether the current transaction successfully committed or not. Rename xfs_trans_roll(), add a new parameter and provide a wrapper to preserve existing callers. Signed-off-by: Brian Foster --- fs/xfs/xfs_trans.c | 15 +++++++++++++-- fs/xfs/xfs_trans.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 0582a27..a0ab1da 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1019,9 +1019,10 @@ xfs_trans_cancel( * chunk we've been working on and get a new transaction to continue. */ int -xfs_trans_roll( +__xfs_trans_roll( struct xfs_trans **tpp, - struct xfs_inode *dp) + struct xfs_inode *dp, + int *committed) { struct xfs_trans *trans; struct xfs_trans_res tres; @@ -1052,6 +1053,7 @@ xfs_trans_roll( if (error) return error; + *committed = 1; trans = *tpp; /* @@ -1074,3 +1076,12 @@ xfs_trans_roll( xfs_trans_ijoin(trans, dp, 0); return 0; } + +int +xfs_trans_roll( + struct xfs_trans **tpp, + struct xfs_inode *dp) +{ + int committed = 0; + return __xfs_trans_roll(tpp, dp, &committed); +} diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index f48e839..ba1660b 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -225,6 +225,7 @@ void xfs_trans_log_efd_extent(xfs_trans_t *, xfs_fsblock_t, xfs_extlen_t); int xfs_trans_commit(struct xfs_trans *); +int __xfs_trans_roll(struct xfs_trans **, struct xfs_inode *, int *); int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); void xfs_trans_cancel(xfs_trans_t *); int xfs_trans_ail_init(struct xfs_mount *); -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0B3C37F8A for ; Thu, 6 Aug 2015 12:44:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9BFF2AC005 for ; Thu, 6 Aug 2015 10:44:35 -0700 (PDT) X-ASG-Debug-ID: 1438883074-04bdf06bd0261be0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4pY8KsZ2C4yVBg7Q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:34 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 620C0FC0E3 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYtP010705 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BB1CB122E79; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 01/11] xfs: disentagle EFI release from the extent count Date: Thu, 6 Aug 2015 13:44:22 -0400 X-ASG-Orig-Subj: [PATCH 01/11] xfs: disentagle EFI release from the extent count Message-Id: <1438883072-28706-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883074 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Release of the EFI either occurs based on the reference count or the extent count. The extent count used is either the count tracked in the EFI or EFD, depending on the particular situation. In either case, the count is initialized to the final value and thus always matches the current efi_next_extent value once the EFI is completely constructed. Given this along with the fact that the EFI is always completely constructed before error can occur, eliminate the unnecessary extent count manipulation and release the EFI directly based on reference count. The efi_next_extent counter remains because it is still used to track the slot to log the next extent to free. Signed-off-by: Brian Foster --- fs/xfs/xfs_extfree_item.c | 20 ++++++++------------ fs/xfs/xfs_extfree_item.h | 1 + fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.h | 1 - 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index adc8f8f..42c9b05 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -149,7 +149,7 @@ xfs_efi_item_unpin( xfs_efi_item_free(efip); return; } - __xfs_efi_release(efip); + xfs_efi_release(efip); } /* @@ -307,18 +307,14 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) * by this efi item we can free the efi item. */ void -xfs_efi_release(xfs_efi_log_item_t *efip, - uint nextents) +xfs_efi_release(struct xfs_efi_log_item *efip) { - ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); - if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); - + /* recovery needs us to drop the EFI reference, too */ + if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) __xfs_efi_release(efip); - /* efip may now have been freed, do not reference it again. */ - } + + __xfs_efi_release(efip); + /* efip may now have been freed, do not reference it again. */ } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) @@ -442,7 +438,7 @@ xfs_efd_item_committed( * EFI got unpinned and freed before the EFD got aborted. */ if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); + xfs_efi_release(efdp->efd_efip); xfs_efd_item_free(efdp); return (xfs_lsn_t)-1; diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 0ffbce3..399562e 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -77,5 +77,6 @@ xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, int xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt); void xfs_efi_item_free(xfs_efi_log_item_t *); +void xfs_efi_release(struct xfs_efi_log_item *); #endif /* __XFS_EXTFREE_ITEM_H__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c674b40..9d8f242 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3766,7 +3766,7 @@ xlog_recover_process_efi( * free the memory associated with it. */ set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_format.efi_nextents); + xfs_efi_release(efip); return -EIO; } } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3b21b4e..f48e839 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -213,7 +213,6 @@ void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); -void xfs_efi_release(struct xfs_efi_log_item *, uint); void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efi_log_item *, xfs_fsblock_t, -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 710407F8C for ; Thu, 6 Aug 2015 12:44:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F020304059 for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883075-04cb6c673f326210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gN6estqidPg6EdET (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id E6DC3E6E51 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYhO001703 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 43BD2122FE2; Thu, 6 Aug 2015 13:44:33 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 10/11] xfs: clean up root inode properly on mount failure Date: Thu, 6 Aug 2015 13:44:31 -0400 X-ASG-Orig-Subj: [PATCH 10/11] xfs: clean up root inode properly on mount failure Message-Id: <1438883072-28706-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883075 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The root inode is read as part of the xfs_mountfs() sequence and the reference is dropped in the event of failure after we grab the inode. The reference drop doesn't necessarily free the inode, however. It marks it for reclaim and potentially kicks off the reclaim workqueue. The workqueue is destroyed further up the error path, which means we are subject to crash if the workqueue job runs after this point or a memory leak which is identified if the xfs_inode_zone is destroyed (e.g., on module removal). Both of these outcomes are reproducible via manual instrumentation of a mount error after the root inode xfs_iget() call in xfs_mountfs(). Update the xfs_mountfs() error path to cancel any potential reclaim work items and to run a synchronous inode reclaim if the root inode is marked for reclaim. This ensures that no jobs remain on the queue before it is destroyed and that the root inode is freed before the reclaim mechanism is torn down. Signed-off-by: Brian Foster --- fs/xfs/xfs_mount.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 45a33d5..bcdd3bf 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -964,6 +964,8 @@ xfs_mountfs( xfs_rtunmount_inodes(mp); out_rele_rip: IRELE(rip); + cancel_delayed_work_sync(&mp->m_reclaim_work); + xfs_reclaim_inodes(mp, SYNC_WAIT); out_log_dealloc: if (log_mount_cancel) xfs_log_mount_finish(mp, true); -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1AB6F7F8A for ; Thu, 6 Aug 2015 12:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D160AC005 for ; Thu, 6 Aug 2015 10:44:39 -0700 (PDT) X-ASG-Debug-ID: 1438883075-04cbb0416e2a7380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gMXsEAuCqnGOTQLA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id DA138D4252 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiY9i017998 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 05696122F63; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure Date: Thu, 6 Aug 2015 13:44:27 -0400 X-ASG-Orig-Subj: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure Message-Id: <1438883072-28706-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883075 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery occurs in two phases at mount time. In the first phase, EFIs and EFDs are processed and potentially cancelled out. EFIs without EFD objects are inserted into the AIL for processing and recovery in the second phase. xfs_mountfs() runs various other operations between the phases and is thus subject to failure. If failure occurs after the first phase but before the second, pending EFIs sit on the AIL, pin it and cause the mount to hang. Update the mount sequence to ensure that pending EFIs are cancelled in the event of failure. Add a recovery cancellation mechanism to iterate the AIL and cancel all EFI items when requested. Plumb cancellation support through the log mount finish helper and update xfs_mountfs() to invoke cancellation in the event of failure after recovery has started. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 16 +++++++++++----- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_priv.h | 2 ++ fs/xfs/xfs_log_recover.c | 41 ++++++++++++++++++++++++++++++++++++----- fs/xfs/xfs_mount.c | 35 +++++++++++++++++++++++------------ 5 files changed, 73 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6b5a84a..522286c 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -740,19 +740,25 @@ out: * it. */ int -xfs_log_mount_finish(xfs_mount_t *mp) +xfs_log_mount_finish( + struct xfs_mount *mp, + bool cancel) { int error = 0; - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { + if (mp->m_flags & XFS_MOUNT_NORECOVERY) { + ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); + return 0; + } + + if (cancel) { + error = xlog_recover_cancel(mp->m_log); + } else { error = xlog_recover_finish(mp->m_log); if (!error) xfs_log_work_queue(mp); - } else { - ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); } - return error; } diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index fa27aae..425e880 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -146,7 +146,7 @@ int xfs_log_mount(struct xfs_mount *mp, struct xfs_buftarg *log_target, xfs_daddr_t start_block, int num_bblocks); -int xfs_log_mount_finish(struct xfs_mount *mp); +int xfs_log_mount_finish(struct xfs_mount *mp, bool); xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); void xfs_log_space_wake(struct xfs_mount *mp); diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 1c87c8a..950f3f9 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -426,6 +426,8 @@ xlog_recover( extern int xlog_recover_finish( struct xlog *log); +extern int +xlog_recover_cancel(struct xlog *); extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, char *dp, int size); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a74ff68..a7ba078 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3823,10 +3823,11 @@ abort_error: */ STATIC int xlog_recover_process_efis( - struct xlog *log) + struct xlog *log, + bool cancel) { - xfs_log_item_t *lip; - xfs_efi_log_item_t *efip; + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; int error = 0; struct xfs_ail_cursor cur; struct xfs_ail *ailp; @@ -3847,10 +3848,24 @@ xlog_recover_process_efis( break; } + efip = (struct xfs_efi_log_item *) lip; + + /* + * A cancel occurs when the mount has failed and we're bailing + * out. Release all pending EFIs so they don't pin the AIL. + */ + if (cancel) { + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip); + spin_lock(&ailp->xa_lock); + + lip = xfs_trans_ail_cursor_next(ailp, &cur); + continue; + } + /* * Skip EFIs that we've already processed. */ - efip = (xfs_efi_log_item_t *)lip; if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { lip = xfs_trans_ail_cursor_next(ailp, &cur); continue; @@ -4617,8 +4632,13 @@ xlog_recover_finish( */ if (log->l_flags & XLOG_RECOVERY_NEEDED) { int error; - error = xlog_recover_process_efis(log); + error = xlog_recover_process_efis(log, false); if (error) { + /* + * We could still have pending EFIs. Cancel them so we + * don't hang... + */ + xlog_recover_process_efis(log, true); xfs_alert(log->l_mp, "Failed to recover EFIs"); return error; } @@ -4644,6 +4664,17 @@ xlog_recover_finish( return 0; } +int +xlog_recover_cancel( + struct xlog *log) +{ + int error = 0; + + if (log->l_flags & XLOG_RECOVERY_NEEDED) + error = xlog_recover_process_efis(log, true); + + return error; +} #if defined(DEBUG) /* diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 461e791..45a33d5 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -615,14 +615,15 @@ xfs_default_resblks(xfs_mount_t *mp) */ int xfs_mountfs( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_sb_t *sbp = &(mp->m_sb); - xfs_inode_t *rip; - __uint64_t resblks; - uint quotamount = 0; - uint quotaflags = 0; - int error = 0; + struct xfs_sb *sbp = &(mp->m_sb); + struct xfs_inode *rip; + __uint64_t resblks; + uint quotamount = 0; + uint quotaflags = 0; + int error = 0; + bool log_mount_cancel = false; xfs_sb_mount_common(mp, sbp); @@ -799,7 +800,10 @@ xfs_mountfs( } /* - * log's mount-time initialization. Perform 1st part recovery if needed + * Log's mount-time initialization. The first part of recovery can place + * some items on the AIL, to be handled when recovery is finished. Set + * the cancel flag to ensure that the recovery is cancelled should we + * fail before then. */ error = xfs_log_mount(mp, mp->m_logdev_targp, XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), @@ -808,6 +812,7 @@ xfs_mountfs( xfs_warn(mp, "log mount failed"); goto out_fail_wait; } + log_mount_cancel = true; /* * Now the log is mounted, we know if it was an unclean shutdown or @@ -910,11 +915,15 @@ xfs_mountfs( } /* - * Finish recovering the file system. This part needed to be - * delayed until after the root and real-time bitmap inodes - * were consistently read in. + * Finish recovering the file system. This part needed to be delayed + * until after the root and real-time bitmap inodes were consistently + * read in. + * + * Reset the cancel flag as the finish cleans up after itself on + * failure. */ - error = xfs_log_mount_finish(mp); + log_mount_cancel = false; + error = xfs_log_mount_finish(mp, false); if (error) { xfs_warn(mp, "log mount finish failed"); goto out_rtunmount; @@ -956,6 +965,8 @@ xfs_mountfs( out_rele_rip: IRELE(rip); out_log_dealloc: + if (log_mount_cancel) + xfs_log_mount_finish(mp, true); xfs_log_unmount(mp); out_fail_wait: if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) -- 2.1.0 From bfoster@redhat.com Thu Aug 6 12:44:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D0177F8B for ; Thu, 6 Aug 2015 12:44:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C5BF8F8068 for ; Thu, 6 Aug 2015 10:44:36 -0700 (PDT) X-ASG-Debug-ID: 1438883075-04cb6c673e326210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QAFAhVg3edVDj6yv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 10:44:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 01DE2E6E52 for ; Thu, 6 Aug 2015 17:44:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYsi001705 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4A0631228EA; Thu, 6 Aug 2015 13:44:33 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 11/11] xfs: fix btree cursor error cleanups Date: Thu, 6 Aug 2015 13:44:32 -0400 X-ASG-Orig-Subj: [PATCH 11/11] xfs: fix btree cursor error cleanups Message-Id: <1438883072-28706-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438883075 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The btree cursor cleanup function takes an error parameter that affects how buffers are released from the cursor. All buffers are released in the event of error. Several callers do not specify the XFS_BTREE_ERROR flag in the event of error, however. This can cause buffers to hang around locked or with an elevated hold count and thus lead to umount hangs in the event of errors. Fix up the xfs_btree_del_cursor() callers to pass XFS_BTREE_ERROR if the cursor is being torn down due to error. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_itable.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index ce63e04..54deb2d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2233,7 +2233,7 @@ xfs_imap_lookup( } xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); if (error) return error; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f41b0c3..930ebd8 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -473,7 +473,8 @@ xfs_bulkstat( * pending error, then we are done. */ del_cursor: - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, error ? + XFS_BTREE_ERROR : XFS_BTREE_NOERROR); xfs_buf_relse(agbp); if (error) break; -- 2.1.0 From bfoster@redhat.com Thu Aug 6 13:03:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 339BE7F7E for ; Thu, 6 Aug 2015 13:03:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1193E304064 for ; Thu, 6 Aug 2015 11:03:21 -0700 (PDT) X-ASG-Debug-ID: 1438884201-04bdf06bcf2624f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id j0fgvJV3KT8cz9pu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 11:03:21 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id F19B9ABB37 for ; Thu, 6 Aug 2015 18:03:20 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYad032227 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D4E8C122F43; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure Date: Thu, 6 Aug 2015 13:44:25 -0400 X-ASG-Orig-Subj: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure Message-Id: <1438883072-28706-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438884201 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery attempts to free extents with leftover EFIs in the AIL after initial processing. If the extent free fails (e.g., due to unrelated fs corruption), the transaction is cancelled, though it might not be dirtied at the time. If this is the case, the EFD does not abort and thus does not release the EFI. This can lead to hangs as the EFI pins the AIL. Update xlog_recover_process_efi() to log the EFD in the transaction before xfs_free_extent() errors are handled to ensure the transaction is dirty, aborts the EFD and releases the EFI on error. This is consistent with how EFDs are handled at runtime in xfs_bmap_finish(). Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 9d8f242..3433b7b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3779,11 +3779,16 @@ xlog_recover_process_efi( for (i = 0; i < efip->efi_format.efi_nextents; i++) { extp = &(efip->efi_format.efi_extents[i]); + /* + * Log the EFD before error handling to ensure the EFD aborts + * (and releases the EFI) on error. + */ error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); - if (error) - goto abort_error; xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, extp->ext_len); + if (error) + goto abort_error; + } set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); -- 2.1.0 From bfoster@redhat.com Thu Aug 6 13:03:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 286287F7E for ; Thu, 6 Aug 2015 13:03:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9B45EAC002 for ; Thu, 6 Aug 2015 11:03:22 -0700 (PDT) X-ASG-Debug-ID: 1438884201-04cb6c6740326b20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id X78wBbcTtU6BB0O3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 11:03:21 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 04DE3ABB38 for ; Thu, 6 Aug 2015 18:03:21 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYmD032233 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1616E122F8C; Thu, 6 Aug 2015 13:44:33 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 09/11] xfs: checksum log record ext headers based on record size Date: Thu, 6 Aug 2015 13:44:30 -0400 X-ASG-Orig-Subj: [PATCH 09/11] xfs: checksum log record ext headers based on record size Message-Id: <1438883072-28706-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438884201 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The first 4 bytes of every basic block in the physical log is stamped with the current lsn. To support this mechanism, the log record header (first block of each new log record) contains space for the original first byte of each log record block before it is replaced with the lsn. The log record header has space for 32k worth of blocks. The version 2 log adds new extended record headers for each additional 32k worth of blocks beyond what is supported by the record header. The log record checksum incorporates the log record header, the extended headers and the record payload. xlog_cksum() checksums the extended headers based on log->l_iclog_heads, which specifies the number of extended headers in a log record based on the log buffer size mount option. The log buffer size is variable, however, and thus means the checksum can be calculated differently based on how a filesystem is mounted. This is problematic if a filesystem crashes and recovery occurs on a subsequent mount using a different log buffer size. For example, crash an active filesystem that is mounted with the default (32k) logbsize, attempt remount/recovery using '-o logbsize=64k' and the mount fails on or warns about log checksum failures. To avoid this problem, update xlog_cksum() to calculate the checksum based on the size of the log buffer according to the log record. The size is already included in the h_size field of the log record header and thus is available at log recovery time. Extended log record headers are also only written when the log record is large enough to require them. This makes checksum calculation of log records consistent with the extended record header mechanism as well as how on-disk records are checksummed with various log buffer size mount options. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 522286c..49cc57e 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1660,8 +1660,13 @@ xlog_cksum( if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { union xlog_in_core2 *xhdr = (union xlog_in_core2 *)rhead; int i; + int xheads; - for (i = 1; i < log->l_iclog_heads; i++) { + xheads = size / XLOG_HEADER_CYCLE_SIZE; + if (size % XLOG_HEADER_CYCLE_SIZE) + xheads++; + + for (i = 1; i < xheads; i++) { crc = crc32c(crc, &xhdr[i].hic_xheader, sizeof(struct xlog_rec_ext_header)); } -- 2.1.0 From bfoster@redhat.com Thu Aug 6 16:06:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E282B7F74 for ; Thu, 6 Aug 2015 16:06:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2AA130405F for ; Thu, 6 Aug 2015 14:06:16 -0700 (PDT) X-ASG-Debug-ID: 1438895174-04bdf06bd2268310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bBcOEcuLxYUzIueR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 14:06:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 9A4D6A58AA for ; Thu, 6 Aug 2015 21:06:14 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t76HiYSc017989 for ; Thu, 6 Aug 2015 13:44:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C8225122E55; Thu, 6 Aug 2015 13:44:32 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs Date: Thu, 6 Aug 2015 13:44:24 -0400 X-ASG-Orig-Subj: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-Id: <1438883072-28706-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1438883072-28706-1-git-send-email-bfoster@redhat.com> References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438895175 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Freeing an extent in XFS involves logging an EFI (extent free intention), freeing the actual extent, and logging an EFD (extent free done). The EFI object is created with a reference count of 2: one for the current transaction and one for the subsequently created EFD. Under normal circumstances, the first reference is dropped when the EFI is unpinned and the second reference is dropped when the EFD is committed to the on-disk log. In event of errors or filesystem shutdown, there are various potential cleanup scenarios depending on the state of the EFI/EFD. The cleanup scenarios are confusing and racy, as demonstrated by the following test sequence: # mount $dev $mnt # fsstress -d $mnt -n 99999 -p 16 -z -f fallocate=1 \ -f punch=1 -f creat=1 -f unlink=1 & # sleep 5 # killall -9 fsstress; wait # godown -f $mnt # umount ... in which the final umount can hang due to the AIL being pinned indefinitely by one or more EFI items. This can occur due to several conditions. For example, if the shutdown occurs after the EFI is committed to the on-disk log and the EFD committed to the CIL, but before the EFD committed to the log, the EFD iop_committed() abort handler does not drop its reference to the EFI. Alternatively, manual error injection in the xfs_bmap_finish() codepath shows that if an error occurs after the EFI transaction is committed but before the EFD is constructed and logged, the EFI is never released from the AIL. Update the EFI/EFD item handling code to use a more straightforward and reliable approach to error handling. If an error occurs after the EFI transaction is committed and before the EFD is constructed, release the EFI explicitly from xfs_bmap_finish(). If the EFI transaction is cancelled, release the EFI in the unlock handler. Once the EFD is constructed, it is responsible for releasing the EFI under any circumstances (including whether the EFI item aborts due to log I/O error). Update the EFD item handlers to release the EFI if the transaction is cancelled or aborts due to log I/O error. Finally, update xfs_bmap_finish() to log at least one EFD extent to the transaction before xfs_free_extent() errors are handled to ensure the transaction is dirty and EFD item error handling is triggered. Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 84 +++++++++++++++++++++++++++-------------------- fs/xfs/xfs_extfree_item.c | 71 ++++++++++++++++++++++----------------- 2 files changed, 90 insertions(+), 65 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 0f34886c..fa65f67 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -67,16 +67,15 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) */ int /* error */ xfs_bmap_finish( - xfs_trans_t **tp, /* transaction pointer addr */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *committed) /* xact committed or not */ + struct xfs_trans **tp, /* transaction pointer addr */ + struct xfs_bmap_free *flist, /* i/o: list extents to free */ + int *committed)/* xact committed or not */ { - xfs_efd_log_item_t *efd; /* extent free data */ - xfs_efi_log_item_t *efi; /* extent free intention */ - int error; /* error return value */ - xfs_bmap_free_item_t *free; /* free extent item */ - xfs_mount_t *mp; /* filesystem mount structure */ - xfs_bmap_free_item_t *next; /* next item on free list */ + struct xfs_efd_log_item *efd; /* extent free data */ + struct xfs_efi_log_item *efi; /* extent free intention */ + int error; /* error return value */ + struct xfs_bmap_free_item *free; /* free extent item */ + struct xfs_bmap_free_item *next; /* next item on free list */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); if (flist->xbf_count == 0) { @@ -88,40 +87,55 @@ xfs_bmap_finish( xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, free->xbfi_blockcount); - error = xfs_trans_roll(tp, NULL); - *committed = 1; - /* - * We have a new transaction, so we should return committed=1, - * even though we're returning an error. - */ - if (error) + error = __xfs_trans_roll(tp, NULL, committed); + if (error) { + /* + * If the transaction was committed, drop the EFD reference + * since we're bailing out of here. The other reference is + * dropped when the EFI hits the AIL. + * + * If the transaction was not committed, the EFI is freed by the + * EFI item unlock handler on abort. Also, we have a new + * transaction so we should return committed=1 even though we're + * returning an error. + */ + if (*committed) { + xfs_efi_release(efi); + xfs_force_shutdown((*tp)->t_mountp, + (error == -EFSCORRUPTED) ? + SHUTDOWN_CORRUPT_INCORE : + SHUTDOWN_META_IO_ERROR); + } else { + *committed = 1; + } + return error; + } efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; - if ((error = xfs_free_extent(*tp, free->xbfi_startblock, - free->xbfi_blockcount))) { - /* - * The bmap free list will be cleaned up at a - * higher level. The EFI will be canceled when - * this transaction is aborted. - * Need to force shutdown here to make sure it - * happens, since this transaction may not be - * dirty yet. - */ - mp = (*tp)->t_mountp; - if (!XFS_FORCED_SHUTDOWN(mp)) - xfs_force_shutdown(mp, - (error == -EFSCORRUPTED) ? - SHUTDOWN_CORRUPT_INCORE : - SHUTDOWN_META_IO_ERROR); - return error; - } + + /* + * Free the extent and log the EFD to dirty the transaction + * before handling errors. This ensures that the transaction is + * aborted, which: + * + * 1.) releases the EFI and frees the EFD + * 2.) shuts down the filesystem + * + * The bmap free list is cleaned up at a higher level. + */ + error = xfs_free_extent(*tp, free->xbfi_startblock, + free->xbfi_blockcount); xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, - free->xbfi_blockcount); + free->xbfi_blockcount); + if (error) + return error; + xfs_bmap_del_free(flist, NULL, free); } + return 0; } diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 42c9b05..aceb54f 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -61,9 +61,15 @@ __xfs_efi_release( if (atomic_dec_and_test(&efip->efi_refcount)) { spin_lock(&ailp->xa_lock); - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); + /* + * We don't know whether the EFI made it to the AIL. Remove it + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. + */ + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); + else + spin_unlock(&ailp->xa_lock); xfs_efi_item_free(efip); } } @@ -128,12 +134,12 @@ xfs_efi_item_pin( } /* - * While EFIs cannot really be pinned, the unpin operation is the last place at - * which the EFI is manipulated during a transaction. If we are being asked to - * remove the EFI it's because the transaction has been cancelled and by - * definition that means the EFI cannot be in the AIL so remove it from the - * transaction and free it. Otherwise coordinate with xfs_efi_release() - * to determine who gets to free the EFI. + * The unpin operation is the last place an EFI is manipulated in the log. It is + * either inserted in the AIL or aborted in the event of a log I/O error. In + * either case, the EFI transaction has been successfully committed to make it + * this far. Therefore, we expect whoever committed the EFI to either construct + * and commit the EFD or drop the EFD's reference in the event of error. Simply + * drop the log's EFI reference now that the log is done with it. */ STATIC void xfs_efi_item_unpin( @@ -141,14 +147,6 @@ xfs_efi_item_unpin( int remove) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); - - if (remove) { - ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); - if (lip->li_desc) - xfs_trans_del_item(lip); - xfs_efi_item_free(efip); - return; - } xfs_efi_release(efip); } @@ -167,6 +165,11 @@ xfs_efi_item_push( return XFS_ITEM_PINNED; } +/* + * The EFI has been either committed or aborted if the transaction has been + * cancelled. If the transaction was cancelled, an EFD isn't going to be + * constructed and thus we free the EFI here directly. + */ STATIC void xfs_efi_item_unlock( struct xfs_log_item *lip) @@ -411,20 +414,27 @@ xfs_efd_item_push( return XFS_ITEM_PINNED; } +/* + * The EFD is either committed or aborted if the transaction is cancelled. If + * the transaction is cancelled, drop our reference to the EFI and free the EFD. + */ STATIC void xfs_efd_item_unlock( struct xfs_log_item *lip) { - if (lip->li_flags & XFS_LI_ABORTED) - xfs_efd_item_free(EFD_ITEM(lip)); + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + + if (lip->li_flags & XFS_LI_ABORTED) { + xfs_efi_release(efdp->efd_efip); + xfs_efd_item_free(efdp); + } } /* - * When the efd item is committed to disk, all we need to do - * is delete our reference to our partner efi item and then - * free ourselves. Since we're freeing ourselves we must - * return -1 to keep the transaction code from further referencing - * this item. + * When the efd item is committed to disk, all we need to do is delete our + * reference to our partner efi item and then free ourselves. Since we're + * freeing ourselves we must return -1 to keep the transaction code from further + * referencing this item. */ STATIC xfs_lsn_t xfs_efd_item_committed( @@ -434,14 +444,15 @@ xfs_efd_item_committed( struct xfs_efd_log_item *efdp = EFD_ITEM(lip); /* - * If we got a log I/O error, it's always the case that the LR with the - * EFI got unpinned and freed before the EFD got aborted. + * Drop the EFI reference regardless of whether the EFD has been + * aborted. Once the EFD transaction is constructed, it is the sole + * responsibility of the EFD to release the EFI (even if the EFI is + * aborted due to log I/O error). */ - if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip); - + xfs_efi_release(efdp->efd_efip); xfs_efd_item_free(efdp); - return (xfs_lsn_t)-1; + + return (xfs_lsn_t) -1; } /* -- 2.1.0 From david@fromorbit.com Thu Aug 6 16:26:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5671E7F80 for ; Thu, 6 Aug 2015 16:26:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 340368F8049 for ; Thu, 6 Aug 2015 14:26:36 -0700 (PDT) X-ASG-Debug-ID: 1438896393-04cbb0416c2ae3c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id GWkAGxF7MRz7Zz4G for ; Thu, 06 Aug 2015 14:26:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AiBwCA0MNV/20mLHlbgxuBPalhAQEBAQEBBpsrAgIBAQKBSU0BAQEBAQGBC4QkAQEEJxMcIxAIAw4GBAklDwUlAyETiC3OLgEBAQEGAQEBAR4ZhgaFMIUJB4MYgRQBBJUBjFWZciaEDywxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Aug 2015 06:56:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNSg8-0001vn-GC; Fri, 07 Aug 2015 07:26:20 +1000 Date: Fri, 7 Aug 2015 07:26:20 +1000 From: Dave Chinner To: Detlef Vollmann Cc: xfs@oss.sgi.com Subject: Re: xfsdump doesn't compile: undefined reference to 'min' Message-ID: <20150806212620.GD3902@dastard> X-ASG-Orig-Subj: Re: xfsdump doesn't compile: undefined reference to 'min' References: <55C312CF.2040408@vollmann.ch> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C312CF.2040408@vollmann.ch> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438896393 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21409 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 06, 2015 at 09:54:55AM +0200, Detlef Vollmann wrote: > > commit 5a2985233c390d59d2a9757b119cb0e001c87a96 > > Author: Dave Chinner > > Date: Fri Jul 18 08:02:26 2014 +1000 > > > > dump: don't redefine min() or max() > > > > They are included from other header files. > The message doesn't say from which header and configure doesn't test > for it. > If I compile it (cross-compilation, gcc, uclibc, xfsprogs 3.1.11, > xfsdump 3.1.4), I get lots of errors: > warning: implicit declaration of function 'max' > undefined reference to 'min' #include -> /usr/include/xfs/xfs.h #include -> /usr/include/xfs/platform_defs.h #define min(a,b) (((a)<(b))?(a):(b)) These headers come from xfsprogs, and you'll need to upgrade that package to 3.2.x.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 6 19:41:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C7C07F55 for ; Thu, 6 Aug 2015 19:41:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 588218F804C for ; Thu, 6 Aug 2015 17:41:54 -0700 (PDT) X-ASG-Debug-ID: 1438908108-04cb6c673d330660001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id pyOMruh9UniaImpC for ; Thu, 06 Aug 2015 17:41:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C2BgB1/sNV/20mLHlbgxuBPalhAQEBAQEHmysEAgKBSE0BAQEBAQGBC4QkAQEDAScTHCMFCwgDDhMlDwUlAyETHogIB81tAQEBAQYCAR8ZhgaFMIE9AYNLB4MYgRQFhxIBhmiHBoxVgUmQAYgoJoIODQ+BZSwxgQUEgUMBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Aug 2015 10:11:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNViW-0002Iq-FY; Fri, 07 Aug 2015 10:41:00 +1000 Date: Fri, 7 Aug 2015 10:41:00 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-ID: <20150807004100.GD16638@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438908108 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21414 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 06, 2015 at 01:44:24PM -0400, Brian Foster wrote: .... > Update the EFI/EFD item handling code to use a more straightforward and > reliable approach to error handling. If an error occurs after the EFI > transaction is committed and before the EFD is constructed, release the > EFI explicitly from xfs_bmap_finish(). If the EFI transaction is > cancelled, release the EFI in the unlock handler. > > Once the EFD is constructed, it is responsible for releasing the EFI > under any circumstances (including whether the EFI item aborts due to > log I/O error). Can you document these rules in a comment at the top of fs/xfs/xfs_extfree_item.c? > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > index 42c9b05..aceb54f 100644 > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -61,9 +61,15 @@ __xfs_efi_release( > > if (atomic_dec_and_test(&efip->efi_refcount)) { > spin_lock(&ailp->xa_lock); > - /* xfs_trans_ail_delete() drops the AIL lock. */ > - xfs_trans_ail_delete(ailp, &efip->efi_item, > - SHUTDOWN_LOG_IO_ERROR); > + /* > + * We don't know whether the EFI made it to the AIL. Remove it > + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. > + */ > + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) > + xfs_trans_ail_delete(ailp, &efip->efi_item, > + SHUTDOWN_LOG_IO_ERROR); > + else > + spin_unlock(&ailp->xa_lock); > xfs_efi_item_free(efip); > } We now have a lot of this pattern: spin_lock(&ailp->xa_lock); if (lip->li_flags & XFS_LI_IN_AIL) xfs_trans_ail_delete(ailp, lip, shutdown_reason); else spin_unlock(&ailp->xa_lock); occurring in the code. Can you look into adding a helper function for this, say xfs_trans_ail_remove()? (separate patch, of course!) The rest of the patch looks fine - getting rid of almost all of those aborted flag special cases is a big win :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From kgtyxds@bhsw.com Thu Aug 6 20:17:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_FROM,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E65867F6B for ; Thu, 6 Aug 2015 20:17:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D27868F804B for ; Thu, 6 Aug 2015 18:17:56 -0700 (PDT) X-ASG-Debug-ID: 1438910273-04cb6c673f3311e0001-NocioJ Received: from bhsw.com ([60.169.2.170]) by cuda.sgi.com with ESMTP id x5ALmNlzuj0ChpXY for ; Thu, 06 Aug 2015 18:17:53 -0700 (PDT) X-Barracuda-Envelope-From: kgtyxds@bhsw.com X-Barracuda-Apparent-Source-IP: 60.169.2.170 Received: from M1A3ILS61T2XPU1 ([127.0.0.1]) by localhost via TCP with ESMTPA; Fri, 07 Aug 2015 09:20:40 +0800 MIME-Version: 1.0 From: www.sportsjc.com Sender: www.sportsjc.com To: xfs@oss.sgi.com Reply-To: www.sportsjc.com Date: 7 Aug 2015 09:20:40 +0800 Subject: =?utf-8?B?VGhlIEJlc3QgV2F5IHRvIEdldCBBIE5GTCBKZXJzZXk=?= Content-Type: multipart/alternative; boundary=--boundary_214747_571e5c80-3f22-44fd-89cf-9c9e314148c5 X-ASG-Orig-Subj: =?utf-8?B?VGhlIEJlc3QgV2F5IHRvIEdldCBBIE5GTCBKZXJzZXk=?= X-Barracuda-Connect: UNKNOWN[60.169.2.170] X-Barracuda-Start-Time: 1438910273 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.15 X-Barracuda-Spam-Status: No, SCORE=2.15 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2, HTML_MESSAGE, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21415 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 0.00 HTML_MESSAGE BODY: HTML included in message 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150807011756.74DF312961A2@cuda.sgi.com> ----boundary_214747_571e5c80-3f22-44fd-89cf-9c9e314148c5 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 RGVhciBORkwgZmFucywNClRoaXMgaXMgYSBjaGVhcCBhbmQgcXVhbGl0eSBORkwgamVyc2V5 IHNpdGUgYXQgaHR0cDovL3d3dy5zcG9ydHNqYy5jb20vbmZsLWMtNjguaHRtbCZuYnNwOw0K SWYgeW91IGFyZSBhIGZhbnMgb2YgdGhlbSwgcGVsYXNlIHZpc2l0IG91ciBwYWdlLg== ----boundary_214747_571e5c80-3f22-44fd-89cf-9c9e314148c5 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PFA+RGVhciBORkwgZmFucyw8L1A+DQo8UD5UaGlzIGlzIGEgY2hlYXAgYW5kIHF1YWxpdHkg TkZMIGplcnNleSBzaXRlIGF0IDxBIGhyZWY9Imh0dHA6Ly93d3cuc3BvcnRzamMuY29tL25m bC1jLTY4Lmh0bWwiPmh0dHA6Ly93d3cuc3BvcnRzamMuY29tL25mbC1jLTY4Lmh0bWw8L0E+ Jm5ic3A7PC9QPg0KPFA+SWYgeW91IGFyZSBhIGZhbnMgb2YgdGhlbSwgcGVsYXNlIHZpc2l0 IG91ciBwYWdlLjwvUD4= ----boundary_214747_571e5c80-3f22-44fd-89cf-9c9e314148c5-- From david@fromorbit.com Thu Aug 6 20:52:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 673637F6B for ; Thu, 6 Aug 2015 20:52:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 009D1AC002 for ; Thu, 6 Aug 2015 18:52:12 -0700 (PDT) X-ASG-Debug-ID: 1438912329-04cb6c673f331d40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ZEBS5NCV4CBxl54r for ; Thu, 06 Aug 2015 18:52:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DbBgDoDsRV/20mLHlbgxuBPaliAQEBAQEBBpsrBAICgUBNAQEBAQEBgQuEJAEBBCcTHCMQCAMOCgklDwUlAyETiC3NXAEBAQEBBQEBAQEeGYYGhTCFCQeDGIEUBZUBjFWZciaEDywxgkwBAQE Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Aug 2015 11:21:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNWon-0002Ot-Ba; Fri, 07 Aug 2015 11:51:33 +1000 Date: Fri, 7 Aug 2015 11:51:33 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery Message-ID: <20150807015133.GE16638@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-6-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-6-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438912329 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21415 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 06, 2015 at 01:44:26PM -0400, Brian Foster wrote: > @@ -2933,16 +2933,16 @@ xlog_recover_efi_pass2( > struct xlog_recover_item *item, > xfs_lsn_t lsn) > { > - int error; > - xfs_mount_t *mp = log->l_mp; > - xfs_efi_log_item_t *efip; > - xfs_efi_log_format_t *efi_formatp; > + int error; > + struct xfs_mount *mp = log->l_mp; > + struct xfs_efi_log_item *efip; > + struct xfs_efi_log_format *efi_formatp; > > efi_formatp = item->ri_buf[0].i_addr; > > efip = xfs_efi_init(mp, efi_formatp->efi_nextents); > - if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), > - &(efip->efi_format)))) { > + error = xfs_efi_copy_format(&(item->ri_buf[0]), &(efip->efi_format)); > + if (error) { You can kill the extra (..) around the variables here. .... > @@ -2995,18 +2998,18 @@ xlog_recover_efd_pass2( > efip = (xfs_efi_log_item_t *)lip; > if (efip->efi_format.efi_id == efi_id) { > /* > - * xfs_trans_ail_delete() drops the > - * AIL lock. > + * Drop the EFD reference to the EFI. This > + * removes the EFI from the AIL and frees it. > */ > - xfs_trans_ail_delete(ailp, lip, > - SHUTDOWN_CORRUPT_INCORE); > - xfs_efi_item_free(efip); > + spin_unlock(&ailp->xa_lock); > + xfs_efi_release(efip); > spin_lock(&ailp->xa_lock); Need to call xfs_efi_release() outside the ailp->xa_lock as xfs_efi_release() now does the removal of the log item from the AIL and so can deadlock when taking the ailp->xa_lock. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 6 21:23:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF8D87F67 for ; Thu, 6 Aug 2015 21:23:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB9228F804B for ; Thu, 6 Aug 2015 19:23:53 -0700 (PDT) X-ASG-Debug-ID: 1438914230-04cb6c6740332820001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id MpxtRmkmDebcAsiu for ; Thu, 06 Aug 2015 19:23:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AjBwAWFsRV/20mLHlbgxuBPaliAQEBAQEBBpsrAgIBAQKBOk0BAQEBAQGBC4QjAQEBAwEnExwjBQsIAw4KCSUPBSUDIROIJgfNSgEBAQEBAQQBAQEBHhmGBoUwhQkHgxiBFAWHEwcChl+HBoxVgUmHOohHiCgmgg4cgWUsMYEFBIFDAQEB Received: from ppp121-44-38-109.lns20.syd4.internode.on.net (HELO dastard) ([121.44.38.109]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Aug 2015 11:53:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNXJo-0002Ul-Pv; Fri, 07 Aug 2015 12:23:36 +1000 Date: Fri, 7 Aug 2015 12:23:36 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure Message-ID: <20150807022336.GF16638@dastard> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-7-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-7-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1438914230 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21416 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 06, 2015 at 01:44:27PM -0400, Brian Foster wrote: > Log recovery occurs in two phases at mount time. In the first phase, > EFIs and EFDs are processed and potentially cancelled out. EFIs without > EFD objects are inserted into the AIL for processing and recovery in the > second phase. xfs_mountfs() runs various other operations between the > phases and is thus subject to failure. If failure occurs after the first > phase but before the second, pending EFIs sit on the AIL, pin it and > cause the mount to hang. > > Update the mount sequence to ensure that pending EFIs are cancelled in > the event of failure. Add a recovery cancellation mechanism to iterate > the AIL and cancel all EFI items when requested. Plumb cancellation > support through the log mount finish helper and update xfs_mountfs() to > invoke cancellation in the event of failure after recovery has started. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_log.c | 16 +++++++++++----- > fs/xfs/xfs_log.h | 2 +- > fs/xfs/xfs_log_priv.h | 2 ++ > fs/xfs/xfs_log_recover.c | 41 ++++++++++++++++++++++++++++++++++++----- > fs/xfs/xfs_mount.c | 35 +++++++++++++++++++++++------------ > 5 files changed, 73 insertions(+), 23 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 6b5a84a..522286c 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -740,19 +740,25 @@ out: > * it. > */ > int > -xfs_log_mount_finish(xfs_mount_t *mp) > +xfs_log_mount_finish( > + struct xfs_mount *mp, > + bool cancel) > { > int error = 0; > > - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { > + if (mp->m_flags & XFS_MOUNT_NORECOVERY) { > + ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > + return 0; > + } > + > + if (cancel) { > + error = xlog_recover_cancel(mp->m_log); > + } else { > error = xlog_recover_finish(mp->m_log); > if (!error) > xfs_log_work_queue(mp); > - } else { > - ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > } > > - > return error; > } As I mentioned on #xfs, I don't think the error/cancel path needs to go through this function. Add a new function xfs_log_mount_cancel(), and put the contents of xlog_recover_cancel() inside it, along with the log unmount function... (General rule: prefix "xfs_log_....()" is for functions that call into the log from outside, passing a struct xfs_mount. prefix "xlog_...()" is for internal calls, passing a struct xlog.) > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index a74ff68..a7ba078 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3823,10 +3823,11 @@ abort_error: > */ > STATIC int > xlog_recover_process_efis( > - struct xlog *log) > + struct xlog *log, > + bool cancel) > { > - xfs_log_item_t *lip; > - xfs_efi_log_item_t *efip; > + struct xfs_log_item *lip; > + struct xfs_efi_log_item *efip; > int error = 0; > struct xfs_ail_cursor cur; > struct xfs_ail *ailp; > @@ -3847,10 +3848,24 @@ xlog_recover_process_efis( > break; > } > > + efip = (struct xfs_efi_log_item *) lip; > + > + /* > + * A cancel occurs when the mount has failed and we're bailing > + * out. Release all pending EFIs so they don't pin the AIL. > + */ > + if (cancel) { > + spin_unlock(&ailp->xa_lock); > + xfs_efi_release(efip); > + spin_lock(&ailp->xa_lock); > + > + lip = xfs_trans_ail_cursor_next(ailp, &cur); > + continue; > + } This might be better to separate into a xlog_recover_cancel_efis() function because this is much simpler than the rest of the loop. It may be more code, but its simpler to read and understand. > + > /* > * Skip EFIs that we've already processed. > */ > - efip = (xfs_efi_log_item_t *)lip; > if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { > lip = xfs_trans_ail_cursor_next(ailp, &cur); > continue; > @@ -4617,8 +4632,13 @@ xlog_recover_finish( > */ > if (log->l_flags & XLOG_RECOVERY_NEEDED) { > int error; > - error = xlog_recover_process_efis(log); > + error = xlog_recover_process_efis(log, false); > if (error) { > + /* > + * We could still have pending EFIs. Cancel them so we > + * don't hang... > + */ > + xlog_recover_process_efis(log, true); Not actually necessary. We don't clear the XLOG_RECOVERY_NEEDED flag, so when the error stack is run in xfs_mountfs(), we will call xfs_log_mount_cancel(), it will see the XLOG_RECOVERY_NEEDED and run xlog_recover_cancel_efis().... > xfs_alert(log->l_mp, "Failed to recover EFIs"); > return error; > } > @@ -4644,6 +4664,17 @@ xlog_recover_finish( > return 0; > } > > +int > +xlog_recover_cancel( > + struct xlog *log) > +{ > + int error = 0; > + > + if (log->l_flags & XLOG_RECOVERY_NEEDED) > + error = xlog_recover_process_efis(log, true); > + > + return error; > +} void xfs_log_mount_cancel( struct xfs_mount *mp) { int error = 0; if (log->l_flags & XLOG_RECOVERY_NEEDED) xlog_recover_cancel_efis(log); xfs_log_unmount(mp); return error; } > @@ -799,7 +800,10 @@ xfs_mountfs( > } > > /* > - * log's mount-time initialization. Perform 1st part recovery if needed > + * Log's mount-time initialization. The first part of recovery can place > + * some items on the AIL, to be handled when recovery is finished. Set > + * the cancel flag to ensure that the recovery is cancelled should we > + * fail before then. > */ > error = xfs_log_mount(mp, mp->m_logdev_targp, > XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), > @@ -808,6 +812,7 @@ xfs_mountfs( > xfs_warn(mp, "log mount failed"); > goto out_fail_wait; > } > + log_mount_cancel = true; At this point, XLOG_RECOVERY_NEEDED will be set if EFI processing is required, so a variable to track this here is not needed. > @@ -910,11 +915,15 @@ xfs_mountfs( > } > > /* > - * Finish recovering the file system. This part needed to be > - * delayed until after the root and real-time bitmap inodes > - * were consistently read in. > + * Finish recovering the file system. This part needed to be delayed > + * until after the root and real-time bitmap inodes were consistently > + * read in. > + * > + * Reset the cancel flag as the finish cleans up after itself on > + * failure. > */ > - error = xfs_log_mount_finish(mp); > + log_mount_cancel = false; > + error = xfs_log_mount_finish(mp, false); > if (error) { > xfs_warn(mp, "log mount finish failed"); > goto out_rtunmount; xfs_log_mount_finish() will clear the XLOG_RECOVERY_NEEDED. On error, we jump into the error stack above the call to xfs_log_mount_cancel(), so it will handle the cleanup.... > @@ -956,6 +965,8 @@ xfs_mountfs( > out_rele_rip: > IRELE(rip); > out_log_dealloc: > + if (log_mount_cancel) > + xfs_log_mount_finish(mp, true); > xfs_log_unmount(mp); And this just becomes a call to xfs_log_mount_cancel(). I hope this is a bit clearer that mud ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Thu Aug 6 21:52:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 671317F51 for ; Thu, 6 Aug 2015 21:52:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F218CAC003 for ; Thu, 6 Aug 2015 19:52:41 -0700 (PDT) X-ASG-Debug-ID: 1438915960-04bdf06bd126ebd0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id IB1GmiJF122mgTqT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 19:52:40 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t772qbxv087428 for ; Thu, 6 Aug 2015 19:52:39 -0700 Message-ID: <55C41D75.4040504@tlinx.org> Date: Thu, 06 Aug 2015 19:52:37 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: xfs-oss Subject: why crc req on free-inobt & file-type-indir options? Content-Type: text/plain; charset=UTF-8; format=flowed X-ASG-Orig-Subj: why crc req on free-inobt & file-type-indir options? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1438915960 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21417 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Could anyone point me at the discussion or literature as to why a free-inodeB-Tree and inline-types, should *REQUIRE* a -crc=1 option? Ultimately isn't it about the users/customers and what they will want? I not saying to not make it a default -- but to require it to try the other features? Main reason I asked, is I have had disks get partly corrupted meta data before, and it looks like the crc information just says "this disk has errors, so assume ALL is LOST! Seems like one bit flip out of a 32+Tb(4TB) are not great odds. Example: sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 mkfs.xfs -mcrc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 data = bsize=4096 blocks=402652672, imaxpct=5 = sunit=16 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=32752, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. cache_node_purge: refcount was 1, not zero (node=0x891ea0) xfs_admin: cannot read root inode (117) cache_node_purge: refcount was 1, not zero (node=0x894410) xfs_admin: cannot read realtime bitmap inode (117) xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. Clearing log and setting UUID writing all SBs bad sb version # 0xbda5 in AG 0 failed to set UUID in AG 0 new UUID = 55c29a43-19b6-ba02-2015-08051620352b 26.34sec 0.11usr 14.97sys (57.28% cpu) Ishtar:law/bin> time sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 mkfs.xfs -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=402652672, imaxpct=5 = sunit=16 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=32752, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Clearing log and setting UUID writing all SBs55 new UUID = 55c29acd-2ce9-d15a-2015-08051622534b In case you were curious why ^^date^^:time^^^?? gives me an idea of how long a disk (or partition) has been in service.... I don't see any benefit in something that fails the disk that quickly. While I've heard a patch for the GUID is in the input stream -- that's one thing. If I go in and a bit-error has reduced my disk to v1-dirs as a side effect, it sounds like the potential for damage is far greater than with that option turned on. Sure it may make you **aware** of a potential problem more quickly (or a new SW error), but I didn't see how it helped repair the disk when it was at fault. Also, is it my imagination or is mkfs.xfs taking longer, occasionally alot longer -- on the order of >60 seconds at long end vs ~30 at lower endd. It sorta felt like a drop cache was being done before the real long one but the memusage didn't change. at least part of the time. Has anyone done any benchmarks both ways on meta-data intensive workloads (I guess lots of mkdirs, touch, rm, adding large ACL's) ...? Thanks much! L. Walsh From xfs@tlinx.org Thu Aug 6 21:54:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA9B07F51 for ; Thu, 6 Aug 2015 21:54:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67E208F8035 for ; Thu, 6 Aug 2015 19:54:03 -0700 (PDT) X-ASG-Debug-ID: 1438916041-04bdf06bd226ec40001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id ffFq5Ls4prAZG2nu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Aug 2015 19:54:01 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t772rxOL087684 for ; Thu, 6 Aug 2015 19:54:01 -0700 Message-ID: <55C41DC7.1050706@tlinx.org> Date: Thu, 06 Aug 2015 19:53:59 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: why crc req on free-inobt & file-type-indir options? Content-Type: text/plain; charset=UTF-8; format=flowed X-ASG-Orig-Subj: why crc req on free-inobt & file-type-indir options? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1438916041 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21417 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Could anyone point me at the discussion or literature as to why a free-inodeB-Tree and inline-types, should *REQUIRE* a -crc=1 option? Ultimately isn't it about the users/customers and what they will want? I not saying to not make it a default -- but to require it to try the other features? Main reason I asked, is I have had disks get partly corrupted meta data before, and it looks like the crc information just says "this disk has errors, so assume ALL is LOST! Seems like one bit flip out of a 32+Tb(4TB) are not great odds. Example: sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 mkfs.xfs -mcrc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 data = bsize=4096 blocks=402652672, imaxpct=5 = sunit=16 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=32752, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. cache_node_purge: refcount was 1, not zero (node=0x891ea0) xfs_admin: cannot read root inode (117) cache_node_purge: refcount was 1, not zero (node=0x894410) xfs_admin: cannot read realtime bitmap inode (117) xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. Clearing log and setting UUID writing all SBs bad sb version # 0xbda5 in AG 0 failed to set UUID in AG 0 new UUID = 55c29a43-19b6-ba02-2015-08051620352b 26.34sec 0.11usr 14.97sys (57.28% cpu) Ishtar:law/bin> time sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 mkfs.xfs -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=402652672, imaxpct=5 = sunit=16 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=32752, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Clearing log and setting UUID writing all SBs55 new UUID = 55c29acd-2ce9-d15a-2015-08051622534b In case you were curious why ^^date^^:time^^^?? gives me an idea of how long a disk (or partition) has been in service.... I don't see any benefit in something that fails the disk that quickly. While I've heard a patch for the GUID is in the input stream -- that's one thing. If I go in and a bit-error has reduced my disk to v1-dirs as a side effect, it sounds like the potential for damage is far greater than with that option turned on. Sure it may make you **aware** of a potential problem more quickly (or a new SW error), but I didn't see how it helped repair the disk when it was at fault. Also, is it my imagination or is mkfs.xfs taking longer, occasionally alot longer -- on the order of >60 seconds at long end vs ~30 at lower endd. It sorta felt like a drop cache was being done before the real long one but the memusage didn't change. at least part of the time. Has anyone done any benchmarks both ways on meta-data intensive workloads (I guess lots of mkdirs, touch, rm, adding large ACL's) ...? Thanks much! L. Walsh From sandeen@sandeen.net Fri Aug 7 00:00:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 00BDD7F3F for ; Fri, 7 Aug 2015 00:00:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE5B48F8050 for ; Thu, 6 Aug 2015 22:00:40 -0700 (PDT) X-ASG-Debug-ID: 1438923635-04cbb0416c2b5d80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fW4WYfrATHq3MOMG for ; Thu, 06 Aug 2015 22:00:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8810C63C6061; Fri, 7 Aug 2015 00:00:34 -0500 (CDT) Message-ID: <55C43B70.4050300@sandeen.net> Date: Thu, 06 Aug 2015 22:00:32 -0700 From: Eric Sandeen MIME-Version: 1.0 To: "L.A. Walsh" , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <55C41D75.4040504@tlinx.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438923635 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21419 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 8/6/15 7:52 PM, L.A. Walsh wrote: > > Could anyone point me at the discussion or literature as to why > a free-inodeB-Tree and inline-types, should *REQUIRE* a -crc=1 option? In part, to limit the test matrix to something the small handful of developers can fully support you on. > Ultimately isn't it about the users/customers and what they will want? Well, no, not necessarily. Users want a lot of things. It's as much about what is possible, as it is about what is wished for. > I not saying to not make it a default -- but to require it to try > the other features? > Main reason I asked, is I have had disks get partly corrupted meta data > before, and it looks like the crc information just says "this disk > has errors, so assume ALL is LOST! Seems like one bit flip out of > a 32+Tb(4TB) are not great odds. I don't follow ... one bit flip on a filesystem will not cause the filesystem to be lost. > Example: > sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 > mkfs.xfs -mcrc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 > meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks > = sectsz=4096 attr=2, projid32bit=1 > = crc=1 finobt=1 > data = bsize=4096 blocks=402652672, imaxpct=5 > = sunit=16 swidth=64 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > log =internal log bsize=4096 blocks=32752, version=2 > = sectsz=4096 sunit=1 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 ok... > xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. Um, what? What xfs_admin command generated this? With what xfsprogs version? > cache_node_purge: refcount was 1, not zero (node=0x891ea0) > xfs_admin: cannot read root inode (117) > cache_node_purge: refcount was 1, not zero (node=0x894410) > xfs_admin: cannot read realtime bitmap inode (117) > xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. > Clearing log and setting UUID > writing all SBs > bad sb version # 0xbda5 in AG 0 > failed to set UUID in AG 0 > new UUID = 55c29a43-19b6-ba02-2015-08051620352b > 26.34sec 0.11usr 14.97sys (57.28% cpu) Something has gone wrong here, but you have not provided enough info for us to know what it is. Full sequence of commands, please, and xfsprogs version number. Is it just a bug? > Ishtar:law/bin> time sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 > mkfs.xfs -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 > meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks > = sectsz=4096 attr=2, projid32bit=1 > = crc=0 finobt=0 > data = bsize=4096 blocks=402652672, imaxpct=5 > = sunit=16 swidth=64 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=0 > log =internal log bsize=4096 blocks=32752, version=2 > = sectsz=4096 sunit=1 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > Clearing log and setting UUID > writing all SBs55 > new UUID = 55c29acd-2ce9-d15a-2015-08051622534b > In case you were curious why ^^date^^:time^^^?? gives me an idea of > how long a disk (or partition) has been in service.... not following. > I don't see any benefit in something that fails the disk that quickly. I'm sorry, I'm still not following. What's failing here? > While I've heard a patch for the GUID is in the input stream -- that's > one thing. If I go in and a bit-error has reduced my disk to v1-dirs > as a side effect, it sounds like the potential for damage is far greater > than with that option turned on. Sure it may make you **aware** of a > potential problem more quickly (or a new SW error), but I didn't see > how it helped repair the disk when it was at fault. Well ... *was* your disk at fault? I can't tell how you arrived at the scenario above. but you're right, CRCs are more about early error detection than enhanced error recovery. > Also, is it my imagination or is mkfs.xfs taking longer, occasionally > alot longer -- on the order of >60 seconds at long end vs ~30 at > lower endd. It sorta felt like a drop cache was being done before > the real long one but the memusage didn't change. at > least part of the time. I've not experienced that... > Has anyone done any benchmarks both > ways on meta-data intensive workloads (I guess lots of mkdirs, > touch, rm, adding large ACL's) ...? Both which ways? With and without CRCs? Yes, Dave did a lot of that during development, IIRC. -Eric > > Thanks much! > L. Walsh > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Aug 7 00:18:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 029737F4E for ; Fri, 7 Aug 2015 00:18:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C21E5304032 for ; Thu, 6 Aug 2015 22:18:54 -0700 (PDT) X-ASG-Debug-ID: 1438924732-04bdf06bd1271750001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id oUYDoOl05821noA2 for ; Thu, 06 Aug 2015 22:18:53 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 58F3C63C6061 for ; Fri, 7 Aug 2015 00:18:52 -0500 (CDT) Message-ID: <55C43FBA.1080408@sandeen.net> Date: Thu, 06 Aug 2015 22:18:50 -0700 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438924732 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21419 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- mkfs.xfs got weird along the way; today it has different outcomes depending on the order of option specification: $ mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g cannot specify both crc and ftype $ mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g Somehow the tests got written as being constrained on what options are specified - and in what order! - vs actually testing for incompatible feature sets. It's fine to specify both crc & ftype options, as long as it's an allowed combination, so just test for the incompatible combination (crc=1 and ftype=0) after all options have been processed. Signed-off-by: Eric Sandeen --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 69d61c7..9042796 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1477,11 +1477,6 @@ main( if (c < 0 || c > 1) illegal(value, "m crc"); crcs_enabled = c; - if (nftype && crcs_enabled) { - fprintf(stderr, -_("cannot specify both crc and ftype\n")); - usage(); - } break; case M_FINOBT: if (!value || *value == '\0') @@ -1555,11 +1550,6 @@ _("cannot specify both crc and ftype\n")); if (nftype) respec('n', nopts, N_FTYPE); dirftype = atoi(value); - if (crcs_enabled) { - fprintf(stderr, -_("cannot specify both crc and ftype\n")); - usage(); - } nftype = 1; break; default: @@ -1714,6 +1704,10 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), XFS_MIN_CRC_BLOCKSIZE); usage(); } + if (crcs_enabled && !dirftype) { + fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); + usage(); + } memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite); From sandeen@sandeen.net Fri Aug 7 00:36:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7D8927F55 for ; Fri, 7 Aug 2015 00:36:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B3AC304043 for ; Thu, 6 Aug 2015 22:36:14 -0700 (PDT) X-ASG-Debug-ID: 1438925770-04bdf06bd1271b90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 04917m5hOJggsxV4 for ; Thu, 06 Aug 2015 22:36:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9196F63C6061; Fri, 7 Aug 2015 00:36:09 -0500 (CDT) Message-ID: <55C443C7.3010608@sandeen.net> Date: Thu, 06 Aug 2015 22:36:07 -0700 From: Eric Sandeen MIME-Version: 1.0 To: "L.A. Walsh" , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <55C41D75.4040504@tlinx.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438925770 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21419 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 8/6/15 7:52 PM, L.A. Walsh wrote: > > Could anyone point me at the discussion or literature as to why > a free-inodeB-Tree and inline-types, should *REQUIRE* a -crc=1 option? FWIW, you can enable ftype w/o crcs. Today it's a little broken, if you specify in the wrong order it fails. I just sent a patch for that. -Eric From xfs@tlinx.org Fri Aug 7 03:14:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 444207F55 for ; Fri, 7 Aug 2015 03:14:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2FF758F8037 for ; Fri, 7 Aug 2015 01:14:50 -0700 (PDT) X-ASG-Debug-ID: 1438935284-04cb6c673e33a6e0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id 4A9znxGC3oDifi0L (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 01:14:45 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t778EfxV092107; Fri, 7 Aug 2015 01:14:43 -0700 Message-ID: <55C468F0.2040707@tlinx.org> Date: Fri, 07 Aug 2015 01:14:40 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <55C43B70.4050300@sandeen.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1438935284 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21421 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Eric Sandeen wrote: > On 8/6/15 7:52 PM, L.A. Walsh wrote: >> Could anyone point me at the discussion or literature as to why >> a free-inodeB-Tree and inline-types, should *REQUIRE* a -crc=1 option? > > In part, to limit the test matrix to something the small handful of > developers can fully support you on. --- That's actually a good reason to make disabling it an option. If a problem comes up it is one more thing that can be disabled. _theoretically_, as I understand it, it _should_ be an option that is *mostly* orthogonal to other options -- yes, if you try to *enable* it (if dynamic-enabling was even available, which it is not AFAIK), on something that wasn't crc'd, it be expected to give many errors. > >> Ultimately isn't it about the users/customers and what they will want? ---- Seems like providing an off switch for your M5 unit would be a reasonable idea if not forward thinking. Ultimately, I wouldn't mind seeing it **if**, it could limp along until a xfx_crc_repair could be done on the device. .. allowing normal function to continue with appropriate warnings about, shutting down that partition ASAP. > > Well, no, not necessarily. Users want a lot of things. It's as much about > what is possible, as it is about what is wished for. > > > I don't follow ... one bit flip on a filesystem will not cause the > filesystem to be lost. ---- Just twitching 1 bit in the guid would cause it to not compare and give messages like the below. > >> Example: >> sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 >> mkfs.xfs -mcrc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 >> meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks >> = sectsz=4096 attr=2, projid32bit=1 >> = crc=1 finobt=1 >> data = bsize=4096 blocks=402652672, imaxpct=5 >> = sunit=16 swidth=64 blks >> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >> log =internal log bsize=4096 blocks=32752, version=2 >> = sectsz=4096 sunit=1 blks, lazy-count=1 >> realtime =none extsz=4096 blocks=0, rtextents=0 > > ok... > >> xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. > > Um, what? What xfs_admin command generated this? With what xfsprogs version? > /usr/sbin/xfs_admin -V xfs_admin version 3.1.11 --- after the mkfs.xfs: cmd="mkfs.xfs $iops $lops $dops ${sector_size:+-s size=$sector_size} -L $lab -f $dev" printf -- "%s\n" "$cmd" $cmd && xfs_admin -U $(/root/bin/gen-dateguid) $dev the gen-dateguid -- just generates the guid. > > Something has gone wrong here, but you have not provided enough info for > us to know what it is. Full sequence of commands, please, and xfsprogs > version number. Is it just a bug? Full sequence = what you ...oops... the ops aren't expanded ... minor scripting dysfunction....hold on... This is the working case: time sudo ./mkfs-xfs-raid SCR /dev/Data/Home2 mkfs.xfs -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/Data/Home2 meta-data=/dev/Data/Home2 isize=512 agcount=32, agsize=12582896 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=402652672, imaxpct=5 = sunit=16 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=32752, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Clearing log and setting UUID writing all SBs new UUID = 55c466ec-0447-d5f8-2015-080701060407 26.37sec 0.10usr 15.43sys (58.89% cpu) ---non working: time sudo finobt=1 crc=1 ./mkfs-xfs-raid SCR /dev/Data/Home2 mkfs.xfs -m crc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/Data/Home2 meta-data=/dev/Data/Home2 isize=512 agcount=32, agsize=12582896 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1 data = bsize=4096 blocks=402652672, imaxpct=5 = sunit=16 swidth=64 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=32752, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. cache_node_purge: refcount was 1, not zero (node=0x891ea0) xfs_admin: cannot read root inode (117) cache_node_purge: refcount was 1, not zero (node=0x894410) xfs_admin: cannot read realtime bitmap inode (117) xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. Clearing log and setting UUID writing all SBs bad sb version # 0xbda5 in AG 0 failed to set UUID in AG 0 new UUID = 55c46721-1baa-6de0-2015-08070106572e 31.93sec 0.11usr 15.52sys (48.96% cpu) > not following. doesn't matter ... just telling you why I used guid > >> I don't see any benefit in something that fails the disk that quickly. > > I'm sorry, I'm still not following. What's failing here? ---- The disk doesn't get made -- it is corrupted: > sudo mount /home2 mount: mount /dev/mapper/Data-Home2 on /home2 failed: Structure needs cleaning > Well ... *was* your disk at fault? I can't tell how you arrived at the > scenario above. --- Explained any better? w/crc and finobt, & set guid, I get unusable disk. w/o those options, it's fine. BTW -- the CRC's are stronger on 4k-sector disks -- they can recover from more errors than the 512byte sector disks (or so disk lit says, as they save enough space in concatenating 8 sectors, that they can use stronger ECC to correct more cases. From xfs@tlinx.org Fri Aug 7 03:18:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0BEA87F58 for ; Fri, 7 Aug 2015 03:18:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9445304067 for ; Fri, 7 Aug 2015 01:17:59 -0700 (PDT) X-ASG-Debug-ID: 1438935477-04cb6c673f33a7b0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id JjK7tHLFnHMzi7oG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 01:17:58 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t778Hs3S093239; Fri, 7 Aug 2015 01:17:57 -0700 Message-ID: <55C469B2.1020005@tlinx.org> Date: Fri, 07 Aug 2015 01:17:54 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <55C43B70.4050300@sandeen.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1438935478 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21422 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Eric Sandeen wrote: > Something has gone wrong here, but you have not provided enough info for > us to know what it is. Full sequence of commands, please, and xfsprogs > version number. Is it just a bug? BTW -- kernel=4.1.0 (sorry -- left that out) From accueil@dosecrets17.eu Fri Aug 7 05:54:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.5 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_IMAGE_RATIO_02,HTML_MESSAGE,HTML_TAG_BALANCE_HEAD,T_KHOP_FOREIGN_CLICK, T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B28D77F3F for ; Fri, 7 Aug 2015 05:54:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 223D7AC006 for ; Fri, 7 Aug 2015 03:54:31 -0700 (PDT) X-ASG-Debug-ID: 1438944867-04cb6c674033df90001-NocioJ Received: from vps.smartt878.eu (vps.smartt878.eu [185.41.154.216]) by cuda.sgi.com with ESMTP id NpgTMrypXJRA0JEl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 03:54:28 -0700 (PDT) X-Barracuda-Envelope-From: accueil@dosecrets17.eu X-Barracuda-Apparent-Source-IP: 185.41.154.216 Received: from [127.0.0.1] (smtp.lead-market01.eu [91.236.239.116]) (Authenticated sender: mail@dosecrets17.eu) by vps.smartt878.eu (Postfix) with ESMTPA id DED90E2823 for ; Fri, 7 Aug 2015 10:54:26 +0000 (UTC) Date: Fri, 07 Aug 2015 12:54:17 +0000 From: Sokool To: xfs@oss.sgi.com Reply-To: Sokool User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; Microsoft Outlook 15.0.4420) MIME-Version: 1.0 Subject: Tout le plaisir de votre piscine avec un abri Sokool ! Content-Type: multipart/alternative; boundary="------------060207080508070507070407" X-ASG-Orig-Subj: Tout le plaisir de votre piscine avec un abri Sokool ! X-Barracuda-Connect: vps.smartt878.eu[185.41.154.216] X-Barracuda-Start-Time: 1438944868 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: 81d55193c689574e284e9967fc41cc04-797-txt X-Barracuda-Spam-Score: 0.69 X-Barracuda-Spam-Status: No, SCORE=0.69 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE, HTML_TAG_BALANCE_HEAD, MISSING_MID, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21424 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.00 HTML_TAG_BALANCE_HEAD BODY: HTML has unbalanced "head" tags 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20150807105431.A138A12961A2@cuda.sgi.com> This is a multi-part message in MIME format. --------------060207080508070507070407 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Pour consulter la version en ligne, cliquez ici Profitez de votre piscine ! Abris de piscine Sokool consulter catalogue Une large gamme d'abris téléscopiques sur mesure, et de qualité, pour sécuriser votre piscine avec esthétique et design ... obtenir un devis Découvrez les abris de piscine SOKOOL pour chauffer, protéger, sécuriser, et profiter d'une piscine propre toute l'année ... en savoir plus footer-back Spécialiste de l'abri téléscopique Deux usines, 30 ans d'expérience Fabrication française conforme aux normes Montage par des professionnels qualifiés logo sokool Leader des abris de piscine sur mesure SOKOOL c'est non seulement des abris de piscine, mais également des abris de terrasse et de SPA. Signaler comme spam | Vous désinscrire de cette liste de diffusion --------------060207080508070507070407 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
Pour consulter la version en ligne, cliquez ici
Profitez de votre piscine !  
Abris de piscine Sokool
consulter catalogue
Une large gamme d'abris téléscopiques sur mesure, et de qualité, pour sécuriser votre piscine avec esthétique et design ...
obtenir un devis
Découvrez les abris de piscine SOKOOL pour chauffer, protéger, sécuriser, et profiter d'une piscine propre toute l'année ...
en savoir plus
footer-back
   
Spécialiste de l'abri téléscopique
Deux usines, 30 ans d'expérience
Fabrication française conforme aux normes
Montage par des professionnels qualifiés
 
logo sokool
Leader des abris de piscine sur mesure
SOKOOL c'est non seulement des abris de piscine, mais également des abris de terrasse et de SPA.
Signaler comme spam | Vous désinscrire de cette liste de diffusion

 

--------------060207080508070507070407-- From bfoster@redhat.com Fri Aug 7 06:37:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3109F7F59 for ; Fri, 7 Aug 2015 06:37:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADE37AC007 for ; Fri, 7 Aug 2015 04:37:09 -0700 (PDT) X-ASG-Debug-ID: 1438947427-04cb6c673d33f070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bkF52bn6846RJTUT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 04:37:08 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 5FBB185539; Fri, 7 Aug 2015 11:37:07 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77Bb7DW016687; Fri, 7 Aug 2015 07:37:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3A686122E55; Fri, 7 Aug 2015 07:37:06 -0400 (EDT) Date: Fri, 7 Aug 2015 07:37:06 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] db: fix uninitialised variable warnings Message-ID: <20150807113705.GA8322@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] db: fix uninitialised variable warnings References: <1438814992-31588-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438814992-31588-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438947428 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 06, 2015 at 08:49:52AM +1000, Dave Chinner wrote: > From: Dave Chinner > > New versions of gcc barf on the conversion table code in > db/convert.c. Shut it up by initialising the conversion array. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > db/convert.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/db/convert.c b/db/convert.c > index 09f9225..a337abe 100644 > --- a/db/convert.c > +++ b/db/convert.c > @@ -157,7 +157,7 @@ convert_f(int argc, char **argv) > { > ctype_t c; > int conmask; > - cval_t cvals[NCTS]; > + cval_t cvals[NCTS] = {}; > int i; > int mask; > __uint64_t v; > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 7 06:37:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 551277F59 for ; Fri, 7 Aug 2015 06:37:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 446058F8050 for ; Fri, 7 Aug 2015 04:37:45 -0700 (PDT) X-ASG-Debug-ID: 1438947464-04cbb0416e2be3b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id N8wUB0iF7435abIP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 04:37:44 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id DCE6A8C1CE; Fri, 7 Aug 2015 11:37:43 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77BbhQ6016842; Fri, 7 Aug 2015 07:37:43 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B703E122E55; Fri, 7 Aug 2015 07:37:42 -0400 (EDT) Date: Fri, 7 Aug 2015 07:37:42 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Message-ID: <20150807113742.GB8322@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing References: <55C43FBA.1080408@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C43FBA.1080408@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438947464 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 06, 2015 at 10:18:50PM -0700, Eric Sandeen wrote: > mkfs.xfs got weird along the way; today it has different outcomes > depending on the order of option specification: > > $ mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g > cannot specify both crc and ftype > $ mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g > > > Somehow the tests got written as being constrained on what options > are specified - and in what order! - vs actually testing for > incompatible feature sets. > IIRC, I think this is one of the core problems the big mkfs option parsing rework that Jan is working on is supposed to fix. > It's fine to specify both crc & ftype options, as long as it's an > allowed combination, so just test for the incompatible combination > (crc=1 and ftype=0) after all options have been processed. > > Signed-off-by: Eric Sandeen > --- Seems fine to me... Reviewed-by: Brian Foster > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 69d61c7..9042796 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1477,11 +1477,6 @@ main( > if (c < 0 || c > 1) > illegal(value, "m crc"); > crcs_enabled = c; > - if (nftype && crcs_enabled) { > - fprintf(stderr, > -_("cannot specify both crc and ftype\n")); > - usage(); > - } > break; > case M_FINOBT: > if (!value || *value == '\0') > @@ -1555,11 +1550,6 @@ _("cannot specify both crc and ftype\n")); > if (nftype) > respec('n', nopts, N_FTYPE); > dirftype = atoi(value); > - if (crcs_enabled) { > - fprintf(stderr, > -_("cannot specify both crc and ftype\n")); > - usage(); > - } > nftype = 1; > break; > default: > @@ -1714,6 +1704,10 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), > XFS_MIN_CRC_BLOCKSIZE); > usage(); > } > + if (crcs_enabled && !dirftype) { > + fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); > + usage(); > + } > > memset(&ft, 0, sizeof(ft)); > get_topology(&xi, &ft, force_overwrite); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 7 07:09:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F1CBB7F59 for ; Fri, 7 Aug 2015 07:09:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B5AE68F8054 for ; Fri, 7 Aug 2015 05:09:37 -0700 (PDT) X-ASG-Debug-ID: 1438949376-04bdf06bd0279e30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bPRLNwpXDfxEVt8E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 05:09:36 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 3F7B1A2C28; Fri, 7 Aug 2015 12:09:36 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77C9ZRe010284; Fri, 7 Aug 2015 08:09:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 84A05122E55; Fri, 7 Aug 2015 08:09:34 -0400 (EDT) Date: Fri, 7 Aug 2015 08:09:34 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-ID: <20150807120934.GC8322@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-4-git-send-email-bfoster@redhat.com> <20150807004100.GD16638@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150807004100.GD16638@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438949376 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 07, 2015 at 10:41:00AM +1000, Dave Chinner wrote: > On Thu, Aug 06, 2015 at 01:44:24PM -0400, Brian Foster wrote: > .... > > Update the EFI/EFD item handling code to use a more straightforward and > > reliable approach to error handling. If an error occurs after the EFI > > transaction is committed and before the EFD is constructed, release the > > EFI explicitly from xfs_bmap_finish(). If the EFI transaction is > > cancelled, release the EFI in the unlock handler. > > > > Once the EFD is constructed, it is responsible for releasing the EFI > > under any circumstances (including whether the EFI item aborts due to > > log I/O error). > > Can you document these rules in a comment at the top of > fs/xfs/xfs_extfree_item.c? > Sure. > > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > > index 42c9b05..aceb54f 100644 > > --- a/fs/xfs/xfs_extfree_item.c > > +++ b/fs/xfs/xfs_extfree_item.c > > @@ -61,9 +61,15 @@ __xfs_efi_release( > > > > if (atomic_dec_and_test(&efip->efi_refcount)) { > > spin_lock(&ailp->xa_lock); > > - /* xfs_trans_ail_delete() drops the AIL lock. */ > > - xfs_trans_ail_delete(ailp, &efip->efi_item, > > - SHUTDOWN_LOG_IO_ERROR); > > + /* > > + * We don't know whether the EFI made it to the AIL. Remove it > > + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. > > + */ > > + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) > > + xfs_trans_ail_delete(ailp, &efip->efi_item, > > + SHUTDOWN_LOG_IO_ERROR); > > + else > > + spin_unlock(&ailp->xa_lock); > > xfs_efi_item_free(efip); > > } > > We now have a lot of this pattern: > > spin_lock(&ailp->xa_lock); > if (lip->li_flags & XFS_LI_IN_AIL) > xfs_trans_ail_delete(ailp, lip, shutdown_reason); > else > spin_unlock(&ailp->xa_lock); > > occurring in the code. Can you look into adding a helper function > for this, say xfs_trans_ail_remove()? (separate patch, of course!) > There was only one other instance of this with regard to the EFI that is ultimately replaced with an xfs_efi_release() call. I'll look into whether there's enough instances of this for other items to justify a helper. Brian > The rest of the patch looks fine - getting rid of almost all of > those aborted flag special cases is a big win :) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 7 07:10:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5D5D7F59 for ; Fri, 7 Aug 2015 07:10:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5C6530406A for ; Fri, 7 Aug 2015 05:09:57 -0700 (PDT) X-ASG-Debug-ID: 1438949396-04cb6c673f33fe40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t156fjbSTUBHX640 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 05:09:56 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 1DD5F9D1CB; Fri, 7 Aug 2015 12:09:56 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77C9tpF010472; Fri, 7 Aug 2015 08:09:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 83364122E55; Fri, 7 Aug 2015 08:09:54 -0400 (EDT) Date: Fri, 7 Aug 2015 08:09:54 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery Message-ID: <20150807120954.GD8322@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-6-git-send-email-bfoster@redhat.com> <20150807015133.GE16638@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150807015133.GE16638@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438949396 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 07, 2015 at 11:51:33AM +1000, Dave Chinner wrote: > On Thu, Aug 06, 2015 at 01:44:26PM -0400, Brian Foster wrote: > > @@ -2933,16 +2933,16 @@ xlog_recover_efi_pass2( > > struct xlog_recover_item *item, > > xfs_lsn_t lsn) > > { > > - int error; > > - xfs_mount_t *mp = log->l_mp; > > - xfs_efi_log_item_t *efip; > > - xfs_efi_log_format_t *efi_formatp; > > + int error; > > + struct xfs_mount *mp = log->l_mp; > > + struct xfs_efi_log_item *efip; > > + struct xfs_efi_log_format *efi_formatp; > > > > efi_formatp = item->ri_buf[0].i_addr; > > > > efip = xfs_efi_init(mp, efi_formatp->efi_nextents); > > - if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), > > - &(efip->efi_format)))) { > > + error = xfs_efi_copy_format(&(item->ri_buf[0]), &(efip->efi_format)); > > + if (error) { > > You can kill the extra (..) around the variables here. > Ok. > .... > > > @@ -2995,18 +2998,18 @@ xlog_recover_efd_pass2( > > efip = (xfs_efi_log_item_t *)lip; > > if (efip->efi_format.efi_id == efi_id) { > > /* > > - * xfs_trans_ail_delete() drops the > > - * AIL lock. > > + * Drop the EFD reference to the EFI. This > > + * removes the EFI from the AIL and frees it. > > */ > > - xfs_trans_ail_delete(ailp, lip, > > - SHUTDOWN_CORRUPT_INCORE); > > - xfs_efi_item_free(efip); > > + spin_unlock(&ailp->xa_lock); > > + xfs_efi_release(efip); > > spin_lock(&ailp->xa_lock); > > Need to call xfs_efi_release() outside the ailp->xa_lock as > xfs_efi_release() now does the removal of the log item from the AIL > and so can deadlock when taking the ailp->xa_lock. > It drops and reacquires the lock, hence the removal of the comment about xfs_trans_ail_delete() dropping it. ;) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 7 07:10:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 357497F59 for ; Fri, 7 Aug 2015 07:10:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A933CAC002 for ; Fri, 7 Aug 2015 05:10:27 -0700 (PDT) X-ASG-Debug-ID: 1438949425-04cb6c673f33fe70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 735WDGbw4NYUw2o7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 05:10:26 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id D975136B148; Fri, 7 Aug 2015 12:10:25 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77CAP4n002095; Fri, 7 Aug 2015 08:10:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9DDBE122E55; Fri, 7 Aug 2015 08:10:24 -0400 (EDT) Date: Fri, 7 Aug 2015 08:10:24 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure Message-ID: <20150807121024.GE8322@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-7-git-send-email-bfoster@redhat.com> <20150807022336.GF16638@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150807022336.GF16638@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438949426 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 07, 2015 at 12:23:36PM +1000, Dave Chinner wrote: > On Thu, Aug 06, 2015 at 01:44:27PM -0400, Brian Foster wrote: > > Log recovery occurs in two phases at mount time. In the first phase, > > EFIs and EFDs are processed and potentially cancelled out. EFIs without > > EFD objects are inserted into the AIL for processing and recovery in the > > second phase. xfs_mountfs() runs various other operations between the > > phases and is thus subject to failure. If failure occurs after the first > > phase but before the second, pending EFIs sit on the AIL, pin it and > > cause the mount to hang. > > > > Update the mount sequence to ensure that pending EFIs are cancelled in > > the event of failure. Add a recovery cancellation mechanism to iterate > > the AIL and cancel all EFI items when requested. Plumb cancellation > > support through the log mount finish helper and update xfs_mountfs() to > > invoke cancellation in the event of failure after recovery has started. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_log.c | 16 +++++++++++----- > > fs/xfs/xfs_log.h | 2 +- > > fs/xfs/xfs_log_priv.h | 2 ++ > > fs/xfs/xfs_log_recover.c | 41 ++++++++++++++++++++++++++++++++++++----- > > fs/xfs/xfs_mount.c | 35 +++++++++++++++++++++++------------ > > 5 files changed, 73 insertions(+), 23 deletions(-) > > > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > > index 6b5a84a..522286c 100644 > > --- a/fs/xfs/xfs_log.c > > +++ b/fs/xfs/xfs_log.c > > @@ -740,19 +740,25 @@ out: > > * it. > > */ > > int > > -xfs_log_mount_finish(xfs_mount_t *mp) > > +xfs_log_mount_finish( > > + struct xfs_mount *mp, > > + bool cancel) > > { > > int error = 0; > > > > - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { > > + if (mp->m_flags & XFS_MOUNT_NORECOVERY) { > > + ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > > + return 0; > > + } > > + > > + if (cancel) { > > + error = xlog_recover_cancel(mp->m_log); > > + } else { > > error = xlog_recover_finish(mp->m_log); > > if (!error) > > xfs_log_work_queue(mp); > > - } else { > > - ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > > } > > > > - > > return error; > > } > > As I mentioned on #xfs, I don't think the error/cancel path needs to > go through this function. Add a new function xfs_log_mount_cancel(), > and put the contents of xlog_recover_cancel() inside it, along with > the log unmount function... > Ok. > (General rule: prefix "xfs_log_....()" is for functions that call > into the log from outside, passing a struct xfs_mount. prefix > "xlog_...()" is for internal calls, passing a struct xlog.) > Sure, xlog_recover_cancel() was just intended to be consistent with xlog_recover_finish(). > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index a74ff68..a7ba078 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -3823,10 +3823,11 @@ abort_error: > > */ > > STATIC int > > xlog_recover_process_efis( > > - struct xlog *log) > > + struct xlog *log, > > + bool cancel) > > { > > - xfs_log_item_t *lip; > > - xfs_efi_log_item_t *efip; > > + struct xfs_log_item *lip; > > + struct xfs_efi_log_item *efip; > > int error = 0; > > struct xfs_ail_cursor cur; > > struct xfs_ail *ailp; > > @@ -3847,10 +3848,24 @@ xlog_recover_process_efis( > > break; > > } > > > > + efip = (struct xfs_efi_log_item *) lip; > > + > > + /* > > + * A cancel occurs when the mount has failed and we're bailing > > + * out. Release all pending EFIs so they don't pin the AIL. > > + */ > > + if (cancel) { > > + spin_unlock(&ailp->xa_lock); > > + xfs_efi_release(efip); > > + spin_lock(&ailp->xa_lock); > > + > > + lip = xfs_trans_ail_cursor_next(ailp, &cur); > > + continue; > > + } > > This might be better to separate into a xlog_recover_cancel_efis() > function because this is much simpler than the rest of the loop. > It may be more code, but its simpler to read and understand. > That was my first instinct, I just didn't want to duplicate the list processing and whatnot once I looked at it. I'll see how it looks. > > + > > /* > > * Skip EFIs that we've already processed. > > */ > > - efip = (xfs_efi_log_item_t *)lip; > > if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { > > lip = xfs_trans_ail_cursor_next(ailp, &cur); > > continue; > > @@ -4617,8 +4632,13 @@ xlog_recover_finish( > > */ > > if (log->l_flags & XLOG_RECOVERY_NEEDED) { > > int error; > > - error = xlog_recover_process_efis(log); > > + error = xlog_recover_process_efis(log, false); > > if (error) { > > + /* > > + * We could still have pending EFIs. Cancel them so we > > + * don't hang... > > + */ > > + xlog_recover_process_efis(log, true); > > Not actually necessary. We don't clear the XLOG_RECOVERY_NEEDED > flag, so when the error stack is run in xfs_mountfs(), we will > call xfs_log_mount_cancel(), it will see the XLOG_RECOVERY_NEEDED > and run xlog_recover_cancel_efis().... > Ok. > > xfs_alert(log->l_mp, "Failed to recover EFIs"); > > return error; > > } > > @@ -4644,6 +4664,17 @@ xlog_recover_finish( > > return 0; > > } > > > > +int > > +xlog_recover_cancel( > > + struct xlog *log) > > +{ > > + int error = 0; > > + > > + if (log->l_flags & XLOG_RECOVERY_NEEDED) > > + error = xlog_recover_process_efis(log, true); > > + > > + return error; > > +} > > void > xfs_log_mount_cancel( > struct xfs_mount *mp) > { > int error = 0; > > if (log->l_flags & XLOG_RECOVERY_NEEDED) > xlog_recover_cancel_efis(log); > > xfs_log_unmount(mp); > return error; > } > > > @@ -799,7 +800,10 @@ xfs_mountfs( > > } > > > > /* > > - * log's mount-time initialization. Perform 1st part recovery if needed > > + * Log's mount-time initialization. The first part of recovery can place > > + * some items on the AIL, to be handled when recovery is finished. Set > > + * the cancel flag to ensure that the recovery is cancelled should we > > + * fail before then. > > */ > > error = xfs_log_mount(mp, mp->m_logdev_targp, > > XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), > > @@ -808,6 +812,7 @@ xfs_mountfs( > > xfs_warn(mp, "log mount failed"); > > goto out_fail_wait; > > } > > + log_mount_cancel = true; > > At this point, XLOG_RECOVERY_NEEDED will be set if EFI processing is > required, so a variable to track this here is not needed. > Indeed, I didn't notice how XLOG_RECOVERY_NEEDED was used here. This seems much cleaner. > > @@ -910,11 +915,15 @@ xfs_mountfs( > > } > > > > /* > > - * Finish recovering the file system. This part needed to be > > - * delayed until after the root and real-time bitmap inodes > > - * were consistently read in. > > + * Finish recovering the file system. This part needed to be delayed > > + * until after the root and real-time bitmap inodes were consistently > > + * read in. > > + * > > + * Reset the cancel flag as the finish cleans up after itself on > > + * failure. > > */ > > - error = xfs_log_mount_finish(mp); > > + log_mount_cancel = false; > > + error = xfs_log_mount_finish(mp, false); > > if (error) { > > xfs_warn(mp, "log mount finish failed"); > > goto out_rtunmount; > > xfs_log_mount_finish() will clear the XLOG_RECOVERY_NEEDED. On > error, we jump into the error stack above the call to > xfs_log_mount_cancel(), so it will handle the cleanup.... > > > @@ -956,6 +965,8 @@ xfs_mountfs( > > out_rele_rip: > > IRELE(rip); > > out_log_dealloc: > > + if (log_mount_cancel) > > + xfs_log_mount_finish(mp, true); > > xfs_log_unmount(mp); > > And this just becomes a call to xfs_log_mount_cancel(). > > I hope this is a bit clearer that mud ;) > I think I follow.. thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From dv@vollmann.ch Fri Aug 7 07:16:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9180C7F59 for ; Fri, 7 Aug 2015 07:16:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7014B8F8054 for ; Fri, 7 Aug 2015 05:16:06 -0700 (PDT) X-ASG-Debug-ID: 1438949763-04cb6c6740340130001-NocioJ Received: from p-smtp-as-01.sunrise.ch (p-smtp-as-01.sunrise.ch [212.35.39.69]) by cuda.sgi.com with ESMTP id hQWyehGMDT0HWj1g (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 05:16:04 -0700 (PDT) X-Barracuda-Envelope-From: dv@vollmann.ch X-Barracuda-Apparent-Source-IP: 212.35.39.69 Received: from [192.168.26.4] (212-98-43-140.static.adslpremium.ch [212.98.43.140]) by p-smtp-as-01.sunrise.ch (8.14.4/8.12.10) with ESMTP id t77CG174018713; Fri, 7 Aug 2015 14:16:01 +0200 Message-ID: <55C4A182.5030904@vollmann.ch> Date: Fri, 07 Aug 2015 14:16:02 +0200 From: Detlef Vollmann User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfsdump doesn't compile: undefined reference to 'min' References: <55C312CF.2040408@vollmann.ch> <20150806212620.GD3902@dastard> X-ASG-Orig-Subj: Re: xfsdump doesn't compile: undefined reference to 'min' In-Reply-To: <20150806212620.GD3902@dastard> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: p-smtp-as-01.sunrise.ch[212.35.39.69] X-Barracuda-Start-Time: 1438949764 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 08/06/15 23:26, Dave Chinner wrote: > On Thu, Aug 06, 2015 at 09:54:55AM +0200, Detlef Vollmann wrote: >> The message doesn't say from which header and configure doesn't test >> for it. >> If I compile it (cross-compilation, gcc, uclibc, xfsprogs 3.1.11, >> xfsdump 3.1.4), I get lots of errors: >> warning: implicit declaration of function 'max' >> undefined reference to 'min' > > #include > -> /usr/include/xfs/xfs.h > #include > -> /usr/include/xfs/platform_defs.h > #define min(a,b) (((a)<(b))?(a):(b)) > > These headers come from xfsprogs, and you'll need to upgrade that > package to 3.2.x.... Thank. Unfortunately that doesn't seem to be an option, so sticking with xfsdump-3.1.3. Detlef From dv@vollmann.ch Fri Aug 7 07:25:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9C6657F59 for ; Fri, 7 Aug 2015 07:25:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28D31AC002 for ; Fri, 7 Aug 2015 05:25:11 -0700 (PDT) X-ASG-Debug-ID: 1438950308-04cbb0416e2bf5e0001-NocioJ Received: from p-smtp-as-01.sunrise.ch (p-smtp-as-01.sunrise.ch [212.35.39.69]) by cuda.sgi.com with ESMTP id 1naUHqCRXc2ghi44 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 05:25:09 -0700 (PDT) X-Barracuda-Envelope-From: dv@vollmann.ch X-Barracuda-Apparent-Source-IP: 212.35.39.69 Received: from [192.168.26.4] (212-98-43-140.static.adslpremium.ch [212.98.43.140]) by p-smtp-as-01.sunrise.ch (8.14.4/8.12.10) with ESMTP id t77CP8CL019516; Fri, 7 Aug 2015 14:25:08 +0200 Message-ID: <55C4A3A4.5000306@vollmann.ch> Date: Fri, 07 Aug 2015 14:25:08 +0200 From: Detlef Vollmann User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Cross-compiling xfsprogs 3.2.x Content-Type: text/plain; charset=utf-8; format=flowed X-ASG-Orig-Subj: Cross-compiling xfsprogs 3.2.x Content-Transfer-Encoding: 7bit X-Barracuda-Connect: p-smtp-as-01.sunrise.ch[212.35.39.69] X-Barracuda-Start-Time: 1438950309 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21426 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Cross-compiling xfsprogs 3.2.4 gives an error: ./gen_crc32table: cannot execute binary file: Exec format error This makes sense as a binary built for the target can't run on the build host. Working around that isn't hard, however there's no way to run crc32selftest sensibly and I have no idea whether tables built on a little-endian 64-bit host will run on a big-endian 32-bit... Also, I get nervous if I see all the warnings like: readdir.c:77:2: warning: format '%lx' expects argument of type 'long unsigned int', but argument 2 has type '__off64_t' [-Wformat=] printf(" d_off: 0x%08lx", dirent->d_off); Any ideas? Detlef From francis@poweryourdesign.com Fri Aug 7 10:02:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C33B7F58 for ; Fri, 7 Aug 2015 10:02:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 566A330404E for ; Fri, 7 Aug 2015 08:02:49 -0700 (PDT) X-ASG-Debug-ID: 1438959766-04cbb0416e2c2f80001-NocioJ Received: from mail.poweryourdesign.com (dns25.dnsserverhosting.info [209.148.91.25]) by cuda.sgi.com with ESMTP id 4oZnHr1U8FgnVBZB for ; Fri, 07 Aug 2015 08:02:47 -0700 (PDT) X-Barracuda-Envelope-From: francis@poweryourdesign.com X-Barracuda-Apparent-Source-IP: 209.148.91.25 Date: Fri, 7 Aug 2015 14:59:27 +0000 To: xfs@oss.sgi.com From: Francis Morales Subject: Proposal for your website X-Priority: 3 X-ASG-Orig-Subj: Proposal for your website MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_0eb61781498a9d6fce67e556e9d7c3e8" X-Barracuda-Connect: dns25.dnsserverhosting.info[209.148.91.25] X-Barracuda-Start-Time: 1438959766 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21429 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20150807150249.33768106C925@cuda.sgi.com> --b1_0eb61781498a9d6fce67e556e9d7c3e8 Content-Type: text/plain; charset = "UTF-8" Content-Transfer-Encoding: 8bit Hello! My name is Francis from poweryourdesign.com, I'm contacting you today to ask if you would be interested in advertising third party content on your website oss.sgi.com . We have a team of professional writers and journalists who create content for a range of different niches. I'm currently looking for websites to place third party content on behalf of my client and it is related to mobile apps business. If this is something that you would be interested in, or simply would like some more information please let me know! Best  regards, Francis Morales www.poweryourdesign.com --b1_0eb61781498a9d6fce67e556e9d7c3e8 Content-Type: text/html; charset = "UTF-8" Content-Transfer-Encoding: 8bit Hello!

My name is Francis from poweryourdesign.com, I'm contacting you today to ask if you would be interested in advertising third party content on your website oss.sgi.com .

We have a team of professional writers and journalists who create content for a range of different niches.

I'm currently looking for websites to place third party content on behalf of my client and it is related to mobile apps business.

If this is something that you would be interested in, or simply would like some more information please let me know!


Best  regards,
Francis Morales
www.poweryourdesign.com --b1_0eb61781498a9d6fce67e556e9d7c3e8-- From choice_home_warranty-xfs=oss.sgi.com@addurnitures.com Fri Aug 7 10:14:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FROM_12LTRDOM, HTML_IMAGE_RATIO_04,HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 998167F58 for ; Fri, 7 Aug 2015 10:14:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 82D9D8F8033 for ; Fri, 7 Aug 2015 08:14:38 -0700 (PDT) X-ASG-Debug-ID: 1438960467-04cbb0416d2c3400003-NocioJ Received: from mail.addurnitures.com ([80.79.17.4]) by cuda.sgi.com with ESMTP id gm9QdQoPMIauDGor for ; Fri, 07 Aug 2015 08:14:35 -0700 (PDT) X-Barracuda-Envelope-From: choice_home_warranty-xfs=oss.sgi.com@addurnitures.com X-Barracuda-Apparent-Source-IP: 80.79.17.4 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=addurnitures.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=choice_home_warranty@addurnitures.com; bh=B4sdAqcFwkFguwOI42ehyr44hcw=; b=f0w0SaWumONBrrNFeTlsnygjptOhIpBxYKyadib4uZt9N9mg9LT92BZdAc3ctYQrrjvC8X91YYQW aTLXjWARAkV0bECf8C4/BO4RLAoDoCvlGEFhmh3COPxEx7Bk4ofDeJ0GtTOkvi4RxkrFgHdhe8pB eDlQslM9DSRfjXVfAkA= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=addurnitures.com; b=VhnHYK6qe3Q/6lAcjc8rrIdZmFd+I61l7S6oK5HmWHCDJ6qUrBToVnGBttOD4oSlfpkCnxhoSs2S ggx4aM4RRyA+mQs0G/te6hcuFlHby1U3+b7pPL95c+MYv4z+ypCocNd8KrZ2iNLV9oBPtEPMkdRL Z3F/FSWrSKf9R4eyHGU=; Received: by mail.addurnitures.com id hoj5lo0001g3 for ; Fri, 7 Aug 2015 07:26:46 -0700 (envelope-from ) Date: Fri, 7 Aug 2015 07:26:46 -0700 From: "Choice Home Warranty" To: Subject: Exclusive Offer: First Month FREE on Every Home Warranty MIME-Version: 1.0 X-ASG-Orig-Subj: Exclusive Offer: First Month FREE on Every Home Warranty Content-Type: multipart/alternative; boundary="----=_Part_13357_774609820.1438956725309" Message-ID: <0.0.0.2A9.1D0D11D173A4454.30222@mail.addurnitures.com> X-Barracuda-Connect: UNKNOWN[80.79.17.4] X-Barracuda-Start-Time: 1438960474 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, FR_3TAG_3TAG, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21429 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 FR_3TAG_3TAG RAW: Looks like 3 small tags. 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_Part_13357_774609820.1438956725309 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Exclusive Offer: First Month FREE on Every Home Warranty http://www.addurnitures.com/e3f86BLl1801ZsnFjnn0ntv0Mjha13/by Update Preferences- http://www.addurnitures.com/pattern/daaP8O6180s6ZsnFjnn0ntv0Mjh815 ------=_Part_13357_774609820.1438956725309 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Choice Home Warranty | Don' t Pay For A Broken A/C This Summer!

Exclusive Offer: First Month FREE on Every Home Warranty

Protect Your Home with a Choice Home Warranty Today.  Get a FREE Instant Price Quote.
*With purchase of single payment plan. A home warranty is a renewable service contract that covers the repair or replacement of many of the most frequently occurring breakdowns of system components and appliances. 
 
Your home is most likely one of your biggest investments. Unexpected repair or replacement costs of covered items can easily strain your budget. Plus, finding a qualified professional to solve your problems can be stressful and inconvenient.

Choice Home Warranty plans offer comprehensive protection against the high cost of repair or replacement of properly maintained major systems and appliances. A policy holder calls our claims center and pays a modest service call fee per claim when a problem or repair need arises.  At Choice Home Warranty, we strive to always offer our customers fast and simple solutions, along with excellent service technicians. Customers are looking for value for their money, and we believe we provide outstanding customer satisfaction and protection against the high costs of home and appliance repairs on covered items.*

When you decide to purchase a Choice Home Warranty, you will work with a knowledgeable, dedicated team that will service your covered home repair needs swiftly and efficiently.** With many home warranty companies, your claim is assigned to a clerk in a large department, rather than having a personable, dedicated team processing your service request. With a CHW Warranty, you will have a dedicated team of two or three representatives, who will always be thoroughly involved in your claim and available to help you with any questions that your may have.

510 Thornall Street, Edison NJ 08837

Update Preferences










 


------=_Part_13357_774609820.1438956725309-- From akanchhaseoweb@outlook.com Fri Aug 7 10:38:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ABE2B7F58 for ; Fri, 7 Aug 2015 10:38:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 920BF30405F for ; Fri, 7 Aug 2015 08:38:41 -0700 (PDT) X-ASG-Debug-ID: 1438961919-04cbb0416f2c3a50001-NocioJ Received: from COL004-OMC2S17.hotmail.com (col004-omc2s17.hotmail.com [65.55.34.91]) by cuda.sgi.com with ESMTP id dwsBBhuSglDUy8dW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 08:38:39 -0700 (PDT) X-Barracuda-Envelope-From: akanchhaseoweb@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.34.91 X-Barracuda-IPDD: Level1 [outlook.com/65.55.34.91] Received: from COL125-W26 ([65.55.34.72]) by COL004-OMC2S17.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.23008); Fri, 7 Aug 2015 08:38:38 -0700 X-Barracuda-IPDD: Level1 [outlook.com/65.55.34.91] X-Barracuda-IPDD: Level1 [outlook.com/65.55.34.91] X-TMN: [TovRjDrwXtYfn8qvXhPLVXXHfj3GHacB] X-Originating-Email: [akanchhaseoweb@outlook.com] Message-ID: Content-Type: multipart/alternative; boundary="_0c01c33d-1efc-4e11-8108-fdbd888ee877_" From: Akanchha Singh Subject: Proposal Date: Fri, 7 Aug 2015 21:08:38 +0530 X-ASG-Orig-Subj: Proposal Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 07 Aug 2015 15:38:38.0482 (UTC) FILETIME=[21355F20:01D0D127] X-Barracuda-Connect: col004-omc2s17.hotmail.com[65.55.34.91] X-Barracuda-Start-Time: 1438961919 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21429 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 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:; --_0c01c33d-1efc-4e11-8108-fdbd888ee877_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Hi=2C Get your site on Google=92s Front Page search: If yes=2C please let us know your website which you want to optimize. We wi= ll analyze your website with=20 full SEO Proposal with plan activity which we will implement on your websit= e. Our Highlights: 1. SEO (Search Engine Optimization) 2. Pay per click (PPC) 3. Press Release 4. Article Submission/Article Writing 5. Blog Submissions/Writing 6. Directory Submission 7. Social Media Optimization. We always adopt the ETHICAL SEO process/White hat techniques=3B we also fol= low the=20 guidelines of Google and major search engine for Organic SEO results which = stay there. ADVANTAGES FOR YOUR BUSINESS GET STARTED TODAY! Email us back to get a full quote which will improve your sales & website r= anking too. Hope to get early response. Regards=2CAkanchha SinghBusiness Manager. = --_0c01c33d-1efc-4e11-8108-fdbd888ee877_ Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable
Hi=2C

<= div>Get your site on Google=92s Front Page search:

If yes=2C please let us know your website which you want to optimize. We w= ill analyze your website with =3B

full SEO Pro= posal with plan activity which we will implement on your website.

Our Highlights:

1. SEO (Search Eng= ine Optimization)

2. Pay per click (PPC)

3. Press Release

4. Article Submis= sion/Article Writing

5. Blog Submissions/Writing

6. Directory Submission

7.= Social Media Optimization.

We always adopt the ET= HICAL SEO process/White hat techniques=3B we also follow the =3B
<= div>
guidelines of Google and major search engine for Organic= SEO results which stay there.

ADVANTAGES FOR YOUR= BUSINESS

GET STARTED TODAY!

<= div>Email us back to get a full quote which will improve your sales &=3B= website ranking too.

Hope to get early response.<= /div>

Regards=2C
Akanchha Singh
Busi= ness Manager.
= --_0c01c33d-1efc-4e11-8108-fdbd888ee877_-- From sandeen@sandeen.net Fri Aug 7 11:42:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0EEFD7F58 for ; Fri, 7 Aug 2015 11:42:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D927C8F8033 for ; Fri, 7 Aug 2015 09:42:52 -0700 (PDT) X-ASG-Debug-ID: 1438965770-04cb6c673d345a80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id SZJKGLiNZRMBlhkn for ; Fri, 07 Aug 2015 09:42:51 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 14A4C63C6061; Fri, 7 Aug 2015 11:42:49 -0500 (CDT) Message-ID: <55C4E007.90709@sandeen.net> Date: Fri, 07 Aug 2015 09:42:47 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster CC: xfs-oss , Jan Tulak Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing References: <55C43FBA.1080408@sandeen.net> <20150807113742.GB8322@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing In-Reply-To: <20150807113742.GB8322@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438965770 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21431 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/7/15 4:37 AM, Brian Foster wrote: > On Thu, Aug 06, 2015 at 10:18:50PM -0700, Eric Sandeen wrote: >> mkfs.xfs got weird along the way; today it has different outcomes >> depending on the order of option specification: >> >> $ mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g >> cannot specify both crc and ftype >> $ mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g >> >> >> Somehow the tests got written as being constrained on what options >> are specified - and in what order! - vs actually testing for >> incompatible feature sets. >> > > IIRC, I think this is one of the core problems the big mkfs option > parsing rework that Jan is working on is supposed to fix. Yeah, I think so - Jan, if this gets in your way, let us know - I didn't mean to make your life difficult by fixing little things while you work. :) -Eric From sandeen@sandeen.net Fri Aug 7 12:02:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A38BA7F59 for ; Fri, 7 Aug 2015 12:02:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67E0D304059 for ; Fri, 7 Aug 2015 10:02:00 -0700 (PDT) X-ASG-Debug-ID: 1438966918-04bdf06bd1280b10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id sAUePHaXEsVpjwoy for ; Fri, 07 Aug 2015 10:01:58 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (unknown [64.146.202.138]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B08EF63C5F00; Fri, 7 Aug 2015 12:01:57 -0500 (CDT) Message-ID: <55C4E483.2060801@sandeen.net> Date: Fri, 07 Aug 2015 10:01:55 -0700 From: Eric Sandeen MIME-Version: 1.0 To: "L.A. Walsh" CC: xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <55C468F0.2040707@tlinx.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438966918 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21433 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 8/7/15 1:14 AM, L.A. Walsh wrote: > > > Eric Sandeen wrote: >> On 8/6/15 7:52 PM, L.A. Walsh wrote: >>> Could anyone point me at the discussion or literature as to why >>> a free-inodeB-Tree and inline-types, should *REQUIRE* a -crc=1 option? >> >> In part, to limit the test matrix to something the small handful of >> developers can fully support you on. > --- > That's actually a good reason to make disabling it an option. Not from a test matrix POV. If V5 superblocks have features A, B, and C, that's one thing to test. If you allow all 3 to be independent, now you have 8 scenarios to test. Well - more like *we* have 8 scenarios to test. ... >> >> I don't follow ... one bit flip on a filesystem will not cause the >> filesystem to be lost. > ---- > Just twitching 1 bit in the guid would cause it to not compare and give messages like > the below. Ok, but the filesystem is not "lost." It just needs to be repaired after corruption. > >> >>> Example: >>> sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 >>> mkfs.xfs -mcrc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 >>> meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks >>> = sectsz=4096 attr=2, projid32bit=1 >>> = crc=1 finobt=1 >>> data = bsize=4096 blocks=402652672, imaxpct=5 >>> = sunit=16 swidth=64 blks >>> naming =version 2 bsize=4096 ascii-ci=0 ftype=1 >>> log =internal log bsize=4096 blocks=32752, version=2 >>> = sectsz=4096 sunit=1 blks, lazy-count=1 >>> realtime =none extsz=4096 blocks=0, rtextents=0 >> >> ok... >> >>> xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. >> >> Um, what? What xfs_admin command generated this? With what xfsprogs version? >> /usr/sbin/xfs_admin -V > xfs_admin version 3.1.11 Over 2 years old, from May 2013... :( You've hit an old bug, not a design feature; it was patched up with: 609f6bb xfs_db: disallow sb UUID write on v5 filesystems and changing the UUID has only recently become possible, and will be available in the next release. So, yes, that xfs_db bug let you create a mismatch which shouldn't have been allowed, and caused corruption. But the more relevant question is, could xfs_repair fix it? You're right, this "one bit flip" caused it to be unmountable. But all XFS knows is that the superblock has been corrupted, and the CRC is now wrong, so it stops and lets you take a look, and fix things as appropriate. > --- > after the mkfs.xfs: > cmd="mkfs.xfs $iops $lops $dops ${sector_size:+-s size=$sector_size} -L $lab -f $dev" > printf -- "%s\n" "$cmd" > $cmd && xfs_admin -U $(/root/bin/gen-dateguid) $dev > > the gen-dateguid -- just generates the guid. > >> >> Something has gone wrong here, but you have not provided enough info for >> us to know what it is. Full sequence of commands, please, and xfsprogs >> version number. Is it just a bug? > > > Full sequence = what you ...oops... the ops aren't expanded ... minor scripting dysfunction....hold on... > > This is the working case: > time sudo ./mkfs-xfs-raid SCR /dev/Data/Home2 > mkfs.xfs -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/Data/Home2 (right, non-crc filesystems can always handle UUID changes) > ---non working: > time sudo finobt=1 crc=1 ./mkfs-xfs-raid SCR /dev/Data/Home2 mkfs.xfs -m crc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/Data/Home2 (right, until very recently, crc filesystems could not change UUIDs, but a bug allowed xfs_db to do it anyway, and corrupt the CRC) >>> I don't see any benefit in something that fails the disk that quickly. >> >> I'm sorry, I'm still not following. What's failing here? > ---- > The disk doesn't get made -- it is corrupted: >> sudo mount /home2 > mount: mount /dev/mapper/Data-Home2 on /home2 failed: Structure needs cleaning dmesg should tell you in detail what's wrong. and xfs_repair should be able to fix it. But yes, this is a bug (fixed last April) that incorrectly allowed xfs_admin/xfs_db to modify the UUID on a CRC filesystem, causing corruption. -Eric From bfoster@redhat.com Fri Aug 7 16:15:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A80BB7F56 for ; Fri, 7 Aug 2015 16:15:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80D6F304043 for ; Fri, 7 Aug 2015 14:15:32 -0700 (PDT) X-ASG-Debug-ID: 1438982131-04bdf06bcf285a00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AAfkYfafxLoAxH6a (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 35F323CA175 for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFUoW032039 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0E340122F43; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 04/12] xfs: ensure EFD trans aborts on log recovery extent free failure Date: Fri, 7 Aug 2015 17:15:20 -0400 X-ASG-Orig-Subj: [PATCH v2 04/12] xfs: ensure EFD trans aborts on log recovery extent free failure Message-Id: <1438982128-38618-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982131 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery attempts to free extents with leftover EFIs in the AIL after initial processing. If the extent free fails (e.g., due to unrelated fs corruption), the transaction is cancelled, though it might not be dirtied at the time. If this is the case, the EFD does not abort and thus does not release the EFI. This can lead to hangs as the EFI pins the AIL. Update xlog_recover_process_efi() to log the EFD in the transaction before xfs_free_extent() errors are handled to ensure the transaction is dirty, aborts the EFD and releases the EFI on error. This is consistent with how EFDs are handled at runtime in xfs_bmap_finish(). Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 9d8f242..3433b7b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3779,11 +3779,16 @@ xlog_recover_process_efi( for (i = 0; i < efip->efi_format.efi_nextents; i++) { extp = &(efip->efi_format.efi_extents[i]); + /* + * Log the EFD before error handling to ensure the EFD aborts + * (and releases the EFI) on error. + */ error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); - if (error) - goto abort_error; xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, extp->ext_len); + if (error) + goto abort_error; + } set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 489627F56 for ; Fri, 7 Aug 2015 16:15:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33C8D8F8052 for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04cb6c673f34afc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zPuZBvHECKEW24SS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 1902D3BF552 for ; Fri, 7 Aug 2015 21:15:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVeW020055 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6BFEF12310B; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 11/12] xfs: fix btree cursor error cleanups Date: Fri, 7 Aug 2015 17:15:27 -0400 X-ASG-Orig-Subj: [PATCH v2 11/12] xfs: fix btree cursor error cleanups Message-Id: <1438982128-38618-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The btree cursor cleanup function takes an error parameter that affects how buffers are released from the cursor. All buffers are released in the event of error. Several callers do not specify the XFS_BTREE_ERROR flag in the event of error, however. This can cause buffers to hang around locked or with an elevated hold count and thus lead to umount hangs in the event of errors. Fix up the xfs_btree_del_cursor() callers to pass XFS_BTREE_ERROR if the cursor is being torn down due to error. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_itable.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index ce63e04..54deb2d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2233,7 +2233,7 @@ xfs_imap_lookup( } xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); if (error) return error; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f41b0c3..930ebd8 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -473,7 +473,8 @@ xfs_bulkstat( * pending error, then we are done. */ del_cursor: - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, error ? + XFS_BTREE_ERROR : XFS_BTREE_NOERROR); xfs_buf_relse(agbp); if (error) break; -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E1367F58 for ; Fri, 7 Aug 2015 16:15:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6912A304043 for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04cb6c673d34afb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PHVQwWDuhCR5aVJQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id F09529D1DB for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVGb032048 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 273A1122F63; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 06/12] xfs: don't leave EFIs on AIL on mount failure Date: Fri, 7 Aug 2015 17:15:22 -0400 X-ASG-Orig-Subj: [PATCH v2 06/12] xfs: don't leave EFIs on AIL on mount failure Message-Id: <1438982128-38618-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery occurs in two phases at mount time. In the first phase, EFIs and EFDs are processed and potentially cancelled out. EFIs without EFD objects are inserted into the AIL for processing and recovery in the second phase. xfs_mountfs() runs various other operations between the phases and is thus subject to failure. If failure occurs after the first phase but before the second, pending EFIs sit on the AIL, pin it and cause the mount to hang. Update the mount sequence to ensure that pending EFIs are cancelled in the event of failure. Add a recovery cancellation mechanism to iterate the AIL and cancel all EFI items when requested. Plumb cancellation support through the log mount finish helper and update xfs_mountfs() to invoke cancellation in the event of failure after recovery has started. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 30 ++++++++++++++++++----- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_priv.h | 2 ++ fs/xfs/xfs_log_recover.c | 63 +++++++++++++++++++++++++++++++++++++++++++++--- fs/xfs/xfs_mount.c | 26 +++++++++++--------- 5 files changed, 100 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6b5a84a..3a5592c 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -700,6 +700,7 @@ xfs_log_mount( if (error) { xfs_warn(mp, "log mount/recovery failed: error %d", error); + xlog_recover_cancel(mp->m_log); goto out_destroy_ail; } } @@ -740,18 +741,35 @@ out: * it. */ int -xfs_log_mount_finish(xfs_mount_t *mp) +xfs_log_mount_finish( + struct xfs_mount *mp) { int error = 0; - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { - error = xlog_recover_finish(mp->m_log); - if (!error) - xfs_log_work_queue(mp); - } else { + if (mp->m_flags & XFS_MOUNT_NORECOVERY) { ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); + return 0; } + error = xlog_recover_finish(mp->m_log); + if (!error) + xfs_log_work_queue(mp); + + return error; +} + +/* + * The mount has failed. Cancel the recovery if it hasn't completed and destroy + * the log. + */ +int +xfs_log_mount_cancel( + struct xfs_mount *mp) +{ + int error; + + error = xlog_recover_cancel(mp->m_log); + xfs_log_unmount(mp); return error; } diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index fa27aae..09d91d3 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -147,6 +147,7 @@ int xfs_log_mount(struct xfs_mount *mp, xfs_daddr_t start_block, int num_bblocks); int xfs_log_mount_finish(struct xfs_mount *mp); +int xfs_log_mount_cancel(struct xfs_mount *); xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); void xfs_log_space_wake(struct xfs_mount *mp); diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 1c87c8a..950f3f9 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -426,6 +426,8 @@ xlog_recover( extern int xlog_recover_finish( struct xlog *log); +extern int +xlog_recover_cancel(struct xlog *); extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, char *dp, int size); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 113042e..c1c4de2 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3823,10 +3823,10 @@ abort_error: */ STATIC int xlog_recover_process_efis( - struct xlog *log) + struct xlog *log) { - xfs_log_item_t *lip; - xfs_efi_log_item_t *efip; + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; int error = 0; struct xfs_ail_cursor cur; struct xfs_ail *ailp; @@ -3850,7 +3850,7 @@ xlog_recover_process_efis( /* * Skip EFIs that we've already processed. */ - efip = (xfs_efi_log_item_t *)lip; + efip = (struct xfs_efi_log_item *) lip; if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { lip = xfs_trans_ail_cursor_next(ailp, &cur); continue; @@ -3870,6 +3870,50 @@ out: } /* + * A cancel occurs when the mount has failed and we're bailing out. Release all + * pending EFIs so they don't pin the AIL. + */ +STATIC int +xlog_recover_cancel_efis( + struct xlog *log) +{ + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; + int error = 0; + struct xfs_ail_cursor cur; + struct xfs_ail *ailp; + + ailp = log->l_ailp; + spin_lock(&ailp->xa_lock); + lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); + while (lip != NULL) { + /* + * We're done when we see something other than an EFI. + * There should be no EFIs left in the AIL now. + */ + if (lip->li_type != XFS_LI_EFI) { +#ifdef DEBUG + for (; lip; lip = xfs_trans_ail_cursor_next(ailp, &cur)) + ASSERT(lip->li_type != XFS_LI_EFI); +#endif + break; + } + + efip = (struct xfs_efi_log_item *) lip; + + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip); + spin_lock(&ailp->xa_lock); + + lip = xfs_trans_ail_cursor_next(ailp, &cur); + } + + xfs_trans_ail_cursor_done(&cur); + spin_unlock(&ailp->xa_lock); + return error; +} + +/* * This routine performs a transaction to null out a bad inode pointer * in an agi unlinked inode hash bucket. */ @@ -4644,6 +4688,17 @@ xlog_recover_finish( return 0; } +int +xlog_recover_cancel( + struct xlog *log) +{ + int error = 0; + + if (log->l_flags & XLOG_RECOVERY_NEEDED) + error = xlog_recover_cancel_efis(log); + + return error; +} #if defined(DEBUG) /* diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 461e791..4825a8a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -615,14 +615,14 @@ xfs_default_resblks(xfs_mount_t *mp) */ int xfs_mountfs( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_sb_t *sbp = &(mp->m_sb); - xfs_inode_t *rip; - __uint64_t resblks; - uint quotamount = 0; - uint quotaflags = 0; - int error = 0; + struct xfs_sb *sbp = &(mp->m_sb); + struct xfs_inode *rip; + __uint64_t resblks; + uint quotamount = 0; + uint quotaflags = 0; + int error = 0; xfs_sb_mount_common(mp, sbp); @@ -799,7 +799,9 @@ xfs_mountfs( } /* - * log's mount-time initialization. Perform 1st part recovery if needed + * Log's mount-time initialization. The first part of recovery can place + * some items on the AIL, to be handled when recovery is finished or + * cancelled. */ error = xfs_log_mount(mp, mp->m_logdev_targp, XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), @@ -910,9 +912,9 @@ xfs_mountfs( } /* - * Finish recovering the file system. This part needed to be - * delayed until after the root and real-time bitmap inodes - * were consistently read in. + * Finish recovering the file system. This part needed to be delayed + * until after the root and real-time bitmap inodes were consistently + * read in. */ error = xfs_log_mount_finish(mp); if (error) { @@ -956,7 +958,7 @@ xfs_mountfs( out_rele_rip: IRELE(rip); out_log_dealloc: - xfs_log_unmount(mp); + xfs_log_mount_cancel(mp); out_fail_wait: if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) xfs_wait_buftarg(mp->m_logdev_targp); -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9CB997F59 for ; Fri, 7 Aug 2015 16:15:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 874D98F804C for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04cbb0416d2c9a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NeKfmdLnaAK4qcEz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 099F23A1170 for ; Fri, 7 Aug 2015 21:15:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVX1023257 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 402B0122FE2; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 08/12] xfs: fix broken icreate log item cancellation Date: Fri, 7 Aug 2015 17:15:24 -0400 X-ASG-Orig-Subj: [PATCH v2 08/12] xfs: fix broken icreate log item cancellation Message-Id: <1438982128-38618-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode cluster buffers are invalidated and cancelled when inode chunks are freed to notify log recovery that previous logged updates to the metadata buffer should be skipped. This ensures that log recovery does not overwrite buffers that might have already been reused. On v4 filesystems, inode chunk allocation and inode updates are logged via the cluster buffers and thus cancellation is easily detected via buffer cancellation items. v5 filesystems use the new icreate transaction, which uses logical logging and ordered buffers to log a full inode chunk allocation at once. The resulting icreate item often spans multiple inode cluster buffers. Log recovery checks for cancelled buffers when processing icreate log items, but it has a couple problems. First, it uses the full length of the inode chunk rather than the cluster size. Second, it uses the length in FSB units rather than BB units. Either of these problems prevent icreate recovery from identifying cancelled buffers and thus inode initialization proceeds unconditionally. Update xlog_recover_do_icreate_pass2() to iterate the icreate range in cluster sized increments and check each increment for cancellation. Since icreate is currently only used for the minimum atomic inode chunk allocation, we expect that either all or none of the buffers will be cancelled. Cancel the icreate if at least one buffer is cancelled to avoid making a bad situation worse by initializing a partial inode chunk, but detect such anomalies and warn the user. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 49 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 2ff62d3..c3de37d 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3037,6 +3037,11 @@ xlog_recover_do_icreate_pass2( unsigned int count; unsigned int isize; xfs_agblock_t length; + int blks_per_cluster; + int bb_per_cluster; + int cancel_count; + int nbufs; + int i; icl = (struct xfs_icreate_log *)item->ri_buf[0].i_addr; if (icl->icl_type != XFS_LI_ICREATE) { @@ -3095,25 +3100,45 @@ xlog_recover_do_icreate_pass2( } /* - * Inode buffers can be freed. Do not replay the inode initialisation as - * we could be overwriting something written after this inode buffer was - * cancelled. + * The icreate transaction can cover multiple cluster buffers and these + * buffers could have been freed and reused. Check the individual + * buffers for cancellation so we don't overwrite anything written after + * a cancellation. + */ + blks_per_cluster = xfs_icluster_size_fsb(mp); + bb_per_cluster = XFS_FSB_TO_BB(mp, blks_per_cluster); + nbufs = length / blks_per_cluster; + for (i = 0, cancel_count = 0; i < nbufs; i++) { + xfs_daddr_t daddr; + + daddr = XFS_AGB_TO_DADDR(mp, agno, + agbno + i * blks_per_cluster); + if (xlog_check_buffer_cancelled(log, daddr, bb_per_cluster, 0)) + cancel_count++; + } + + /* + * We currently only use icreate for a single allocation at a time. This + * means we should expect either all or none of the buffers to be + * cancelled. Be conservative and skip replay if at least one buffer is + * cancelled, but warn the user that something is awry if the buffers + * are not consistent. * - * XXX: we need to iterate all buffers and only init those that are not - * cancelled. I think that a more fine grained factoring of - * xfs_ialloc_inode_init may be appropriate here to enable this to be - * done easily. + * XXX: This must be refined to only skip cancelled clusters once we use + * icreate for multiple chunk allocations. */ - if (xlog_check_buffer_cancelled(log, - XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) { + ASSERT(!cancel_count || cancel_count == nbufs); + if (cancel_count) { + if (cancel_count != nbufs) + xfs_warn(mp, + "WARNING: partial inode chunk cancellation, skipped icreate."); trace_xfs_log_recover_icreate_cancel(log, icl); return 0; } trace_xfs_log_recover_icreate_recover(log, icl); - xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); - return 0; + return xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, + length, be32_to_cpu(icl->icl_gen)); } STATIC void -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A031B7F5A for ; Fri, 7 Aug 2015 16:15:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BF808F804B for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04cb6c674034afc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WYdVKkeQJZWyjyOE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 12EDFA7579 for ; Fri, 7 Aug 2015 21:15:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVLO020051 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5DC6E1230E2; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 10/12] xfs: clean up root inode properly on mount failure Date: Fri, 7 Aug 2015 17:15:26 -0400 X-ASG-Orig-Subj: [PATCH v2 10/12] xfs: clean up root inode properly on mount failure Message-Id: <1438982128-38618-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The root inode is read as part of the xfs_mountfs() sequence and the reference is dropped in the event of failure after we grab the inode. The reference drop doesn't necessarily free the inode, however. It marks it for reclaim and potentially kicks off the reclaim workqueue. The workqueue is destroyed further up the error path, which means we are subject to crash if the workqueue job runs after this point or a memory leak which is identified if the xfs_inode_zone is destroyed (e.g., on module removal). Both of these outcomes are reproducible via manual instrumentation of a mount error after the root inode xfs_iget() call in xfs_mountfs(). Update the xfs_mountfs() error path to cancel any potential reclaim work items and to run a synchronous inode reclaim if the root inode is marked for reclaim. This ensures that no jobs remain on the queue before it is destroyed and that the root inode is freed before the reclaim mechanism is torn down. Signed-off-by: Brian Foster --- fs/xfs/xfs_mount.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4825a8a..bf92e0c 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -957,6 +957,8 @@ xfs_mountfs( xfs_rtunmount_inodes(mp); out_rele_rip: IRELE(rip); + cancel_delayed_work_sync(&mp->m_reclaim_work); + xfs_reclaim_inodes(mp, SYNC_WAIT); out_log_dealloc: xfs_log_mount_cancel(mp); out_fail_wait: -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 652DD7F59 for ; Fri, 7 Aug 2015 16:15:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D648FAC008 for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04cbb0416e2c9a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dfveeJF65zKK0YR3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 002DB9D1DD for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVVW020044 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1AA8B122F4C; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 05/12] xfs: use EFI refcount consistently in log recovery Date: Fri, 7 Aug 2015 17:15:21 -0400 X-ASG-Orig-Subj: [PATCH v2 05/12] xfs: use EFI refcount consistently in log recovery Message-Id: <1438982128-38618-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The EFI is initialized with a reference count of 2. One for the EFI to ensure the item makes it to the AIL and one for the subsequently created EFD to release the EFI once the EFD is committed. Log recovery uses the EFI in a similar manner, but implements a hack to remove both references in one call once the EFD is handled. Update log recovery to use EFI reference counting in a manner consistent with the log. When an EFI is encountered during recovery, an EFI item is allocated and inserted to the AIL directly. Since the EFI reference is typically dropped when the EFI is unpinned and this is analogous with AIL insertion, drop the EFI reference at this point. When a corresponding EFD is encountered in the log, this indicates that the extents were freed, no processing is required and the EFI can be dropped. Update xlog_recover_efd_pass2() to simply drop the EFD reference at this point rather than open code the AIL removal and EFI free. Remaining EFIs (i.e., with no corresponding EFD) are processed in xlog_recover_finish(). An EFD transaction is allocated and the extents are freed, which transfers ownership of the EFI reference to the EFD item in the log. Signed-off-by: Brian Foster --- fs/xfs/xfs_extfree_item.c | 57 +++++++++++++++++------------------------------ fs/xfs/xfs_log_recover.c | 43 ++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index aceb54f..2b2acac 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -47,34 +47,6 @@ xfs_efi_item_free( } /* - * Freeing the efi requires that we remove it from the AIL if it has already - * been placed there. However, the EFI may not yet have been placed in the AIL - * when called by xfs_efi_release() from EFD processing due to the ordering of - * committed vs unpin operations in bulk insert operations. Hence the reference - * count to ensure only the last caller frees the EFI. - */ -STATIC void -__xfs_efi_release( - struct xfs_efi_log_item *efip) -{ - struct xfs_ail *ailp = efip->efi_item.li_ailp; - - if (atomic_dec_and_test(&efip->efi_refcount)) { - spin_lock(&ailp->xa_lock); - /* - * We don't know whether the EFI made it to the AIL. Remove it - * if so. Note that xfs_trans_ail_delete() drops the AIL lock. - */ - if (efip->efi_item.li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); - else - spin_unlock(&ailp->xa_lock); - xfs_efi_item_free(efip); - } -} - -/* * This returns the number of iovecs needed to log the given efi item. * We only need 1 iovec for an efi item. It just logs the efi_log_format * structure. @@ -304,20 +276,31 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) } /* - * This is called by the efd item code below to release references to the given - * efi item. Each efd calls this with the number of extents that it has - * logged, and when the sum of these reaches the total number of extents logged - * by this efi item we can free the efi item. + * Freeing the efi requires that we remove it from the AIL if it has already + * been placed there. However, the EFI may not yet have been placed in the AIL + * when called by xfs_efi_release() from EFD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the reference + * count to ensure only the last caller frees the EFI. */ void xfs_efi_release(struct xfs_efi_log_item *efip) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); + struct xfs_ail *ailp = efip->efi_item.li_ailp; - __xfs_efi_release(efip); - /* efip may now have been freed, do not reference it again. */ + if (atomic_dec_and_test(&efip->efi_refcount)) { + spin_lock(&ailp->xa_lock); + /* + * We don't know whether the EFI made it to the AIL. Remove it + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. + */ + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); + else + spin_unlock(&ailp->xa_lock); + + xfs_efi_item_free(efip); + } } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3433b7b..113042e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2933,16 +2933,16 @@ xlog_recover_efi_pass2( struct xlog_recover_item *item, xfs_lsn_t lsn) { - int error; - xfs_mount_t *mp = log->l_mp; - xfs_efi_log_item_t *efip; - xfs_efi_log_format_t *efi_formatp; + int error; + struct xfs_mount *mp = log->l_mp; + struct xfs_efi_log_item *efip; + struct xfs_efi_log_format *efi_formatp; efi_formatp = item->ri_buf[0].i_addr; efip = xfs_efi_init(mp, efi_formatp->efi_nextents); - if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), - &(efip->efi_format)))) { + error = xfs_efi_copy_format(&item->ri_buf[0], &efip->efi_format); + if (error) { xfs_efi_item_free(efip); return error; } @@ -2950,20 +2950,23 @@ xlog_recover_efi_pass2( spin_lock(&log->l_ailp->xa_lock); /* - * xfs_trans_ail_update() drops the AIL lock. + * The EFI has two references. One for the EFD and one for EFI to ensure + * it makes it into the AIL. Insert the EFI into the AIL directly and + * drop the EFI reference. Note that xfs_trans_ail_update() drops the + * AIL lock. */ xfs_trans_ail_update(log->l_ailp, &efip->efi_item, lsn); + xfs_efi_release(efip); return 0; } /* - * This routine is called when an efd format structure is found in - * a committed transaction in the log. It's purpose is to cancel - * the corresponding efi if it was still in the log. To do this - * it searches the AIL for the efi with an id equal to that in the - * efd format structure. If we find it, we remove the efi from the - * AIL and free it. + * This routine is called when an EFD format structure is found in a committed + * transaction in the log. Its purpose is to cancel the corresponding EFI if it + * was still in the log. To do this it searches the AIL for the EFI with an id + * equal to that in the EFD format structure. If we find it we drop the EFD + * reference, which removes the EFI from the AIL and frees it. */ STATIC int xlog_recover_efd_pass2( @@ -2985,8 +2988,8 @@ xlog_recover_efd_pass2( efi_id = efd_formatp->efd_efi_id; /* - * Search for the efi with the id in the efd format structure - * in the AIL. + * Search for the EFI with the id in the EFD format structure in the + * AIL. */ spin_lock(&ailp->xa_lock); lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); @@ -2995,18 +2998,18 @@ xlog_recover_efd_pass2( efip = (xfs_efi_log_item_t *)lip; if (efip->efi_format.efi_id == efi_id) { /* - * xfs_trans_ail_delete() drops the - * AIL lock. + * Drop the EFD reference to the EFI. This + * removes the EFI from the AIL and frees it. */ - xfs_trans_ail_delete(ailp, lip, - SHUTDOWN_CORRUPT_INCORE); - xfs_efi_item_free(efip); + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip); spin_lock(&ailp->xa_lock); break; } } lip = xfs_trans_ail_cursor_next(ailp, &cur); } + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7CCE57F56 for ; Fri, 7 Aug 2015 16:15:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5775D304059 for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982131-04cbb0416c2c9a80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sSXIxDi4N74BH6SO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 5060D91D0A for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFUrI032037 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F3C0E122EB9; Fri, 7 Aug 2015 17:15:28 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 03/12] xfs: fix efi/efd error handling to avoid fs shutdown hangs Date: Fri, 7 Aug 2015 17:15:19 -0400 X-ASG-Orig-Subj: [PATCH v2 03/12] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-Id: <1438982128-38618-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Freeing an extent in XFS involves logging an EFI (extent free intention), freeing the actual extent, and logging an EFD (extent free done). The EFI object is created with a reference count of 2: one for the current transaction and one for the subsequently created EFD. Under normal circumstances, the first reference is dropped when the EFI is unpinned and the second reference is dropped when the EFD is committed to the on-disk log. In event of errors or filesystem shutdown, there are various potential cleanup scenarios depending on the state of the EFI/EFD. The cleanup scenarios are confusing and racy, as demonstrated by the following test sequence: # mount $dev $mnt # fsstress -d $mnt -n 99999 -p 16 -z -f fallocate=1 \ -f punch=1 -f creat=1 -f unlink=1 & # sleep 5 # killall -9 fsstress; wait # godown -f $mnt # umount ... in which the final umount can hang due to the AIL being pinned indefinitely by one or more EFI items. This can occur due to several conditions. For example, if the shutdown occurs after the EFI is committed to the on-disk log and the EFD committed to the CIL, but before the EFD committed to the log, the EFD iop_committed() abort handler does not drop its reference to the EFI. Alternatively, manual error injection in the xfs_bmap_finish() codepath shows that if an error occurs after the EFI transaction is committed but before the EFD is constructed and logged, the EFI is never released from the AIL. Update the EFI/EFD item handling code to use a more straightforward and reliable approach to error handling. If an error occurs after the EFI transaction is committed and before the EFD is constructed, release the EFI explicitly from xfs_bmap_finish(). If the EFI transaction is cancelled, release the EFI in the unlock handler. Once the EFD is constructed, it is responsible for releasing the EFI under any circumstances (including whether the EFI item aborts due to log I/O error). Update the EFD item handlers to release the EFI if the transaction is cancelled or aborts due to log I/O error. Finally, update xfs_bmap_finish() to log at least one EFD extent to the transaction before xfs_free_extent() errors are handled to ensure the transaction is dirty and EFD item error handling is triggered. Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 84 +++++++++++++++++++++++++++-------------------- fs/xfs/xfs_extfree_item.c | 71 ++++++++++++++++++++++----------------- fs/xfs/xfs_extfree_item.h | 25 ++++++++++++-- 3 files changed, 112 insertions(+), 68 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 0f34886c..fa65f67 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -67,16 +67,15 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) */ int /* error */ xfs_bmap_finish( - xfs_trans_t **tp, /* transaction pointer addr */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *committed) /* xact committed or not */ + struct xfs_trans **tp, /* transaction pointer addr */ + struct xfs_bmap_free *flist, /* i/o: list extents to free */ + int *committed)/* xact committed or not */ { - xfs_efd_log_item_t *efd; /* extent free data */ - xfs_efi_log_item_t *efi; /* extent free intention */ - int error; /* error return value */ - xfs_bmap_free_item_t *free; /* free extent item */ - xfs_mount_t *mp; /* filesystem mount structure */ - xfs_bmap_free_item_t *next; /* next item on free list */ + struct xfs_efd_log_item *efd; /* extent free data */ + struct xfs_efi_log_item *efi; /* extent free intention */ + int error; /* error return value */ + struct xfs_bmap_free_item *free; /* free extent item */ + struct xfs_bmap_free_item *next; /* next item on free list */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); if (flist->xbf_count == 0) { @@ -88,40 +87,55 @@ xfs_bmap_finish( xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, free->xbfi_blockcount); - error = xfs_trans_roll(tp, NULL); - *committed = 1; - /* - * We have a new transaction, so we should return committed=1, - * even though we're returning an error. - */ - if (error) + error = __xfs_trans_roll(tp, NULL, committed); + if (error) { + /* + * If the transaction was committed, drop the EFD reference + * since we're bailing out of here. The other reference is + * dropped when the EFI hits the AIL. + * + * If the transaction was not committed, the EFI is freed by the + * EFI item unlock handler on abort. Also, we have a new + * transaction so we should return committed=1 even though we're + * returning an error. + */ + if (*committed) { + xfs_efi_release(efi); + xfs_force_shutdown((*tp)->t_mountp, + (error == -EFSCORRUPTED) ? + SHUTDOWN_CORRUPT_INCORE : + SHUTDOWN_META_IO_ERROR); + } else { + *committed = 1; + } + return error; + } efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; - if ((error = xfs_free_extent(*tp, free->xbfi_startblock, - free->xbfi_blockcount))) { - /* - * The bmap free list will be cleaned up at a - * higher level. The EFI will be canceled when - * this transaction is aborted. - * Need to force shutdown here to make sure it - * happens, since this transaction may not be - * dirty yet. - */ - mp = (*tp)->t_mountp; - if (!XFS_FORCED_SHUTDOWN(mp)) - xfs_force_shutdown(mp, - (error == -EFSCORRUPTED) ? - SHUTDOWN_CORRUPT_INCORE : - SHUTDOWN_META_IO_ERROR); - return error; - } + + /* + * Free the extent and log the EFD to dirty the transaction + * before handling errors. This ensures that the transaction is + * aborted, which: + * + * 1.) releases the EFI and frees the EFD + * 2.) shuts down the filesystem + * + * The bmap free list is cleaned up at a higher level. + */ + error = xfs_free_extent(*tp, free->xbfi_startblock, + free->xbfi_blockcount); xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, - free->xbfi_blockcount); + free->xbfi_blockcount); + if (error) + return error; + xfs_bmap_del_free(flist, NULL, free); } + return 0; } diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 42c9b05..aceb54f 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -61,9 +61,15 @@ __xfs_efi_release( if (atomic_dec_and_test(&efip->efi_refcount)) { spin_lock(&ailp->xa_lock); - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); + /* + * We don't know whether the EFI made it to the AIL. Remove it + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. + */ + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); + else + spin_unlock(&ailp->xa_lock); xfs_efi_item_free(efip); } } @@ -128,12 +134,12 @@ xfs_efi_item_pin( } /* - * While EFIs cannot really be pinned, the unpin operation is the last place at - * which the EFI is manipulated during a transaction. If we are being asked to - * remove the EFI it's because the transaction has been cancelled and by - * definition that means the EFI cannot be in the AIL so remove it from the - * transaction and free it. Otherwise coordinate with xfs_efi_release() - * to determine who gets to free the EFI. + * The unpin operation is the last place an EFI is manipulated in the log. It is + * either inserted in the AIL or aborted in the event of a log I/O error. In + * either case, the EFI transaction has been successfully committed to make it + * this far. Therefore, we expect whoever committed the EFI to either construct + * and commit the EFD or drop the EFD's reference in the event of error. Simply + * drop the log's EFI reference now that the log is done with it. */ STATIC void xfs_efi_item_unpin( @@ -141,14 +147,6 @@ xfs_efi_item_unpin( int remove) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); - - if (remove) { - ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); - if (lip->li_desc) - xfs_trans_del_item(lip); - xfs_efi_item_free(efip); - return; - } xfs_efi_release(efip); } @@ -167,6 +165,11 @@ xfs_efi_item_push( return XFS_ITEM_PINNED; } +/* + * The EFI has been either committed or aborted if the transaction has been + * cancelled. If the transaction was cancelled, an EFD isn't going to be + * constructed and thus we free the EFI here directly. + */ STATIC void xfs_efi_item_unlock( struct xfs_log_item *lip) @@ -411,20 +414,27 @@ xfs_efd_item_push( return XFS_ITEM_PINNED; } +/* + * The EFD is either committed or aborted if the transaction is cancelled. If + * the transaction is cancelled, drop our reference to the EFI and free the EFD. + */ STATIC void xfs_efd_item_unlock( struct xfs_log_item *lip) { - if (lip->li_flags & XFS_LI_ABORTED) - xfs_efd_item_free(EFD_ITEM(lip)); + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + + if (lip->li_flags & XFS_LI_ABORTED) { + xfs_efi_release(efdp->efd_efip); + xfs_efd_item_free(efdp); + } } /* - * When the efd item is committed to disk, all we need to do - * is delete our reference to our partner efi item and then - * free ourselves. Since we're freeing ourselves we must - * return -1 to keep the transaction code from further referencing - * this item. + * When the efd item is committed to disk, all we need to do is delete our + * reference to our partner efi item and then free ourselves. Since we're + * freeing ourselves we must return -1 to keep the transaction code from further + * referencing this item. */ STATIC xfs_lsn_t xfs_efd_item_committed( @@ -434,14 +444,15 @@ xfs_efd_item_committed( struct xfs_efd_log_item *efdp = EFD_ITEM(lip); /* - * If we got a log I/O error, it's always the case that the LR with the - * EFI got unpinned and freed before the EFD got aborted. + * Drop the EFI reference regardless of whether the EFD has been + * aborted. Once the EFD transaction is constructed, it is the sole + * responsibility of the EFD to release the EFI (even if the EFI is + * aborted due to log I/O error). */ - if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip); - + xfs_efi_release(efdp->efd_efip); xfs_efd_item_free(efdp); - return (xfs_lsn_t)-1; + + return (xfs_lsn_t) -1; } /* diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 399562e..8fa8651 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -39,9 +39,28 @@ struct kmem_zone; * "extent free done" log item described below. * * The EFI is reference counted so that it is not freed prior to both the EFI - * and EFD being committed and unpinned. This ensures that when the last - * reference goes away the EFI will always be in the AIL as it has been - * unpinned, regardless of whether the EFD is processed before or after the EFI. + * and EFD being committed and unpinned. This ensures the EFI is inserted into + * the AIL even in the event of out of order EFI/EFD processing. In other words, + * an EFI is born with two references: + * + * 1.) an EFI held reference to track EFI AIL insertion + * 2.) an EFD held reference to track EFD commit + * + * On allocation, both references are the responsibility of the caller. Once the + * EFI is added to and dirtied in a transaction, ownership of reference one + * transfers to the transaction. The reference is dropped once the EFI is + * inserted to the AIL or in the event of failure along the way (e.g., commit + * failure, log I/O error, etc.). Note that the caller remains responsible for + * the EFD reference under all circumstances to this point. The caller has no + * means to detect failure once the transaction is committed, however. + * Therefore, an EFD is required after this point, even in the event of + * unrelated failure. + * + * Once an EFD is allocated and dirtied in a transaction, reference two + * transfers to the transaction. The EFD reference is dropped once it reaches + * the unpin handler. Similar to the EFI, the reference also drops in the event + * of commit failure or log I/O errors. Note that the EFD is not inserted in the + * AIL, so at this point both the EFI and EFD are freed. */ typedef struct xfs_efi_log_item { xfs_log_item_t efi_item; -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 81A627F5A for ; Fri, 7 Aug 2015 16:15:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B75AAC00B for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04cbb0416c2c9a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1CpCDKwUljykbhgG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:33 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 317B3A58AD for ; Fri, 7 Aug 2015 21:15:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVRZ025055 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7AF68123598; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 12/12] xfs: add helper to conditionally remove items from the AIL Date: Fri, 7 Aug 2015 17:15:28 -0400 X-ASG-Orig-Subj: [PATCH v2 12/12] xfs: add helper to conditionally remove items from the AIL Message-Id: <1438982128-38618-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Several areas of code duplicate a pattern where we take the AIL lock, check whether an item is in the AIL and remove it if so. Create a new helper for this pattern and use it where appropriate. Signed-off-by: Brian Foster --- fs/xfs/xfs_buf_item.c | 7 ++----- fs/xfs/xfs_dquot.c | 8 ++------ fs/xfs/xfs_extfree_item.c | 13 ++----------- fs/xfs/xfs_inode_item.c | 10 ++-------- fs/xfs/xfs_trans_priv.h | 14 ++++++++++++++ 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 092d652..f89abeb 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -647,11 +647,8 @@ xfs_buf_item_unlock( xfs_buf_item_relse(bp); else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); - if (lip->li_flags & XFS_LI_IN_AIL) { - spin_lock(&lip->li_ailp->xa_lock); - xfs_trans_ail_delete(lip->li_ailp, lip, - SHUTDOWN_LOG_IO_ERROR); - } + xfs_trans_ail_remove(lip->li_ailp, lip, + SHUTDOWN_LOG_IO_ERROR); xfs_buf_item_relse(bp); } } diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 4143dc7..03e0ca8 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -954,12 +954,8 @@ xfs_qm_dqflush( struct xfs_log_item *lip = &dqp->q_logitem.qli_item; dqp->dq_flags &= ~XFS_DQ_DIRTY; - spin_lock(&mp->m_ail->xa_lock); - if (lip->li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(mp->m_ail, lip, - SHUTDOWN_CORRUPT_INCORE); - else - spin_unlock(&mp->m_ail->xa_lock); + xfs_trans_ail_remove(mp->m_ail, lip, SHUTDOWN_CORRUPT_INCORE); + error = -EIO; goto out_unlock; } diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 2b2acac..e3c872c 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -288,17 +288,8 @@ xfs_efi_release(struct xfs_efi_log_item *efip) struct xfs_ail *ailp = efip->efi_item.li_ailp; if (atomic_dec_and_test(&efip->efi_refcount)) { - spin_lock(&ailp->xa_lock); - /* - * We don't know whether the EFI made it to the AIL. Remove it - * if so. Note that xfs_trans_ail_delete() drops the AIL lock. - */ - if (efip->efi_item.li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); - else - spin_unlock(&ailp->xa_lock); - + xfs_trans_ail_remove(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); xfs_efi_item_free(efip); } } diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index bf13a5a..d4fac829 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -705,15 +705,9 @@ xfs_iflush_abort( if (iip) { struct xfs_ail *ailp = iip->ili_item.li_ailp; if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { - spin_lock(&ailp->xa_lock); - if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &iip->ili_item, - stale ? - SHUTDOWN_LOG_IO_ERROR : + xfs_trans_ail_remove(ailp, &iip->ili_item, + stale ? SHUTDOWN_LOG_IO_ERROR : SHUTDOWN_CORRUPT_INCORE); - } else - spin_unlock(&ailp->xa_lock); } iip->ili_logged = 0; /* diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 1b73629..c70c670 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -119,6 +119,20 @@ xfs_trans_ail_delete( xfs_trans_ail_delete_bulk(ailp, &lip, 1, shutdown_type); } +static inline void +xfs_trans_ail_remove( + struct xfs_ail *ailp, + struct xfs_log_item *lip, + int shutdown_type) +{ + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_delete() drops the AIL lock */ + if (lip->li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, lip, shutdown_type); + else + spin_unlock(&ailp->xa_lock); +} + void xfs_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_ail_push_all(struct xfs_ail *); void xfs_ail_push_all_sync(struct xfs_ail *); -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C74277F73 for ; Fri, 7 Aug 2015 16:15:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B18198F804C for ; Fri, 7 Aug 2015 14:15:32 -0700 (PDT) X-ASG-Debug-ID: 1438982131-04cb6c673f34afb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cDcgNrIPhAqduVoE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 1DB498EB2B for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFUZj032035 for ; Fri, 7 Aug 2015 17:15:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E960B122E79; Fri, 7 Aug 2015 17:15:28 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 02/12] xfs: return committed status from xfs_trans_roll() Date: Fri, 7 Aug 2015 17:15:18 -0400 X-ASG-Orig-Subj: [PATCH v2 02/12] xfs: return committed status from xfs_trans_roll() Message-Id: <1438982128-38618-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982131 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Some callers need to make error handling decisions based on whether the current transaction successfully committed or not. Rename xfs_trans_roll(), add a new parameter and provide a wrapper to preserve existing callers. Signed-off-by: Brian Foster --- fs/xfs/xfs_trans.c | 15 +++++++++++++-- fs/xfs/xfs_trans.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 0582a27..a0ab1da 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1019,9 +1019,10 @@ xfs_trans_cancel( * chunk we've been working on and get a new transaction to continue. */ int -xfs_trans_roll( +__xfs_trans_roll( struct xfs_trans **tpp, - struct xfs_inode *dp) + struct xfs_inode *dp, + int *committed) { struct xfs_trans *trans; struct xfs_trans_res tres; @@ -1052,6 +1053,7 @@ xfs_trans_roll( if (error) return error; + *committed = 1; trans = *tpp; /* @@ -1074,3 +1076,12 @@ xfs_trans_roll( xfs_trans_ijoin(trans, dp, 0); return 0; } + +int +xfs_trans_roll( + struct xfs_trans **tpp, + struct xfs_inode *dp) +{ + int committed = 0; + return __xfs_trans_roll(tpp, dp, &committed); +} diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index f48e839..ba1660b 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -225,6 +225,7 @@ void xfs_trans_log_efd_extent(xfs_trans_t *, xfs_fsblock_t, xfs_extlen_t); int xfs_trans_commit(struct xfs_trans *); +int __xfs_trans_roll(struct xfs_trans **, struct xfs_inode *, int *); int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); void xfs_trans_cancel(xfs_trans_t *); int xfs_trans_ail_init(struct xfs_mount *); -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39A517F73 for ; Fri, 7 Aug 2015 16:15:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C66DBAC001 for ; Fri, 7 Aug 2015 14:15:32 -0700 (PDT) X-ASG-Debug-ID: 1438982131-04bdf06bd2285a10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RHwVyDsSLdU7IYav (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 4C993373BD1 for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFUqv020038 for ; Fri, 7 Aug 2015 17:15:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E304B1228EA; Fri, 7 Aug 2015 17:15:28 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 01/12] xfs: disentagle EFI release from the extent count Date: Fri, 7 Aug 2015 17:15:17 -0400 X-ASG-Orig-Subj: [PATCH v2 01/12] xfs: disentagle EFI release from the extent count Message-Id: <1438982128-38618-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982131 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Release of the EFI either occurs based on the reference count or the extent count. The extent count used is either the count tracked in the EFI or EFD, depending on the particular situation. In either case, the count is initialized to the final value and thus always matches the current efi_next_extent value once the EFI is completely constructed. Given this along with the fact that the EFI is always completely constructed before error can occur, eliminate the unnecessary extent count manipulation and release the EFI directly based on reference count. The efi_next_extent counter remains because it is still used to track the slot to log the next extent to free. Signed-off-by: Brian Foster --- fs/xfs/xfs_extfree_item.c | 20 ++++++++------------ fs/xfs/xfs_extfree_item.h | 1 + fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.h | 1 - 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index adc8f8f..42c9b05 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -149,7 +149,7 @@ xfs_efi_item_unpin( xfs_efi_item_free(efip); return; } - __xfs_efi_release(efip); + xfs_efi_release(efip); } /* @@ -307,18 +307,14 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) * by this efi item we can free the efi item. */ void -xfs_efi_release(xfs_efi_log_item_t *efip, - uint nextents) +xfs_efi_release(struct xfs_efi_log_item *efip) { - ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); - if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); - + /* recovery needs us to drop the EFI reference, too */ + if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) __xfs_efi_release(efip); - /* efip may now have been freed, do not reference it again. */ - } + + __xfs_efi_release(efip); + /* efip may now have been freed, do not reference it again. */ } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) @@ -442,7 +438,7 @@ xfs_efd_item_committed( * EFI got unpinned and freed before the EFD got aborted. */ if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); + xfs_efi_release(efdp->efd_efip); xfs_efd_item_free(efdp); return (xfs_lsn_t)-1; diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 0ffbce3..399562e 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -77,5 +77,6 @@ xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, int xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt); void xfs_efi_item_free(xfs_efi_log_item_t *); +void xfs_efi_release(struct xfs_efi_log_item *); #endif /* __XFS_EXTFREE_ITEM_H__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c674b40..9d8f242 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3766,7 +3766,7 @@ xlog_recover_process_efi( * free the memory associated with it. */ set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_format.efi_nextents); + xfs_efi_release(efip); return -EIO; } } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3b21b4e..f48e839 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -213,7 +213,6 @@ void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); -void xfs_efi_release(struct xfs_efi_log_item *, uint); void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efi_log_item *, xfs_fsblock_t, -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5CC7E7F7D for ; Fri, 7 Aug 2015 16:15:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ECD11AC003 for ; Fri, 7 Aug 2015 14:15:32 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04bdf06bd2285a20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uqPMCz90DlRuv8zt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 13116A49FB for ; Fri, 7 Aug 2015 21:15:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVcH023171 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4CED61230E0; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 09/12] xfs: checksum log record ext headers based on record size Date: Fri, 7 Aug 2015 17:15:25 -0400 X-ASG-Orig-Subj: [PATCH v2 09/12] xfs: checksum log record ext headers based on record size Message-Id: <1438982128-38618-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The first 4 bytes of every basic block in the physical log is stamped with the current lsn. To support this mechanism, the log record header (first block of each new log record) contains space for the original first byte of each log record block before it is replaced with the lsn. The log record header has space for 32k worth of blocks. The version 2 log adds new extended record headers for each additional 32k worth of blocks beyond what is supported by the record header. The log record checksum incorporates the log record header, the extended headers and the record payload. xlog_cksum() checksums the extended headers based on log->l_iclog_heads, which specifies the number of extended headers in a log record based on the log buffer size mount option. The log buffer size is variable, however, and thus means the checksum can be calculated differently based on how a filesystem is mounted. This is problematic if a filesystem crashes and recovery occurs on a subsequent mount using a different log buffer size. For example, crash an active filesystem that is mounted with the default (32k) logbsize, attempt remount/recovery using '-o logbsize=64k' and the mount fails on or warns about log checksum failures. To avoid this problem, update xlog_cksum() to calculate the checksum based on the size of the log buffer according to the log record. The size is already included in the h_size field of the log record header and thus is available at log recovery time. Extended log record headers are also only written when the log record is large enough to require them. This makes checksum calculation of log records consistent with the extended record header mechanism as well as how on-disk records are checksummed with various log buffer size mount options. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3a5592c..aaadee0 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1672,8 +1672,13 @@ xlog_cksum( if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { union xlog_in_core2 *xhdr = (union xlog_in_core2 *)rhead; int i; + int xheads; - for (i = 1; i < log->l_iclog_heads; i++) { + xheads = size / XLOG_HEADER_CYCLE_SIZE; + if (size % XLOG_HEADER_CYCLE_SIZE) + xheads++; + + for (i = 1; i < xheads; i++) { crc = crc32c(crc, &xhdr[i].hic_xheader, sizeof(struct xlog_rec_ext_header)); } -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7B7517F7E for ; Fri, 7 Aug 2015 16:15:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2394FAC007 for ; Fri, 7 Aug 2015 14:15:32 -0700 (PDT) X-ASG-Debug-ID: 1438982132-04bdf06bcf285a10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dAXJCgyHkOSK99t3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id ED7E335BA49 for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFVTg023169 for ; Fri, 7 Aug 2015 17:15:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 33AA4122F8C; Fri, 7 Aug 2015 17:15:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 07/12] xfs: icreate log item recovery and cancellation tracepoints Date: Fri, 7 Aug 2015 17:15:23 -0400 X-ASG-Orig-Subj: [PATCH v2 07/12] xfs: icreate log item recovery and cancellation tracepoints Message-Id: <1438982128-38618-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1438982128-38618-1-git-send-email-bfoster@redhat.com> References: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982132 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Various log items have recovery tracepoints to identify whether a particular log item is recovered or cancelled. Add the equivalent tracepoints for the icreate transaction. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 5 ++++- fs/xfs/xfs_trace.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c1c4de2..2ff62d3 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3105,9 +3105,12 @@ xlog_recover_do_icreate_pass2( * done easily. */ if (xlog_check_buffer_cancelled(log, - XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) + XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) { + trace_xfs_log_recover_icreate_cancel(log, icl); return 0; + } + trace_xfs_log_recover_icreate_recover(log, icl); xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, be32_to_cpu(icl->icl_gen)); return 0; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 8d916d3..9aeeb21 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2089,6 +2089,40 @@ DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_recover); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_cancel); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_skip); +DECLARE_EVENT_CLASS(xfs_log_recover_icreate_item_class, + TP_PROTO(struct xlog *log, struct xfs_icreate_log *in_f), + TP_ARGS(log, in_f), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(unsigned int, count) + __field(unsigned int, isize) + __field(xfs_agblock_t, length) + __field(unsigned int, gen) + ), + TP_fast_assign( + __entry->dev = log->l_mp->m_super->s_dev; + __entry->agno = be32_to_cpu(in_f->icl_ag); + __entry->agbno = be32_to_cpu(in_f->icl_agbno); + __entry->count = be32_to_cpu(in_f->icl_count); + __entry->isize = be32_to_cpu(in_f->icl_isize); + __entry->length = be32_to_cpu(in_f->icl_length); + __entry->gen = be32_to_cpu(in_f->icl_gen); + ), + TP_printk("dev %d:%d agno %u agbno %u count %u isize %u length %u " + "gen %u", MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, __entry->agbno, __entry->count, __entry->isize, + __entry->length, __entry->gen) +) +#define DEFINE_LOG_RECOVER_ICREATE_ITEM(name) \ +DEFINE_EVENT(xfs_log_recover_icreate_item_class, name, \ + TP_PROTO(struct xlog *log, struct xfs_icreate_log *in_f), \ + TP_ARGS(log, in_f)) + +DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_cancel); +DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_recover); + DECLARE_EVENT_CLASS(xfs_discard_class, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len), -- 2.1.0 From bfoster@redhat.com Fri Aug 7 16:15:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 897757F80 for ; Fri, 7 Aug 2015 16:15:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 17603AC006 for ; Fri, 7 Aug 2015 14:15:33 -0700 (PDT) X-ASG-Debug-ID: 1438982131-04cb6c674034afb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OojZNvrDVYNhdGVv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 14:15:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 0E91D9D1DA for ; Fri, 7 Aug 2015 21:15:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-76.bos.redhat.com [10.18.41.76]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t77LFUWD025048 for ; Fri, 7 Aug 2015 17:15:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D5EC4122E55; Fri, 7 Aug 2015 17:15:28 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 00/12] xfs: miscellaneous logging, recovery, umount fixes Date: Fri, 7 Aug 2015 17:15:16 -0400 X-ASG-Orig-Subj: [PATCH v2 00/12] xfs: miscellaneous logging, recovery, umount fixes Message-Id: <1438982128-38618-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1438982131 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's v2 of the EFI/EFD and miscellaneous log fixes series. Patch 12 is added based on a suggestion from Dave in the v1 comments. Otherwise, most of the changes are in patch 6 where the APIs for log recovery cancellation are shuffled around a bit. Note that I retained the xlog_recovery_finish() helper rather than replace it because there is another caller in this version that addresses a memory leak (plus it seems consistent with the xlog_recovery_finish() interface). Brian v2: - Added new comment around EFI/EFD refcount rules. - Appended patch 12 to clean up AIL item removal. - Reworked log recovery EFI cancellation APIs. - Invoke EFI cancellation within xfs_log_mount() on failure to prevent memory leak. v1: http://oss.sgi.com/pipermail/xfs/2015-August/042877.html - Updated EFI/EFD tracking semantics based on rfc comments. - Added more cleanups/fixes to series. rfc: http://oss.sgi.com/pipermail/xfs/2015-July/042617.html Brian Foster (12): xfs: disentagle EFI release from the extent count xfs: return committed status from xfs_trans_roll() xfs: fix efi/efd error handling to avoid fs shutdown hangs xfs: ensure EFD trans aborts on log recovery extent free failure xfs: use EFI refcount consistently in log recovery xfs: don't leave EFIs on AIL on mount failure xfs: icreate log item recovery and cancellation tracepoints xfs: fix broken icreate log item cancellation xfs: checksum log record ext headers based on record size xfs: clean up root inode properly on mount failure xfs: fix btree cursor error cleanups xfs: add helper to conditionally remove items from the AIL fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_bmap_util.c | 84 ++++++++++++---------- fs/xfs/xfs_buf_item.c | 7 +- fs/xfs/xfs_dquot.c | 8 +-- fs/xfs/xfs_extfree_item.c | 109 ++++++++++++----------------- fs/xfs/xfs_extfree_item.h | 26 ++++++- fs/xfs/xfs_inode_item.c | 10 +-- fs/xfs/xfs_itable.c | 3 +- fs/xfs/xfs_log.c | 37 ++++++++-- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_log_recover.c | 169 ++++++++++++++++++++++++++++++++++----------- fs/xfs/xfs_mount.c | 28 ++++---- fs/xfs/xfs_trace.h | 34 +++++++++ fs/xfs/xfs_trans.c | 15 +++- fs/xfs/xfs_trans.h | 2 +- fs/xfs/xfs_trans_priv.h | 14 ++++ 17 files changed, 367 insertions(+), 184 deletions(-) -- 2.1.0 From debbugs@buxtehude.debian.org Fri Aug 7 16:33:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 299E77F5E for ; Fri, 7 Aug 2015 16:33:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A507EAC006 for ; Fri, 7 Aug 2015 14:33:19 -0700 (PDT) X-ASG-Debug-ID: 1438983196-04cbb0416f2ca040001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id nDiz5HHpA54EM2j1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 07 Aug 2015 14:33:17 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84) (envelope-from ) id 1ZNpGM-000501-7g; Fri, 07 Aug 2015 21:33:14 +0000 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: owner@bugs.debian.org From: owner@bugs.debian.org (Debian Bug Tracking System) To: Daniel Bast Subject: Bug#792330: marked as done (xfsprogs: FTBFS on ppc64el: configure: error: cannot guess build type; you must specify one) Message-ID: X-ASG-Orig-Subj: Bug#792330: marked as done (xfsprogs: FTBFS on ppc64el: configure: error: cannot guess build type; you must specify one) References: <80499FED-BEFA-41E2-BF22-78C292E52005@gmx.net> <20150714014646.9724.43365.reportbug@chloe.home.mraw.org> X-Debian-PR-Message: closed 792330 X-Debian-PR-Package: src:xfsprogs X-Debian-PR-Source: xfsprogs Date: Fri, 07 Aug 2015 21:33:14 +0000 Content-Type: multipart/mixed; boundary="----------=_1438983194-19217-0" X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1438983197 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21439 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format... ------------=_1438983194-19217-0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Your message dated Fri, 7 Aug 2015 23:28:45 +0200 with message-id <80499FED-BEFA-41E2-BF22-78C292E52005@gmx.net> and subject line fixed: Bug#792330: xfsprogs: FTBFS on ppc64el: configure: = error: cannot guess build type; you must specify one has caused the Debian Bug report #792330, regarding xfsprogs: FTBFS on ppc64el: configure: error: cannot guess build = type; you must specify one to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the Bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what this message is talking about, this may indicate a serious mail system misconfiguration somewhere. Please contact owner@bugs.debian.org immediately.) --=20 792330: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D792330 Debian Bug Tracking System Contact owner@bugs.debian.org with problems ------------=_1438983194-19217-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by bugs.debian.org; 14 Jul 2015 01:46:55 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.0-bugs.debian.org_2005_01_02 (2014-02-07) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-7.7 required=4.0 tests=BAYES_00,FROMDEVELOPER, RCVD_IN_PBL,XMAILER_REPORTBUG,X_DEBBUGS_CC autolearn=ham autolearn_force=no version=3.4.0-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 6; hammy, 139; neutral, 35; spammy, 1. spammytokens:0.956-+--H*r:bugs.debian.org hammytokens:0.000-+--sk:buildd., 0.000-+--H*M:reportbug, 0.000-+--H*MI:reportbug, 0.000-+--H*F:U*kibi, 0.000-+--UD:buildd.debian.org Return-path: Received: from home.mraw.org ([82.236.137.215] helo=chloe.home.mraw.org) by buxtehude.debian.org with esmtp (Exim 4.84) (envelope-from ) id 1ZEpJ9-0001Eh-0P for submit@bugs.debian.org; Tue, 14 Jul 2015 01:46:55 +0000 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="UTF-8" From: Cyril Brulebois To: Debian Bug Tracking System Subject: xfsprogs: FTBFS on ppc64el: configure: error: cannot guess build type; you must specify one Message-ID: <20150714014646.9724.43365.reportbug@chloe.home.mraw.org> X-Mailer: reportbug 6.6.3 Date: Tue, 14 Jul 2015 03:46:46 +0200 X-Debbugs-Cc: kibi@debian.org Delivered-To: submit@bugs.debian.org Source: xfsprogs Version: 3.2.3 Severity: serious Justification: FTBFS Hi, your package no longer builds on ppc64el, it fails with: | uname -m = ppc64le | uname -r = 3.16.0-4-powerpc64le | uname -s = Linux | uname -v = #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) | | /usr/bin/uname -p = | /bin/uname -X = | | hostinfo = | /bin/universe = | /usr/bin/arch -k = | /bin/arch = | /usr/bin/oslevel = | /usr/convex/getsysinfo = | | UNAME_MACHINE = ppc64le | UNAME_RELEASE = 3.16.0-4-powerpc64le | UNAME_SYSTEM = Linux | UNAME_VERSION = #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) | configure: error: cannot guess build type; you must specify one | make[1]: *** [include/builddefs] Error 1 | checking build system type... Makefile:89: recipe for target 'include/builddefs' failed | make[1]: Leaving directory '/«PKGBUILDDIR»' | make: *** [.census] Error 2 | dpkg-buildpackage: error: debian/rules build gave error exit status 2 | debian/rules:36: recipe for target '.census' failed Full build log: https://buildd.debian.org/status/fetch.php?pkg=xfsprogs&arch=ppc64el&ver=3.2.3&stamp=1434333394 Mraw, KiBi. ------------=_1438983194-19217-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 792330-close) by bugs.debian.org; 7 Aug 2015 21:28:54 +0000 X-Spam-Checker-Version: SpamAssassin 3.4.0-bugs.debian.org_2005_01_02 (2014-02-07) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-5.6 required=4.0 tests=BAYES_00,FREEMAIL_FROM, HAS_BUG_NUMBER,HTML_MESSAGE,MULTALT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RP_MATCHES_RCVD,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 17; hammy, 91; neutral, 25; spammy, 3. spammytokens:0.985-+--H*c:HHHHHHHH, 0.960-+--H*c:HHHH, 0.939-+--H*c:alternative hammytokens:0.000-+--sk:buildd., 0.000-+--UD:buildd.debian.org, 0.000-+--buildddebianorg, 0.000-+--buildd.debian.org, 0.000-+--ppc64el Return-path: Received: from mout.gmx.net ([212.227.15.15]) by buxtehude.debian.org with esmtps (TLS1.2:DHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84) (envelope-from ) id 1ZNpCA-0004Np-FZ for 792330-close@bugs.debian.org; Fri, 07 Aug 2015 21:28:54 +0000 Received: from [192.168.178.21] ([80.131.214.241]) by mail.gmx.com (mrgmx003) with ESMTPSA (Nemesis) id 0Lmqxo-1YuIKo0DIC-00h32D for <792330-close@bugs.debian.org>; Fri, 07 Aug 2015 23:28:46 +0200 From: Daniel Bast Content-Type: multipart/alternative; boundary="Apple-Mail=_F63B196D-D51B-49A8-BCB9-E2418A1AA19B" Message-Id: <80499FED-BEFA-41E2-BF22-78C292E52005@gmx.net> Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2102\)) Subject: fixed: Bug#792330: xfsprogs: FTBFS on ppc64el: configure: error: cannot guess build type; you must specify one Date: Fri, 7 Aug 2015 23:28:45 +0200 References: <20150714014646.9724.43365.reportbug@chloe.home.mraw.org> To: 792330-close@bugs.debian.org In-Reply-To: <20150714014646.9724.43365.reportbug@chloe.home.mraw.org> X-Mailer: Apple Mail (2.2102) X-Provags-ID: V03:K0:UykdLT5qIBZfXzjzC8PjCmYrbNFF6PriNynvB8fsYQic6OSMBFY qBHWCcYyEagwBNpX1OvOipzRN6H7K1eD27myWNzCLFfFWBuKebwBv9mhnvuZeWr7K5cBuNE VraAw55/wmy7LinfUyPMz4qxkEFpk7iMHCLzCHXzLffpUVZC0R0pNCLXRENqStUYJhLnrn9 vQ7hQQ+M6vUNUrnrSa3ZQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:CbK11puwQBI=:WvcUcx7lbDga2Wjr8MbMGs XYC+wZJ+QGvjw1QFAJktsm5GqlatjIKeIqncDEyRn6qwO4bWfP5fxzTY2qMOo3jNRa6PH8LKP yDZq7G9YbSnpey9k+mIFQamdiWpiCA6ZGNKZ540N1Utl8mPsmxx4x+P1xeMf6C5T1hh0vI/go eI0pNLx/zsvTXpv/0gyItvd1vFns7jlmKa59Ak5BGwn5xtYE2gKXGV0zW/wJJIx00/6VfhIxT fR7kJ+Se5Y43vsMVvi8oNW1yYPy6fMh2WFEEjufUelN/Kkn3EYcWNvjply5KWU9nvdkpWfaPz A5tB7ONvtE4Hj5+lDj/Go/yRQdVbZfWwxrYdqNz66nGgNl0tUWx42Fc8tBFOCcIX/7EV8XQ33 JH/lrVmv33bbc07eKBn0iA8JOL3BQi9/atQfyPFcS+qEhot/9NaBKcgSsz74rRS9/vXd9XSBA rEIXd0xoCr9d1gnk6l054gU/w8j/Plb5koMYglr5x0LNkOZ2g6cK8MXiXXXLCHHQTLnxaIPgm 8DTAoF8fq6t7qFn6guHJlLJ49CclBPXiF8zqAy0HUx1Gg09Jk486hckmzhxe7bDzl8iZqvrOs dhk5+GUzQwF2cbKiffi27KEpkSGCsv+rW0JKLN491fBQ9DOXTmWK84yuCp3sMyR7IThbJquMU H5gbFnvQ4FRYJw2Dd1O5za+FD8YF763tcadD8KOu5BP/9lmDdYmpc6/k5qPK/w9QchppDvhKW Usio3IAqMKw/olffoD+4g2QAxOVhTEQAT+MRrg== --Apple-Mail=_F63B196D-D51B-49A8-BCB9-E2418A1AA19B Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii fixed in 3.2.4-1 see https://buildd.debian.org/status/package.php?p=3Dxfsprogs&suite=3Dsid = = --Apple-Mail=_F63B196D-D51B-49A8-BCB9-E2418A1AA19B Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii fixed in 3.2.4-1

--Apple-Mail=_F63B196D-D51B-49A8-BCB9-E2418A1AA19B-- ------------=_1438983194-19217-0-- From david@fromorbit.com Fri Aug 7 17:45:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E82ED7F56 for ; Fri, 7 Aug 2015 17:45:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D564C304039 for ; Fri, 7 Aug 2015 15:45:24 -0700 (PDT) X-ASG-Debug-ID: 1438987518-04cb6c673e34ce50001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jHCL0ZFBAzO8POvF for ; Fri, 07 Aug 2015 15:45:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D3BgCNNMVVPOUbLHlbgxuBPYZSoxwBCpsuBAICgTZNAQEBAQEBBwEBAQFBP4QkAQEEJxMcIxAIAw4KCSUPBSUDBxoTiC3NdAEBAQEGAgEfGYYGhTCBPQGDSweDGIEUBZUIjFqZd4JBgXQsMYJMAQEB Received: from ppp121-44-27-229.lns20.syd4.internode.on.net (HELO dastard) ([121.44.27.229]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Aug 2015 08:15:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNqO4-0004v5-Fq; Sat, 08 Aug 2015 08:45:16 +1000 Date: Sat, 8 Aug 2015 08:45:16 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-ID: <20150807224516.GF3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-4-git-send-email-bfoster@redhat.com> <20150807004100.GD16638@dastard> <20150807120934.GC8322@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150807120934.GC8322@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1438987518 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 07, 2015 at 08:09:34AM -0400, Brian Foster wrote: > On Fri, Aug 07, 2015 at 10:41:00AM +1000, Dave Chinner wrote: > > On Thu, Aug 06, 2015 at 01:44:24PM -0400, Brian Foster wrote: > > > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > > > index 42c9b05..aceb54f 100644 > > > --- a/fs/xfs/xfs_extfree_item.c > > > +++ b/fs/xfs/xfs_extfree_item.c > > > @@ -61,9 +61,15 @@ __xfs_efi_release( > > > > > > if (atomic_dec_and_test(&efip->efi_refcount)) { > > > spin_lock(&ailp->xa_lock); > > > - /* xfs_trans_ail_delete() drops the AIL lock. */ > > > - xfs_trans_ail_delete(ailp, &efip->efi_item, > > > - SHUTDOWN_LOG_IO_ERROR); > > > + /* > > > + * We don't know whether the EFI made it to the AIL. Remove it > > > + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. > > > + */ > > > + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) > > > + xfs_trans_ail_delete(ailp, &efip->efi_item, > > > + SHUTDOWN_LOG_IO_ERROR); > > > + else > > > + spin_unlock(&ailp->xa_lock); > > > xfs_efi_item_free(efip); > > > } > > > > We now have a lot of this pattern: > > > > spin_lock(&ailp->xa_lock); > > if (lip->li_flags & XFS_LI_IN_AIL) > > xfs_trans_ail_delete(ailp, lip, shutdown_reason); > > else > > spin_unlock(&ailp->xa_lock); > > > > occurring in the code. Can you look into adding a helper function > > for this, say xfs_trans_ail_remove()? (separate patch, of course!) > > > > There was only one other instance of this with regard to the EFI that is > ultimately replaced with an xfs_efi_release() call. I'll look into > whether there's enough instances of this for other items to justify a > helper. A quick look shows at least another 4 outside the EFI code: xfs_buf_item_unlock xfs_qm_dqflush_done xfs_qm_dqflush xfs_iflush_abort That's enough for a helper, I think. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 7 17:55:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DA62B7CBE for ; Fri, 7 Aug 2015 17:55:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C67138F8037 for ; Fri, 7 Aug 2015 15:55:35 -0700 (PDT) X-ASG-Debug-ID: 1438988133-04cb6c673d34d1d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hsrF07aRJbDjdP35 for ; Fri, 07 Aug 2015 15:55:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BkCAATN8VVPOUbLHlbgxuBPYZSoxwBBAaaJIEKBAICgTZNAQEBAQEBBwEBAQFBP4QkAQEEOhwjEAgDGAklDwUlAwcaE4gtzXIBCyAZhgaFMIQwWQeELAWVCIxagUmEI5QLgjQcgWUsMYEFgUcBAQE Received: from ppp121-44-27-229.lns20.syd4.internode.on.net (HELO dastard) ([121.44.27.229]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Aug 2015 08:25:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNqXz-0004wh-TT; Sat, 08 Aug 2015 08:55:31 +1000 Date: Sat, 8 Aug 2015 08:55:31 +1000 From: Dave Chinner To: "L.A. Walsh" Cc: Eric Sandeen , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? Message-ID: <20150807225531.GG3902@dastard> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C468F0.2040707@tlinx.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1438988133 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 07, 2015 at 01:14:40AM -0700, L.A. Walsh wrote: > >On 8/6/15 7:52 PM, L.A. Walsh wrote: > >>Example: > >>sudo mkfs-xfs-raid SCR /dev/mapper/Data-Home2 > >>mkfs.xfs -mcrc=1,finobt=1 -i maxpct=5,size=512 -l size=32752b,lazy-count=1 -d su=64k,sw=4 -s size=4096 -L SCR -f /dev/mapper/Data-Home2 > >>meta-data=/dev/mapper/Data-Home2 isize=512 agcount=32, agsize=12582896 blks > >> = sectsz=4096 attr=2, projid32bit=1 > >> = crc=1 finobt=1 > >>data = bsize=4096 blocks=402652672, imaxpct=5 > >> = sunit=16 swidth=64 blks > >>naming =version 2 bsize=4096 ascii-ci=0 ftype=1 > >>log =internal log bsize=4096 blocks=32752, version=2 > >> = sectsz=4096 sunit=1 blks, lazy-count=1 > >>realtime =none extsz=4096 blocks=0, rtextents=0 > > > >ok... > > > >>xfs_admin: WARNING - filesystem uses v1 dirs,limited functionality provided. > > > >Um, what? What xfs_admin command generated this? With what xfsprogs version? > >/usr/sbin/xfs_admin -V > xfs_admin version 3.1.11 > --- The above error message is what old versions of xfs_db emit when they see a filesystem version they don't understand. xfsprogs 3.1.11 doesn't support CRCs. 3.2.0 was the first version of xfsprogs to support CRCs, and 3.2.1 (IIRC) was the first to support finobt, so the make binary came from a different build to the xfs_db binary that xfs_admin executes. Can you please ensure that you are running an up-to-date xfsprogs and not some mix-and-match of different versions with differing feature support capabilities? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 7 18:15:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9ED597F4E for ; Fri, 7 Aug 2015 18:15:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8C27B8F8033 for ; Fri, 7 Aug 2015 16:15:56 -0700 (PDT) X-ASG-Debug-ID: 1438989350-04cbb0416c2cc2a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id K82eneURCBX1SmtF for ; Fri, 07 Aug 2015 16:15:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AEBwC+O8VVPOUbLHlbgxtUaYZSow8NAQQGlTOFewQCAoE2TQEBAQEBAQcBAQEBQT+EIwEBAQMBJxMcIwULCAMOCgklDwUlAwcaE4gmB814AQsgGYYGhTCFCQeELAWVCIUAh1qBSZRJg2WENSwxgkwBAQE Received: from ppp121-44-27-229.lns20.syd4.internode.on.net (HELO dastard) ([121.44.27.229]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Aug 2015 08:45:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZNqrc-0004ze-KB; Sat, 08 Aug 2015 09:15:48 +1000 Date: Sat, 8 Aug 2015 09:15:48 +1000 From: Dave Chinner To: Detlef Vollmann Cc: xfs@oss.sgi.com Subject: Re: Cross-compiling xfsprogs 3.2.x Message-ID: <20150807231548.GH3902@dastard> X-ASG-Orig-Subj: Re: Cross-compiling xfsprogs 3.2.x References: <55C4A3A4.5000306@vollmann.ch> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C4A3A4.5000306@vollmann.ch> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1438989350 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21442 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 07, 2015 at 02:25:08PM +0200, Detlef Vollmann wrote: > Cross-compiling xfsprogs 3.2.4 gives an error: > ./gen_crc32table: cannot execute binary file: Exec format error > This makes sense as a binary built for the target can't run on > the build host. > Working around that isn't hard, however there's no way to run > crc32selftest sensibly and I have no idea whether tables built > on a little-endian 64-bit host will run on a big-endian 32-bit... At this point, we have to trust the cross compiler not to have bugs. Unfortuantely, this is a bad deal, because we know that various cross-compilers (e.g. gcc 4.6/4.7 on intel host to arm target) generate broken code that results in directory corruption.... As for it failing to execute and stopping the build, that should be fixed in 4.2.0-rc1 (current head of the git tree here: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git). > Also, I get nervous if I see all the warnings like: > readdir.c:77:2: warning: format '%lx' expects argument of type 'long > unsigned int', but argument 2 has type '__off64_t' [-Wformat=] > printf(" d_off: 0x%08lx", dirent->d_off); Which is correct on 64 bit machines as glibc defines __off64_t to a long int on 64 bit platforms. On 32 bit platforms it is "long long int" and that's why we have those "PRIu64" formatting strings throughout the code base. e.g. in xfs_repair: $ git grep PRIu64 repair |wc -l 372 there are 372 instances of PRIu64 being used to handle this sort of problem. There are always going to be new ones pop up as 32 bit systems are not the primary development target. I'll happily take patches to silence these warnings on your 32 bit builds (and any other problems you find)... Cheers, Dave. -- Dave Chinner david@fromorbit.com From keescook@www.outflux.net Fri Aug 7 18:43:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BEA87F50 for ; Fri, 7 Aug 2015 18:43:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 19239304043 for ; Fri, 7 Aug 2015 16:43:40 -0700 (PDT) X-ASG-Debug-ID: 1438991017-04cb6c673d34e1e0001-NocioJ Received: from smtp.outflux.net ([198.145.64.163]) by cuda.sgi.com with ESMTP id XzPQ109RSFFqViBX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 16:43:38 -0700 (PDT) X-Barracuda-Envelope-From: keescook@www.outflux.net X-Barracuda-Apparent-Source-IP: 198.145.64.163 Received: from www.outflux.net (serenity.outflux.net [10.2.0.2]) by vinyl.outflux.net (8.14.4/8.14.4/Debian-4.1ubuntu1) with ESMTP id t77Nfokk023043; Fri, 7 Aug 2015 16:41:51 -0700 Date: Fri, 7 Aug 2015 16:41:50 -0700 From: Kees Cook To: Andrew Morton Cc: "Yan, Zheng" , Sage Weil , Ilya Dryomov , Steve French , Jan Kara , Andreas Dilger , "Theodore Ts'o" , Steven Whitehouse , Bob Peterson , Jeff Dike , Richard Weinberger , Mark Fasheh , Joel Becker , Miklos Szeredi , Dave Chinner , xfs@oss.sgi.com, Tejun Heo , Li Zefan , Johannes Weiner , "David S. Miller" , Paul Moore , Stephen Smalley , Eric Paris , James Morris , "Serge E. Hallyn" , Jens Axboe , Fabian Frederick , Christoph Hellwig , Firo Yang , David Howells , Jiri Slaby , Al Viro , Joe Perches , Steven Rostedt , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] fs: create and use seq_show_option for escaping Message-ID: <20150807234150.GA11735@www.outflux.net> X-ASG-Orig-Subj: [PATCH] fs: create and use seq_show_option for escaping MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-MIMEDefang-Filter: outflux$Revision: 1.316 $ X-HELO: www.outflux.net X-Scanned-By: MIMEDefang 2.73 X-Barracuda-Connect: UNKNOWN[198.145.64.163] X-Barracuda-Start-Time: 1438991018 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21443 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Many file systems that implement the show_options hook fail to correctly escape their output which could lead to unescaped characters (e.g. new lines) leaking into /proc/mounts and /proc/[pid]/mountinfo files. This could lead to confusion, spoofed entries (resulting in things like systemd issuing false d-bus "mount" notifications), and who knows what else. This looks like it would only be the root user stepping on themselves, but it's possible weird things could happen in containers or in other situations with delegated mount privileges. Here's an example using overlay with setuid fusermount trusting the contents of /proc/mounts (via the /etc/mtab symlink). Imagine the use of "sudo" is something more sneaky: $ BASE="ovl" $ MNT="$BASE/mnt" $ LOW="$BASE/lower" $ UP="$BASE/upper" $ WORK="$BASE/work/ 0 0 none /proc fuse.pwn user_id=1000" $ mkdir -p "$LOW" "$UP" "$WORK" $ sudo mount -t overlay -o "lowerdir=$LOW,upperdir=$UP,workdir=$WORK" none /mnt $ cat /proc/mounts none /root/ovl/mnt overlay rw,relatime,lowerdir=ovl/lower,upperdir=ovl/upper,workdir=ovl/work/ 0 0 none /proc fuse.pwn user_id=1000 0 0 $ fusermount -u /proc $ cat /proc/mounts cat: /proc/mounts: No such file or directory This fixes the problem by adding new seq_show_option and seq_show_option_n helpers, and updating the vulnerable show_option handlers to use them as needed. Some, like SELinux, need to be open coded due to unusual existing escape mechanisms. Signed-off-by: Kees Cook Cc: stable@vger.kernel.org --- fs/ceph/super.c | 2 +- fs/cifs/cifsfs.c | 6 +++--- fs/ext3/super.c | 4 ++-- fs/ext4/super.c | 4 ++-- fs/gfs2/super.c | 6 +++--- fs/hfs/super.c | 4 ++-- fs/hfsplus/options.c | 4 ++-- fs/hostfs/hostfs_kern.c | 2 +- fs/ocfs2/super.c | 4 ++-- fs/overlayfs/super.c | 6 +++--- fs/reiserfs/super.c | 8 +++++--- fs/xfs/xfs_super.c | 4 ++-- include/linux/seq_file.h | 34 ++++++++++++++++++++++++++++++++++ kernel/cgroup.c | 7 ++++--- net/ceph/ceph_common.c | 7 +++++-- security/selinux/hooks.c | 2 +- 16 files changed, 72 insertions(+), 32 deletions(-) diff --git a/fs/ceph/super.c b/fs/ceph/super.c index d1c833c321b9..7b6bfcbf801c 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -479,7 +479,7 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT) seq_printf(m, ",readdir_max_bytes=%d", fsopt->max_readdir_bytes); if (strcmp(fsopt->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT)) - seq_printf(m, ",snapdirname=%s", fsopt->snapdir_name); + seq_show_option(m, "snapdirname", fsopt->snapdir_name); return 0; } diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 0a9fb6b53126..6a1119e87fbb 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -394,17 +394,17 @@ cifs_show_options(struct seq_file *s, struct dentry *root) struct sockaddr *srcaddr; srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr; - seq_printf(s, ",vers=%s", tcon->ses->server->vals->version_string); + seq_show_option(s, "vers", tcon->ses->server->vals->version_string); cifs_show_security(s, tcon->ses); cifs_show_cache_flavor(s, cifs_sb); if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) seq_puts(s, ",multiuser"); else if (tcon->ses->user_name) - seq_printf(s, ",username=%s", tcon->ses->user_name); + seq_show_option(s, "username", tcon->ses->user_name); if (tcon->ses->domainName) - seq_printf(s, ",domain=%s", tcon->ses->domainName); + seq_show_option(s, "domain", tcon->ses->domainName); if (srcaddr->sa_family != AF_UNSPEC) { struct sockaddr_in *saddr4; diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 5ed0044fbb37..e9312494f3ee 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -578,10 +578,10 @@ static inline void ext3_show_quota_options(struct seq_file *seq, struct super_bl } if (sbi->s_qf_names[USRQUOTA]) - seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); + seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]); if (sbi->s_qf_names[GRPQUOTA]) - seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); + seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]); if (test_opt(sb, USRQUOTA)) seq_puts(seq, ",usrquota"); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 58987b5c514b..9981064c4a54 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1763,10 +1763,10 @@ static inline void ext4_show_quota_options(struct seq_file *seq, } if (sbi->s_qf_names[USRQUOTA]) - seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); + seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]); if (sbi->s_qf_names[GRPQUOTA]) - seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); + seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]); #endif } diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 2982445947e1..894fb01a91da 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1334,11 +1334,11 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) if (is_ancestor(root, sdp->sd_master_dir)) seq_puts(s, ",meta"); if (args->ar_lockproto[0]) - seq_printf(s, ",lockproto=%s", args->ar_lockproto); + seq_show_option(s, "lockproto", args->ar_lockproto); if (args->ar_locktable[0]) - seq_printf(s, ",locktable=%s", args->ar_locktable); + seq_show_option(s, "locktable", args->ar_locktable); if (args->ar_hostdata[0]) - seq_printf(s, ",hostdata=%s", args->ar_hostdata); + seq_show_option(s, "hostdata", args->ar_hostdata); if (args->ar_spectator) seq_puts(s, ",spectator"); if (args->ar_localflocks) diff --git a/fs/hfs/super.c b/fs/hfs/super.c index 55c03b9e9070..4574fdd3d421 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c @@ -136,9 +136,9 @@ static int hfs_show_options(struct seq_file *seq, struct dentry *root) struct hfs_sb_info *sbi = HFS_SB(root->d_sb); if (sbi->s_creator != cpu_to_be32(0x3f3f3f3f)) - seq_printf(seq, ",creator=%.4s", (char *)&sbi->s_creator); + seq_show_option_n(seq, "creator", (char *)&sbi->s_creator, 4); if (sbi->s_type != cpu_to_be32(0x3f3f3f3f)) - seq_printf(seq, ",type=%.4s", (char *)&sbi->s_type); + seq_show_option_n(seq, "type", (char *)&sbi->s_type, 4); seq_printf(seq, ",uid=%u,gid=%u", from_kuid_munged(&init_user_ns, sbi->s_uid), from_kgid_munged(&init_user_ns, sbi->s_gid)); diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c index c90b72ee676d..bb806e58c977 100644 --- a/fs/hfsplus/options.c +++ b/fs/hfsplus/options.c @@ -218,9 +218,9 @@ int hfsplus_show_options(struct seq_file *seq, struct dentry *root) struct hfsplus_sb_info *sbi = HFSPLUS_SB(root->d_sb); if (sbi->creator != HFSPLUS_DEF_CR_TYPE) - seq_printf(seq, ",creator=%.4s", (char *)&sbi->creator); + seq_show_option_n(seq, "creator", (char *)&sbi->creator, 4); if (sbi->type != HFSPLUS_DEF_CR_TYPE) - seq_printf(seq, ",type=%.4s", (char *)&sbi->type); + seq_show_option_n(seq, "type", (char *)&sbi->type, 4); seq_printf(seq, ",umask=%o,uid=%u,gid=%u", sbi->umask, from_kuid_munged(&init_user_ns, sbi->uid), from_kgid_munged(&init_user_ns, sbi->gid)); diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 059597b23f67..2ac99db3750e 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -260,7 +260,7 @@ static int hostfs_show_options(struct seq_file *seq, struct dentry *root) size_t offset = strlen(root_ino) + 1; if (strlen(root_path) > offset) - seq_printf(seq, ",%s", root_path + offset); + seq_show_option(seq, root_path + offset, NULL); if (append) seq_puts(seq, ",append"); diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 403c5660b306..a482e312c7b2 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1550,8 +1550,8 @@ static int ocfs2_show_options(struct seq_file *s, struct dentry *root) seq_printf(s, ",localflocks,"); if (osb->osb_cluster_stack[0]) - seq_printf(s, ",cluster_stack=%.*s", OCFS2_STACK_LABEL_LEN, - osb->osb_cluster_stack); + seq_show_option_n(s, "cluster_stack", osb->osb_cluster_stack, + OCFS2_STACK_LABEL_LEN); if (opts & OCFS2_MOUNT_USRQUOTA) seq_printf(s, ",usrquota"); if (opts & OCFS2_MOUNT_GRPQUOTA) diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index 7466ff339c66..79073d68b475 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -588,10 +588,10 @@ static int ovl_show_options(struct seq_file *m, struct dentry *dentry) struct super_block *sb = dentry->d_sb; struct ovl_fs *ufs = sb->s_fs_info; - seq_printf(m, ",lowerdir=%s", ufs->config.lowerdir); + seq_show_option(m, "lowerdir", ufs->config.lowerdir); if (ufs->config.upperdir) { - seq_printf(m, ",upperdir=%s", ufs->config.upperdir); - seq_printf(m, ",workdir=%s", ufs->config.workdir); + seq_show_option(m, "upperdir", ufs->config.upperdir); + seq_show_option(m, "workdir", ufs->config.workdir); } return 0; } diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 0e4cf728126f..4a62fe8cc3bf 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -714,18 +714,20 @@ static int reiserfs_show_options(struct seq_file *seq, struct dentry *root) seq_puts(seq, ",acl"); if (REISERFS_SB(s)->s_jdev) - seq_printf(seq, ",jdev=%s", REISERFS_SB(s)->s_jdev); + seq_show_option(seq, "jdev", REISERFS_SB(s)->s_jdev); if (journal->j_max_commit_age != journal->j_default_max_commit_age) seq_printf(seq, ",commit=%d", journal->j_max_commit_age); #ifdef CONFIG_QUOTA if (REISERFS_SB(s)->s_qf_names[USRQUOTA]) - seq_printf(seq, ",usrjquota=%s", REISERFS_SB(s)->s_qf_names[USRQUOTA]); + seq_show_option(seq, "usrjquota", + REISERFS_SB(s)->s_qf_names[USRQUOTA]); else if (opts & (1 << REISERFS_USRQUOTA)) seq_puts(seq, ",usrquota"); if (REISERFS_SB(s)->s_qf_names[GRPQUOTA]) - seq_printf(seq, ",grpjquota=%s", REISERFS_SB(s)->s_qf_names[GRPQUOTA]); + seq_show_option(seq, "grpjquota", + REISERFS_SB(s)->s_qf_names[GRPQUOTA]); else if (opts & (1 << REISERFS_GRPQUOTA)) seq_puts(seq, ",grpquota"); if (REISERFS_SB(s)->s_jquota_fmt) { diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 1fb16562c159..bbd9b1f10ffb 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -511,9 +511,9 @@ xfs_showargs( seq_printf(m, "," MNTOPT_LOGBSIZE "=%dk", mp->m_logbsize >> 10); if (mp->m_logname) - seq_printf(m, "," MNTOPT_LOGDEV "=%s", mp->m_logname); + seq_show_option(m, MNTOPT_LOGDEV, mp->m_logname); if (mp->m_rtname) - seq_printf(m, "," MNTOPT_RTDEV "=%s", mp->m_rtname); + seq_show_option(m, MNTOPT_RTDEV, mp->m_rtname); if (mp->m_dalign > 0) seq_printf(m, "," MNTOPT_SUNIT "=%d", diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 912a7c482649..ff4c631348dd 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -149,6 +149,40 @@ static inline struct user_namespace *seq_user_ns(struct seq_file *seq) #endif } +/** + * seq_show_options - display mount options with appropriate escapes. + * @m: the seq_file handle + * @name: the mount option name + * @value: the mount option name's value, can be NULL + */ +static inline void seq_show_option(struct seq_file *m, char *name, char *value) +{ + seq_putc(m, ','); + seq_escape(m, name, ",= \t\n\\"); + if (value) { + seq_putc(m, '='); + seq_escape(m, value, ", \t\n\\"); + } +} + +/** + * seq_show_option_n - display mount options with appropriate escapes + * where @value must be a specific length. + * @m: the seq_file handle + * @name: the mount option name + * @value: the mount option name's value, cannot be NULL + * @length: the length of @value to display + * + * This is a macro since this uses "length" to define the size of the + * stack buffer. + */ +#define seq_show_option_n(m, name, value, length) { \ + char val_buf[length + 1]; \ + strncpy(val_buf, value, length); \ + val_buf[length] = '\0'; \ + seq_show_option(m, name, val_buf); \ +} + #define SEQ_START_TOKEN ((void *)1) /* * Helpers for iteration over list_head-s in seq_files diff --git a/kernel/cgroup.c b/kernel/cgroup.c index f89d9292eee6..c6c4240e7d28 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -1334,7 +1334,7 @@ static int cgroup_show_options(struct seq_file *seq, for_each_subsys(ss, ssid) if (root->subsys_mask & (1 << ssid)) - seq_printf(seq, ",%s", ss->name); + seq_show_option(seq, ss->name, NULL); if (root->flags & CGRP_ROOT_NOPREFIX) seq_puts(seq, ",noprefix"); if (root->flags & CGRP_ROOT_XATTR) @@ -1342,13 +1342,14 @@ static int cgroup_show_options(struct seq_file *seq, spin_lock(&release_agent_path_lock); if (strlen(root->release_agent_path)) - seq_printf(seq, ",release_agent=%s", root->release_agent_path); + seq_show_option(seq, "release_agent", + root->release_agent_path); spin_unlock(&release_agent_path_lock); if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags)) seq_puts(seq, ",clone_children"); if (strlen(root->name)) - seq_printf(seq, ",name=%s", root->name); + seq_show_option(seq, "name", root->name); return 0; } diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index f30329f72641..b2197e17a742 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c @@ -517,8 +517,11 @@ int ceph_print_client_options(struct seq_file *m, struct ceph_client *client) struct ceph_options *opt = client->options; size_t pos = m->count; - if (opt->name) - seq_printf(m, "name=%s,", opt->name); + if (opt->name) { + seq_puts(m, "name="); + seq_escape(m, opt->name, ", \t\n\\"); + seq_putc(','); + } if (opt->key) seq_puts(m, "secret=,"); diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 564079c5c49d..cdf4c589a391 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -1100,7 +1100,7 @@ static void selinux_write_opts(struct seq_file *m, seq_puts(m, prefix); if (has_comma) seq_putc(m, '\"'); - seq_puts(m, opts->mnt_opts[i]); + seq_escape(m, opts->mnt_opts[i], "\"\n\\"); if (has_comma) seq_putc(m, '\"'); } -- 1.9.1 -- Kees Cook Chrome OS Security From xfs@tlinx.org Fri Aug 7 19:50:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 06E0D7CBF for ; Fri, 7 Aug 2015 19:50:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CE53B8F8037 for ; Fri, 7 Aug 2015 17:50:51 -0700 (PDT) X-ASG-Debug-ID: 1438995050-04bdf06bd228a7e0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id 7OrvkbTSSIz75fsq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 17:50:50 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t780oj0m028642; Fri, 7 Aug 2015 17:50:48 -0700 Message-ID: <55C55265.4080309@tlinx.org> Date: Fri, 07 Aug 2015 17:50:45 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> <20150807225531.GG3902@dastard> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <20150807225531.GG3902@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1438995050 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Dave Chinner wrote: > xfsprogs 3.1.11 doesn't support CRCs. 3.2.0 was the first version of > xfsprogs to support CRCs, and 3.2.1 (IIRC) was the first to support > finobt, so the make binary came from a different build to the xfs_db > binary that xfs_admin executes. ---- I'll have to do some research on this. Q: should the versions of xfsdump&restore be the same as the rest of the xfsprogs? From serge@mail.hallyn.com Fri Aug 7 20:33:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD6987F51 for ; Fri, 7 Aug 2015 20:33:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE0FD304043 for ; Fri, 7 Aug 2015 18:33:20 -0700 (PDT) X-ASG-Debug-ID: 1438997597-04cbb0416f2cefa0001-NocioJ Received: from h2.hallyn.com (h2.hallyn.com [78.46.35.8]) by cuda.sgi.com with ESMTP id 72PHTe05U7v0XHkk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 18:33:18 -0700 (PDT) X-Barracuda-Envelope-From: serge@mail.hallyn.com X-Barracuda-Apparent-Source-IP: 78.46.35.8 Received: by h2.hallyn.com (Postfix, from userid 1001) id D81F3120AE4; Fri, 7 Aug 2015 20:33:16 -0500 (CDT) Date: Fri, 7 Aug 2015 20:33:16 -0500 From: "Serge E. Hallyn" To: Kees Cook Cc: Andrew Morton , "Yan, Zheng" , Sage Weil , Ilya Dryomov , Steve French , Jan Kara , Andreas Dilger , Theodore Ts'o , Steven Whitehouse , Bob Peterson , Jeff Dike , Richard Weinberger , Mark Fasheh , Joel Becker , Miklos Szeredi , Dave Chinner , xfs@oss.sgi.com, Tejun Heo , Li Zefan , Johannes Weiner , "David S. Miller" , Paul Moore , Stephen Smalley , Eric Paris , James Morris , "Serge E. Hallyn" , Jens Axboe , Fabian Frederick , Christoph Hellwig , Firo Yang , David Howells , Jiri Slaby , Al Viro , Joe Perches , Steven Rostedt , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] fs: create and use seq_show_option for escaping Message-ID: <20150808013316.GA22864@mail.hallyn.com> X-ASG-Orig-Subj: Re: [PATCH] fs: create and use seq_show_option for escaping References: <20150807234150.GA11735@www.outflux.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150807234150.GA11735@www.outflux.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: h2.hallyn.com[78.46.35.8] X-Barracuda-Start-Time: 1438997598 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 07, 2015 at 04:41:50PM -0700, Kees Cook wrote: > Many file systems that implement the show_options hook fail to correctly > escape their output which could lead to unescaped characters (e.g. new > lines) leaking into /proc/mounts and /proc/[pid]/mountinfo files. This > could lead to confusion, spoofed entries (resulting in things like > systemd issuing false d-bus "mount" notifications), and who knows > what else. This looks like it would only be the root user stepping on > themselves, but it's possible weird things could happen in containers > or in other situations with delegated mount privileges. > > Here's an example using overlay with setuid fusermount trusting the > contents of /proc/mounts (via the /etc/mtab symlink). Imagine the use of > "sudo" is something more sneaky: > > $ BASE="ovl" > $ MNT="$BASE/mnt" > $ LOW="$BASE/lower" > $ UP="$BASE/upper" > $ WORK="$BASE/work/ 0 0 > none /proc fuse.pwn user_id=1000" > $ mkdir -p "$LOW" "$UP" "$WORK" > $ sudo mount -t overlay -o "lowerdir=$LOW,upperdir=$UP,workdir=$WORK" none /mnt > $ cat /proc/mounts > none /root/ovl/mnt overlay rw,relatime,lowerdir=ovl/lower,upperdir=ovl/upper,workdir=ovl/work/ 0 0 > none /proc fuse.pwn user_id=1000 0 0 > $ fusermount -u /proc > $ cat /proc/mounts > cat: /proc/mounts: No such file or directory > > This fixes the problem by adding new seq_show_option and seq_show_option_n > helpers, and updating the vulnerable show_option handlers to use them as > needed. Some, like SELinux, need to be open coded due to unusual existing > escape mechanisms. > > Signed-off-by: Kees Cook > Cc: stable@vger.kernel.org Acked-by: Serge Hallyn > --- > fs/ceph/super.c | 2 +- > fs/cifs/cifsfs.c | 6 +++--- > fs/ext3/super.c | 4 ++-- > fs/ext4/super.c | 4 ++-- > fs/gfs2/super.c | 6 +++--- > fs/hfs/super.c | 4 ++-- > fs/hfsplus/options.c | 4 ++-- > fs/hostfs/hostfs_kern.c | 2 +- > fs/ocfs2/super.c | 4 ++-- > fs/overlayfs/super.c | 6 +++--- > fs/reiserfs/super.c | 8 +++++--- > fs/xfs/xfs_super.c | 4 ++-- > include/linux/seq_file.h | 34 ++++++++++++++++++++++++++++++++++ > kernel/cgroup.c | 7 ++++--- > net/ceph/ceph_common.c | 7 +++++-- > security/selinux/hooks.c | 2 +- > 16 files changed, 72 insertions(+), 32 deletions(-) > > diff --git a/fs/ceph/super.c b/fs/ceph/super.c > index d1c833c321b9..7b6bfcbf801c 100644 > --- a/fs/ceph/super.c > +++ b/fs/ceph/super.c > @@ -479,7 +479,7 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) > if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT) > seq_printf(m, ",readdir_max_bytes=%d", fsopt->max_readdir_bytes); > if (strcmp(fsopt->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT)) > - seq_printf(m, ",snapdirname=%s", fsopt->snapdir_name); > + seq_show_option(m, "snapdirname", fsopt->snapdir_name); > > return 0; > } > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 0a9fb6b53126..6a1119e87fbb 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -394,17 +394,17 @@ cifs_show_options(struct seq_file *s, struct dentry *root) > struct sockaddr *srcaddr; > srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr; > > - seq_printf(s, ",vers=%s", tcon->ses->server->vals->version_string); > + seq_show_option(s, "vers", tcon->ses->server->vals->version_string); > cifs_show_security(s, tcon->ses); > cifs_show_cache_flavor(s, cifs_sb); > > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) > seq_puts(s, ",multiuser"); > else if (tcon->ses->user_name) > - seq_printf(s, ",username=%s", tcon->ses->user_name); > + seq_show_option(s, "username", tcon->ses->user_name); > > if (tcon->ses->domainName) > - seq_printf(s, ",domain=%s", tcon->ses->domainName); > + seq_show_option(s, "domain", tcon->ses->domainName); > > if (srcaddr->sa_family != AF_UNSPEC) { > struct sockaddr_in *saddr4; > diff --git a/fs/ext3/super.c b/fs/ext3/super.c > index 5ed0044fbb37..e9312494f3ee 100644 > --- a/fs/ext3/super.c > +++ b/fs/ext3/super.c > @@ -578,10 +578,10 @@ static inline void ext3_show_quota_options(struct seq_file *seq, struct super_bl > } > > if (sbi->s_qf_names[USRQUOTA]) > - seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); > + seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]); > > if (sbi->s_qf_names[GRPQUOTA]) > - seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); > + seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]); > > if (test_opt(sb, USRQUOTA)) > seq_puts(seq, ",usrquota"); > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index 58987b5c514b..9981064c4a54 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -1763,10 +1763,10 @@ static inline void ext4_show_quota_options(struct seq_file *seq, > } > > if (sbi->s_qf_names[USRQUOTA]) > - seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); > + seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]); > > if (sbi->s_qf_names[GRPQUOTA]) > - seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); > + seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]); > #endif > } > > diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c > index 2982445947e1..894fb01a91da 100644 > --- a/fs/gfs2/super.c > +++ b/fs/gfs2/super.c > @@ -1334,11 +1334,11 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) > if (is_ancestor(root, sdp->sd_master_dir)) > seq_puts(s, ",meta"); > if (args->ar_lockproto[0]) > - seq_printf(s, ",lockproto=%s", args->ar_lockproto); > + seq_show_option(s, "lockproto", args->ar_lockproto); > if (args->ar_locktable[0]) > - seq_printf(s, ",locktable=%s", args->ar_locktable); > + seq_show_option(s, "locktable", args->ar_locktable); > if (args->ar_hostdata[0]) > - seq_printf(s, ",hostdata=%s", args->ar_hostdata); > + seq_show_option(s, "hostdata", args->ar_hostdata); > if (args->ar_spectator) > seq_puts(s, ",spectator"); > if (args->ar_localflocks) > diff --git a/fs/hfs/super.c b/fs/hfs/super.c > index 55c03b9e9070..4574fdd3d421 100644 > --- a/fs/hfs/super.c > +++ b/fs/hfs/super.c > @@ -136,9 +136,9 @@ static int hfs_show_options(struct seq_file *seq, struct dentry *root) > struct hfs_sb_info *sbi = HFS_SB(root->d_sb); > > if (sbi->s_creator != cpu_to_be32(0x3f3f3f3f)) > - seq_printf(seq, ",creator=%.4s", (char *)&sbi->s_creator); > + seq_show_option_n(seq, "creator", (char *)&sbi->s_creator, 4); > if (sbi->s_type != cpu_to_be32(0x3f3f3f3f)) > - seq_printf(seq, ",type=%.4s", (char *)&sbi->s_type); > + seq_show_option_n(seq, "type", (char *)&sbi->s_type, 4); > seq_printf(seq, ",uid=%u,gid=%u", > from_kuid_munged(&init_user_ns, sbi->s_uid), > from_kgid_munged(&init_user_ns, sbi->s_gid)); > diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c > index c90b72ee676d..bb806e58c977 100644 > --- a/fs/hfsplus/options.c > +++ b/fs/hfsplus/options.c > @@ -218,9 +218,9 @@ int hfsplus_show_options(struct seq_file *seq, struct dentry *root) > struct hfsplus_sb_info *sbi = HFSPLUS_SB(root->d_sb); > > if (sbi->creator != HFSPLUS_DEF_CR_TYPE) > - seq_printf(seq, ",creator=%.4s", (char *)&sbi->creator); > + seq_show_option_n(seq, "creator", (char *)&sbi->creator, 4); > if (sbi->type != HFSPLUS_DEF_CR_TYPE) > - seq_printf(seq, ",type=%.4s", (char *)&sbi->type); > + seq_show_option_n(seq, "type", (char *)&sbi->type, 4); > seq_printf(seq, ",umask=%o,uid=%u,gid=%u", sbi->umask, > from_kuid_munged(&init_user_ns, sbi->uid), > from_kgid_munged(&init_user_ns, sbi->gid)); > diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c > index 059597b23f67..2ac99db3750e 100644 > --- a/fs/hostfs/hostfs_kern.c > +++ b/fs/hostfs/hostfs_kern.c > @@ -260,7 +260,7 @@ static int hostfs_show_options(struct seq_file *seq, struct dentry *root) > size_t offset = strlen(root_ino) + 1; > > if (strlen(root_path) > offset) > - seq_printf(seq, ",%s", root_path + offset); > + seq_show_option(seq, root_path + offset, NULL); > > if (append) > seq_puts(seq, ",append"); > diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c > index 403c5660b306..a482e312c7b2 100644 > --- a/fs/ocfs2/super.c > +++ b/fs/ocfs2/super.c > @@ -1550,8 +1550,8 @@ static int ocfs2_show_options(struct seq_file *s, struct dentry *root) > seq_printf(s, ",localflocks,"); > > if (osb->osb_cluster_stack[0]) > - seq_printf(s, ",cluster_stack=%.*s", OCFS2_STACK_LABEL_LEN, > - osb->osb_cluster_stack); > + seq_show_option_n(s, "cluster_stack", osb->osb_cluster_stack, > + OCFS2_STACK_LABEL_LEN); > if (opts & OCFS2_MOUNT_USRQUOTA) > seq_printf(s, ",usrquota"); > if (opts & OCFS2_MOUNT_GRPQUOTA) > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index 7466ff339c66..79073d68b475 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -588,10 +588,10 @@ static int ovl_show_options(struct seq_file *m, struct dentry *dentry) > struct super_block *sb = dentry->d_sb; > struct ovl_fs *ufs = sb->s_fs_info; > > - seq_printf(m, ",lowerdir=%s", ufs->config.lowerdir); > + seq_show_option(m, "lowerdir", ufs->config.lowerdir); > if (ufs->config.upperdir) { > - seq_printf(m, ",upperdir=%s", ufs->config.upperdir); > - seq_printf(m, ",workdir=%s", ufs->config.workdir); > + seq_show_option(m, "upperdir", ufs->config.upperdir); > + seq_show_option(m, "workdir", ufs->config.workdir); > } > return 0; > } > diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c > index 0e4cf728126f..4a62fe8cc3bf 100644 > --- a/fs/reiserfs/super.c > +++ b/fs/reiserfs/super.c > @@ -714,18 +714,20 @@ static int reiserfs_show_options(struct seq_file *seq, struct dentry *root) > seq_puts(seq, ",acl"); > > if (REISERFS_SB(s)->s_jdev) > - seq_printf(seq, ",jdev=%s", REISERFS_SB(s)->s_jdev); > + seq_show_option(seq, "jdev", REISERFS_SB(s)->s_jdev); > > if (journal->j_max_commit_age != journal->j_default_max_commit_age) > seq_printf(seq, ",commit=%d", journal->j_max_commit_age); > > #ifdef CONFIG_QUOTA > if (REISERFS_SB(s)->s_qf_names[USRQUOTA]) > - seq_printf(seq, ",usrjquota=%s", REISERFS_SB(s)->s_qf_names[USRQUOTA]); > + seq_show_option(seq, "usrjquota", > + REISERFS_SB(s)->s_qf_names[USRQUOTA]); > else if (opts & (1 << REISERFS_USRQUOTA)) > seq_puts(seq, ",usrquota"); > if (REISERFS_SB(s)->s_qf_names[GRPQUOTA]) > - seq_printf(seq, ",grpjquota=%s", REISERFS_SB(s)->s_qf_names[GRPQUOTA]); > + seq_show_option(seq, "grpjquota", > + REISERFS_SB(s)->s_qf_names[GRPQUOTA]); > else if (opts & (1 << REISERFS_GRPQUOTA)) > seq_puts(seq, ",grpquota"); > if (REISERFS_SB(s)->s_jquota_fmt) { > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 1fb16562c159..bbd9b1f10ffb 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -511,9 +511,9 @@ xfs_showargs( > seq_printf(m, "," MNTOPT_LOGBSIZE "=%dk", mp->m_logbsize >> 10); > > if (mp->m_logname) > - seq_printf(m, "," MNTOPT_LOGDEV "=%s", mp->m_logname); > + seq_show_option(m, MNTOPT_LOGDEV, mp->m_logname); > if (mp->m_rtname) > - seq_printf(m, "," MNTOPT_RTDEV "=%s", mp->m_rtname); > + seq_show_option(m, MNTOPT_RTDEV, mp->m_rtname); > > if (mp->m_dalign > 0) > seq_printf(m, "," MNTOPT_SUNIT "=%d", > diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h > index 912a7c482649..ff4c631348dd 100644 > --- a/include/linux/seq_file.h > +++ b/include/linux/seq_file.h > @@ -149,6 +149,40 @@ static inline struct user_namespace *seq_user_ns(struct seq_file *seq) > #endif > } > > +/** > + * seq_show_options - display mount options with appropriate escapes. > + * @m: the seq_file handle > + * @name: the mount option name > + * @value: the mount option name's value, can be NULL > + */ > +static inline void seq_show_option(struct seq_file *m, char *name, char *value) > +{ > + seq_putc(m, ','); > + seq_escape(m, name, ",= \t\n\\"); > + if (value) { > + seq_putc(m, '='); > + seq_escape(m, value, ", \t\n\\"); > + } > +} > + > +/** > + * seq_show_option_n - display mount options with appropriate escapes > + * where @value must be a specific length. > + * @m: the seq_file handle > + * @name: the mount option name > + * @value: the mount option name's value, cannot be NULL > + * @length: the length of @value to display > + * > + * This is a macro since this uses "length" to define the size of the > + * stack buffer. > + */ > +#define seq_show_option_n(m, name, value, length) { \ > + char val_buf[length + 1]; \ > + strncpy(val_buf, value, length); \ > + val_buf[length] = '\0'; \ > + seq_show_option(m, name, val_buf); \ > +} > + > #define SEQ_START_TOKEN ((void *)1) > /* > * Helpers for iteration over list_head-s in seq_files > diff --git a/kernel/cgroup.c b/kernel/cgroup.c > index f89d9292eee6..c6c4240e7d28 100644 > --- a/kernel/cgroup.c > +++ b/kernel/cgroup.c > @@ -1334,7 +1334,7 @@ static int cgroup_show_options(struct seq_file *seq, > > for_each_subsys(ss, ssid) > if (root->subsys_mask & (1 << ssid)) > - seq_printf(seq, ",%s", ss->name); > + seq_show_option(seq, ss->name, NULL); > if (root->flags & CGRP_ROOT_NOPREFIX) > seq_puts(seq, ",noprefix"); > if (root->flags & CGRP_ROOT_XATTR) > @@ -1342,13 +1342,14 @@ static int cgroup_show_options(struct seq_file *seq, > > spin_lock(&release_agent_path_lock); > if (strlen(root->release_agent_path)) > - seq_printf(seq, ",release_agent=%s", root->release_agent_path); > + seq_show_option(seq, "release_agent", > + root->release_agent_path); > spin_unlock(&release_agent_path_lock); > > if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags)) > seq_puts(seq, ",clone_children"); > if (strlen(root->name)) > - seq_printf(seq, ",name=%s", root->name); > + seq_show_option(seq, "name", root->name); > return 0; > } > > diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c > index f30329f72641..b2197e17a742 100644 > --- a/net/ceph/ceph_common.c > +++ b/net/ceph/ceph_common.c > @@ -517,8 +517,11 @@ int ceph_print_client_options(struct seq_file *m, struct ceph_client *client) > struct ceph_options *opt = client->options; > size_t pos = m->count; > > - if (opt->name) > - seq_printf(m, "name=%s,", opt->name); > + if (opt->name) { > + seq_puts(m, "name="); > + seq_escape(m, opt->name, ", \t\n\\"); > + seq_putc(','); > + } > if (opt->key) > seq_puts(m, "secret=,"); > > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c > index 564079c5c49d..cdf4c589a391 100644 > --- a/security/selinux/hooks.c > +++ b/security/selinux/hooks.c > @@ -1100,7 +1100,7 @@ static void selinux_write_opts(struct seq_file *m, > seq_puts(m, prefix); > if (has_comma) > seq_putc(m, '\"'); > - seq_puts(m, opts->mnt_opts[i]); > + seq_escape(m, opts->mnt_opts[i], "\"\n\\"); > if (has_comma) > seq_putc(m, '\"'); > } > -- > 1.9.1 > > > -- > Kees Cook > Chrome OS Security From sandeen@sandeen.net Fri Aug 7 20:45:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8350C7F51 for ; Fri, 7 Aug 2015 20:45:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1CC72AC006 for ; Fri, 7 Aug 2015 18:45:12 -0700 (PDT) X-ASG-Debug-ID: 1438998310-04cb6c673e3511b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id c4dFCP7mzZVRShF0 for ; Fri, 07 Aug 2015 18:45:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [192.168.1.100] (unknown [64.146.202.138]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9FA1363C6061; Fri, 7 Aug 2015 20:45:09 -0500 (CDT) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (1.0) Subject: Re: why crc req on free-inobt & file-type-indir options? From: Eric Sandeen X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? X-Mailer: iPhone Mail (12H143) In-Reply-To: <55C55265.4080309@tlinx.org> Date: Fri, 7 Aug 2015 18:45:07 -0700 Cc: Dave Chinner , xfs-oss Content-Transfer-Encoding: quoted-printable Message-Id: <620A4212-818A-4375-90FC-DBB0B91A84DB@sandeen.net> References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> <20150807225531.GG3902@dastard> <55C55265.4080309@tlinx.org> To: "L.A. Walsh" X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1438998310 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.42 X-Barracuda-Spam-Status: No, SCORE=1.42 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars > On Aug 7, 2015, at 5:50 PM, L.A. Walsh wrote: >=20 >=20 >=20 > Dave Chinner wrote: >=20 >> xfsprogs 3.1.11 doesn't support CRCs. 3.2.0 was the first version of >> xfsprogs to support CRCs, and 3.2.1 (IIRC) was the first to support >> finobt, so the make binary came from a different build to the xfs_db >> binary that xfs_admin executes. > ---- > I'll have to do some research on this. >=20 > Q: should the versions of xfsdump&restore be the same as the rest of the x= fsprogs? Nope, they are separate packages with separate versioning. -Eric >=20 From xfs@tlinx.org Fri Aug 7 21:59:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B83677F51 for ; Fri, 7 Aug 2015 21:59:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 98FDE304043 for ; Fri, 7 Aug 2015 19:59:51 -0700 (PDT) X-ASG-Debug-ID: 1439002788-04cbb0416e2d0ab0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id HQutTtOBMzV5ciuV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Aug 2015 19:59:49 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t782xhRl040542; Fri, 7 Aug 2015 19:59:45 -0700 Message-ID: <55C5709F.8030705@tlinx.org> Date: Fri, 07 Aug 2015 19:59:43 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: Eric Sandeen CC: Dave Chinner , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> <20150807225531.GG3902@dastard> <55C55265.4080309@tlinx.org> <620A4212-818A-4375-90FC-DBB0B91A84DB@sandeen.net> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <620A4212-818A-4375-90FC-DBB0B91A84DB@sandeen.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1439002789 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Eric Sandeen wrote: > >> On Aug 7, 2015, at 5:50 PM, L.A. Walsh wrote: >> Q: should the versions of xfsdump&restore be the same as the rest of the xfsprogs? > Nope, they are separate packages with separate versioning. --- I see. So how does one tell which version of xfsdump/restore should be used to "safely" dump (and restore) a file system made with version i.j.k of xfsprogs(mkfs.xfs) ? Or is that possible? From hooanon05g@gmail.com Sat Aug 8 11:42:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E08247CBE for ; Sat, 8 Aug 2015 11:42:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68450AC006 for ; Sat, 8 Aug 2015 09:42:00 -0700 (PDT) X-ASG-Debug-ID: 1439052117-04cbb0416c2dbfb0001-NocioJ Received: from mail05-md.ns.itscom.net (mail05-md.ns.itscom.net [175.177.155.115]) by cuda.sgi.com with ESMTP id IfEXUIbR9xbtp7xM for ; Sat, 08 Aug 2015 09:41:58 -0700 (PDT) X-Barracuda-Envelope-From: hooanon05g@gmail.com X-Barracuda-Apparent-Source-IP: 175.177.155.115 Received: from scan04-mds.s.noc.itscom.net (scan04-md.ns.itscom.net [175.177.155.125]) by mail05-md-outgoing.ns.itscom.net (Postfix) with ESMTP id BC4AC6584C9; Sun, 9 Aug 2015 01:41:56 +0900 (JST) Received: from unknown (HELO mail01-md-outgoing.ns.itscom.net) ([175.177.155.111]) by scan04-mds.s.noc.itscom.net with ESMTP; 09 Aug 2015 01:41:55 +0900 Received: from jromail.nowhere (h175-177-087-162.catv02.itscom.jp [175.177.87.162]) by mail01-md-outgoing.ns.itscom.net (Postfix) with ESMTP; Sun, 9 Aug 2015 01:41:55 +0900 (JST) Received: from jro by jrobl id 1ZO7Bz-0002L7-IM ; Sun, 09 Aug 2015 01:41:55 +0900 From: "J. R. Okajima" Subject: Re: [PATCH] fs: create and use seq_show_option for escaping To: Kees Cook X-ASG-Orig-Subj: Re: [PATCH] fs: create and use seq_show_option for escaping Cc: Andrew Morton , "Yan, Zheng" , Sage Weil , Ilya Dryomov , Steve French , Jan Kara , Andreas Dilger , "Theodore Ts'o" , Steven Whitehouse , Bob Peterson , Jeff Dike , Richard Weinberger , Mark Fasheh , Joel Becker , Miklos Szeredi , Dave Chinner , xfs@oss.sgi.com, Tejun Heo , Li Zefan , Johannes Weiner , "David S. Miller" , Paul Moore , Stephen Smalley , Eric Paris , James Morris , "Serge E. Hallyn" , Jens Axboe , Fabian Frederick , Christoph Hellwig , Firo Yang , David Howells , Jiri Slaby , Al Viro , Joe Perches , Steven Rostedt , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20150807234150.GA11735@www.outflux.net> References: <20150807234150.GA11735@www.outflux.net> Date: Sun, 09 Aug 2015 01:41:55 +0900 Message-ID: <8996.1439052115@jrobl> X-Barracuda-Connect: mail05-md.ns.itscom.net[175.177.155.115] X-Barracuda-Start-Time: 1439052118 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Kees Cook: > This fixes the problem by adding new seq_show_option and seq_show_option_n > helpers, and updating the vulnerable show_option handlers to use them as > needed. Some, like SELinux, need to be open coded due to unusual existing > escape mechanisms. How about other ctrl chars such as CR or FF? I am using the similar function for many years, and it might be more generic because it supports all cntrl chars other than "\t\n\\" (see below). Many of other ctrl chars may not be necessary. But some people uses non-ASCII chars for their pathnames which may contain ESC or other chars. Any crazy chars can corrupt the output of /proc/mount and others. So it might be better to consider all ctrl chars. ---------------------------------------------------------------------- static char au_esc_chars[0x20 + 3]; /* 0x01-0x20, backslash, del, and NULL */ int au_seq_path(struct seq_file *seq, struct path *path) { return seq_path(seq, path, au_esc_chars); } module_init(void) { ::: p = au_esc_chars; for (i = 1; i <= ' '; i++) *p++ = i; *p++ = '\\'; *p++ = '\x7f'; *p = 0; ::: } J. R. Okajima From keescook@google.com Sat Aug 8 14:31:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3C737CBE for ; Sat, 8 Aug 2015 14:31:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A021304043 for ; Sat, 8 Aug 2015 12:31:03 -0700 (PDT) X-ASG-Debug-ID: 1439062261-04bdf06bd029f570001-NocioJ Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id mXXD2WkNfAz9oH2Z (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 08 Aug 2015 12:31:01 -0700 (PDT) X-Barracuda-Envelope-From: keescook@google.com Received: by ioii16 with SMTP id i16so138827003ioi.0 for ; Sat, 08 Aug 2015 12:31:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=pWDyH2ptYO9tlRNygaUYpTt2mzt88STvcxo/ALJCu/E=; b=G5hETnSFkBoUhCFEh1g8ZiyBODhGR2wyLTCjNP84+bE1zvkaDtR8LTAh16/bEDRi2a a9/6KzGASwrE1CB8IVgXzbl4ZaOuMKlVrbGKrwbPtm4TeFHFH0vSBOF9i0D0srRW5rSY 811VIK38DVRFlGDBCjru2sy5Fs5Dn5sNtjzx4wxbsPQVPwlMLPyIYT3MbCLPwNH21PNV XmKbk4NgljDLAhw5JI99vn6hV1tgAE6Du1nNfT8bDBBiFHaYy672b13Fsq9DgmGwvccL NPLTePT3dQsbRsCWY/xIFVcxByz4jhh49TwMj8gcvcRXt9Z+8jLT/X4597LW18jli7IS o8Gw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=pWDyH2ptYO9tlRNygaUYpTt2mzt88STvcxo/ALJCu/E=; b=QdhbwRtJhTD+Q38BHcK5KgltmDm4uevJWysj0TS/Xt2z1dJZceSU9REB0+g5KT/tYb hVPpuoILW/XGLsL2P8Kvh/DqFlvhPIU/+EsvhDg7cuWDzJ7CrmRB0r1YmUFR7sKZjZko hQSuP/dl66XqBd87TOOjxSEfKFD/MkDhX6kkc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=pWDyH2ptYO9tlRNygaUYpTt2mzt88STvcxo/ALJCu/E=; b=IQFicWg5gFVIbY/NEjfltmjn7ZxAsJDU6TTpK2jnjIqx8WdqFCVpzbgjgvqd3UDizE 7SNeOa8q/8Z5Yj4hkBTnPoEd0ZYYpGxZkSBTp6z6d+/UrMseD2ji1i6SFI+1WBKi1xbl XlSZAsmpbp+q89EZ+a/O0dzNp/ISlvJly4rmMPEsOUZGsDhHCKv38vx+6p/3M3P3oCci KNPCbKdhqqHj4rtaNE0SZ19PwklaR637MVK42e85x8cJ2MX2NcZuCOKlwQMDH4AQw9cD OuvJa6BjhElm0+WXJNBCBcbI8l38oZQ9uTp/g5xR9a5m6rszYpOSwlHLaoOq+XmTMibv M1Bg== X-Gm-Message-State: ALoCoQleWi4KqB74hSiU9gRN5rDuZyvFHpmODso0p0O3FvvxajKDSdwLh6epn0gx9mQJFfZLhfFY MIME-Version: 1.0 X-Received: by 10.107.149.11 with SMTP id x11mr13890577iod.141.1439062260626; Sat, 08 Aug 2015 12:31:00 -0700 (PDT) Sender: keescook@google.com Received: by 10.64.60.130 with HTTP; Sat, 8 Aug 2015 12:31:00 -0700 (PDT) In-Reply-To: <8996.1439052115@jrobl> References: <20150807234150.GA11735@www.outflux.net> <8996.1439052115@jrobl> Date: Sat, 8 Aug 2015 12:31:00 -0700 X-Google-Sender-Auth: lc1ETbtXwcAYrZ4RAqVgfuNMRwg Message-ID: Subject: Re: [PATCH] fs: create and use seq_show_option for escaping From: Kees Cook X-ASG-Orig-Subj: Re: [PATCH] fs: create and use seq_show_option for escaping To: "J. R. Okajima" Cc: Andrew Morton , "Yan, Zheng" , Sage Weil , Ilya Dryomov , Steve French , Jan Kara , Andreas Dilger , "Theodore Ts'o" , Steven Whitehouse , Bob Peterson , Jeff Dike , Richard Weinberger , Mark Fasheh , Joel Becker , Miklos Szeredi , Dave Chinner , xfs@oss.sgi.com, Tejun Heo , Li Zefan , Johannes Weiner , "David S. Miller" , Paul Moore , Stephen Smalley , Eric Paris , James Morris , "Serge E. Hallyn" , Jens Axboe , Fabian Frederick , Christoph Hellwig , Firo Yang , David Howells , Jiri Slaby , Al Viro , Joe Perches , Steven Rostedt , "linux-fsdevel@vger.kernel.org" , LKML Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-io0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1439062261 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, Aug 8, 2015 at 9:41 AM, J. R. Okajima wrote: > > Kees Cook: >> This fixes the problem by adding new seq_show_option and seq_show_option_n >> helpers, and updating the vulnerable show_option handlers to use them as >> needed. Some, like SELinux, need to be open coded due to unusual existing >> escape mechanisms. > > How about other ctrl chars such as CR or FF? > I am using the similar function for many years, and it might be more > generic because it supports all cntrl chars other than "\t\n\\" (see > below). > > Many of other ctrl chars may not be necessary. But some people uses > non-ASCII chars for their pathnames which may contain ESC or other > chars. Any crazy chars can corrupt the output of /proc/mount and > others. So it might be better to consider all ctrl chars. While that's generally true, it's the consumers of mounts and mountinfo that we need to worry about, and for those, it's only the delimiters that we need to be concerned about (space, tab, newline, and escapes). However, since these consumers are expecting to deal with escapes, we could, at any time, add new classes of characters to be escaped. For this change, though, I wanted to keep it minimal for easiest backporting. -Kees -- Kees Cook Chrome OS Security From david@fromorbit.com Sat Aug 8 19:13:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C9357CBE for ; Sat, 8 Aug 2015 19:13:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 027188F8035 for ; Sat, 8 Aug 2015 17:13:20 -0700 (PDT) X-ASG-Debug-ID: 1439079194-04bdf06bcf2a2f00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id q41GwZidrHkS2nxG for ; Sat, 08 Aug 2015 17:13:15 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AACQBrmsZVPOUbLHlbgxuBPYZSoxkBAQEBAQEGmiyBCgICAQECgR9NAQEBAQEBBwEBAQFAAT+EJAEBBDocIxAIAxgJJQ8FJQMHGhOILc0AAQsgGYYGhTKFCQeELAEElQuMYIFMhzyQeIQ1LDGCTAEBAQ Received: from ppp121-44-27-229.lns20.syd4.internode.on.net (HELO dastard) ([121.44.27.229]) by ipmail06.adl6.internode.on.net with ESMTP; 09 Aug 2015 09:41:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZOED2-00075F-18; Sun, 09 Aug 2015 10:11:28 +1000 Date: Sun, 9 Aug 2015 10:11:28 +1000 From: Dave Chinner To: "L.A. Walsh" Cc: Eric Sandeen , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? Message-ID: <20150809001127.GI3902@dastard> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> <20150807225531.GG3902@dastard> <55C55265.4080309@tlinx.org> <620A4212-818A-4375-90FC-DBB0B91A84DB@sandeen.net> <55C5709F.8030705@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C5709F.8030705@tlinx.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439079194 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21468 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 07, 2015 at 07:59:43PM -0700, L.A. Walsh wrote: > > > Eric Sandeen wrote: > > > >>On Aug 7, 2015, at 5:50 PM, L.A. Walsh wrote: > >>Q: should the versions of xfsdump&restore be the same as the rest of the xfsprogs? > >Nope, they are separate packages with separate versioning. > --- > I see. So how does one tell which version of xfsdump/restore should > be used to "safely" dump (and restore) a file system made > with version i.j.k of xfsprogs(mkfs.xfs) ? Or is that possible? xfsdump does not care what version of the XFS filesystem it operates on as it does not access the raw on-disk srtuctures. i.e. xfsdump/restore are just like any other userspace application that uses standard syscalls and ioctls to read/write information to/from the filesystem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 02:36:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6ABF7F47 for ; Sun, 9 Aug 2015 02:36:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61C22AC004 for ; Sun, 9 Aug 2015 00:36:44 -0700 (PDT) X-ASG-Debug-ID: 1439105802-04cbb0416d2e75f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wvZXp6M8DVBHtoCv (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 00:36:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOL9t-00032X-VO; Sun, 09 Aug 2015 07:36:41 +0000 Date: Sun, 9 Aug 2015 00:36:41 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count Message-ID: <20150809073641.GA3163@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439105803 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 06, 2015 at 01:44:22PM -0400, Brian Foster wrote: - __xfs_efi_release(efip); + xfs_efi_release(efip); Can you explain in the changelog why this is safe? > -xfs_efi_release(xfs_efi_log_item_t *efip, > - uint nextents) > +xfs_efi_release(struct xfs_efi_log_item *efip) Can you use normal XFS function formatting here? e.g. xfs_efi_release( struct xfs_efi_log_item *efip) As a follow on we should be able to remove atomic_inc_return and replace it with a local iterator in xfs_bmap_finish(). From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 02:37:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 003397F54 for ; Sun, 9 Aug 2015 02:37:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2DE6304059 for ; Sun, 9 Aug 2015 00:37:21 -0700 (PDT) X-ASG-Debug-ID: 1439105840-04cb6c673f36ae90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id mglt8LzbdmyFPwzq (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 00:37:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLAW-00034s-3W; Sun, 09 Aug 2015 07:37:20 +0000 Date: Sun, 9 Aug 2015 00:37:20 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/11] xfs: return committed status from xfs_trans_roll() Message-ID: <20150809073720.GB3163@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/11] xfs: return committed status from xfs_trans_roll() References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439105840 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 06, 2015 at 01:44:23PM -0400, Brian Foster wrote: > Some callers need to make error handling decisions based on whether the > current transaction successfully committed or not. Rename > xfs_trans_roll(), add a new parameter and provide a wrapper to preserve > existing callers. > > Signed-off-by: Brian Foster Looks fine, Reviewed-by: Christoph Hellwig From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 02:46:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 504DA7F51 for ; Sun, 9 Aug 2015 02:46:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFBA8AC004 for ; Sun, 9 Aug 2015 00:46:36 -0700 (PDT) X-ASG-Debug-ID: 1439106395-04cbb0416c2e7970001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 1Bcui2NX31nHXNZN (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 00:46:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLJT-00063y-2m; Sun, 09 Aug 2015 07:46:35 +0000 Date: Sun, 9 Aug 2015 00:46:35 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-ID: <20150809074635.GC3163@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/11] xfs: fix efi/efd error handling to avoid fs shutdown hangs References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439106395 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > STATIC void > xfs_efi_item_unpin( > @@ -141,14 +147,6 @@ xfs_efi_item_unpin( > int remove) > { > struct xfs_efi_log_item *efip = EFI_ITEM(lip); > - > - if (remove) { > - ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); > - if (lip->li_desc) > - xfs_trans_del_item(lip); > - xfs_efi_item_free(efip); > - return; > - } > xfs_efi_release(efip); After this the buf iterm is the last one looking a the remove argument. I wonder if it might need similar treatment. > - return (xfs_lsn_t)-1; > + > + return (xfs_lsn_t) -1; This changes the style away from the most common style in Linux and XFS. From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 02:53:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F10DA7F56 for ; Sun, 9 Aug 2015 02:53:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC64F304039 for ; Sun, 9 Aug 2015 00:53:13 -0700 (PDT) X-ASG-Debug-ID: 1439106792-04cbb0416d2e7a80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 6upaTieGg75IIiDF (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 00:53:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLPr-0008E6-FX; Sun, 09 Aug 2015 07:53:11 +0000 Date: Sun, 9 Aug 2015 00:53:11 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure Message-ID: <20150809075311.GD3163@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439106792 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + /* > + * Log the EFD before error handling to ensure the EFD aborts > + * (and releases the EFI) on error. > + */ > error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); > xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, > extp->ext_len); Given that we now always need to log the extents in the EFD even on error maybe it's time to move the call to xfs_free_extent into xfs_trans_log_efd_extent and rename it to xfs_trans_free_extent? Or even better convert xfs_bmap_finish to also walk the extents in the EFI instead of xfs_bmap_free list and have a xfs_trans_free_extents helper ala: int xfs_trans_free_extents( struct xfs_trans *tp, struct xfs_efi_log_item *efip) { struct xfs_efd_log_item *efdp; int error = 0, i; efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents); for (i = 0; i < efip->efi_format.efi_nextents; i++) { struct xfs_extent *extp = &efip->efi_format.efi_extents[i]; error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, extp->ext_len); if (error) break; } return error; } From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 02:56:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E5BF329DF5 for ; Sun, 9 Aug 2015 02:56:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2741304043 for ; Sun, 9 Aug 2015 00:56:42 -0700 (PDT) X-ASG-Debug-ID: 1439107001-04cb6c674036b2b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HqJVngExFCyGjHCE (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 00:56:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLTE-00016R-T0; Sun, 09 Aug 2015 07:56:40 +0000 Date: Sun, 9 Aug 2015 00:56:40 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery Message-ID: <20150809075640.GE3163@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-6-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-6-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439107001 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + error = xfs_efi_copy_format(&(item->ri_buf[0]), &(efip->efi_format)); > + if (error) { > xfs_efi_item_free(efip); Shou;dn't we switch all users of xfs_item_free except for xfs_efi_release to xfs_efi_release now for consistency? From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 03:01:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CC2D429DF5 for ; Sun, 9 Aug 2015 03:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5BC8BAC006 for ; Sun, 9 Aug 2015 01:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439107310-04cb6c674036b3f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DAH3pft7qeYwV4DW (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 01:01:51 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLYE-0002Rv-FU; Sun, 09 Aug 2015 08:01:50 +0000 Date: Sun, 9 Aug 2015 01:01:50 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure Message-ID: <20150809080150.GA4253@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-7-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-7-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439107310 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > STATIC int > xlog_recover_process_efis( > - struct xlog *log) > + struct xlog *log, > + bool cancel) There is almost no code shared between cancelation and processing, so please add a new xlog_cancel_efis helper instead. > + efip = (struct xfs_efi_log_item *) lip; Please use container_of to get to a containing structure. From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 03:02:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 180D629DF5 for ; Sun, 9 Aug 2015 03:02:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE4B28F8037 for ; Sun, 9 Aug 2015 01:02:14 -0700 (PDT) X-ASG-Debug-ID: 1439107332-04cbb0416e2e7c00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 38XMuJgHvynBIDnE (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 01:02:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLYa-0002SY-A5; Sun, 09 Aug 2015 08:02:12 +0000 Date: Sun, 9 Aug 2015 01:02:12 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs: icreate log item recovery and cancellation tracepoints Message-ID: <20150809080212.GB4253@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs: icreate log item recovery and cancellation tracepoints References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-8-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-8-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439107332 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 03:03:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0D3BF29DF5 for ; Sun, 9 Aug 2015 03:03:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8F02EAC008 for ; Sun, 9 Aug 2015 01:03:39 -0700 (PDT) X-ASG-Debug-ID: 1439107417-04cbb0416e2e7c50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gqos4upuRWj8nrjO (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 01:03:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLZx-0002dW-C1; Sun, 09 Aug 2015 08:03:37 +0000 Date: Sun, 9 Aug 2015 01:03:37 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/11] xfs: fix btree cursor error cleanups Message-ID: <20150809080337.GC4253@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/11] xfs: fix btree cursor error cleanups References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-12-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-12-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439107417 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 06, 2015 at 01:44:32PM -0400, Brian Foster wrote: > The btree cursor cleanup function takes an error parameter that affects > how buffers are released from the cursor. All buffers are released in > the event of error. Several callers do not specify the XFS_BTREE_ERROR > flag in the event of error, however. This can cause buffers to hang > around locked or with an elevated hold count and thus lead to umount > hangs in the event of errors. > > Fix up the xfs_btree_del_cursor() callers to pass XFS_BTREE_ERROR if the > cursor is being torn down due to error. > > Signed-off-by: Brian Foster Looks fine, Reviewed-by: Christoph Hellwig I wonder if we should change the second parameter of xfs_btree_del_cursor to "int error" to make the life esier for the callers. From BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 9 03:03:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C69E129E05 for ; Sun, 9 Aug 2015 03:03:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 924C3304043 for ; Sun, 9 Aug 2015 01:03:56 -0700 (PDT) X-ASG-Debug-ID: 1439107434-04bdf06bd22a85e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id J3itkNEcUQSDrrYA (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 09 Aug 2015 01:03:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+86c5c5088f552ba8cf40+4368+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZOLaE-0002iT-HW; Sun, 09 Aug 2015 08:03:54 +0000 Date: Sun, 9 Aug 2015 01:03:54 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 10/11] xfs: clean up root inode properly on mount failure Message-ID: <20150809080354.GD4253@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/11] xfs: clean up root inode properly on mount failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-11-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438883072-28706-11-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439107434 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 06, 2015 at 01:44:31PM -0400, Brian Foster wrote: > The root inode is read as part of the xfs_mountfs() sequence and the > reference is dropped in the event of failure after we grab the inode. > The reference drop doesn't necessarily free the inode, however. It marks > it for reclaim and potentially kicks off the reclaim workqueue. The > workqueue is destroyed further up the error path, which means we are > subject to crash if the workqueue job runs after this point or a memory > leak which is identified if the xfs_inode_zone is destroyed (e.g., on > module removal). Both of these outcomes are reproducible via manual > instrumentation of a mount error after the root inode xfs_iget() call in > xfs_mountfs(). > > Update the xfs_mountfs() error path to cancel any potential reclaim work > items and to run a synchronous inode reclaim if the root inode is marked > for reclaim. This ensures that no jobs remain on the queue before it is > destroyed and that the root inode is freed before the reclaim mechanism > is torn down. > > Signed-off-by: Brian Foster Looks good, Reviewed-by: Christoph Hellwig From contact@integrit045.eu Sun Aug 9 05:51:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 425A929E01 for ; Sun, 9 Aug 2015 05:51:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD3EF8F8033 for ; Sun, 9 Aug 2015 03:51:55 -0700 (PDT) X-ASG-Debug-ID: 1439117510-04bdf06bcf2aaad0001-NocioJ Received: from vps.havaianas862.eu (vps.havaianas862.eu [185.13.38.211]) by cuda.sgi.com with ESMTP id 4uAm7C9cagmwYAyv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 09 Aug 2015 03:51:52 -0700 (PDT) X-Barracuda-Envelope-From: contact@integrit045.eu X-Barracuda-Apparent-Source-IP: 185.13.38.211 Received: from [127.0.0.1] (smtp.lead-market01.eu [91.236.239.116]) (Authenticated sender: mail@integrit045.eu) by vps.havaianas862.eu (Postfix) with ESMTPA id 0EDD22AB3E2 for ; Sun, 9 Aug 2015 10:51:50 +0000 (UTC) Date: Sun, 09 Aug 2015 12:51:36 +0000 From: CIEFAS To: xfs@oss.sgi.com Reply-To: CIEFAS User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; Microsoft Outlook 15.0.4420) MIME-Version: 1.0 Subject: Formation au risque Amiante Content-Type: multipart/alternative; boundary="------------040708070802090307030602" X-ASG-Orig-Subj: Formation au risque Amiante X-Barracuda-Connect: vps.havaianas862.eu[185.13.38.211] X-Barracuda-Start-Time: 1439117512 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE, MISSING_MID, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20150809105155.74682A42183@cuda.sgi.com> This is a multi-part message in MIME format. --------------040708070802090307030602 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Formations au risque amiante sous-section 4  Pour en savoir plus  Notre mission: aider les entreprises à obtenir les compétences en matière de risque amiante. Et c'est avec passion et professionnalisme que CIEFAS vous accompagne en "sous-section 4". Le tarif de nos stages est calculé au plus juste. Il y a urgence ? Nous étudions immédiatement toute demande de formation sous-section 4, et nous pouvons convenir rapidement d'un stage à une date très proche. Tarif spécial pour un stage en intra (en vos locaux, 9 personnes maximum) dans le Rhône ( Offre valable pour une commande avant le 31/08/2015 ) -> encadrement technique (5 jours) : 5350 euros HT -> encadrement de chantier (5 jours) : 5350 euros HT -> encadrement mixte (5 jours) : 5350 euros HT -> opérateur de chantier (2 jours) : 2350 euros HT CIEFAS sarl 04 78 81 72 73 Pour en savoir plus Pour retir votre adresse email,c'est la --------------040708070802090307030602 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
Formations au risque amiante sous-section 4   
Pour en savoir plus 

 

Notre mission: aider les entreprises à obtenir les compétences en matière de risque amiante.
Et c'est avec passion et professionnalisme que CIEFAS vous accompagne en "sous-section 4".

Le tarif de nos stages est calculé au plus juste.

Il y a urgence ? Nous étudions immédiatement toute demande de formation sous-section 4,

et nous pouvons convenir rapidement d'un stage à une date très proche.

Tarif spécial pour un stage en intra (en vos locaux, 9 personnes maximum) dans le Rhône
( Offre valable pour une commande avant le 31/08/2015 )


-> encadrement technique (5 jours) : 5350 euros HT
-> encadrement de chantier (5 jours) : 5350 euros HT

-> encadrement mixte (5 jours) : 5350 euros HT
-> opérateur de chantier (
2 jours) : 2350 euros HT

CIEFAS sarl
04 78 81 72 73

Pour en savoir plus

 

Pour retir votre adresse email,c'est la

--------------040708070802090307030602-- From MD-NO--34306-3-FR-PR--xfs=oss.sgi.com@lists.mdirector.com Sun Aug 9 07:56:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE,T_DKIM_INVALID,T_KHOP_FOREIGN_CLICK autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4267729DFD for ; Sun, 9 Aug 2015 07:56:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AB82EAC004 for ; Sun, 9 Aug 2015 05:55:57 -0700 (PDT) X-ASG-Debug-ID: 1439124949-04cb6c67403708f0001-NocioJ Received: from mta141.181.mdrctr.com (mta141.181.mdrctr.com [62.97.141.181]) by cuda.sgi.com with ESMTP id cwkOaoWQhCfBaz9w for ; Sun, 09 Aug 2015 05:55:49 -0700 (PDT) X-Barracuda-Envelope-From: MD-NO--34306-3-FR-PR--xfs=oss.sgi.com@lists.mdirector.com X-Barracuda-Apparent-Source-IP: 62.97.141.181 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=free; d=pictyear.frmdirector.com; h=From:Reply-To:To:Date:List-Id:List-Unsubscribe:Subject:MIME-Version:Content-Type:Message-ID; i=info@pictyear.frmdirector.com; bh=3FXaSAG7k2kTq4I5bRDqfbhQi30=; b=bHXytske2n9mlZlDz5NjuFLYBNrvdlJUj6Bunbz9cNF6Gw++TCmQY1YtuD2Isk8bZXy05PaUVxXM G4RjN79VwqKkgyTFWr/ou2pQM6q3jTEvOHvLyGVRoew/jDpff9ZJ+fbtzAPvUXuA4KBIQ4ZB3HQG QStVAKTNq0puc/gnebg= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=free; d=pictyear.frmdirector.com; b=ke2YFHcsARztYWaCK0erPnibS3ZM7IQZHHkk/pyY2oIo7gjoSzYNNHNvb570T/WfIWlM3A03CmAW GbLZXBw1Q2wuWmVM2+1vC+Zt3zKdabIbwGKtBaaSQMJBfofxia9QdCltYtD0sh62nBKz+snTg0be ZzpMLLDh8jhL40VK7MY=; Received: from pmta4.mta.antevenio.com (127.0.0.1) by mta141.181.mdrctr.com id hot6tc15mior for ; Sun, 9 Aug 2015 14:55:25 +0200 (envelope-from ) From: PICTYEAR Reply-To: PICTYEAR To: Precedence: bulk X-rpcampaign: mdMDNO343063FRPR X-rpcampaignok: mdmdMD-NO--34306-3-FR-PR X-reputation: -1 Date: Sun, 9 Aug 2015 14:55:25 +0200 List-Id: 34306-1.mdirector.com List-Unsubscribe: , X-LU: , Subject: PICTYEAR, =?UTF-8?B?IG5lIGxhaXNzZXogcGx1cyBsZXMgcGhvdG9zIG/DuSB2b3VzIMOqdGVzIGRhbnM=?= =?UTF-8?B?IGxlcyBzbWFydHBob25lcyBkZXMgYXV0cmVzLg==?= MIME-Version: 1.0 X-ASG-Orig-Subj: PICTYEAR, =?UTF-8?B?IG5lIGxhaXNzZXogcGx1cyBsZXMgcGhvdG9zIG/DuSB2b3VzIMOqdGVzIGRhbnM=?= =?UTF-8?B?IGxlcyBzbWFydHBob25lcyBkZXMgYXV0cmVzLg==?= Content-Type: multipart/mixed; boundary="boundaryTagForMixed" Message-ID: <0.0.C.25.1D0D2A2A92D45F6.42D7F2@mta141.181.mdrctr.com> X-Barracuda-Connect: mta141.181.mdrctr.com[62.97.141.181] X-Barracuda-Start-Time: 1439124949 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC0_SA085b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA085b Custom Rule SA085b 0.20 BSF_SC0_SA038b Custom Rule SA038b --boundaryTagForMixed Content-Type: multipart/alternative; boundary="boundaryTagForAlternative" --boundaryTagForAlternative Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit ********************************************************************** Vous pourrez exercer vos droits d´accès, annulation, rectification et opposition concernant vos données à caractère personnel, en cliquant * annulation //www.mdirector.com/track/pre-unsubscribe/category/EMAIL/empId/34306/subId/3/listId/1/conId/74212/signature/3dacb882609447c6a6cd07e3ea82c062/conEmail/xfs@oss.sgi.com/conMovil/- --boundaryTagForAlternative Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit PICTYEAR
Si vous n’arrivez pas à visualiser cet email, cliquez ici.
pictyear
La première application mobile gratuite et privée qui regroupe toutes les photos que vous prenez avec toutes celles qui sont prises par vos proches.
shoot - swipe - print
les selfies entre amis - les photos en famille
 
Ne laissez plus dans les smartphones des autres les photos sur lesquelles vous apparaissez
 
les éclats de rire - les photos entre copines
 
Réalisez instantanément vos albums photos personnalisés et recevez gratuitement votre FREEBOOK
 
les nouvelles rencontres - les bons moments entre amis
 
Téléchargez l’app et tentez de gagner* un voyage pour 2 à SAN FRANCISCO
 
OU UN ALBUM PHOTO INSTANTANÉMENT COMPOSÉ DE VOS PLUS BEAUX SOUVENIRS PARTAGÉS
 
Pictyear
 
Disponible sur l'APPSTORE  - Disponible sur GOOGLE PLAY
 
 
 
pictyear
Pictyear est la première appli au
monde qui vous permet de créer
instantanément un album photos
imprimé, seul ou à plusieurs.
SUIVEZ-NOUS
FacebookTwitterInstagramPinterest
 
Le règlement du jeu concours sans obligation d’achat « SUMMER PICTYEAR » est disponible en cliquant ici.
 
© Copyright 2015 Pictyear Tous droits réservés. Mentions légales.
 
Conformément à la loi "Informatique et libertés" du 6 janvier 1978, vous bénéficiez d'un droit d'accès, de modification, de rectification et de suppression des données qui vous concernent. Si vous souhaitez exercer ce droit et obtenir communication des informations vous concernant, veuillez vous adresser à : Venise Activation – 7, 13 Bd Paul Émile Victor 92200 Neuilly sur Seine.

Si vous souhaitez ne plus recevoir de messages, cliquez ici.
 
Vous pourrez exercer vos droits d´accès, annulation, rectification et opposition concernant vos données à caractère personnel, en cliquant annulation.
--boundaryTagForAlternative-- --boundaryTagForMixed-- From lrhorer@mygrande.net Sun Aug 9 20:38:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A2B3429DF5 for ; Sun, 9 Aug 2015 20:38:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B24C304043 for ; Sun, 9 Aug 2015 18:38:05 -0700 (PDT) X-ASG-Debug-ID: 1439170678-04bdf06bd12b92c0001-NocioJ Received: from mail02.lsn.net (mail02.lsn.net [66.90.130.128]) by cuda.sgi.com with ESMTP id SKnFGEL4LTtwT1IM for ; Sun, 09 Aug 2015 18:37:58 -0700 (PDT) X-Barracuda-Envelope-From: lrhorer@mygrande.net X-Barracuda-Apparent-Source-IP: 66.90.130.128 Received: from [192.168.1.121] (66-90-232-145.dyn.grandenetworks.net [66.90.232.145]) (authenticated bits=0) by mail02.lsn.net (8.14.4/8.13.6) with ESMTP id t7A1bmsv016840 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Sun, 9 Aug 2015 20:37:49 -0500 X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.98.4 at av01.lsn.net Message-ID: <55C8006C.8070807@mygrande.net> Date: Sun, 09 Aug 2015 20:37:48 -0500 From: Leslie Rhorer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: Brian Foster , Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <03864DDC681E664EBF5D47682BE7D7CF0D358740@USADCWVEMBX07.corp.global.level3.com> <55AAF73A.4040903@mygrande.net> <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <20150804224240.GU16638@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail02.lsn.net[66.90.130.128] X-Barracuda-Start-Time: 1439170678 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21478 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Well, nice try, but it doesn't wash for several reasons: 1. Power supply issues would be highly unlikely to be the cause of such a highly specific failure at always a very specific point in a process. Problems would crop up all over the place, not just with one, very specific failure. While I am thinking of it, I also ran memtest86+ again on the new memory. It passed all tests with flying colors. 2. The system has not been under a heavy load when this happens. In fact, it's piddling. Rsync and tar are single threaded, eating up at most 1 CPU core at a time. I have processes that can regularly bang all 8 cores right to the wall with no errors. The I/O stream is even more piddling. Rsync is transferring nearly 120 MBps (it's a 1G link) during the process, and some portions of the tar process can bang out well over 2Gbps. Creating a directory is nothing. 3. All the power supply rails are nominal - I checked. 4. Most damning of all, I am able to reproduce the issue, now, on another machine. I'm not entirely sure why creating the image on one partition and then copying it to the root or across the LAN stopped it from failing, but I took the 1.5T drive and moved it to the backup machine, which as I related earlier is nearly identical in hardware and highly similar in software to the primary system. It's failing there repeatedly and consistently: RR274x/Driver/Freebsd/rr274x_3x-bsd-8.0-v1.0.10.0712.tgz RR274x/Driver/Linux/ RR274x/Driver/Linux/Debian/ tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Structure needs cleaning RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/ tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Input/output error tar: RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386: Cannot mkdir: No such file or directory RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/boot/ tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Input/output error tar: RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/boot: Cannot mkdir: No such file or directory RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/boot/rr274x_3x2.6.26-2-486i386.ko.gz tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Input/output error gzip: stdin: Input/output error tar: Unexpected EOF in archive tar: RR274x/Driver/Linux: Cannot utime: Input/output error tar: RR274x/Driver/Linux: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x/Driver/Linux: Cannot change mode to rwxr-xr-x: Input/output error tar: RR274x/Driver: Cannot utime: Input/output error tar: RR274x/Driver: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x/Driver: Cannot change mode to rwxr-xr-x: Input/output error tar: RR274x: Cannot utime: Input/output error tar: RR274x: Cannot change ownership to uid 0, gid 1000: Input/output error tar: RR274x: Cannot change mode to rwxr-xr-x: Input/output error tar: Error is not recoverable: exiting now dmesg: [26743.775522] XFS (sdk): Mounting V4 Filesystem [26743.904281] XFS (sdk): Ending clean mount [26743.912614] Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev- instead. [26772.528827] loop: module loaded [26772.601043] XFS (loop0): Mounting V4 Filesystem [26772.764360] XFS (loop0): Ending clean mount [26772.770627] Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev- instead. [26899.019942] XFS (loop0): xfs_iread: validation failed for inode 124656869424 failed [26899.019952] ffff8800b473e000: 49 4e 00 00 03 02 00 00 00 30 00 70 00 00 03 e8 IN.......0.p.... [26899.019957] ffff8800b473e010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 00 00 00 16 ..... .o........ [26899.019960] ffff8800b473e020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c 00 00 00 20 .W7.+]"...a.... [26899.019964] ffff8800b473e030: ff ff 00 d2 1b f6 27 90 00 00 00 00 00 00 00 00 ......'......... [26899.019993] XFS (loop0): Internal error xfs_iread at line 392 of file /build/linux-u5KAtC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. Caller xfs_iget+0x24b/0x690 [xfs] [26899.020000] CPU: 6 PID: 3756 Comm: tar Not tainted 3.16.0-4-amd64 #1 Debian 3.16.7-ckt11-1+deb8u2 [26899.020004] Hardware name: To be filled by O.E.M. To be filled by O.E.M./SABERTOOTH 990FX R2.0, BIOS 0803 08/15/2012 [26899.020007] 0000000000000001 ffffffff8150b3d5 ffff8800065b9800 ffffffffa06bd5cb [26899.020014] 0000018800000010 ffffffffa06c2f6b ffff88000a680400 ffff8800065b9800 [26899.020019] 0000000000000075 ffff88000527f140 ffffffffa0708b3a ffffffffa06c2f6b [26899.020024] Call Trace: [26899.020034] [] ? dump_stack+0x41/0x51 [26899.020052] [] ? xfs_corruption_error+0x5b/0x80 [xfs] [26899.020069] [] ? xfs_iget+0x24b/0x690 [xfs] [26899.020090] [] ? xfs_iread+0xea/0x400 [xfs] [26899.020106] [] ? xfs_iget+0x24b/0x690 [xfs] [26899.020124] [] ? xfs_iget+0x24b/0x690 [xfs] [26899.020146] [] ? xfs_ialloc+0xa6/0x500 [xfs] [26899.020192] [] ? kmem_zone_alloc+0x6e/0xe0 [xfs] [26899.020215] [] ? xfs_dir_ialloc+0x62/0x2a0 [xfs] [26899.020237] [] ? xfs_trans_reserve+0x1f5/0x200 [xfs] [26899.020261] [] ? xfs_create+0x489/0x700 [xfs] [26899.020267] [] ? kern_path_create+0xaa/0x190 [26899.020286] [] ? xfs_generic_create+0xca/0x250 [xfs] [26899.020292] [] ? vfs_mkdir+0xb0/0x160 [26899.020296] [] ? SyS_mkdirat+0xab/0xe0 [26899.020303] [] ? system_call_fast_compare_end+0x10/0x15 [26899.020307] XFS (loop0): Corruption detected. Unmount and run xfs_repair [26899.020337] XFS (loop0): Internal error xfs_trans_cancel at line 959 of file /build/linux-u5KAtC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. Caller xfs_create+0x2b2/0x700 [xfs] [26899.020342] CPU: 6 PID: 3756 Comm: tar Not tainted 3.16.0-4-amd64 #1 Debian 3.16.7-ckt11-1+deb8u2 [26899.020345] Hardware name: To be filled by O.E.M. To be filled by O.E.M./SABERTOOTH 990FX R2.0, BIOS 0803 08/15/2012 [26899.020347] 000000000000000c ffffffff8150b3d5 ffff88000527f140 ffffffffa06d1e07 [26899.020354] ffff88000a729800 ffff8800066e3ec8 ffff8800065b9800 ffffffffa07037d2 [26899.020359] 0000000000000001 ffff8800066e3e20 ffff8800066e3e1c ffff8800066e3eb0 [26899.020364] Call Trace: [26899.020370] [] ? dump_stack+0x41/0x51 [26899.020388] [] ? xfs_trans_cancel+0xc7/0xf0 [xfs] [26899.020409] [] ? xfs_create+0x2b2/0x700 [xfs] [26899.020414] [] ? kern_path_create+0xaa/0x190 [26899.020432] [] ? xfs_generic_create+0xca/0x250 [xfs] [26899.020437] [] ? vfs_mkdir+0xb0/0x160 [26899.020442] [] ? SyS_mkdirat+0xab/0xe0 [26899.020447] [] ? system_call_fast_compare_end+0x10/0x15 [26899.020454] XFS (loop0): xfs_do_force_shutdown(0x8) called from line 960 of file /build/linux-u5KAtC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. Return address = 0xffffffffa06d1e20 [26899.407181] XFS (loop0): Corruption of in-memory data detected. Shutting down filesystem [26899.407190] XFS (loop0): Please umount the filesystem and rectify the problem(s) [26923.319559] XFS (loop0): xfs_log_force: error 5 returned. Xfs_repair still reports no faults. I'm compressing the dump file and image file right now to be posted on http:/flethergeek.com/images when it is done, but it is taking a very long time. I'll also try decompresssing the image to the other array to see if it still fails before I upload the file. 'No point in uploading if putting it through the compression process results in an image that does not fail. On 8/4/2015 5:42 PM, Dave Chinner wrote: > On Tue, Aug 04, 2015 at 02:52:33AM -0500, Leslie Rhorer wrote: >> It's failing, again. The rsync job failed and when I attempt to >> untar the file in the image mount, it fails there, as well. See >> below. I formatted a 1.5T drive as xfs and mounted it under /media. >> I then dumped the failing FS to a file on /media using xfs_metadump >> and used xfs_mdrestore to create an image of the FS. I then mounted >> the image, copied over the tarball to its location, and ran tar to >> extract the files: >> >> [131874.545344] loop: module loaded >> [131874.549914] XFS (loop0): Mounting V4 Filesystem > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > >> [131874.555540] XFS (loop0): Ending clean mount >> [132020.964431] XFS (loop0): xfs_iread: validation failed for inode 124656869424 failed >> [132020.964435] ffff88028b078000: 49 4e 00 00 03 02 00 00 00 30 00 70 00 00 03 e8 IN.......0.p.... >> [132020.964437] ffff88028b078010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 00 00 00 16 ..... .o........ >> [132020.964438] ffff88028b078020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c 00 00 00 20 .W7.+]"...a.... >> [132020.964440] ffff88028b078030: ff ff 00 d2 1b f6 27 90 00 00 00 00 00 00 00 00 ......'......... >> [132020.964454] XFS (loop0): Internal error xfs_iread at line 392 of >> file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. >> Caller xfs_iget+0x24b/0x690 [xfs] > > That's a different error to all the ones you've previously posted. > This is an inode allocation that has found a bad inode on disk. > > Decoding the 64 bytes above: > > di_magic = 0x494e > di_mode = 0 > di_version = 3 <<< That's *wrong* > di_format = 2 > di_onlink = 0 > di_uid = 0x300070 <<< Looks unlikely > di_gid = 0x3e8 > ---- > di_nlink = 0 > di_projlo = 0x620 <<< should be zero > di_projhi = 0xb06f <<< should be zero > di_pad[6] = 0x1 0x2e 0 0 0 0 <<< should be zero > di_flushiter = 0x16 <<< should be zero for v3 inode > --- > di_atime > di_mtime > di_ctime > di_size = 0x20ffff00d2 <<< should be zero > ---- > di_nblocks = 0x1bf6279000000000 <<< should be zero > di_extsize = 0 > ---- > > You've just created and mounted a v4 filesystem, which means it is > using v2 inodes. This inode read back as a v3 inode, with lots of > crap in places where there should be zeros for either v2 or v3 inodes. > > This does not look like a filesystem problem - it's clear that what > has come from disk (or a cached memory buffer) is full of garbage > and contains invalid configuration, and the filesystem has quite > correctly detected the corruption and shut down. The filesystem > would give the same errors if it tried to *write* such a corrupt > block, so we know what was just been detected has not come from the > filesytem code... > > FWIW, I've occasionally seen this sort of thing happen when a power > supply had gone bad - it wasn't bad enough to make things fail, it > ust caused transient issues under load that manifest as corruptions > and crashes. Given that you've already found one set of hardware > problems and the corruption patterns are unlike any > filesystem/storage problem I've ever seen, I'd suggest that you > still have some kind of hardware issue... > > Cheers, > > Dave. > From MD-NO--34306-9-FR-PR--xfs=oss.sgi.com@lists.mdirector.com Mon Aug 10 04:58:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE,T_DKIM_INVALID,T_KHOP_FOREIGN_CLICK autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4FD3D7F47 for ; Mon, 10 Aug 2015 04:58:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EAC01304059 for ; Mon, 10 Aug 2015 02:57:56 -0700 (PDT) X-ASG-Debug-ID: 1439200667-04bdf06bd22c33b0001-NocioJ Received: from mta141.183.mdrctr.com (mta141.183.mdrctr.com [62.97.141.183]) by cuda.sgi.com with ESMTP id zkSE6LkDnHXyfFBT for ; Mon, 10 Aug 2015 02:57:48 -0700 (PDT) X-Barracuda-Envelope-From: MD-NO--34306-9-FR-PR--xfs=oss.sgi.com@lists.mdirector.com X-Barracuda-Apparent-Source-IP: 62.97.141.183 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=free; d=pictyear.frmdirector.com; h=From:Reply-To:To:Date:List-Id:List-Unsubscribe:Subject:MIME-Version:Content-Type:Message-ID; i=info@pictyear.frmdirector.com; bh=Ifwqfa/N560f0njVZWUdNpDW+vE=; b=aH5K3POcDaxCBVDK2aKofkxvd/tralF0/wdtfoZJ+QKPkme7CilEtLoqZPqXfuxK+2V3w+4QdwPO VVB8n6Sb6XPW3qZNRi0H140e2oRJO8a1KJtysm3dowNLTTvUx5ofYpwRmQSKjyNrpuE9DwS7UW/o 0Qe8PTVprRWHgsRATSU= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=free; d=pictyear.frmdirector.com; b=VDncFPUdcyI9SVPg09m6F3S//LtQYxt6laOjcLIsIAKUAuTHa7JrHkDOxcmUdPo/ENCbeXCokOP0 y6xkljm/3+iXuMEtIANPylg7KJRTa76ntMbbSkBDdYxa5kJT+n7dE7SCwUm+PefFVuPzkT8YQRwy +zAOkrPxFwHu69Cpvos=; Received: from pmta4.mta.antevenio.com (127.0.0.1) by mta141.181.mdrctr.com id hp1qpq15mio8 for ; Mon, 10 Aug 2015 11:56:37 +0200 (envelope-from ) From: PICTYEAR Reply-To: PICTYEAR To: Precedence: bulk X-rpcampaign: mdMDNO343069FRPR X-rpcampaignok: mdmdMD-NO--34306-9-FR-PR X-reputation: -1 Date: Mon, 10 Aug 2015 11:56:37 +0200 List-Id: 34306-3.mdirector.com List-Unsubscribe: , X-LU: , Subject: PICTYEAR, freebook gratuit de vos photos de vacances ! MIME-Version: 1.0 X-ASG-Orig-Subj: PICTYEAR, freebook gratuit de vos photos de vacances ! Content-Type: multipart/mixed; boundary="boundaryTagForMixed" Message-ID: <0.0.E.B6.1D0D352D93CE91C.E8648A@mta141.181.mdrctr.com> X-Barracuda-Connect: mta141.183.mdrctr.com[62.97.141.183] X-Barracuda-Start-Time: 1439200668 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC0_SA085b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA085b Custom Rule SA085b 0.20 BSF_SC0_SA038b Custom Rule SA038b --boundaryTagForMixed Content-Type: multipart/alternative; boundary="boundaryTagForAlternative" --boundaryTagForAlternative Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit ********************************************************************** Vous pourrez exercer vos droits d´accès, annulation, rectification et opposition concernant vos données à caractère personnel, en cliquant * annulation //www.mdirector.com/track/pre-unsubscribe/category/EMAIL/empId/34306/subId/9/listId/3/conId/27804/signature/d101ae3dc6b7204b6129caba8c851e47/conEmail/xfs@oss.sgi.com/conMovil/- --boundaryTagForAlternative Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit PICTYEAR
Si vous n’arrivez pas à visualiser cet email, cliquez ici.
pictyear
La première application mobile gratuite et privée qui regroupe toutes les photos que vous prenez avec toutes celles qui sont prises par vos proches.
shoot - swipe - print
les selfies entre amis - les photos en famille
 
Ne laissez plus dans les smartphones des autres les photos sur lesquelles vous apparaissez
 
les éclats de rire - les photos entre copines
 
Réalisez instantanément vos albums photos personnalisés et recevez gratuitement votre FREEBOOK
 
les nouvelles rencontres - les bons moments entre amis
 
Téléchargez l’app et tentez de gagner* un voyage pour 2 à SAN FRANCISCO
 
OU UN ALBUM PHOTO INSTANTANÉMENT COMPOSÉ DE VOS PLUS BEAUX SOUVENIRS PARTAGÉS
 
Pictyear
 
Disponible sur l'APPSTORE  - Disponible sur GOOGLE PLAY
 
 
 
pictyear
Pictyear est la première appli au
monde qui vous permet de créer
instantanément un album photos
imprimé, seul ou à plusieurs.
SUIVEZ-NOUS
FacebookTwitterInstagramPinterest
 
Le règlement du jeu concours sans obligation d’achat « SUMMER PICTYEAR » est disponible en cliquant ici.
 
© Copyright 2015 Pictyear Tous droits réservés. Mentions légales.
 
Conformément à la loi "Informatique et libertés" du 6 janvier 1978, vous bénéficiez d'un droit d'accès, de modification, de rectification et de suppression des données qui vous concernent. Si vous souhaitez exercer ce droit et obtenir communication des informations vous concernant, veuillez vous adresser à : Venise Activation – 7, 13 Bd Paul Émile Victor 92200 Neuilly sur Seine.

Si vous souhaitez ne plus recevoir de messages, cliquez ici.
 
Vous pourrez exercer vos droits d´accès, annulation, rectification et opposition concernant vos données à caractère personnel, en cliquant annulation.
--boundaryTagForAlternative-- --boundaryTagForMixed-- From bfoster@redhat.com Mon Aug 10 07:37:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D99A67F47 for ; Mon, 10 Aug 2015 07:37:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B52AA8F8039 for ; Mon, 10 Aug 2015 05:37:32 -0700 (PDT) X-ASG-Debug-ID: 1439210248-04cbb0416c305060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DX3EtJs46uLD1MkA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 05:37:28 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 15F73226; Mon, 10 Aug 2015 12:37:28 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7ACbRc9023875; Mon, 10 Aug 2015 08:37:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4E27412019F; Mon, 10 Aug 2015 08:37:27 -0400 (EDT) Date: Mon, 10 Aug 2015 08:37:27 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count Message-ID: <20150810123726.GA18933@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-2-git-send-email-bfoster@redhat.com> <20150809073641.GA3163@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150809073641.GA3163@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439210248 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 09, 2015 at 12:36:41AM -0700, Christoph Hellwig wrote: > On Thu, Aug 06, 2015 at 01:44:22PM -0400, Brian Foster wrote: > > - __xfs_efi_release(efip); > + xfs_efi_release(efip); > > Can you explain in the changelog why this is safe? > I thought it did. I'll try to elaborate. > > > -xfs_efi_release(xfs_efi_log_item_t *efip, > > - uint nextents) > > +xfs_efi_release(struct xfs_efi_log_item *efip) > > Can you use normal XFS function formatting here? e.g. > > xfs_efi_release( > struct xfs_efi_log_item *efip) > Ok. > > As a follow on we should be able to remove atomic_inc_return and > replace it with a local iterator in xfs_bmap_finish(). > I'm not sure what you mean here... Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 10 07:37:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB7997F47 for ; Mon, 10 Aug 2015 07:37:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E8A4AC003 for ; Mon, 10 Aug 2015 05:37:59 -0700 (PDT) X-ASG-Debug-ID: 1439210274-04cb6c673f38c020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DgSMUa1wKfe6Ymeg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 05:37:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 7E509341AF0; Mon, 10 Aug 2015 12:37:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7ACbsMu017726; Mon, 10 Aug 2015 08:37:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A002812019F; Mon, 10 Aug 2015 08:37:53 -0400 (EDT) Date: Mon, 10 Aug 2015 08:37:53 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery Message-ID: <20150810123753.GB18933@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfs: use EFI refcount consistently in log recovery References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-6-git-send-email-bfoster@redhat.com> <20150809075640.GE3163@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150809075640.GE3163@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439210275 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 09, 2015 at 12:56:40AM -0700, Christoph Hellwig wrote: > > + error = xfs_efi_copy_format(&(item->ri_buf[0]), &(efip->efi_format)); > > + if (error) { > > xfs_efi_item_free(efip); > > Shou;dn't we switch all users of xfs_item_free except for > xfs_efi_release to xfs_efi_release now for consistency? > I don't think that's necessarily correct, at least as a one-to-one conversion. We'd have to release two references here as well as in the unlock handler if the transaction is aborted. E.g., the reference count is only relevant once the EFI enters the transaction subsystem. Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 10 07:38:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 16F8B7F47 for ; Mon, 10 Aug 2015 07:38:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9B204AC004 for ; Mon, 10 Aug 2015 05:38:06 -0700 (PDT) X-ASG-Debug-ID: 1439210285-04cbb0416c3050b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EEDV7jIhKkBvXb3W (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 05:38:05 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 2A4468E918; Mon, 10 Aug 2015 12:38:05 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7ACc49i024109; Mon, 10 Aug 2015 08:38:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8BFB212019F; Mon, 10 Aug 2015 08:38:04 -0400 (EDT) Date: Mon, 10 Aug 2015 08:38:04 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure Message-ID: <20150810123803.GC18933@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-5-git-send-email-bfoster@redhat.com> <20150809075311.GD3163@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150809075311.GD3163@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439210285 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 09, 2015 at 12:53:11AM -0700, Christoph Hellwig wrote: > > + /* > > + * Log the EFD before error handling to ensure the EFD aborts > > + * (and releases the EFI) on error. > > + */ > > error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); > > xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, > > extp->ext_len); > > Given that we now always need to log the extents in the EFD even on > error maybe it's time to move the call to xfs_free_extent into > xfs_trans_log_efd_extent and rename it to xfs_trans_free_extent? > > Or even better convert xfs_bmap_finish to also walk the extents in the > EFI instead of xfs_bmap_free list and have a xfs_trans_free_extents helper > ala: > Good idea, I'll incorporate something like this. Brian > int > xfs_trans_free_extents( > struct xfs_trans *tp, > struct xfs_efi_log_item *efip) > { > struct xfs_efd_log_item *efdp; > int error = 0, i; > > efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents); > for (i = 0; i < efip->efi_format.efi_nextents; i++) { > struct xfs_extent *extp = &efip->efi_format.efi_extents[i]; > > error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); > xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, > extp->ext_len); > > if (error) > break; > } > > return error; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 10 07:38:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4B7277F47 for ; Mon, 10 Aug 2015 07:38:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22D7C8F8039 for ; Mon, 10 Aug 2015 05:38:56 -0700 (PDT) X-ASG-Debug-ID: 1439210335-04cb6c673d38c070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cOP49PcQ2YFizD0z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 05:38:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id E09E85BA27; Mon, 10 Aug 2015 12:38:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7ACcsuH023845; Mon, 10 Aug 2015 08:38:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 490A312019F; Mon, 10 Aug 2015 08:38:54 -0400 (EDT) Date: Mon, 10 Aug 2015 08:38:54 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure Message-ID: <20150810123853.GD18933@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs: don't leave EFIs on AIL on mount failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-7-git-send-email-bfoster@redhat.com> <20150809080150.GA4253@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150809080150.GA4253@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439210335 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 09, 2015 at 01:01:50AM -0700, Christoph Hellwig wrote: > > STATIC int > > xlog_recover_process_efis( > > - struct xlog *log) > > + struct xlog *log, > > + bool cancel) > > There is almost no code shared between cancelation and processing, > so please add a new xlog_cancel_efis helper instead. > See v2. > > + efip = (struct xfs_efi_log_item *) lip; > > Please use container_of to get to a containing structure. > Ok. Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 10 08:39:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3E5D17F47 for ; Mon, 10 Aug 2015 08:39:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C4BE8F804B for ; Mon, 10 Aug 2015 06:39:41 -0700 (PDT) X-ASG-Debug-ID: 1439213980-04cb6c673f38d9b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Qv6JO9HypvkVkCF9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 06:39:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 69E9A8E4FD; Mon, 10 Aug 2015 13:39:40 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7ADdeNv027602; Mon, 10 Aug 2015 09:39:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AAD1512019F; Mon, 10 Aug 2015 09:39:39 -0400 (EDT) Date: Mon, 10 Aug 2015 09:39:39 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure Message-ID: <20150810133939.GA33960@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 04/11] xfs: ensure EFD trans aborts on log recovery extent free failure References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-5-git-send-email-bfoster@redhat.com> <20150809075311.GD3163@infradead.org> <20150810123803.GC18933@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150810123803.GC18933@bfoster.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439213981 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 10, 2015 at 08:38:04AM -0400, Brian Foster wrote: > On Sun, Aug 09, 2015 at 12:53:11AM -0700, Christoph Hellwig wrote: > > > + /* > > > + * Log the EFD before error handling to ensure the EFD aborts > > > + * (and releases the EFI) on error. > > > + */ > > > error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); > > > xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, > > > extp->ext_len); > > > > Given that we now always need to log the extents in the EFD even on > > error maybe it's time to move the call to xfs_free_extent into > > xfs_trans_log_efd_extent and rename it to xfs_trans_free_extent? > > > > Or even better convert xfs_bmap_finish to also walk the extents in the > > EFI instead of xfs_bmap_free list and have a xfs_trans_free_extents helper > > ala: > > > > Good idea, I'll incorporate something like this. > > Brian > After taking a closer look at this, I think I'll go with the first idea to push down xfs_free_extent(). The code below to iterate based on the EFI, while a nice cleanup, complicates handling the free list on error. E.g., we currently remove each bmap_free_item as it is successfully processed so the resulting list is consistent with the items that were not processed before the error. It might not matter functionally at the moment since the caller probably cancels the free list, but I consider that a landmine should we decide to do something more with the unprocessed entries down the road. Brian > > int > > xfs_trans_free_extents( > > struct xfs_trans *tp, > > struct xfs_efi_log_item *efip) > > { > > struct xfs_efd_log_item *efdp; > > int error = 0, i; > > > > efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents); > > for (i = 0; i < efip->efi_format.efi_nextents; i++) { > > struct xfs_extent *extp = &efip->efi_format.efi_extents[i]; > > > > error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); > > xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, > > extp->ext_len); > > > > if (error) > > break; > > } > > > > return error; > > } > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jack@suse.cz Mon Aug 10 08:44:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 048157F47 for ; Mon, 10 Aug 2015 08:44:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5F2A8F8066 for ; Mon, 10 Aug 2015 06:44:13 -0700 (PDT) X-ASG-Debug-ID: 1439214249-04cbb0416e306bd0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id T8lmLfZqTU1rPvMf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 06:44:10 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 8DDD1AAC2; Mon, 10 Aug 2015 13:44:06 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 090788169B; Mon, 10 Aug 2015 15:44:04 +0200 (CEST) Date: Mon, 10 Aug 2015 15:44:04 +0200 From: Jan Kara To: Kees Cook Cc: Andrew Morton , "Yan, Zheng" , Sage Weil , Ilya Dryomov , Steve French , Jan Kara , Andreas Dilger , Theodore Ts'o , Steven Whitehouse , Bob Peterson , Jeff Dike , Richard Weinberger , Mark Fasheh , Joel Becker , Miklos Szeredi , Dave Chinner , xfs@oss.sgi.com, Tejun Heo , Li Zefan , Johannes Weiner , "David S. Miller" , Paul Moore , Stephen Smalley , Eric Paris , James Morris , "Serge E. Hallyn" , Jens Axboe , Fabian Frederick , Christoph Hellwig , Firo Yang , David Howells , Jiri Slaby , Al Viro , Joe Perches , Steven Rostedt , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] fs: create and use seq_show_option for escaping Message-ID: <20150810134404.GD3768@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] fs: create and use seq_show_option for escaping References: <20150807234150.GA11735@www.outflux.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150807234150.GA11735@www.outflux.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439214250 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 07-08-15 16:41:50, Kees Cook wrote: > Many file systems that implement the show_options hook fail to correctly > escape their output which could lead to unescaped characters (e.g. new > lines) leaking into /proc/mounts and /proc/[pid]/mountinfo files. This > could lead to confusion, spoofed entries (resulting in things like > systemd issuing false d-bus "mount" notifications), and who knows > what else. This looks like it would only be the root user stepping on > themselves, but it's possible weird things could happen in containers > or in other situations with delegated mount privileges. > > Here's an example using overlay with setuid fusermount trusting the > contents of /proc/mounts (via the /etc/mtab symlink). Imagine the use of > "sudo" is something more sneaky: > > $ BASE="ovl" > $ MNT="$BASE/mnt" > $ LOW="$BASE/lower" > $ UP="$BASE/upper" > $ WORK="$BASE/work/ 0 0 > none /proc fuse.pwn user_id=1000" > $ mkdir -p "$LOW" "$UP" "$WORK" > $ sudo mount -t overlay -o "lowerdir=$LOW,upperdir=$UP,workdir=$WORK" none /mnt > $ cat /proc/mounts > none /root/ovl/mnt overlay rw,relatime,lowerdir=ovl/lower,upperdir=ovl/upper,workdir=ovl/work/ 0 0 > none /proc fuse.pwn user_id=1000 0 0 > $ fusermount -u /proc > $ cat /proc/mounts > cat: /proc/mounts: No such file or directory > > This fixes the problem by adding new seq_show_option and seq_show_option_n > helpers, and updating the vulnerable show_option handlers to use them as > needed. Some, like SELinux, need to be open coded due to unusual existing > escape mechanisms. > > Signed-off-by: Kees Cook > Cc: stable@vger.kernel.org Looks good to me. You can add: Acked-by: Jan Kara Honza > --- > fs/ceph/super.c | 2 +- > fs/cifs/cifsfs.c | 6 +++--- > fs/ext3/super.c | 4 ++-- > fs/ext4/super.c | 4 ++-- > fs/gfs2/super.c | 6 +++--- > fs/hfs/super.c | 4 ++-- > fs/hfsplus/options.c | 4 ++-- > fs/hostfs/hostfs_kern.c | 2 +- > fs/ocfs2/super.c | 4 ++-- > fs/overlayfs/super.c | 6 +++--- > fs/reiserfs/super.c | 8 +++++--- > fs/xfs/xfs_super.c | 4 ++-- > include/linux/seq_file.h | 34 ++++++++++++++++++++++++++++++++++ > kernel/cgroup.c | 7 ++++--- > net/ceph/ceph_common.c | 7 +++++-- > security/selinux/hooks.c | 2 +- > 16 files changed, 72 insertions(+), 32 deletions(-) > > diff --git a/fs/ceph/super.c b/fs/ceph/super.c > index d1c833c321b9..7b6bfcbf801c 100644 > --- a/fs/ceph/super.c > +++ b/fs/ceph/super.c > @@ -479,7 +479,7 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) > if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT) > seq_printf(m, ",readdir_max_bytes=%d", fsopt->max_readdir_bytes); > if (strcmp(fsopt->snapdir_name, CEPH_SNAPDIRNAME_DEFAULT)) > - seq_printf(m, ",snapdirname=%s", fsopt->snapdir_name); > + seq_show_option(m, "snapdirname", fsopt->snapdir_name); > > return 0; > } > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 0a9fb6b53126..6a1119e87fbb 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -394,17 +394,17 @@ cifs_show_options(struct seq_file *s, struct dentry *root) > struct sockaddr *srcaddr; > srcaddr = (struct sockaddr *)&tcon->ses->server->srcaddr; > > - seq_printf(s, ",vers=%s", tcon->ses->server->vals->version_string); > + seq_show_option(s, "vers", tcon->ses->server->vals->version_string); > cifs_show_security(s, tcon->ses); > cifs_show_cache_flavor(s, cifs_sb); > > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER) > seq_puts(s, ",multiuser"); > else if (tcon->ses->user_name) > - seq_printf(s, ",username=%s", tcon->ses->user_name); > + seq_show_option(s, "username", tcon->ses->user_name); > > if (tcon->ses->domainName) > - seq_printf(s, ",domain=%s", tcon->ses->domainName); > + seq_show_option(s, "domain", tcon->ses->domainName); > > if (srcaddr->sa_family != AF_UNSPEC) { > struct sockaddr_in *saddr4; > diff --git a/fs/ext3/super.c b/fs/ext3/super.c > index 5ed0044fbb37..e9312494f3ee 100644 > --- a/fs/ext3/super.c > +++ b/fs/ext3/super.c > @@ -578,10 +578,10 @@ static inline void ext3_show_quota_options(struct seq_file *seq, struct super_bl > } > > if (sbi->s_qf_names[USRQUOTA]) > - seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); > + seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]); > > if (sbi->s_qf_names[GRPQUOTA]) > - seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); > + seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]); > > if (test_opt(sb, USRQUOTA)) > seq_puts(seq, ",usrquota"); > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index 58987b5c514b..9981064c4a54 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -1763,10 +1763,10 @@ static inline void ext4_show_quota_options(struct seq_file *seq, > } > > if (sbi->s_qf_names[USRQUOTA]) > - seq_printf(seq, ",usrjquota=%s", sbi->s_qf_names[USRQUOTA]); > + seq_show_option(seq, "usrjquota", sbi->s_qf_names[USRQUOTA]); > > if (sbi->s_qf_names[GRPQUOTA]) > - seq_printf(seq, ",grpjquota=%s", sbi->s_qf_names[GRPQUOTA]); > + seq_show_option(seq, "grpjquota", sbi->s_qf_names[GRPQUOTA]); > #endif > } > > diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c > index 2982445947e1..894fb01a91da 100644 > --- a/fs/gfs2/super.c > +++ b/fs/gfs2/super.c > @@ -1334,11 +1334,11 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) > if (is_ancestor(root, sdp->sd_master_dir)) > seq_puts(s, ",meta"); > if (args->ar_lockproto[0]) > - seq_printf(s, ",lockproto=%s", args->ar_lockproto); > + seq_show_option(s, "lockproto", args->ar_lockproto); > if (args->ar_locktable[0]) > - seq_printf(s, ",locktable=%s", args->ar_locktable); > + seq_show_option(s, "locktable", args->ar_locktable); > if (args->ar_hostdata[0]) > - seq_printf(s, ",hostdata=%s", args->ar_hostdata); > + seq_show_option(s, "hostdata", args->ar_hostdata); > if (args->ar_spectator) > seq_puts(s, ",spectator"); > if (args->ar_localflocks) > diff --git a/fs/hfs/super.c b/fs/hfs/super.c > index 55c03b9e9070..4574fdd3d421 100644 > --- a/fs/hfs/super.c > +++ b/fs/hfs/super.c > @@ -136,9 +136,9 @@ static int hfs_show_options(struct seq_file *seq, struct dentry *root) > struct hfs_sb_info *sbi = HFS_SB(root->d_sb); > > if (sbi->s_creator != cpu_to_be32(0x3f3f3f3f)) > - seq_printf(seq, ",creator=%.4s", (char *)&sbi->s_creator); > + seq_show_option_n(seq, "creator", (char *)&sbi->s_creator, 4); > if (sbi->s_type != cpu_to_be32(0x3f3f3f3f)) > - seq_printf(seq, ",type=%.4s", (char *)&sbi->s_type); > + seq_show_option_n(seq, "type", (char *)&sbi->s_type, 4); > seq_printf(seq, ",uid=%u,gid=%u", > from_kuid_munged(&init_user_ns, sbi->s_uid), > from_kgid_munged(&init_user_ns, sbi->s_gid)); > diff --git a/fs/hfsplus/options.c b/fs/hfsplus/options.c > index c90b72ee676d..bb806e58c977 100644 > --- a/fs/hfsplus/options.c > +++ b/fs/hfsplus/options.c > @@ -218,9 +218,9 @@ int hfsplus_show_options(struct seq_file *seq, struct dentry *root) > struct hfsplus_sb_info *sbi = HFSPLUS_SB(root->d_sb); > > if (sbi->creator != HFSPLUS_DEF_CR_TYPE) > - seq_printf(seq, ",creator=%.4s", (char *)&sbi->creator); > + seq_show_option_n(seq, "creator", (char *)&sbi->creator, 4); > if (sbi->type != HFSPLUS_DEF_CR_TYPE) > - seq_printf(seq, ",type=%.4s", (char *)&sbi->type); > + seq_show_option_n(seq, "type", (char *)&sbi->type, 4); > seq_printf(seq, ",umask=%o,uid=%u,gid=%u", sbi->umask, > from_kuid_munged(&init_user_ns, sbi->uid), > from_kgid_munged(&init_user_ns, sbi->gid)); > diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c > index 059597b23f67..2ac99db3750e 100644 > --- a/fs/hostfs/hostfs_kern.c > +++ b/fs/hostfs/hostfs_kern.c > @@ -260,7 +260,7 @@ static int hostfs_show_options(struct seq_file *seq, struct dentry *root) > size_t offset = strlen(root_ino) + 1; > > if (strlen(root_path) > offset) > - seq_printf(seq, ",%s", root_path + offset); > + seq_show_option(seq, root_path + offset, NULL); > > if (append) > seq_puts(seq, ",append"); > diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c > index 403c5660b306..a482e312c7b2 100644 > --- a/fs/ocfs2/super.c > +++ b/fs/ocfs2/super.c > @@ -1550,8 +1550,8 @@ static int ocfs2_show_options(struct seq_file *s, struct dentry *root) > seq_printf(s, ",localflocks,"); > > if (osb->osb_cluster_stack[0]) > - seq_printf(s, ",cluster_stack=%.*s", OCFS2_STACK_LABEL_LEN, > - osb->osb_cluster_stack); > + seq_show_option_n(s, "cluster_stack", osb->osb_cluster_stack, > + OCFS2_STACK_LABEL_LEN); > if (opts & OCFS2_MOUNT_USRQUOTA) > seq_printf(s, ",usrquota"); > if (opts & OCFS2_MOUNT_GRPQUOTA) > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index 7466ff339c66..79073d68b475 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -588,10 +588,10 @@ static int ovl_show_options(struct seq_file *m, struct dentry *dentry) > struct super_block *sb = dentry->d_sb; > struct ovl_fs *ufs = sb->s_fs_info; > > - seq_printf(m, ",lowerdir=%s", ufs->config.lowerdir); > + seq_show_option(m, "lowerdir", ufs->config.lowerdir); > if (ufs->config.upperdir) { > - seq_printf(m, ",upperdir=%s", ufs->config.upperdir); > - seq_printf(m, ",workdir=%s", ufs->config.workdir); > + seq_show_option(m, "upperdir", ufs->config.upperdir); > + seq_show_option(m, "workdir", ufs->config.workdir); > } > return 0; > } > diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c > index 0e4cf728126f..4a62fe8cc3bf 100644 > --- a/fs/reiserfs/super.c > +++ b/fs/reiserfs/super.c > @@ -714,18 +714,20 @@ static int reiserfs_show_options(struct seq_file *seq, struct dentry *root) > seq_puts(seq, ",acl"); > > if (REISERFS_SB(s)->s_jdev) > - seq_printf(seq, ",jdev=%s", REISERFS_SB(s)->s_jdev); > + seq_show_option(seq, "jdev", REISERFS_SB(s)->s_jdev); > > if (journal->j_max_commit_age != journal->j_default_max_commit_age) > seq_printf(seq, ",commit=%d", journal->j_max_commit_age); > > #ifdef CONFIG_QUOTA > if (REISERFS_SB(s)->s_qf_names[USRQUOTA]) > - seq_printf(seq, ",usrjquota=%s", REISERFS_SB(s)->s_qf_names[USRQUOTA]); > + seq_show_option(seq, "usrjquota", > + REISERFS_SB(s)->s_qf_names[USRQUOTA]); > else if (opts & (1 << REISERFS_USRQUOTA)) > seq_puts(seq, ",usrquota"); > if (REISERFS_SB(s)->s_qf_names[GRPQUOTA]) > - seq_printf(seq, ",grpjquota=%s", REISERFS_SB(s)->s_qf_names[GRPQUOTA]); > + seq_show_option(seq, "grpjquota", > + REISERFS_SB(s)->s_qf_names[GRPQUOTA]); > else if (opts & (1 << REISERFS_GRPQUOTA)) > seq_puts(seq, ",grpquota"); > if (REISERFS_SB(s)->s_jquota_fmt) { > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 1fb16562c159..bbd9b1f10ffb 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -511,9 +511,9 @@ xfs_showargs( > seq_printf(m, "," MNTOPT_LOGBSIZE "=%dk", mp->m_logbsize >> 10); > > if (mp->m_logname) > - seq_printf(m, "," MNTOPT_LOGDEV "=%s", mp->m_logname); > + seq_show_option(m, MNTOPT_LOGDEV, mp->m_logname); > if (mp->m_rtname) > - seq_printf(m, "," MNTOPT_RTDEV "=%s", mp->m_rtname); > + seq_show_option(m, MNTOPT_RTDEV, mp->m_rtname); > > if (mp->m_dalign > 0) > seq_printf(m, "," MNTOPT_SUNIT "=%d", > diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h > index 912a7c482649..ff4c631348dd 100644 > --- a/include/linux/seq_file.h > +++ b/include/linux/seq_file.h > @@ -149,6 +149,40 @@ static inline struct user_namespace *seq_user_ns(struct seq_file *seq) > #endif > } > > +/** > + * seq_show_options - display mount options with appropriate escapes. > + * @m: the seq_file handle > + * @name: the mount option name > + * @value: the mount option name's value, can be NULL > + */ > +static inline void seq_show_option(struct seq_file *m, char *name, char *value) > +{ > + seq_putc(m, ','); > + seq_escape(m, name, ",= \t\n\\"); > + if (value) { > + seq_putc(m, '='); > + seq_escape(m, value, ", \t\n\\"); > + } > +} > + > +/** > + * seq_show_option_n - display mount options with appropriate escapes > + * where @value must be a specific length. > + * @m: the seq_file handle > + * @name: the mount option name > + * @value: the mount option name's value, cannot be NULL > + * @length: the length of @value to display > + * > + * This is a macro since this uses "length" to define the size of the > + * stack buffer. > + */ > +#define seq_show_option_n(m, name, value, length) { \ > + char val_buf[length + 1]; \ > + strncpy(val_buf, value, length); \ > + val_buf[length] = '\0'; \ > + seq_show_option(m, name, val_buf); \ > +} > + > #define SEQ_START_TOKEN ((void *)1) > /* > * Helpers for iteration over list_head-s in seq_files > diff --git a/kernel/cgroup.c b/kernel/cgroup.c > index f89d9292eee6..c6c4240e7d28 100644 > --- a/kernel/cgroup.c > +++ b/kernel/cgroup.c > @@ -1334,7 +1334,7 @@ static int cgroup_show_options(struct seq_file *seq, > > for_each_subsys(ss, ssid) > if (root->subsys_mask & (1 << ssid)) > - seq_printf(seq, ",%s", ss->name); > + seq_show_option(seq, ss->name, NULL); > if (root->flags & CGRP_ROOT_NOPREFIX) > seq_puts(seq, ",noprefix"); > if (root->flags & CGRP_ROOT_XATTR) > @@ -1342,13 +1342,14 @@ static int cgroup_show_options(struct seq_file *seq, > > spin_lock(&release_agent_path_lock); > if (strlen(root->release_agent_path)) > - seq_printf(seq, ",release_agent=%s", root->release_agent_path); > + seq_show_option(seq, "release_agent", > + root->release_agent_path); > spin_unlock(&release_agent_path_lock); > > if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->cgrp.flags)) > seq_puts(seq, ",clone_children"); > if (strlen(root->name)) > - seq_printf(seq, ",name=%s", root->name); > + seq_show_option(seq, "name", root->name); > return 0; > } > > diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c > index f30329f72641..b2197e17a742 100644 > --- a/net/ceph/ceph_common.c > +++ b/net/ceph/ceph_common.c > @@ -517,8 +517,11 @@ int ceph_print_client_options(struct seq_file *m, struct ceph_client *client) > struct ceph_options *opt = client->options; > size_t pos = m->count; > > - if (opt->name) > - seq_printf(m, "name=%s,", opt->name); > + if (opt->name) { > + seq_puts(m, "name="); > + seq_escape(m, opt->name, ", \t\n\\"); > + seq_putc(','); > + } > if (opt->key) > seq_puts(m, "secret=,"); > > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c > index 564079c5c49d..cdf4c589a391 100644 > --- a/security/selinux/hooks.c > +++ b/security/selinux/hooks.c > @@ -1100,7 +1100,7 @@ static void selinux_write_opts(struct seq_file *m, > seq_puts(m, prefix); > if (has_comma) > seq_putc(m, '\"'); > - seq_puts(m, opts->mnt_opts[i]); > + seq_escape(m, opts->mnt_opts[i], "\"\n\\"); > if (has_comma) > seq_putc(m, '\"'); > } > -- > 1.9.1 > > > -- > Kees Cook > Chrome OS Security > -- Jan Kara SUSE Labs, CR From ibeynurs@host1.missoulianapps.com Mon Aug 10 11:58:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=FREEMAIL_FROM,URG_BIZ autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EE2107F47 for ; Mon, 10 Aug 2015 11:58:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D4D478F804B for ; Mon, 10 Aug 2015 09:58:18 -0700 (PDT) X-ASG-Debug-ID: 1439225897-04cbb0416c30c500001-NocioJ Received: from host1.missoulianapps.com (host1.missoulianapps.com [173.199.128.206]) by cuda.sgi.com with ESMTP id 0psro7JbDeQu424K (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 09:58:17 -0700 (PDT) X-Barracuda-Envelope-From: ibeynurs@host1.missoulianapps.com X-Barracuda-Apparent-Source-IP: 173.199.128.206 Received: from ibeynurs by host1.missoulianapps.com with local (Exim 4.85) (envelope-from ) id 1ZOpM5-0004YW-EN for xfs@oss.sgi.com; Mon, 10 Aug 2015 10:51:17 -0500 Date: Mon, 10 Aug 2015 16:51:17 +0100 To: xfs@oss.sgi.com From: =?UTF-8?Q?David_Anderson?= Subject: =?UTF-8?Q?Urgent_Proposal?= Message-ID: <1b12f3934ee2929ff532ca57b8150382@ibeylandscape.com> X-ASG-Orig-Subj: =?UTF-8?Q?Urgent_Proposal?= X-Priority: 3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="us-ascii" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - host1.missoulianapps.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [557 32007] / [47 12] X-AntiAbuse: Sender Address Domain - host1.missoulianapps.com X-Get-Message-Sender-Via: host1.missoulianapps.com: authenticated_id: ibeynurs/only user confirmed/virtual account not confirmed X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: host1.missoulianapps.com[173.199.128.206] X-Barracuda-Start-Time: 1439225897 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.77 X-Barracuda-Spam-Status: No, SCORE=1.77 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=TVD_PH_SUBJ_URGENT, URG_BIZ X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.67 URG_BIZ BODY: Contains urgent matter 1.10 TVD_PH_SUBJ_URGENT TVD_PH_SUBJ_URGENT Good day, How are you doing today? Please excuse my unconventional mode of approach w= hich was out of desperation and forgive me for invading your privacy through this medium.Nevertheless, I de= sire to convey a very important message which in the long run will be conjointly beneficial to us. This entails a business dealing which I will make known to you the full det= ails in my next mail upon your response and readiness to work with me.Please do take this mail in earnest. Hopefully I will hear from you soon. Thank you, David Anderson From OliveGarden@lpadbiz.com Mon Aug 10 13:02:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=DATE_IN_PAST_12_24, HTML_IMAGE_RATIO_04,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3BD0E7F47 for ; Mon, 10 Aug 2015 13:02:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 271F6304067 for ; Mon, 10 Aug 2015 11:01:58 -0700 (PDT) X-ASG-Debug-ID: 1439229715-04cbb0416f30e260001-NocioJ Received: from 140.lpadbiz.com (140.lpadbiz.com [209.183.115.140]) by cuda.sgi.com with ESMTP id DJBTcD35KIaUl9sa for ; Mon, 10 Aug 2015 11:01:55 -0700 (PDT) X-Barracuda-Envelope-From: OliveGarden@lpadbiz.com X-Barracuda-Apparent-Source-IP: 209.183.115.140 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=key1; d=lpadbiz.com; h=Date:List-Unsubscribe:Mime-Version:Content-Type:From:To:Subject:Reply-To; i=OliveGarden@lpadbiz.com; bh=ozysk64P4OQe9GvBU3lHQwdC3U4=; b=gvhNL8UXnJyRJw+k6fvxKqJbLA96ckT9IPfEWzaKkqeuNoqRGuKikvIXFWShh0Fy7ZEQAJC1OtAe TNMfHYoZiW8Jc9zvUPjLN8N05Zh4iLxagBjAl/XykAr6+40S58VUE1e+fqzEvapeNYeFRnCo3Chh NxvHz4YYnrTYu3D3nX4= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=key1; d=lpadbiz.com; b=awh8Tub7yG7PKhQT7sLl7dLJcp/u0ISVJ009wYBiRnV9Gyc1Oi7ktV4g1R3S78FpKL54gYNkyDGA r0vqXnwjUvMFdQ+ddrCYJufGVIsH8yXlIB45yDzGFcHsB+Rjfi8NJMENV3wDDcdg97IjomYra6It GbPZx5cajtNAJauZUGM=; Received: by 140.lpadbiz.com id hp3jfk1goikc for ; Mon, 10 Aug 2015 13:59:59 -0400 (envelope-from ) x-skyfall: 123642046 x-caiverzi: 3_3_21059 Date:10 Aug 2015 01:42:53 PM -0400 List-Unsubscribe: mailto:unsubscribe@lpadbiz.com Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="12345" From: "Olive Garden" To: Subject: Catering Delivery Now Available Reply-To: mail@lpadbiz.com X-ASG-Orig-Subj: Catering Delivery Now Available X-Barracuda-Connect: 140.lpadbiz.com[209.183.115.140] X-Barracuda-Start-Time: 1439229715 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.13 X-Barracuda-Spam-Status: No, SCORE=1.13 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, DKIM_SIGNED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Message-Id: <20150810180158.E3A84106C925@cuda.sgi.com> --12345 Content-Type: text/plain; Ordering lunch for your group has never been easier! LOCATIONS MENUS ORDER ONLINE Let Us Make Lunch Easy Whether treating clients to lunch or celebrating at the office, getting everyone's favorites just got easier. With a minimum purchase of $125, we'll deliver Olive Garden(r) Catering and set everything up for you. Just call us to place your order* and you can get back to business we'll take care of the rest. Interested in hearing more from Olive Garden? Join our eClub and receive exclusive news, offers and coupons. VIEW DELIVERY MENU Delivery minimum phone order of $125 from Catering menu. FOLLOW US LOCATIONS MENUS ORDER ONLINE If you are having trouble viewing this email, http://lpadbiz.com/ViewInBrowser.aspx?order=1299ee75-84de-4b0f-a478-9ed7d5cb6db3&rec=123642046&scope=final&appServerId=3&appId=3 . *24-hour notice preferred for orders within delivery area. All orders are subject to a 15% delivery service charge, of which 7% is paid to the driver, and is not a gratuity. Chafing dish, rack and fuel available for purchase. Learn more at www.olivegarden.com/delivery 2015 Darden Concepts, Inc. All rights reserved. Refer A Friend | Contact Us | Legal Notices Privacy Notice / Your California Privacy Rights Olive Garden 1000 Darden Center Dr, Orlando FL 32837 If you wish to no longer receive messages, please press here If you wish to no longer receive messages, please press here: http://lpadbiz.com/optout.aspx?eseq=123642046&cmp=1299ee75-84de-4b0f-a478-9ed7d5cb6db3&appServerId=3&appId=3 --12345 Content-Type: text/html; Olive Garden
Ordering lunch for your group has never been easier!
Olive Garden
LOCATIONS MENUS ORDER ONLINE
Catering Delivery Now Available
Let Us Make Lunch Easy
Let Us Make Lunch Easy
Whether treating clients to lunch or celebrating at the office, getting everyone's favorites just got easier. With a minimum purchase of $125, we'll deliver Olive Garden® Catering and set everything up for you. Just call us to place your order* and you can get back to business – we'll take care of the rest.
Interested in hearing more from Olive Garden? Join our eClub and receive exclusive news, offers and coupons.
VIEW DELIVERY MENU
Delivery minimum phone order of $125 from Catering menu.
Olive Garden® Catering
FOLLOW US Facebook Twitter Instagram YouTube
LOCATIONS MENUS ORDER ONLINE
 
If you are having trouble viewing this email, View email in browser.
*24-hour notice preferred for orders within delivery area. All orders are subject to a 15% delivery service charge, of which 7% is paid to the driver, and is not a gratuity. Chafing dish, rack and fuel available for purchase. Learn more at www.olivegarden.com/delivery
© 2015 Darden Concepts, Inc. All rights reserved.
Refer A Friend  |  Contact Us  |  Legal Notices
Privacy Notice / Your California Privacy Rights
 
Olive Garden
1000 Darden Center Dr, Orlando FL 32837

If you wish to no longer receive messages, please press here
 
 
                                                           
--12345-- From bfoster@redhat.com Mon Aug 10 13:55:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D77F7F47 for ; Mon, 10 Aug 2015 13:55:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 46CF28F8059 for ; Mon, 10 Aug 2015 11:55:42 -0700 (PDT) X-ASG-Debug-ID: 1439232940-04cb6c673d395c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zneCbmqgHsP98Q6p (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 11:55:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id BD53883F65; Mon, 10 Aug 2015 18:55:40 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AIteh5030784; Mon, 10 Aug 2015 14:55:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 807E312019F; Mon, 10 Aug 2015 14:55:39 -0400 (EDT) Date: Mon, 10 Aug 2015 14:55:39 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH RFC 1/2] xfs: return committed status from xfs_trans_roll() Message-ID: <20150810185539.GB33960@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH RFC 1/2] xfs: return committed status from xfs_trans_roll() References: <1437682410-51778-3-git-send-email-bfoster@redhat.com> <1437682410-51778-2-git-send-email-bfoster@redhat.com> <20150728004009.GB24249@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150728004009.GB24249@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439232941 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Jul 28, 2015 at 10:40:09AM +1000, Dave Chinner wrote: > [ reply to both patches in one reply, because it's related. ] > > On Thu, Jul 23, 2015 at 04:13:29PM -0400, Brian Foster wrote: > > Some callers need to make error handling decisions based on whether the > > current transaction successfully committed or not. Rename > > xfs_trans_roll(), add a new parameter and provide a wrapper to preserve > > existing callers. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_trans.c | 15 +++++++++++++-- > > fs/xfs/xfs_trans.h | 1 + > > 2 files changed, 14 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > > index 0582a27..a0ab1da 100644 > > --- a/fs/xfs/xfs_trans.c > > +++ b/fs/xfs/xfs_trans.c > > @@ -1019,9 +1019,10 @@ xfs_trans_cancel( > > * chunk we've been working on and get a new transaction to continue. > > */ > > int > > -xfs_trans_roll( > > +__xfs_trans_roll( ... > So xfs_qm_dqalloc(), on error, simply cancels the freelist and > returns the error - it ignores the committed flag. So the committed > flag is used to determine how to handle the dquot buffer: > > xfs_trans_bhold(tp, bp); > > if ((error = xfs_bmap_finish(tpp, &flist, &committed))) { > goto error1; > } > > if (committed) { > tp = *tpp; > xfs_trans_bjoin(tp, bp); > } else { > xfs_trans_bhold_release(tp, bp); > } > > Now, xfs_trans_bhold() simply sets the BLI_HOLD flag on the buffer, > and transaction commit clears it. That means we could call it > unconditionally, and all we have to do is remove an assert(BLI_HOLD) > from xfs_trans_bhold_release() to enable that. Given this is the > only caller of xfs_trans_bhold_release(), I don't see a problem with > doing that. Nor is there a problem with multiple joins of an object > to a transaction, so we could simply make this: > > xfs_trans_bhold(tp, bp); > error = xfs_bmap_finish(tpp, &flist, &committed); > if (error) > goto error1; > tp = *tpp; > xfs_trans_bjoin(tp, bp); > xfs_trans_bhold_release(tp, bp); > > And the committed flag is not necessary. With this, we can hide > everything to do with error on commit vs error after commit inside > xfs_bmap_finish()... > I'm starting to look back at this and try to understand the intent here (FYI, I've appended some of the xfs_bmap_cancel() fixes to v3 of the EFI/EFD series, to be posted shortly). Is the proposition that we should be able to remove the committed parameter from xfs_bmap_finish() entirely? If so, the buffer hold technique makes some sense here, but not necessarily the potential for multiple joins of the object to the transaction that this kind of usage introduces. At least, there are currently assertions to protect against that kind of thing in the buffer/inode join handlers that would have to be removed. In the case of a buffer join, it looks like there's some reference counting that would have to be rectified against this type of usage (I take it there is some appropriate use for this that I'm not familiar with). Both the buffer and inode cases also look like they'd introduce multiple calls to xfs_trans_add_item(), which I'm not sure is totally safe at a glance. The fact that an xfs_log_item points to a single xfs_log_item_desc looks a bit suspicious to me, but I'd have to take a harder look at that. Even if it were completely safe, IMO we obfuscate the context of code as shown above because the object could be added to the new transaction or re-added to the original depending on whether the previous transaction freed some blocks or not. In other words, I think a multiple join of an object has to be made completely idempotent in order to justify use of a pattern like that shown above. I'm not sure it's worth doing that just to kill a flag. Thoughts? Brian > > efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); > > for (free = flist->xbf_first; free != NULL; free = next) { > > next = free->xbfi_next; > > - if ((error = xfs_free_extent(*tp, free->xbfi_startblock, > > - free->xbfi_blockcount))) { > > + > > + /* > > + * Free the extent if the above trans roll hasn't failed and log > > + * the EFD before handling errors from either call to ensure the > > + * EFI reference is accounted for in the tp. Otherwise, the EFI > > + * is never released on abort and pins the AIL indefinitely. > > + */ > > + if (!error) > > + error = xfs_free_extent(*tp, free->xbfi_startblock, > > + free->xbfi_blockcount); > > + xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, > > + free->xbfi_blockcount); > > + if (error) { > > /* > > * The bmap free list will be cleaned up at a > > * higher level. The EFI will be canceled when > > @@ -118,11 +134,10 @@ xfs_bmap_finish( > > SHUTDOWN_META_IO_ERROR); > > return error; > > } > > - xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, > > - free->xbfi_blockcount); > > xfs_bmap_del_free(flist, NULL, free); > > } > > - return 0; > > + > > + return error; > > This loop doesn't obviously do the right thing now. It > will log the first extent into the EFD and then trigger a shutdown > and return. The extent count in the EFD may not match the > extent count on the EFI, so releasing the EFD at this point may not > release all the extents in the EFI and hence not release the EFI. > > I think I'd prefer to see a xfs_trans_cancel_efi() call to handle > this error path rather than having to go through the efd to release > the reference on the EFI. i.e. > > error = __xfs_trans_roll(tp, NULL, &committed); > if (error) { > if (committed) { > if (!XFS_FORCED_SHUTDOWN(mp)) > xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); > xfs_efi_cancel(tp, efi); > } > return error; > } > > /* > * Cancel a committed EFI after triggering a shutdown. We need to do > * this so that the committed EFI is removed from the AIL and freed, > * otherwise unmount will hang due to a non-empty AIL. > */ > xfs_efi_cancel() > { > ASSERT(XFS_FORCED_SHUTDOWN(mp)); > xfs_efi_release(efi, efi->nextents); > } > > Doing this means there's less complexity on the EFD abort side of > things, as we don't have to now handle this failure case via > transaction completion callback interface. > > Hmmm - something I just noticed: if we only have one EFD per EFI, > why do we do we have that layer of extent counting before dropping > real references? > > > xfs_efd_item_unlock( > > struct xfs_log_item *lip) > > { > > - if (lip->li_flags & XFS_LI_ABORTED) > > - xfs_efd_item_free(EFD_ITEM(lip)); > > + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > > + > > + if (lip->li_flags & XFS_LI_ABORTED) { > > + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); > > + xfs_efd_item_free(efdp); > > + } > > } > > i.e. we always call xfs_efi_release() with efi_nextents or > efd_nextents, which are always the same, and so we never partially > complete an EFI. Should we just kill that layer, as it does tend to > complicate the EFI release code? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 10 14:01:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A38B47F47 for ; Mon, 10 Aug 2015 14:01:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 72BBC8F8052 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04bdf06bd22d1fb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9i7DtBCC5f2dtBQQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 69B1D351E6E for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1p2V001468 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 14CA11202E2; Mon, 10 Aug 2015 15:01:50 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 10/13] xfs: clean up root inode properly on mount failure Date: Mon, 10 Aug 2015 15:01:46 -0400 X-ASG-Orig-Subj: [PATCH v3 10/13] xfs: clean up root inode properly on mount failure Message-Id: <1439233309-19959-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The root inode is read as part of the xfs_mountfs() sequence and the reference is dropped in the event of failure after we grab the inode. The reference drop doesn't necessarily free the inode, however. It marks it for reclaim and potentially kicks off the reclaim workqueue. The workqueue is destroyed further up the error path, which means we are subject to crash if the workqueue job runs after this point or a memory leak which is identified if the xfs_inode_zone is destroyed (e.g., on module removal). Both of these outcomes are reproducible via manual instrumentation of a mount error after the root inode xfs_iget() call in xfs_mountfs(). Update the xfs_mountfs() error path to cancel any potential reclaim work items and to run a synchronous inode reclaim if the root inode is marked for reclaim. This ensures that no jobs remain on the queue before it is destroyed and that the root inode is freed before the reclaim mechanism is torn down. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_mount.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4825a8a..bf92e0c 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -957,6 +957,8 @@ xfs_mountfs( xfs_rtunmount_inodes(mp); out_rele_rip: IRELE(rip); + cancel_delayed_work_sync(&mp->m_reclaim_work); + xfs_reclaim_inodes(mp, SYNC_WAIT); out_log_dealloc: xfs_log_mount_cancel(mp); out_fail_wait: -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BE5D47F4E for ; Mon, 10 Aug 2015 14:01:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ABCFF8F8054 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cbb0416e30f8f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4HKit8znjylQZPvP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 4A9648E4ED for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1o5Z005102 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D289912026D; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 06/13] xfs: don't leave EFIs on AIL on mount failure Date: Mon, 10 Aug 2015 15:01:42 -0400 X-ASG-Orig-Subj: [PATCH v3 06/13] xfs: don't leave EFIs on AIL on mount failure Message-Id: <1439233309-19959-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery occurs in two phases at mount time. In the first phase, EFIs and EFDs are processed and potentially cancelled out. EFIs without EFD objects are inserted into the AIL for processing and recovery in the second phase. xfs_mountfs() runs various other operations between the phases and is thus subject to failure. If failure occurs after the first phase but before the second, pending EFIs sit on the AIL, pin it and cause the mount to hang. Update the mount sequence to ensure that pending EFIs are cancelled in the event of failure. Add a recovery cancellation mechanism to iterate the AIL and cancel all EFI items when requested. Plumb cancellation support through the log mount finish helper and update xfs_mountfs() to invoke cancellation in the event of failure after recovery has started. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 30 ++++++++++++++++++----- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_priv.h | 2 ++ fs/xfs/xfs_log_recover.c | 63 +++++++++++++++++++++++++++++++++++++++++++++--- fs/xfs/xfs_mount.c | 26 +++++++++++--------- 5 files changed, 100 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6b5a84a..3a5592c 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -700,6 +700,7 @@ xfs_log_mount( if (error) { xfs_warn(mp, "log mount/recovery failed: error %d", error); + xlog_recover_cancel(mp->m_log); goto out_destroy_ail; } } @@ -740,18 +741,35 @@ out: * it. */ int -xfs_log_mount_finish(xfs_mount_t *mp) +xfs_log_mount_finish( + struct xfs_mount *mp) { int error = 0; - if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) { - error = xlog_recover_finish(mp->m_log); - if (!error) - xfs_log_work_queue(mp); - } else { + if (mp->m_flags & XFS_MOUNT_NORECOVERY) { ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); + return 0; } + error = xlog_recover_finish(mp->m_log); + if (!error) + xfs_log_work_queue(mp); + + return error; +} + +/* + * The mount has failed. Cancel the recovery if it hasn't completed and destroy + * the log. + */ +int +xfs_log_mount_cancel( + struct xfs_mount *mp) +{ + int error; + + error = xlog_recover_cancel(mp->m_log); + xfs_log_unmount(mp); return error; } diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index fa27aae..09d91d3 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -147,6 +147,7 @@ int xfs_log_mount(struct xfs_mount *mp, xfs_daddr_t start_block, int num_bblocks); int xfs_log_mount_finish(struct xfs_mount *mp); +int xfs_log_mount_cancel(struct xfs_mount *); xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); void xfs_log_space_wake(struct xfs_mount *mp); diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 1c87c8a..950f3f9 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -426,6 +426,8 @@ xlog_recover( extern int xlog_recover_finish( struct xlog *log); +extern int +xlog_recover_cancel(struct xlog *); extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, char *dp, int size); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index f3965f7..3016b80 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3817,10 +3817,10 @@ abort_error: */ STATIC int xlog_recover_process_efis( - struct xlog *log) + struct xlog *log) { - xfs_log_item_t *lip; - xfs_efi_log_item_t *efip; + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; int error = 0; struct xfs_ail_cursor cur; struct xfs_ail *ailp; @@ -3844,7 +3844,7 @@ xlog_recover_process_efis( /* * Skip EFIs that we've already processed. */ - efip = (xfs_efi_log_item_t *)lip; + efip = container_of(lip, struct xfs_efi_log_item, efi_item); if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { lip = xfs_trans_ail_cursor_next(ailp, &cur); continue; @@ -3864,6 +3864,50 @@ out: } /* + * A cancel occurs when the mount has failed and we're bailing out. Release all + * pending EFIs so they don't pin the AIL. + */ +STATIC int +xlog_recover_cancel_efis( + struct xlog *log) +{ + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; + int error = 0; + struct xfs_ail_cursor cur; + struct xfs_ail *ailp; + + ailp = log->l_ailp; + spin_lock(&ailp->xa_lock); + lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); + while (lip != NULL) { + /* + * We're done when we see something other than an EFI. + * There should be no EFIs left in the AIL now. + */ + if (lip->li_type != XFS_LI_EFI) { +#ifdef DEBUG + for (; lip; lip = xfs_trans_ail_cursor_next(ailp, &cur)) + ASSERT(lip->li_type != XFS_LI_EFI); +#endif + break; + } + + efip = container_of(lip, struct xfs_efi_log_item, efi_item); + + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip); + spin_lock(&ailp->xa_lock); + + lip = xfs_trans_ail_cursor_next(ailp, &cur); + } + + xfs_trans_ail_cursor_done(&cur); + spin_unlock(&ailp->xa_lock); + return error; +} + +/* * This routine performs a transaction to null out a bad inode pointer * in an agi unlinked inode hash bucket. */ @@ -4638,6 +4682,17 @@ xlog_recover_finish( return 0; } +int +xlog_recover_cancel( + struct xlog *log) +{ + int error = 0; + + if (log->l_flags & XLOG_RECOVERY_NEEDED) + error = xlog_recover_cancel_efis(log); + + return error; +} #if defined(DEBUG) /* diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 461e791..4825a8a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -615,14 +615,14 @@ xfs_default_resblks(xfs_mount_t *mp) */ int xfs_mountfs( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_sb_t *sbp = &(mp->m_sb); - xfs_inode_t *rip; - __uint64_t resblks; - uint quotamount = 0; - uint quotaflags = 0; - int error = 0; + struct xfs_sb *sbp = &(mp->m_sb); + struct xfs_inode *rip; + __uint64_t resblks; + uint quotamount = 0; + uint quotaflags = 0; + int error = 0; xfs_sb_mount_common(mp, sbp); @@ -799,7 +799,9 @@ xfs_mountfs( } /* - * log's mount-time initialization. Perform 1st part recovery if needed + * Log's mount-time initialization. The first part of recovery can place + * some items on the AIL, to be handled when recovery is finished or + * cancelled. */ error = xfs_log_mount(mp, mp->m_logdev_targp, XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), @@ -910,9 +912,9 @@ xfs_mountfs( } /* - * Finish recovering the file system. This part needed to be - * delayed until after the root and real-time bitmap inodes - * were consistently read in. + * Finish recovering the file system. This part needed to be delayed + * until after the root and real-time bitmap inodes were consistently + * read in. */ error = xfs_log_mount_finish(mp); if (error) { @@ -956,7 +958,7 @@ xfs_mountfs( out_rele_rip: IRELE(rip); out_log_dealloc: - xfs_log_unmount(mp); + xfs_log_mount_cancel(mp); out_fail_wait: if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) xfs_wait_buftarg(mp->m_logdev_targp); -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 15C657F47 for ; Mon, 10 Aug 2015 14:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02EAA8F804C for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cb6c6740395e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gzpubFfkk56P9IGl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 868CE3679E1 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1pT5005206 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 43C1B12018A; Mon, 10 Aug 2015 15:01:50 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 12/13] xfs: add helper to conditionally remove items from the AIL Date: Mon, 10 Aug 2015 15:01:48 -0400 X-ASG-Orig-Subj: [PATCH v3 12/13] xfs: add helper to conditionally remove items from the AIL Message-Id: <1439233309-19959-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233312 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Several areas of code duplicate a pattern where we take the AIL lock, check whether an item is in the AIL and remove it if so. Create a new helper for this pattern and use it where appropriate. Signed-off-by: Brian Foster --- fs/xfs/xfs_buf_item.c | 7 ++----- fs/xfs/xfs_dquot.c | 8 ++------ fs/xfs/xfs_extfree_item.c | 13 ++----------- fs/xfs/xfs_inode_item.c | 10 ++-------- fs/xfs/xfs_trans_priv.h | 14 ++++++++++++++ 5 files changed, 22 insertions(+), 30 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 092d652..f89abeb 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -647,11 +647,8 @@ xfs_buf_item_unlock( xfs_buf_item_relse(bp); else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); - if (lip->li_flags & XFS_LI_IN_AIL) { - spin_lock(&lip->li_ailp->xa_lock); - xfs_trans_ail_delete(lip->li_ailp, lip, - SHUTDOWN_LOG_IO_ERROR); - } + xfs_trans_ail_remove(lip->li_ailp, lip, + SHUTDOWN_LOG_IO_ERROR); xfs_buf_item_relse(bp); } } diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 4143dc7..03e0ca8 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -954,12 +954,8 @@ xfs_qm_dqflush( struct xfs_log_item *lip = &dqp->q_logitem.qli_item; dqp->dq_flags &= ~XFS_DQ_DIRTY; - spin_lock(&mp->m_ail->xa_lock); - if (lip->li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(mp->m_ail, lip, - SHUTDOWN_CORRUPT_INCORE); - else - spin_unlock(&mp->m_ail->xa_lock); + xfs_trans_ail_remove(mp->m_ail, lip, SHUTDOWN_CORRUPT_INCORE); + error = -EIO; goto out_unlock; } diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index ce1d4fb..62fe41a 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -289,17 +289,8 @@ xfs_efi_release( struct xfs_ail *ailp = efip->efi_item.li_ailp; if (atomic_dec_and_test(&efip->efi_refcount)) { - spin_lock(&ailp->xa_lock); - /* - * We don't know whether the EFI made it to the AIL. Remove it - * if so. Note that xfs_trans_ail_delete() drops the AIL lock. - */ - if (efip->efi_item.li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); - else - spin_unlock(&ailp->xa_lock); - + xfs_trans_ail_remove(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); xfs_efi_item_free(efip); } } diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index bf13a5a..d4fac829 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -705,15 +705,9 @@ xfs_iflush_abort( if (iip) { struct xfs_ail *ailp = iip->ili_item.li_ailp; if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { - spin_lock(&ailp->xa_lock); - if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &iip->ili_item, - stale ? - SHUTDOWN_LOG_IO_ERROR : + xfs_trans_ail_remove(ailp, &iip->ili_item, + stale ? SHUTDOWN_LOG_IO_ERROR : SHUTDOWN_CORRUPT_INCORE); - } else - spin_unlock(&ailp->xa_lock); } iip->ili_logged = 0; /* diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 1b73629..c70c670 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -119,6 +119,20 @@ xfs_trans_ail_delete( xfs_trans_ail_delete_bulk(ailp, &lip, 1, shutdown_type); } +static inline void +xfs_trans_ail_remove( + struct xfs_ail *ailp, + struct xfs_log_item *lip, + int shutdown_type) +{ + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_delete() drops the AIL lock */ + if (lip->li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, lip, shutdown_type); + else + spin_unlock(&ailp->xa_lock); +} + void xfs_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_ail_push_all(struct xfs_ail *); void xfs_ail_push_all_sync(struct xfs_ail *); -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CE8117F50 for ; Mon, 10 Aug 2015 14:01:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A460C8F8052 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cb6c673f395e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SyXegsuWQ5CF7wyz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 484C79D1E9 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1okG002506 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0A40C1203DF; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 07/13] xfs: icreate log item recovery and cancellation tracepoints Date: Mon, 10 Aug 2015 15:01:43 -0400 X-ASG-Orig-Subj: [PATCH v3 07/13] xfs: icreate log item recovery and cancellation tracepoints Message-Id: <1439233309-19959-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Various log items have recovery tracepoints to identify whether a particular log item is recovered or cancelled. Add the equivalent tracepoints for the icreate transaction. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_log_recover.c | 5 ++++- fs/xfs/xfs_trace.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3016b80..8369bf3 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3104,9 +3104,12 @@ xlog_recover_do_icreate_pass2( * done easily. */ if (xlog_check_buffer_cancelled(log, - XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) + XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) { + trace_xfs_log_recover_icreate_cancel(log, icl); return 0; + } + trace_xfs_log_recover_icreate_recover(log, icl); xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, be32_to_cpu(icl->icl_gen)); return 0; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 8d916d3..9aeeb21 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2089,6 +2089,40 @@ DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_recover); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_cancel); DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_skip); +DECLARE_EVENT_CLASS(xfs_log_recover_icreate_item_class, + TP_PROTO(struct xlog *log, struct xfs_icreate_log *in_f), + TP_ARGS(log, in_f), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(unsigned int, count) + __field(unsigned int, isize) + __field(xfs_agblock_t, length) + __field(unsigned int, gen) + ), + TP_fast_assign( + __entry->dev = log->l_mp->m_super->s_dev; + __entry->agno = be32_to_cpu(in_f->icl_ag); + __entry->agbno = be32_to_cpu(in_f->icl_agbno); + __entry->count = be32_to_cpu(in_f->icl_count); + __entry->isize = be32_to_cpu(in_f->icl_isize); + __entry->length = be32_to_cpu(in_f->icl_length); + __entry->gen = be32_to_cpu(in_f->icl_gen); + ), + TP_printk("dev %d:%d agno %u agbno %u count %u isize %u length %u " + "gen %u", MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, __entry->agbno, __entry->count, __entry->isize, + __entry->length, __entry->gen) +) +#define DEFINE_LOG_RECOVER_ICREATE_ITEM(name) \ +DEFINE_EVENT(xfs_log_recover_icreate_item_class, name, \ + TP_PROTO(struct xlog *log, struct xfs_icreate_log *in_f), \ + TP_ARGS(log, in_f)) + +DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_cancel); +DEFINE_LOG_RECOVER_ICREATE_ITEM(xfs_log_recover_icreate_recover); + DECLARE_EVENT_CLASS(xfs_discard_class, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len), -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 700207F51 for ; Mon, 10 Aug 2015 14:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 049A1AC004 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cbb0416d30f8f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qJqHupP9zDHeVpS2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 5C7A9461DC for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1pqN005193 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 23512120574; Mon, 10 Aug 2015 15:01:50 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 09/13] xfs: checksum log record ext headers based on record size Date: Mon, 10 Aug 2015 15:01:45 -0400 X-ASG-Orig-Subj: [PATCH v3 09/13] xfs: checksum log record ext headers based on record size Message-Id: <1439233309-19959-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The first 4 bytes of every basic block in the physical log is stamped with the current lsn. To support this mechanism, the log record header (first block of each new log record) contains space for the original first byte of each log record block before it is replaced with the lsn. The log record header has space for 32k worth of blocks. The version 2 log adds new extended record headers for each additional 32k worth of blocks beyond what is supported by the record header. The log record checksum incorporates the log record header, the extended headers and the record payload. xlog_cksum() checksums the extended headers based on log->l_iclog_heads, which specifies the number of extended headers in a log record based on the log buffer size mount option. The log buffer size is variable, however, and thus means the checksum can be calculated differently based on how a filesystem is mounted. This is problematic if a filesystem crashes and recovery occurs on a subsequent mount using a different log buffer size. For example, crash an active filesystem that is mounted with the default (32k) logbsize, attempt remount/recovery using '-o logbsize=64k' and the mount fails on or warns about log checksum failures. To avoid this problem, update xlog_cksum() to calculate the checksum based on the size of the log buffer according to the log record. The size is already included in the h_size field of the log record header and thus is available at log recovery time. Extended log record headers are also only written when the log record is large enough to require them. This makes checksum calculation of log records consistent with the extended record header mechanism as well as how on-disk records are checksummed with various log buffer size mount options. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3a5592c..aaadee0 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1672,8 +1672,13 @@ xlog_cksum( if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { union xlog_in_core2 *xhdr = (union xlog_in_core2 *)rhead; int i; + int xheads; - for (i = 1; i < log->l_iclog_heads; i++) { + xheads = size / XLOG_HEADER_CYCLE_SIZE; + if (size % XLOG_HEADER_CYCLE_SIZE) + xheads++; + + for (i = 1; i < xheads; i++) { crc = crc32c(crc, &xhdr[i].hic_xheader, sizeof(struct xlog_rec_ext_header)); } -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B87D77F5F for ; Mon, 10 Aug 2015 14:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3EC4AAC008 for ; Mon, 10 Aug 2015 12:01:53 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cb6c673e395e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zAj7eBgU70drQ8kt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 5A64B9D1F8 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1o1S009878 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EDE961202D2; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 08/13] xfs: fix broken icreate log item cancellation Date: Mon, 10 Aug 2015 15:01:44 -0400 X-ASG-Orig-Subj: [PATCH v3 08/13] xfs: fix broken icreate log item cancellation Message-Id: <1439233309-19959-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode cluster buffers are invalidated and cancelled when inode chunks are freed to notify log recovery that previous logged updates to the metadata buffer should be skipped. This ensures that log recovery does not overwrite buffers that might have already been reused. On v4 filesystems, inode chunk allocation and inode updates are logged via the cluster buffers and thus cancellation is easily detected via buffer cancellation items. v5 filesystems use the new icreate transaction, which uses logical logging and ordered buffers to log a full inode chunk allocation at once. The resulting icreate item often spans multiple inode cluster buffers. Log recovery checks for cancelled buffers when processing icreate log items, but it has a couple problems. First, it uses the full length of the inode chunk rather than the cluster size. Second, it uses the length in FSB units rather than BB units. Either of these problems prevent icreate recovery from identifying cancelled buffers and thus inode initialization proceeds unconditionally. Update xlog_recover_do_icreate_pass2() to iterate the icreate range in cluster sized increments and check each increment for cancellation. Since icreate is currently only used for the minimum atomic inode chunk allocation, we expect that either all or none of the buffers will be cancelled. Cancel the icreate if at least one buffer is cancelled to avoid making a bad situation worse by initializing a partial inode chunk, but detect such anomalies and warn the user. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 49 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 8369bf3..9ab0866 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3036,6 +3036,11 @@ xlog_recover_do_icreate_pass2( unsigned int count; unsigned int isize; xfs_agblock_t length; + int blks_per_cluster; + int bb_per_cluster; + int cancel_count; + int nbufs; + int i; icl = (struct xfs_icreate_log *)item->ri_buf[0].i_addr; if (icl->icl_type != XFS_LI_ICREATE) { @@ -3094,25 +3099,45 @@ xlog_recover_do_icreate_pass2( } /* - * Inode buffers can be freed. Do not replay the inode initialisation as - * we could be overwriting something written after this inode buffer was - * cancelled. + * The icreate transaction can cover multiple cluster buffers and these + * buffers could have been freed and reused. Check the individual + * buffers for cancellation so we don't overwrite anything written after + * a cancellation. + */ + blks_per_cluster = xfs_icluster_size_fsb(mp); + bb_per_cluster = XFS_FSB_TO_BB(mp, blks_per_cluster); + nbufs = length / blks_per_cluster; + for (i = 0, cancel_count = 0; i < nbufs; i++) { + xfs_daddr_t daddr; + + daddr = XFS_AGB_TO_DADDR(mp, agno, + agbno + i * blks_per_cluster); + if (xlog_check_buffer_cancelled(log, daddr, bb_per_cluster, 0)) + cancel_count++; + } + + /* + * We currently only use icreate for a single allocation at a time. This + * means we should expect either all or none of the buffers to be + * cancelled. Be conservative and skip replay if at least one buffer is + * cancelled, but warn the user that something is awry if the buffers + * are not consistent. * - * XXX: we need to iterate all buffers and only init those that are not - * cancelled. I think that a more fine grained factoring of - * xfs_ialloc_inode_init may be appropriate here to enable this to be - * done easily. + * XXX: This must be refined to only skip cancelled clusters once we use + * icreate for multiple chunk allocations. */ - if (xlog_check_buffer_cancelled(log, - XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) { + ASSERT(!cancel_count || cancel_count == nbufs); + if (cancel_count) { + if (cancel_count != nbufs) + xfs_warn(mp, + "WARNING: partial inode chunk cancellation, skipped icreate."); trace_xfs_log_recover_icreate_cancel(log, icl); return 0; } trace_xfs_log_recover_icreate_recover(log, icl); - xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); - return 0; + return xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, + length, be32_to_cpu(icl->icl_gen)); } STATIC void -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CEA8F7F47 for ; Mon, 10 Aug 2015 14:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 629CAAC009 for ; Mon, 10 Aug 2015 12:01:53 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cb6c673f395e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cvM1zSWjzgSp3vX7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 8DA28461EA for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1pAr002512 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4EFB312019F; Mon, 10 Aug 2015 15:01:50 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 13/13] xfs: add missing bmap cancel calls in error paths Date: Mon, 10 Aug 2015 15:01:49 -0400 X-ASG-Orig-Subj: [PATCH v3 13/13] xfs: add missing bmap cancel calls in error paths Message-Id: <1439233309-19959-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233312 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 If a failure occurs after the bmap free list is populated and before xfs_bmap_finish() completes successfully (which returns a partial list on failure), the bmap free list must be cancelled. Otherwise, the extent items on the list are never freed and a memory leak occurs. Several random error paths throughout the code suffer this problem. Fix these up such that xfs_bmap_cancel() is always called on error. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 1 + fs/xfs/xfs_bmap_util.c | 10 +++++---- fs/xfs/xfs_inode.c | 9 ++++---- fs/xfs/xfs_rtalloc.c | 57 ++++++++++++++++++++++++------------------------ 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 63e05b6..8e2010d 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5945,6 +5945,7 @@ xfs_bmap_split_extent( return xfs_trans_commit(tp); out: + xfs_bmap_cancel(&free_list); xfs_trans_cancel(tp); return error; } diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 73aab0d..3bf4ad0 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1474,7 +1474,7 @@ xfs_shift_file_space( XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, XFS_QMOPT_RES_REGBLKS); if (error) - goto out; + goto out_trans_cancel; xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); @@ -1488,18 +1488,20 @@ xfs_shift_file_space( &done, stop_fsb, &first_block, &free_list, direction, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) - goto out; + goto out_bmap_cancel; error = xfs_bmap_finish(&tp, &free_list, &committed); if (error) - goto out; + goto out_bmap_cancel; error = xfs_trans_commit(tp); } return error; -out: +out_bmap_cancel: + xfs_bmap_cancel(&free_list); +out_trans_cancel: xfs_trans_cancel(tp); return error; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d22a984..d8230ba 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1785,14 +1785,15 @@ xfs_inactive_ifree( xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); /* - * Just ignore errors at this point. There is nothing we can - * do except to try to keep going. Make sure it's not a silent - * error. + * Just ignore errors at this point. There is nothing we can do except + * to try to keep going. Make sure it's not a silent error. */ error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) + if (error) { xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", __func__, error); + xfs_bmap_cancel(&free_list); + } error = xfs_trans_commit(tp); if (error) xfs_notice(mp, "%s: xfs_trans_commit returned error %d", diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index f4e8c06..ab1bac6 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -757,31 +757,30 @@ xfs_rtallocate_extent_size( /* * Allocate space to the bitmap or summary file, and zero it, for growfs. */ -STATIC int /* error */ +STATIC int xfs_growfs_rt_alloc( - xfs_mount_t *mp, /* file system mount point */ - xfs_extlen_t oblocks, /* old count of blocks */ - xfs_extlen_t nblocks, /* new count of blocks */ - xfs_inode_t *ip) /* inode (bitmap/summary) */ + struct xfs_mount *mp, /* file system mount point */ + xfs_extlen_t oblocks, /* old count of blocks */ + xfs_extlen_t nblocks, /* new count of blocks */ + struct xfs_inode *ip) /* inode (bitmap/summary) */ { - xfs_fileoff_t bno; /* block number in file */ - xfs_buf_t *bp; /* temporary buffer for zeroing */ - int committed; /* transaction committed flag */ - xfs_daddr_t d; /* disk block address */ - int error; /* error return value */ - xfs_fsblock_t firstblock; /* first block allocated in xaction */ - xfs_bmap_free_t flist; /* list of freed blocks */ - xfs_fsblock_t fsbno; /* filesystem block for bno */ - xfs_bmbt_irec_t map; /* block map output */ - int nmap; /* number of block maps */ - int resblks; /* space reservation */ + xfs_fileoff_t bno; /* block number in file */ + struct xfs_buf *bp; /* temporary buffer for zeroing */ + int committed; /* transaction committed flag */ + xfs_daddr_t d; /* disk block address */ + int error; /* error return value */ + xfs_fsblock_t firstblock;/* first block allocated in xaction */ + struct xfs_bmap_free flist; /* list of freed blocks */ + xfs_fsblock_t fsbno; /* filesystem block for bno */ + struct xfs_bmbt_irec map; /* block map output */ + int nmap; /* number of block maps */ + int resblks; /* space reservation */ + struct xfs_trans *tp; /* * Allocate space to the file, as necessary. */ while (oblocks < nblocks) { - xfs_trans_t *tp; - tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC); resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); /* @@ -790,7 +789,7 @@ xfs_growfs_rt_alloc( error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtalloc, resblks, 0); if (error) - goto error_cancel; + goto out_trans_cancel; /* * Lock the inode. */ @@ -808,16 +807,16 @@ xfs_growfs_rt_alloc( if (!error && nmap < 1) error = -ENOSPC; if (error) - goto error_cancel; + goto out_bmap_cancel; /* * Free any blocks freed up in the transaction, then commit. */ error = xfs_bmap_finish(&tp, &flist, &committed); if (error) - goto error_cancel; + goto out_bmap_cancel; error = xfs_trans_commit(tp); if (error) - goto error; + return error; /* * Now we need to clear the allocated blocks. * Do this one block per transaction, to keep it simple. @@ -832,7 +831,7 @@ xfs_growfs_rt_alloc( error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtzero, 0, 0); if (error) - goto error_cancel; + goto out_trans_cancel; /* * Lock the bitmap inode. */ @@ -846,9 +845,7 @@ xfs_growfs_rt_alloc( mp->m_bsize, 0); if (bp == NULL) { error = -EIO; -error_cancel: - xfs_trans_cancel(tp); - goto error; + goto out_trans_cancel; } memset(bp->b_addr, 0, mp->m_sb.sb_blocksize); xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); @@ -857,16 +854,20 @@ error_cancel: */ error = xfs_trans_commit(tp); if (error) - goto error; + return error; } /* * Go on to the next extent, if any. */ oblocks = map.br_startoff + map.br_blockcount; } + return 0; -error: +out_bmap_cancel: + xfs_bmap_cancel(&flist); +out_trans_cancel: + xfs_trans_cancel(tp); return error; } -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 371937F5F for ; Mon, 10 Aug 2015 14:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 14A588F804B for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-ASG-Debug-ID: 1439233310-04bdf06bd12d1fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HrvKA6l1GeVhjDqU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id C9CA48E51E for ; Mon, 10 Aug 2015 19:01:50 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1o8h005179 for ; Mon, 10 Aug 2015 15:01:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A07BA12018A; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 02/13] xfs: return committed status from xfs_trans_roll() Date: Mon, 10 Aug 2015 15:01:38 -0400 X-ASG-Orig-Subj: [PATCH v3 02/13] xfs: return committed status from xfs_trans_roll() Message-Id: <1439233309-19959-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Some callers need to make error handling decisions based on whether the current transaction successfully committed or not. Rename xfs_trans_roll(), add a new parameter and provide a wrapper to preserve existing callers. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_trans.c | 15 +++++++++++++-- fs/xfs/xfs_trans.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 0582a27..a0ab1da 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -1019,9 +1019,10 @@ xfs_trans_cancel( * chunk we've been working on and get a new transaction to continue. */ int -xfs_trans_roll( +__xfs_trans_roll( struct xfs_trans **tpp, - struct xfs_inode *dp) + struct xfs_inode *dp, + int *committed) { struct xfs_trans *trans; struct xfs_trans_res tres; @@ -1052,6 +1053,7 @@ xfs_trans_roll( if (error) return error; + *committed = 1; trans = *tpp; /* @@ -1074,3 +1076,12 @@ xfs_trans_roll( xfs_trans_ijoin(trans, dp, 0); return 0; } + +int +xfs_trans_roll( + struct xfs_trans **tpp, + struct xfs_inode *dp) +{ + int committed = 0; + return __xfs_trans_roll(tpp, dp, &committed); +} diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index f48e839..ba1660b 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -225,6 +225,7 @@ void xfs_trans_log_efd_extent(xfs_trans_t *, xfs_fsblock_t, xfs_extlen_t); int xfs_trans_commit(struct xfs_trans *); +int __xfs_trans_roll(struct xfs_trans **, struct xfs_inode *, int *); int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); void xfs_trans_cancel(xfs_trans_t *); int xfs_trans_ail_init(struct xfs_mount *); -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_LOLITA1 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5E23B7F4E for ; Mon, 10 Aug 2015 14:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CA5A304067 for ; Mon, 10 Aug 2015 12:01:53 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cb6c673e395e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id h1SujpOeVPZBzIlI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 3B9F22652 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1oZd005181 for ; Mon, 10 Aug 2015 15:01:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C5F90120254; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 04/13] xfs: ensure EFD trans aborts on log recovery extent free failure Date: Mon, 10 Aug 2015 15:01:40 -0400 X-ASG-Orig-Subj: [PATCH v3 04/13] xfs: ensure EFD trans aborts on log recovery extent free failure Message-Id: <1439233309-19959-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233312 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery attempts to free extents with leftover EFIs in the AIL after initial processing. If the extent free fails (e.g., due to unrelated fs corruption), the transaction is cancelled, though it might not be dirtied at the time. If this is the case, the EFD does not abort and thus does not release the EFI. This can lead to hangs as the EFI pins the AIL. Update xlog_recover_process_efi() to log the EFD in the transaction before xfs_free_extent() errors are handled to ensure the transaction is dirty, aborts the EFD and releases the EFI on error. Since this is a requirement for EFD processing (and consistent with xfs_bmap_finish()), update the EFD logging helper to do the extent free and unconditionally log the EFD. This encodes the required EFD logging behavior into the helper and reduces the likelihood of errors down the road. Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 21 +++++++-------------- fs/xfs/xfs_log_recover.c | 7 +++---- fs/xfs/xfs_trans.h | 7 +++---- fs/xfs/xfs_trans_extfree.c | 32 +++++++++++++++++++++++--------- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index fa65f67..73aab0d 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -112,24 +112,17 @@ xfs_bmap_finish( return error; } + /* + * Get an EFD and free each extent in the list, logging to the EFD in + * the process. The remaining bmap free list is cleaned up by the caller + * on error. + */ efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; - /* - * Free the extent and log the EFD to dirty the transaction - * before handling errors. This ensures that the transaction is - * aborted, which: - * - * 1.) releases the EFI and frees the EFD - * 2.) shuts down the filesystem - * - * The bmap free list is cleaned up at a higher level. - */ - error = xfs_free_extent(*tp, free->xbfi_startblock, - free->xbfi_blockcount); - xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, - free->xbfi_blockcount); + error = xfs_trans_free_extent(*tp, efd, free->xbfi_startblock, + free->xbfi_blockcount); if (error) return error; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 9d8f242..c77dfb5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -34,7 +34,6 @@ #include "xfs_inode_item.h" #include "xfs_extfree_item.h" #include "xfs_trans_priv.h" -#include "xfs_alloc.h" #include "xfs_ialloc.h" #include "xfs_quota.h" #include "xfs_cksum.h" @@ -3779,11 +3778,11 @@ xlog_recover_process_efi( for (i = 0; i < efip->efi_format.efi_nextents; i++) { extp = &(efip->efi_format.efi_extents[i]); - error = xfs_free_extent(tp, extp->ext_start, extp->ext_len); + error = xfs_trans_free_extent(tp, efdp, extp->ext_start, + extp->ext_len); if (error) goto abort_error; - xfs_trans_log_efd_extent(tp, efdp, extp->ext_start, - extp->ext_len); + } set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index ba1660b..4643070 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -220,10 +220,9 @@ void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efd_log_item *xfs_trans_get_efd(xfs_trans_t *, struct xfs_efi_log_item *, uint); -void xfs_trans_log_efd_extent(xfs_trans_t *, - struct xfs_efd_log_item *, - xfs_fsblock_t, - xfs_extlen_t); +int xfs_trans_free_extent(struct xfs_trans *, + struct xfs_efd_log_item *, xfs_fsblock_t, + xfs_extlen_t); int xfs_trans_commit(struct xfs_trans *); int __xfs_trans_roll(struct xfs_trans **, struct xfs_inode *, int *); int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 284397d..a96ae54 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -25,6 +25,7 @@ #include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" +#include "xfs_alloc.h" /* * This routine is called to allocate an "extent free intention" @@ -108,19 +109,30 @@ xfs_trans_get_efd(xfs_trans_t *tp, } /* - * This routine is called to indicate that the described - * extent is to be logged as having been freed. It should - * be called once for each extent freed. + * Free an extent and log it to the EFD. Note that the transaction is marked + * dirty regardless of whether the extent free succeeds or fails to support the + * EFI/EFD lifecycle rules. */ -void -xfs_trans_log_efd_extent(xfs_trans_t *tp, - xfs_efd_log_item_t *efdp, - xfs_fsblock_t start_block, - xfs_extlen_t ext_len) +int +xfs_trans_free_extent( + struct xfs_trans *tp, + struct xfs_efd_log_item *efdp, + xfs_fsblock_t start_block, + xfs_extlen_t ext_len) { uint next_extent; - xfs_extent_t *extp; + struct xfs_extent *extp; + int error; + error = xfs_free_extent(tp, start_block, ext_len); + + /* + * Mark the transaction dirty, even on error. This ensures the + * transaction is aborted, which: + * + * 1.) releases the EFI and frees the EFD + * 2.) shuts down the filesystem + */ tp->t_flags |= XFS_TRANS_DIRTY; efdp->efd_item.li_desc->lid_flags |= XFS_LID_DIRTY; @@ -130,4 +142,6 @@ xfs_trans_log_efd_extent(xfs_trans_t *tp, extp->ext_start = start_block; extp->ext_len = ext_len; efdp->efd_next_extent++; + + return error; } -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8AB117F47 for ; Mon, 10 Aug 2015 14:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B8B8AC002 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04bdf06bd02d1fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8atrkkz8hYdtSSPh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 050228F266 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1oU4002497 for ; Mon, 10 Aug 2015 15:01:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B984B1201A0; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 03/13] xfs: fix efi/efd error handling to avoid fs shutdown hangs Date: Mon, 10 Aug 2015 15:01:39 -0400 X-ASG-Orig-Subj: [PATCH v3 03/13] xfs: fix efi/efd error handling to avoid fs shutdown hangs Message-Id: <1439233309-19959-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Freeing an extent in XFS involves logging an EFI (extent free intention), freeing the actual extent, and logging an EFD (extent free done). The EFI object is created with a reference count of 2: one for the current transaction and one for the subsequently created EFD. Under normal circumstances, the first reference is dropped when the EFI is unpinned and the second reference is dropped when the EFD is committed to the on-disk log. In event of errors or filesystem shutdown, there are various potential cleanup scenarios depending on the state of the EFI/EFD. The cleanup scenarios are confusing and racy, as demonstrated by the following test sequence: # mount $dev $mnt # fsstress -d $mnt -n 99999 -p 16 -z -f fallocate=1 \ -f punch=1 -f creat=1 -f unlink=1 & # sleep 5 # killall -9 fsstress; wait # godown -f $mnt # umount ... in which the final umount can hang due to the AIL being pinned indefinitely by one or more EFI items. This can occur due to several conditions. For example, if the shutdown occurs after the EFI is committed to the on-disk log and the EFD committed to the CIL, but before the EFD committed to the log, the EFD iop_committed() abort handler does not drop its reference to the EFI. Alternatively, manual error injection in the xfs_bmap_finish() codepath shows that if an error occurs after the EFI transaction is committed but before the EFD is constructed and logged, the EFI is never released from the AIL. Update the EFI/EFD item handling code to use a more straightforward and reliable approach to error handling. If an error occurs after the EFI transaction is committed and before the EFD is constructed, release the EFI explicitly from xfs_bmap_finish(). If the EFI transaction is cancelled, release the EFI in the unlock handler. Once the EFD is constructed, it is responsible for releasing the EFI under any circumstances (including whether the EFI item aborts due to log I/O error). Update the EFD item handlers to release the EFI if the transaction is cancelled or aborts due to log I/O error. Finally, update xfs_bmap_finish() to log at least one EFD extent to the transaction before xfs_free_extent() errors are handled to ensure the transaction is dirty and EFD item error handling is triggered. Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 84 +++++++++++++++++++++++++++-------------------- fs/xfs/xfs_extfree_item.c | 69 ++++++++++++++++++++++---------------- fs/xfs/xfs_extfree_item.h | 25 ++++++++++++-- 3 files changed, 111 insertions(+), 67 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 0f34886c..fa65f67 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -67,16 +67,15 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) */ int /* error */ xfs_bmap_finish( - xfs_trans_t **tp, /* transaction pointer addr */ - xfs_bmap_free_t *flist, /* i/o: list extents to free */ - int *committed) /* xact committed or not */ + struct xfs_trans **tp, /* transaction pointer addr */ + struct xfs_bmap_free *flist, /* i/o: list extents to free */ + int *committed)/* xact committed or not */ { - xfs_efd_log_item_t *efd; /* extent free data */ - xfs_efi_log_item_t *efi; /* extent free intention */ - int error; /* error return value */ - xfs_bmap_free_item_t *free; /* free extent item */ - xfs_mount_t *mp; /* filesystem mount structure */ - xfs_bmap_free_item_t *next; /* next item on free list */ + struct xfs_efd_log_item *efd; /* extent free data */ + struct xfs_efi_log_item *efi; /* extent free intention */ + int error; /* error return value */ + struct xfs_bmap_free_item *free; /* free extent item */ + struct xfs_bmap_free_item *next; /* next item on free list */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); if (flist->xbf_count == 0) { @@ -88,40 +87,55 @@ xfs_bmap_finish( xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, free->xbfi_blockcount); - error = xfs_trans_roll(tp, NULL); - *committed = 1; - /* - * We have a new transaction, so we should return committed=1, - * even though we're returning an error. - */ - if (error) + error = __xfs_trans_roll(tp, NULL, committed); + if (error) { + /* + * If the transaction was committed, drop the EFD reference + * since we're bailing out of here. The other reference is + * dropped when the EFI hits the AIL. + * + * If the transaction was not committed, the EFI is freed by the + * EFI item unlock handler on abort. Also, we have a new + * transaction so we should return committed=1 even though we're + * returning an error. + */ + if (*committed) { + xfs_efi_release(efi); + xfs_force_shutdown((*tp)->t_mountp, + (error == -EFSCORRUPTED) ? + SHUTDOWN_CORRUPT_INCORE : + SHUTDOWN_META_IO_ERROR); + } else { + *committed = 1; + } + return error; + } efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; - if ((error = xfs_free_extent(*tp, free->xbfi_startblock, - free->xbfi_blockcount))) { - /* - * The bmap free list will be cleaned up at a - * higher level. The EFI will be canceled when - * this transaction is aborted. - * Need to force shutdown here to make sure it - * happens, since this transaction may not be - * dirty yet. - */ - mp = (*tp)->t_mountp; - if (!XFS_FORCED_SHUTDOWN(mp)) - xfs_force_shutdown(mp, - (error == -EFSCORRUPTED) ? - SHUTDOWN_CORRUPT_INCORE : - SHUTDOWN_META_IO_ERROR); - return error; - } + + /* + * Free the extent and log the EFD to dirty the transaction + * before handling errors. This ensures that the transaction is + * aborted, which: + * + * 1.) releases the EFI and frees the EFD + * 2.) shuts down the filesystem + * + * The bmap free list is cleaned up at a higher level. + */ + error = xfs_free_extent(*tp, free->xbfi_startblock, + free->xbfi_blockcount); xfs_trans_log_efd_extent(*tp, efd, free->xbfi_startblock, - free->xbfi_blockcount); + free->xbfi_blockcount); + if (error) + return error; + xfs_bmap_del_free(flist, NULL, free); } + return 0; } diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 6ff738f..475b9f0 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -61,9 +61,15 @@ __xfs_efi_release( if (atomic_dec_and_test(&efip->efi_refcount)) { spin_lock(&ailp->xa_lock); - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); + /* + * We don't know whether the EFI made it to the AIL. Remove it + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. + */ + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); + else + spin_unlock(&ailp->xa_lock); xfs_efi_item_free(efip); } } @@ -128,12 +134,12 @@ xfs_efi_item_pin( } /* - * While EFIs cannot really be pinned, the unpin operation is the last place at - * which the EFI is manipulated during a transaction. If we are being asked to - * remove the EFI it's because the transaction has been cancelled and by - * definition that means the EFI cannot be in the AIL so remove it from the - * transaction and free it. Otherwise coordinate with xfs_efi_release() - * to determine who gets to free the EFI. + * The unpin operation is the last place an EFI is manipulated in the log. It is + * either inserted in the AIL or aborted in the event of a log I/O error. In + * either case, the EFI transaction has been successfully committed to make it + * this far. Therefore, we expect whoever committed the EFI to either construct + * and commit the EFD or drop the EFD's reference in the event of error. Simply + * drop the log's EFI reference now that the log is done with it. */ STATIC void xfs_efi_item_unpin( @@ -141,14 +147,6 @@ xfs_efi_item_unpin( int remove) { struct xfs_efi_log_item *efip = EFI_ITEM(lip); - - if (remove) { - ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); - if (lip->li_desc) - xfs_trans_del_item(lip); - xfs_efi_item_free(efip); - return; - } xfs_efi_release(efip); } @@ -167,6 +165,11 @@ xfs_efi_item_push( return XFS_ITEM_PINNED; } +/* + * The EFI has been either committed or aborted if the transaction has been + * cancelled. If the transaction was cancelled, an EFD isn't going to be + * constructed and thus we free the EFI here directly. + */ STATIC void xfs_efi_item_unlock( struct xfs_log_item *lip) @@ -412,20 +415,27 @@ xfs_efd_item_push( return XFS_ITEM_PINNED; } +/* + * The EFD is either committed or aborted if the transaction is cancelled. If + * the transaction is cancelled, drop our reference to the EFI and free the EFD. + */ STATIC void xfs_efd_item_unlock( struct xfs_log_item *lip) { - if (lip->li_flags & XFS_LI_ABORTED) - xfs_efd_item_free(EFD_ITEM(lip)); + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + + if (lip->li_flags & XFS_LI_ABORTED) { + xfs_efi_release(efdp->efd_efip); + xfs_efd_item_free(efdp); + } } /* - * When the efd item is committed to disk, all we need to do - * is delete our reference to our partner efi item and then - * free ourselves. Since we're freeing ourselves we must - * return -1 to keep the transaction code from further referencing - * this item. + * When the efd item is committed to disk, all we need to do is delete our + * reference to our partner efi item and then free ourselves. Since we're + * freeing ourselves we must return -1 to keep the transaction code from further + * referencing this item. */ STATIC xfs_lsn_t xfs_efd_item_committed( @@ -435,13 +445,14 @@ xfs_efd_item_committed( struct xfs_efd_log_item *efdp = EFD_ITEM(lip); /* - * If we got a log I/O error, it's always the case that the LR with the - * EFI got unpinned and freed before the EFD got aborted. + * Drop the EFI reference regardless of whether the EFD has been + * aborted. Once the EFD transaction is constructed, it is the sole + * responsibility of the EFD to release the EFI (even if the EFI is + * aborted due to log I/O error). */ - if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip); - + xfs_efi_release(efdp->efd_efip); xfs_efd_item_free(efdp); + return (xfs_lsn_t)-1; } diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 399562e..8fa8651 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -39,9 +39,28 @@ struct kmem_zone; * "extent free done" log item described below. * * The EFI is reference counted so that it is not freed prior to both the EFI - * and EFD being committed and unpinned. This ensures that when the last - * reference goes away the EFI will always be in the AIL as it has been - * unpinned, regardless of whether the EFD is processed before or after the EFI. + * and EFD being committed and unpinned. This ensures the EFI is inserted into + * the AIL even in the event of out of order EFI/EFD processing. In other words, + * an EFI is born with two references: + * + * 1.) an EFI held reference to track EFI AIL insertion + * 2.) an EFD held reference to track EFD commit + * + * On allocation, both references are the responsibility of the caller. Once the + * EFI is added to and dirtied in a transaction, ownership of reference one + * transfers to the transaction. The reference is dropped once the EFI is + * inserted to the AIL or in the event of failure along the way (e.g., commit + * failure, log I/O error, etc.). Note that the caller remains responsible for + * the EFD reference under all circumstances to this point. The caller has no + * means to detect failure once the transaction is committed, however. + * Therefore, an EFD is required after this point, even in the event of + * unrelated failure. + * + * Once an EFD is allocated and dirtied in a transaction, reference two + * transfers to the transaction. The EFD reference is dropped once it reaches + * the unpin handler. Similar to the EFI, the reference also drops in the event + * of commit failure or log I/O errors. Note that the EFD is not inserted in the + * AIL, so at this point both the EFI and EFD are freed. */ typedef struct xfs_efi_log_item { xfs_log_item_t efi_item; -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CBA647F5F for ; Mon, 10 Aug 2015 14:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7E201AC003 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04bdf06bcf2d1fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sVtz2MYrjsTqP5Sa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 4B6F89D1F7 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1oCo009870 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E11201202E0; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 05/13] xfs: use EFI refcount consistently in log recovery Date: Mon, 10 Aug 2015 15:01:41 -0400 X-ASG-Orig-Subj: [PATCH v3 05/13] xfs: use EFI refcount consistently in log recovery Message-Id: <1439233309-19959-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The EFI is initialized with a reference count of 2. One for the EFI to ensure the item makes it to the AIL and one for the subsequently created EFD to release the EFI once the EFD is committed. Log recovery uses the EFI in a similar manner, but implements a hack to remove both references in one call once the EFD is handled. Update log recovery to use EFI reference counting in a manner consistent with the log. When an EFI is encountered during recovery, an EFI item is allocated and inserted to the AIL directly. Since the EFI reference is typically dropped when the EFI is unpinned and this is analogous with AIL insertion, drop the EFI reference at this point. When a corresponding EFD is encountered in the log, this indicates that the extents were freed, no processing is required and the EFI can be dropped. Update xlog_recover_efd_pass2() to simply drop the EFD reference at this point rather than open code the AIL removal and EFI free. Remaining EFIs (i.e., with no corresponding EFD) are processed in xlog_recover_finish(). An EFD transaction is allocated and the extents are freed, which transfers ownership of the EFI reference to the EFD item in the log. Signed-off-by: Brian Foster --- fs/xfs/xfs_extfree_item.c | 57 +++++++++++++++++------------------------------ fs/xfs/xfs_log_recover.c | 43 ++++++++++++++++++----------------- 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 475b9f0..ce1d4fb 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -47,34 +47,6 @@ xfs_efi_item_free( } /* - * Freeing the efi requires that we remove it from the AIL if it has already - * been placed there. However, the EFI may not yet have been placed in the AIL - * when called by xfs_efi_release() from EFD processing due to the ordering of - * committed vs unpin operations in bulk insert operations. Hence the reference - * count to ensure only the last caller frees the EFI. - */ -STATIC void -__xfs_efi_release( - struct xfs_efi_log_item *efip) -{ - struct xfs_ail *ailp = efip->efi_item.li_ailp; - - if (atomic_dec_and_test(&efip->efi_refcount)) { - spin_lock(&ailp->xa_lock); - /* - * We don't know whether the EFI made it to the AIL. Remove it - * if so. Note that xfs_trans_ail_delete() drops the AIL lock. - */ - if (efip->efi_item.li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); - else - spin_unlock(&ailp->xa_lock); - xfs_efi_item_free(efip); - } -} - -/* * This returns the number of iovecs needed to log the given efi item. * We only need 1 iovec for an efi item. It just logs the efi_log_format * structure. @@ -304,21 +276,32 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) } /* - * This is called by the efd item code below to release references to the given - * efi item. Each efd calls this with the number of extents that it has - * logged, and when the sum of these reaches the total number of extents logged - * by this efi item we can free the efi item. + * Freeing the efi requires that we remove it from the AIL if it has already + * been placed there. However, the EFI may not yet have been placed in the AIL + * when called by xfs_efi_release() from EFD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the reference + * count to ensure only the last caller frees the EFI. */ void xfs_efi_release( struct xfs_efi_log_item *efip) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); + struct xfs_ail *ailp = efip->efi_item.li_ailp; - __xfs_efi_release(efip); - /* efip may now have been freed, do not reference it again. */ + if (atomic_dec_and_test(&efip->efi_refcount)) { + spin_lock(&ailp->xa_lock); + /* + * We don't know whether the EFI made it to the AIL. Remove it + * if so. Note that xfs_trans_ail_delete() drops the AIL lock. + */ + if (efip->efi_item.li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); + else + spin_unlock(&ailp->xa_lock); + + xfs_efi_item_free(efip); + } } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c77dfb5..f3965f7 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2932,16 +2932,16 @@ xlog_recover_efi_pass2( struct xlog_recover_item *item, xfs_lsn_t lsn) { - int error; - xfs_mount_t *mp = log->l_mp; - xfs_efi_log_item_t *efip; - xfs_efi_log_format_t *efi_formatp; + int error; + struct xfs_mount *mp = log->l_mp; + struct xfs_efi_log_item *efip; + struct xfs_efi_log_format *efi_formatp; efi_formatp = item->ri_buf[0].i_addr; efip = xfs_efi_init(mp, efi_formatp->efi_nextents); - if ((error = xfs_efi_copy_format(&(item->ri_buf[0]), - &(efip->efi_format)))) { + error = xfs_efi_copy_format(&item->ri_buf[0], &efip->efi_format); + if (error) { xfs_efi_item_free(efip); return error; } @@ -2949,20 +2949,23 @@ xlog_recover_efi_pass2( spin_lock(&log->l_ailp->xa_lock); /* - * xfs_trans_ail_update() drops the AIL lock. + * The EFI has two references. One for the EFD and one for EFI to ensure + * it makes it into the AIL. Insert the EFI into the AIL directly and + * drop the EFI reference. Note that xfs_trans_ail_update() drops the + * AIL lock. */ xfs_trans_ail_update(log->l_ailp, &efip->efi_item, lsn); + xfs_efi_release(efip); return 0; } /* - * This routine is called when an efd format structure is found in - * a committed transaction in the log. It's purpose is to cancel - * the corresponding efi if it was still in the log. To do this - * it searches the AIL for the efi with an id equal to that in the - * efd format structure. If we find it, we remove the efi from the - * AIL and free it. + * This routine is called when an EFD format structure is found in a committed + * transaction in the log. Its purpose is to cancel the corresponding EFI if it + * was still in the log. To do this it searches the AIL for the EFI with an id + * equal to that in the EFD format structure. If we find it we drop the EFD + * reference, which removes the EFI from the AIL and frees it. */ STATIC int xlog_recover_efd_pass2( @@ -2984,8 +2987,8 @@ xlog_recover_efd_pass2( efi_id = efd_formatp->efd_efi_id; /* - * Search for the efi with the id in the efd format structure - * in the AIL. + * Search for the EFI with the id in the EFD format structure in the + * AIL. */ spin_lock(&ailp->xa_lock); lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); @@ -2994,18 +2997,18 @@ xlog_recover_efd_pass2( efip = (xfs_efi_log_item_t *)lip; if (efip->efi_format.efi_id == efi_id) { /* - * xfs_trans_ail_delete() drops the - * AIL lock. + * Drop the EFD reference to the EFI. This + * removes the EFI from the AIL and frees it. */ - xfs_trans_ail_delete(ailp, lip, - SHUTDOWN_CORRUPT_INCORE); - xfs_efi_item_free(efip); + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip); spin_lock(&ailp->xa_lock); break; } } lip = xfs_trans_ail_cursor_next(ailp, &cur); } + xfs_trans_ail_cursor_done(&cur); spin_unlock(&ailp->xa_lock); -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 039FA7F6A for ; Mon, 10 Aug 2015 14:01:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7EDE8AC004 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233310-04cb6c673d395e60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JhciwipgKGEV6v4R (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id B235383F69 for ; Mon, 10 Aug 2015 19:01:50 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1ou7005094 for ; Mon, 10 Aug 2015 15:01:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 91BD712019F; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 00/13] xfs: miscellaneous logging, recovery, umount fixes Date: Mon, 10 Aug 2015 15:01:36 -0400 X-ASG-Orig-Subj: [PATCH v3 00/13] xfs: miscellaneous logging, recovery, umount fixes Message-Id: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here is v3 of the EFI/EFD/logging fixup series with updates based on Christoph's review (in the v1 thread). I debated folding patch 4 into patch 3 given the additional refactoring, but opted to keep them separate to keep patch 3 to functional changes. Feel free to fold them if that is preferred. I also appended patch 13 to add some missing xfs_bmap_cancel() calls, which I had deferred looking into until the lower level xfs_bmap_finish() fixes were more solidified. Brian v3: - Various, minor style fixups. - Updated the commit log description for patch 1. - Migrated xfs_trans_log_efd_extent() to an xfs_trans_free_extent() helper that encodes the new EFD logging rules (patch 4). - Appended patch 13 to add a few missing xfs_bmap_cancel() calls. v2: http://oss.sgi.com/pipermail/xfs/2015-August/042922.html - Added new comment around EFI/EFD refcount rules. - Appended patch 12 to clean up AIL item removal. - Reworked log recovery EFI cancellation APIs. - Invoke EFI cancellation within xfs_log_mount() on failure to prevent memory leak. v1: http://oss.sgi.com/pipermail/xfs/2015-August/042877.html - Updated EFI/EFD tracking semantics based on rfc comments. - Added more cleanups/fixes to series. rfc: http://oss.sgi.com/pipermail/xfs/2015-July/042617.html Brian Foster (13): xfs: disentagle EFI release from the extent count xfs: return committed status from xfs_trans_roll() xfs: fix efi/efd error handling to avoid fs shutdown hangs xfs: ensure EFD trans aborts on log recovery extent free failure xfs: use EFI refcount consistently in log recovery xfs: don't leave EFIs on AIL on mount failure xfs: icreate log item recovery and cancellation tracepoints xfs: fix broken icreate log item cancellation xfs: checksum log record ext headers based on record size xfs: clean up root inode properly on mount failure xfs: fix btree cursor error cleanups xfs: add helper to conditionally remove items from the AIL xfs: add missing bmap cancel calls in error paths fs/xfs/libxfs/xfs_bmap.c | 1 + fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_bmap_util.c | 87 ++++++++++++----------- fs/xfs/xfs_buf_item.c | 7 +- fs/xfs/xfs_dquot.c | 8 +-- fs/xfs/xfs_extfree_item.c | 108 ++++++++++++----------------- fs/xfs/xfs_extfree_item.h | 26 ++++++- fs/xfs/xfs_inode.c | 9 +-- fs/xfs/xfs_inode_item.c | 10 +-- fs/xfs/xfs_itable.c | 3 +- fs/xfs/xfs_log.c | 37 ++++++++-- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_log_recover.c | 167 ++++++++++++++++++++++++++++++++++----------- fs/xfs/xfs_mount.c | 28 ++++---- fs/xfs/xfs_rtalloc.c | 57 ++++++++-------- fs/xfs/xfs_trace.h | 34 +++++++++ fs/xfs/xfs_trans.c | 15 +++- fs/xfs/xfs_trans.h | 9 ++- fs/xfs/xfs_trans_extfree.c | 32 ++++++--- fs/xfs/xfs_trans_priv.h | 14 ++++ 21 files changed, 423 insertions(+), 234 deletions(-) -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39AA67F4E for ; Mon, 10 Aug 2015 14:01:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4569AC006 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cbb0416f30f8f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DhmmPvDv4ZuNGyUv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id D817D19EF37 for ; Mon, 10 Aug 2015 19:01:50 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1orL002495 for ; Mon, 10 Aug 2015 15:01:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ACF73120235; Mon, 10 Aug 2015 15:01:49 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 01/13] xfs: disentagle EFI release from the extent count Date: Mon, 10 Aug 2015 15:01:37 -0400 X-ASG-Orig-Subj: [PATCH v3 01/13] xfs: disentagle EFI release from the extent count Message-Id: <1439233309-19959-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Release of the EFI either occurs based on the reference count or the extent count. The extent count used is either the count tracked in the EFI or EFD, depending on the particular situation. In either case, the count is initialized to the final value and thus always matches the current efi_next_extent value once the EFI is completely constructed. For example, the EFI extent count is increased as the extents are logged in xfs_bmap_finish() and the full free list is always completely processed. Therefore, the count is guaranteed to be complete once the EFI transaction is committed. The EFD uses the efd_nextents counter to release the EFI. This counter is initialized to the count of the EFI when the EFD is created. Thus the EFD, as currently used, has no concept of partial EFI release based on extent count. Given that the EFI extent count is always released in whole, use of the extent count for reference counting is unnecessary. Remove this level of the API and release the EFI based on the core reference count. The efi_next_extent counter remains because it is still used to track the slot to log the next extent to free. Signed-off-by: Brian Foster --- fs/xfs/xfs_extfree_item.c | 21 +++++++++------------ fs/xfs/xfs_extfree_item.h | 1 + fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.h | 1 - 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index adc8f8f..6ff738f 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -149,7 +149,7 @@ xfs_efi_item_unpin( xfs_efi_item_free(efip); return; } - __xfs_efi_release(efip); + xfs_efi_release(efip); } /* @@ -307,18 +307,15 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt) * by this efi item we can free the efi item. */ void -xfs_efi_release(xfs_efi_log_item_t *efip, - uint nextents) +xfs_efi_release( + struct xfs_efi_log_item *efip) { - ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); - if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); - + /* recovery needs us to drop the EFI reference, too */ + if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) __xfs_efi_release(efip); - /* efip may now have been freed, do not reference it again. */ - } + + __xfs_efi_release(efip); + /* efip may now have been freed, do not reference it again. */ } static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) @@ -442,7 +439,7 @@ xfs_efd_item_committed( * EFI got unpinned and freed before the EFD got aborted. */ if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); + xfs_efi_release(efdp->efd_efip); xfs_efd_item_free(efdp); return (xfs_lsn_t)-1; diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 0ffbce3..399562e 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -77,5 +77,6 @@ xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, int xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt); void xfs_efi_item_free(xfs_efi_log_item_t *); +void xfs_efi_release(struct xfs_efi_log_item *); #endif /* __XFS_EXTFREE_ITEM_H__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c674b40..9d8f242 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3766,7 +3766,7 @@ xlog_recover_process_efi( * free the memory associated with it. */ set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_format.efi_nextents); + xfs_efi_release(efip); return -EIO; } } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 3b21b4e..f48e839 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -213,7 +213,6 @@ void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); -void xfs_efi_release(struct xfs_efi_log_item *, uint); void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efi_log_item *, xfs_fsblock_t, -- 2.1.0 From bfoster@redhat.com Mon Aug 10 14:01:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E67467F69 for ; Mon, 10 Aug 2015 14:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C5C9D304066 for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-ASG-Debug-ID: 1439233311-04cb6c673d395e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TahlnOUTXyfHKjUe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 12:01:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 765969D1F9 for ; Mon, 10 Aug 2015 19:01:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7AJ1pLQ001473 for ; Mon, 10 Aug 2015 15:01:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2FE6112054A; Mon, 10 Aug 2015 15:01:50 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 11/13] xfs: fix btree cursor error cleanups Date: Mon, 10 Aug 2015 15:01:47 -0400 X-ASG-Orig-Subj: [PATCH v3 11/13] xfs: fix btree cursor error cleanups Message-Id: <1439233309-19959-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439233311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The btree cursor cleanup function takes an error parameter that affects how buffers are released from the cursor. All buffers are released in the event of error. Several callers do not specify the XFS_BTREE_ERROR flag in the event of error, however. This can cause buffers to hang around locked or with an elevated hold count and thus lead to umount hangs in the event of errors. Fix up the xfs_btree_del_cursor() callers to pass XFS_BTREE_ERROR if the cursor is being torn down due to error. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_itable.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index ce63e04..54deb2d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2233,7 +2233,7 @@ xfs_imap_lookup( } xfs_trans_brelse(tp, agbp); - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); if (error) return error; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index f41b0c3..930ebd8 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -473,7 +473,8 @@ xfs_bulkstat( * pending error, then we are done. */ del_cursor: - xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(cur, error ? + XFS_BTREE_ERROR : XFS_BTREE_NOERROR); xfs_buf_relse(agbp); if (error) break; -- 2.1.0 From paul@paul-moore.com Mon Aug 10 16:12:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6DBF57F47 for ; Mon, 10 Aug 2015 16:12:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BB718F8050 for ; Mon, 10 Aug 2015 14:12:23 -0700 (PDT) X-ASG-Debug-ID: 1439241140-04bdf06bd22d50a0001-NocioJ Received: from mail-qk0-f171.google.com (mail-qk0-f171.google.com [209.85.220.171]) by cuda.sgi.com with ESMTP id nub6AERnjpATsuh3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Aug 2015 14:12:21 -0700 (PDT) X-Barracuda-Envelope-From: paul@paul-moore.com X-Barracuda-Apparent-Source-IP: 209.85.220.171 Received: by qkfj126 with SMTP id j126so11595580qkf.0 for ; Mon, 10 Aug 2015 14:12:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:user-agent :in-reply-to:references:mime-version:content-transfer-encoding :content-type; bh=bYHhy/yXwGi949J2lDqrJQW5NW505HsFjf70UjVbFpw=; b=FHhuDPvZWklh55iOX+zwanBLVLj4nzerXxJLYvn6mmLctni2lorv90WMkDuJOQoLht IG27x8DCqgV3BJ4ie7MCLRb87M2zPihG+De7QafneegczFD1t3g1IBdqUqEK3729E98T ruppnO5LP1CT4dgjCtqGeyVKehxu305tQjQMFNM0uSRwqLlzxO5oHyNErYGP2DT9ZIdT hy54RMM9zaYlbQXbEQL9Ju9dg2pFwWKjzXntoALxfTFg2nliB9hYeXBipRCzpES24H5X m+UYgj1Og8nQT+2i7q1ijN4SfdGzH9EfMqkmtuDzsMUXrsE11g6GERMyzChDA8QZqGh8 QvUg== X-Gm-Message-State: ALoCoQnaSpwZeJ11ETwFbtoUZzHdi66fU8eP9UojjglNHR79778SpKhG6xXYNkQZfcKF1O4GWBN7 X-Received: by 10.55.31.72 with SMTP id f69mr40835847qkf.72.1439241140019; Mon, 10 Aug 2015 14:12:20 -0700 (PDT) Received: from sifl.localnet (c-73-143-245-155.hsd1.nh.comcast.net. [73.143.245.155]) by smtp.gmail.com with ESMTPSA id 108sm6084740qgz.17.2015.08.10.14.12.19 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 10 Aug 2015 14:12:19 -0700 (PDT) From: Paul Moore To: Kees Cook Cc: Andrew Morton , "Yan, Zheng" , Sage Weil , Ilya Dryomov , Steve French , Jan Kara , Andreas Dilger , "Theodore Ts'o" , Steven Whitehouse , Bob Peterson , Jeff Dike , Richard Weinberger , Mark Fasheh , Joel Becker , Miklos Szeredi , Dave Chinner , xfs@oss.sgi.com, Tejun Heo , Li Zefan , Johannes Weiner , "David S. Miller" , Stephen Smalley , Eric Paris , James Morris , "Serge E. Hallyn" , Jens Axboe , Fabian Frederick , Christoph Hellwig , Firo Yang , David Howells , Jiri Slaby , Al Viro , Joe Perches , Steven Rostedt , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] fs: create and use seq_show_option for escaping Date: Mon, 10 Aug 2015 17:12:18 -0400 X-ASG-Orig-Subj: Re: [PATCH] fs: create and use seq_show_option for escaping Message-ID: <1643551.Z65F38WpRq@sifl> User-Agent: KMail/4.14.10 (Linux/4.1.2-gentoo; KDE/4.14.10; x86_64; ; ) In-Reply-To: <20150807234150.GA11735@www.outflux.net> References: <20150807234150.GA11735@www.outflux.net> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Barracuda-Connect: mail-qk0-f171.google.com[209.85.220.171] X-Barracuda-Start-Time: 1439241140 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Friday, August 07, 2015 04:41:50 PM Kees Cook wrote: > Many file systems that implement the show_options hook fail to correctly > escape their output which could lead to unescaped characters (e.g. new > lines) leaking into /proc/mounts and /proc/[pid]/mountinfo files. This > could lead to confusion, spoofed entries (resulting in things like > systemd issuing false d-bus "mount" notifications), and who knows > what else. This looks like it would only be the root user stepping on > themselves, but it's possible weird things could happen in containers > or in other situations with delegated mount privileges. > > Here's an example using overlay with setuid fusermount trusting the > contents of /proc/mounts (via the /etc/mtab symlink). Imagine the use of > "sudo" is something more sneaky: > > $ BASE="ovl" > $ MNT="$BASE/mnt" > $ LOW="$BASE/lower" > $ UP="$BASE/upper" > $ WORK="$BASE/work/ 0 0 > none /proc fuse.pwn user_id=1000" > $ mkdir -p "$LOW" "$UP" "$WORK" > $ sudo mount -t overlay -o "lowerdir=$LOW,upperdir=$UP,workdir=$WORK" none > /mnt $ cat /proc/mounts > none /root/ovl/mnt overlay > rw,relatime,lowerdir=ovl/lower,upperdir=ovl/upper,workdir=ovl/work/ 0 0 > none /proc fuse.pwn user_id=1000 0 0 > $ fusermount -u /proc > $ cat /proc/mounts > cat: /proc/mounts: No such file or directory > > This fixes the problem by adding new seq_show_option and seq_show_option_n > helpers, and updating the vulnerable show_option handlers to use them as > needed. Some, like SELinux, need to be open coded due to unusual existing > escape mechanisms. > > Signed-off-by: Kees Cook > Cc: stable@vger.kernel.org > --- > fs/ceph/super.c | 2 +- > fs/cifs/cifsfs.c | 6 +++--- > fs/ext3/super.c | 4 ++-- > fs/ext4/super.c | 4 ++-- > fs/gfs2/super.c | 6 +++--- > fs/hfs/super.c | 4 ++-- > fs/hfsplus/options.c | 4 ++-- > fs/hostfs/hostfs_kern.c | 2 +- > fs/ocfs2/super.c | 4 ++-- > fs/overlayfs/super.c | 6 +++--- > fs/reiserfs/super.c | 8 +++++--- > fs/xfs/xfs_super.c | 4 ++-- > include/linux/seq_file.h | 34 ++++++++++++++++++++++++++++++++++ > kernel/cgroup.c | 7 ++++--- > net/ceph/ceph_common.c | 7 +++++-- > security/selinux/hooks.c | 2 +- > 16 files changed, 72 insertions(+), 32 deletions(-) The SELinux changes look fine to me. Acked-by: Paul Moore -- paul moore www.paul-moore.com From ibeynurs@host1.missoulianapps.com Mon Aug 10 22:09:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=FREEMAIL_FROM,URG_BIZ autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 252697F47 for ; Mon, 10 Aug 2015 22:09:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B348AAC002 for ; Mon, 10 Aug 2015 20:09:18 -0700 (PDT) X-ASG-Debug-ID: 1439262556-04cb6c673e3a0350001-NocioJ Received: from host1.missoulianapps.com (host1.missoulianapps.com [173.199.128.206]) by cuda.sgi.com with ESMTP id CGjd1jVnVlUSq6uX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Aug 2015 20:09:16 -0700 (PDT) X-Barracuda-Envelope-From: ibeynurs@host1.missoulianapps.com X-Barracuda-Apparent-Source-IP: 173.199.128.206 Received: from ibeynurs by host1.missoulianapps.com with local (Exim 4.85) (envelope-from ) id 1ZOzw9-0004qs-0s for xfs@oss.sgi.com; Mon, 10 Aug 2015 22:09:13 -0500 Date: Tue, 11 Aug 2015 04:09:12 +0100 To: xfs@oss.sgi.com From: =?UTF-8?Q?David_Anderson?= Subject: =?UTF-8?Q?Urgent_Proposal?= Message-ID: X-ASG-Orig-Subj: =?UTF-8?Q?Urgent_Proposal?= X-Priority: 3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="us-ascii" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - host1.missoulianapps.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [557 32007] / [47 12] X-AntiAbuse: Sender Address Domain - host1.missoulianapps.com X-Get-Message-Sender-Via: host1.missoulianapps.com: authenticated_id: ibeynurs/only user confirmed/virtual account not confirmed X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/ibeynurs/public_html/mailer .php X-Source-Dir: ibeynursery.com:/public_html X-Barracuda-Connect: host1.missoulianapps.com[173.199.128.206] X-Barracuda-Start-Time: 1439262556 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.77 X-Barracuda-Spam-Status: No, SCORE=1.77 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=TVD_PH_SUBJ_URGENT, URG_BIZ X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.67 URG_BIZ BODY: Contains urgent matter 1.10 TVD_PH_SUBJ_URGENT TVD_PH_SUBJ_URGENT Good day, How are you doing today? Please excuse my unconventional mode of approach w= hich was out of desperation and forgive me for invading your privacy through this medium.Nevertheless, I de= sire to convey a very important message which in the long run will be conjointly beneficial to us. This entails a business dealing which I will make known to you the full det= ails in my next mail upon your response and readiness to work with me.Please do take this mail in earnest. Hopefully I will hear from you soon. Thank you, David Anderson From 21db5509.1dw1.1gPf.dZ.1xoEPWLrSH+xfs=oss.sgi.com@bnc3.mailjet.com Tue Aug 11 03:15:29 2015 Return-Path: <21db5509.1dw1.1gPf.dZ.1xoEPWLrSH+xfs=oss.sgi.com@bnc3.mailjet.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 81C3D7F50 for ; Tue, 11 Aug 2015 03:15:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32D14304077 for ; Tue, 11 Aug 2015 01:15:26 -0700 (PDT) X-ASG-Debug-ID: 1439280922-04bdf06bd22e33a0001-NocioJ Received: from o215.p8.mailjet.com (o215.p8.mailjet.com [87.253.233.215]) by cuda.sgi.com with ESMTP id Rez9PgA7GZrg4ZMW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 01:15:23 -0700 (PDT) X-Barracuda-Envelope-From: 21db5509.1dw1.1gPf.dZ.1xoEPWLrSH+xfs=oss.sgi.com@bnc3.mailjet.com X-Barracuda-Apparent-Source-IP: 87.253.233.215 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/simple; q=dns/txt; d=bnc3.mailjet.com; i=indongo=3Dministryofmagicdev.com@bnc3.mailjet.com; s=mailjet; h=message-id:mime-version:from:reply-to:to:subject:date:list-id:list-unsubscribe: precedence:x-csa-complaints:content-type; bh=36eXIypTigTDdmQatiAedkJznUY=; b= LOcrNMe9dQsnDOi8eT8mgn5BSte7YDPtR6FYl7u6ZZGeb9qowhNELJxMyK1Q ACjdkCksuu/Hq9UglbqwiwbMCYMI51yY6wReFWx5HRbLzFhGz4ULm+4IaeLj yWNJGDtUXLN4curKigxcEWwRFeFT1ci9vQqdRK/5CSCVkxSiiBE= Message-Id: <21db5509.1dw1.1gPf.dZ.1xoEPWLrSH@mailjet.com> MIME-Version: 1.0 From: Indongo Reply-To: henri@ministryofmagicnam.com To: xfs@oss.sgi.com Subject: Indongo Toyota Date: Tue, 11 Aug 2015 08:15:21 +0000 X-ASG-Orig-Subj: Indongo Toyota List-Id: List-Unsubscribe: Precedence: bulk X-CSA-Complaints: whitelist-complaints@eco.de Content-Type: multipart/alternative; boundary="=-cxeu81gKAzpioQn23wWN" X-Barracuda-Connect: o215.p8.mailjet.com[87.253.233.215] X-Barracuda-Start-Time: 1439280923 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --=-cxeu81gKAzpioQn23wWN Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Special offer from Indongo Toyota View online version [http://omi3.mjt.lu/nl2/omi3/xk.html?a=3D1xoEPWLrSH&b= =3D21db5509&c=3Domi3&d=3D8dbbd8cf&e=3Da75ed2fd&email=3Dxfs@oss.sgi.com][htt= p://omi3.mjt.lu/img/omi3/b/k/x7.jpeg] Drive the Hilux of your Choice! Doubl= e Cab, Single Cab or Extra Cab - pick one and SAVE! This e-mail has been sent to xfs@oss.sgi.com, click here to unsubscribe [[[= UNSUB_LINK_EN]]] .= --=-cxeu81gKAzpioQn23wWN Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable Indongo Toyota
Special offer from Indongo Toyot= a
<= /tbody>
 
<= tr>
=
=C2=A0
3D""
=C2=A0
=
=C2=A0
Drive the Hilux of your Choice!
=C2=A0
=C2=A0=
Double Cab, Single Cab or Extra Cab = - pick one and SAVE!
=C2=A0
<= td>
=
=

This e-mail has been sent to xfs@oss.sgi.com, click here to unsubscribe.

<= td width=3D"25">

<= /td>

3D"" = --=-cxeu81gKAzpioQn23wWN-- From bfoster@redhat.com Tue Aug 11 09:19:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EF9FE7F54 for ; Tue, 11 Aug 2015 09:19:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A1A9C8F8039 for ; Tue, 11 Aug 2015 07:18:59 -0700 (PDT) X-ASG-Debug-ID: 1439302734-04bdf06bd22ec580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JnluQNKrsRtLDrBj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 07:18:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id A01AE8E3F0; Tue, 11 Aug 2015 14:18:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7BEIsKF002984; Tue, 11 Aug 2015 10:18:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2BBA5124C43; Tue, 11 Aug 2015 10:18:53 -0400 (EDT) Date: Tue, 11 Aug 2015 10:18:53 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/10] xfs: add configurable error support to metadata buffers Message-ID: <20150811141852.GA59636@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 04/10] xfs: add configurable error support to metadata buffers References: <1438772921-28715-1-git-send-email-david@fromorbit.com> <1438772921-28715-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438772921-28715-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439302735 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 05, 2015 at 09:08:35PM +1000, Dave Chinner wrote: > From: Dave Chinner > > With the error configuration handle for async metadata write errors > in place, we can now add initial support to the IO error processing > in xfs_buf_iodone_error(). > > Add an infrastructure function to look up the configuration handle, > and rearrange the error handling to prepare the way for different > error handling conigurations to be used. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.h | 1 + > fs/xfs/xfs_buf_item.c | 112 ++++++++++++++++++++++++++++++-------------------- > fs/xfs/xfs_mount.h | 3 ++ > fs/xfs/xfs_sysfs.c | 17 ++++++++ > 4 files changed, 88 insertions(+), 45 deletions(-) > > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index 68c8f2d..ed0ea41 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -181,6 +181,7 @@ typedef struct xfs_buf { > unsigned int b_page_count; /* size of page array */ > unsigned int b_offset; /* page offset in first page */ > int b_error; /* error code on I/O */ > + int b_last_error; /* previous async I/O error */ > const struct xfs_buf_ops *b_ops; > > #ifdef XFS_BUF_LOCK_TRACKING > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index ee63961..a09ae26 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -924,35 +924,22 @@ xfs_buf_do_callbacks( > } > } > > -/* > - * This is the iodone() function for buffers which have had callbacks > - * attached to them by xfs_buf_attach_iodone(). It should remove each > - * log item from the buffer's list and call the callback of each in turn. > - * When done, the buffer's fsprivate field is set to NULL and the buffer > - * is unlocked with a call to iodone(). > - */ A pre-function comment would be nice to at least explain what the return value means. > -void > -xfs_buf_iodone_callbacks( > +static bool > +xfs_buf_iodone_callback_error( > struct xfs_buf *bp) > { > struct xfs_log_item *lip = bp->b_fspriv; > struct xfs_mount *mp = lip->li_mountp; > static ulong lasttime; > static xfs_buftarg_t *lasttarg; > - > - if (likely(!bp->b_error)) > - goto do_callbacks; > + struct xfs_error_cfg *cfg; > > /* > * If we've already decided to shutdown the filesystem because of > * I/O errors, there's no point in giving this a retry. > */ > - if (XFS_FORCED_SHUTDOWN(mp)) { > - xfs_buf_stale(bp); > - bp->b_flags |= XBF_DONE; > - trace_xfs_buf_item_iodone(bp, _RET_IP_); > - goto do_callbacks; > - } Looks like we've lost a tracepoint here. > + if (XFS_FORCED_SHUTDOWN(mp)) > + goto out_stale; > > if (bp->b_target != lasttarg || > time_after(jiffies, (lasttime + 5*HZ))) { > @@ -961,45 +948,80 @@ xfs_buf_iodone_callbacks( > } > lasttarg = bp->b_target; > > + /* synchronous writes will have callers process the error */ > + if (!(bp->b_flags & XBF_ASYNC)) > + goto out_stale; > + Why mark it stale? > + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); > + ASSERT(bp->b_iodone != NULL); > + > /* > * If the write was asynchronous then no one will be looking for the > - * error. Clear the error state and write the buffer out again. > - * > - * XXX: This helps against transient write errors, but we need to find > - * a way to shut the filesystem down if the writes keep failing. > - * > - * In practice we'll shut the filesystem down soon as non-transient > - * errors tend to affect the whole device and a failing log write > - * will make us give up. But we really ought to do better here. > + * error. If this is the first failure of this type, clear the error > + * state and write the buffer out again. This means we always retry an > + * async write failure at least once, but we also need to set the buffer > + * up to behave correctly now for repeated failures. > */ > - if (XFS_BUF_ISASYNC(bp)) { > - ASSERT(bp->b_iodone != NULL); > - > - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); > + cfg = xfs_error_get_cfg(mp, XFS_ERR_METADATA, bp->b_error); cfg isn't used until after the following block of code. Brian > + if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL)) || > + bp->b_last_error != bp->b_error) { > + bp->b_flags |= (XBF_WRITE | XBF_ASYNC | > + XBF_DONE | XBF_WRITE_FAIL); > + bp->b_last_error = bp->b_error; > + xfs_buf_ioerror(bp, 0); > + xfs_buf_submit(bp); > + return true; > + } > > - xfs_buf_ioerror(bp, 0); /* errno of 0 unsets the flag */ > + /* > + * Repeated failure on an async write. Take action according to the > + * error configuration we have been set up to use. > + */ > + if (cfg->fail_speed == XFS_ERR_FAIL_FAST) > + goto permanent_error; > > - if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { > - bp->b_flags |= XBF_WRITE | XBF_ASYNC | > - XBF_DONE | XBF_WRITE_FAIL; > - xfs_buf_submit(bp); > - } else { > - xfs_buf_relse(bp); > - } > - > - return; > - } > + /* still a transient error, higher layers will retry */ > + xfs_buf_ioerror(bp, 0); > + xfs_buf_relse(bp); > + return true; > > /* > - * If the write of the buffer was synchronous, we want to make > - * sure to return the error to the caller of xfs_bwrite(). > + * Permanent error - we need to trigger a shutdown if we haven't already > + * to indicate that inconsistency will result from this action. > */ > +permanent_error: > + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); > +out_stale: > xfs_buf_stale(bp); > bp->b_flags |= XBF_DONE; > - > trace_xfs_buf_error_relse(bp, _RET_IP_); > + return false; > +} > + > +/* > + * This is the iodone() function for buffers which have had callbacks attached > + * to them by xfs_buf_attach_iodone(). We need to iterate the items on the > + * callback list, mark the buffer as having no more callbacks and then push the > + * buffer through IO completion processing. > + */ > +void > +xfs_buf_iodone_callbacks( > + struct xfs_buf *bp) > +{ > + /* > + * If there is an error, process it. Some errors require us > + * to run callbacks after failure processing is done so we > + * detect that and take appropriate action. > + */ > + if (bp->b_error && xfs_buf_iodone_callback_error(bp)) > + return; > + > + /* > + * Successful IO or permanent error. Either way, we can clear the > + * retry state here in preparation for the next error that may occur. > + */ > + bp->b_last_error = 0; > > -do_callbacks: > xfs_buf_do_callbacks(bp); > bp->b_fspriv = NULL; > bp->b_iodone = NULL; > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 753060f..21caa5a 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -366,4 +366,7 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); > > extern void xfs_set_low_space_thresholds(struct xfs_mount *); > > +struct xfs_error_cfg * xfs_error_get_cfg(struct xfs_mount *mp, > + int error_class, int error); > + > #endif /* __XFS_MOUNT_H__ */ > diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c > index cb7ced0..3667d33 100644 > --- a/fs/xfs/xfs_sysfs.c > +++ b/fs/xfs/xfs_sysfs.c > @@ -355,3 +355,20 @@ xfs_error_sysfs_del( > xfs_sysfs_del(&mp->m_error_meta_kobj); > xfs_sysfs_del(&mp->m_error_kobj); > } > + > +struct xfs_error_cfg * > +xfs_error_get_cfg( > + struct xfs_mount *mp, > + int error_class, > + int error) > +{ > + struct xfs_error_cfg *cfg; > + > + switch (error) { > + default: > + cfg = &mp->m_error_cfg[error_class][XFS_ERR_DEFAULT]; > + break; > + } > + > + return cfg; > +} > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 11 09:19:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCCF629DF6 for ; Tue, 11 Aug 2015 09:19:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45980AC008 for ; Tue, 11 Aug 2015 07:19:06 -0700 (PDT) X-ASG-Debug-ID: 1439302745-04bdf06bd22ec5a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JpPN8NHg5QttHjU8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 07:19:05 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id E62348E4EB; Tue, 11 Aug 2015 14:19:04 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7BEJ4Up005920; Tue, 11 Aug 2015 10:19:04 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7FD27124C43; Tue, 11 Aug 2015 10:19:03 -0400 (EDT) Date: Tue, 11 Aug 2015 10:19:03 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/10] xfs: introduce table-based init for error behaviours Message-ID: <20150811141902.GB59636@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 05/10] xfs: introduce table-based init for error behaviours References: <1438772921-28715-1-git-send-email-david@fromorbit.com> <1438772921-28715-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438772921-28715-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439302745 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 05, 2015 at 09:08:36PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Before we start expanding the number of error classes and errors we > can configure behaviour for, we need a simple and clear way to > define the default behaviour that we initialised each mount with. > Introduce a table based method for keeping the initial configuration > in, and apply that to the existing initialisation code. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_sysfs.c | 72 +++++++++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 60 insertions(+), 12 deletions(-) > > diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c > index 3667d33..9d66095 100644 > --- a/fs/xfs/xfs_sysfs.c > +++ b/fs/xfs/xfs_sysfs.c > @@ -303,11 +303,67 @@ struct kobj_type xfs_error_ktype = { > .release = xfs_sysfs_release, > }; > > +/* > + * Error initialisation tables. These need to be ordered in the same > + * order as the enums used to index the array. All class init tables need to > + * define a "default" behaviour as the first entry, all other entries can be > + * empty. > + */ > +struct xfs_error_init { > + char *name; > + int fail_speed; > +}; > + > +static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { > + { .name = "Default", > + .fail_speed = XFS_ERR_FAIL_NEVER, > + }, > +}; > + > +static int > +xfs_error_sysfs_init_class( > + struct xfs_mount *mp, > + int class, > + const char *parent_name, > + struct xfs_kobj *parent_kobj, > + const struct xfs_error_init init[]) > +{ > + struct xfs_error_cfg *cfg; > + int error; > + int i; > + > + ASSERT(class < XFS_ERR_CLASS_MAX); > + > + error = xfs_sysfs_init(parent_kobj, &xfs_error_ktype, > + &mp->m_error_kobj, parent_name); 'parent_kobj' is a bit confusing of a name here since you're initializing it as well. Perhaps 'base_kobj,' 'class_kobj,' or something along those lines? Brian > + if (error) > + return error; > + > + for (i = 0; i < XFS_ERR_ERRNO_MAX; i++) { > + cfg = &mp->m_error_cfg[class][i]; > + error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, > + parent_kobj, init[i].name); > + if (error) > + goto out_error; > + > + cfg->fail_speed = init[i].fail_speed; > + } > + return 0; > + > +out_error: > + /* unwind the entries that succeeded */ > + for (i--; i >= 0; i--) { > + cfg = &mp->m_error_cfg[class][i]; > + xfs_sysfs_del(&cfg->kobj); > + } > + xfs_sysfs_del(parent_kobj); > + return error; > +} > + > int > xfs_error_sysfs_init( > struct xfs_mount *mp) > { > - struct xfs_error_cfg *cfg; > int error; > > /* .../xfs//error/ */ > @@ -317,22 +373,14 @@ xfs_error_sysfs_init( > return error; > > /* .../xfs//error/metadata/ */ > - error = xfs_sysfs_init(&mp->m_error_meta_kobj, &xfs_error_ktype, > - &mp->m_error_kobj, "metadata"); > + error = xfs_error_sysfs_init_class(mp, XFS_ERR_METADATA, > + "metadata", &mp->m_error_meta_kobj, > + xfs_error_meta_init); > if (error) > goto out_error; > > - cfg = &mp->m_error_cfg[XFS_ERR_METADATA][XFS_ERR_DEFAULT]; > - error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype, > - &mp->m_error_meta_kobj, "Default"); > - if (error) > - goto out_error_meta; > - cfg->fail_speed = XFS_ERR_FAIL_NEVER; > - > return 0; > > -out_error_meta: > - xfs_sysfs_del(&mp->m_error_meta_kobj); > out_error: > xfs_sysfs_del(&mp->m_error_kobj); > return error; > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 11 09:19:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 111757F54 for ; Tue, 11 Aug 2015 09:19:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF60A8F804B for ; Tue, 11 Aug 2015 07:19:29 -0700 (PDT) X-ASG-Debug-ID: 1439302765-04cbb0416d329740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oA1pTVIlzOu9OrbL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 07:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 33F488E3E8; Tue, 11 Aug 2015 14:19:25 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7BEJOAi012783; Tue, 11 Aug 2015 10:19:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B73DB124C43; Tue, 11 Aug 2015 10:19:23 -0400 (EDT) Date: Tue, 11 Aug 2015 10:19:23 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/10] xfs: add configuration of error failure speed Message-ID: <20150811141923.GC59636@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 06/10] xfs: add configuration of error failure speed References: <1438772921-28715-1-git-send-email-david@fromorbit.com> <1438772921-28715-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438772921-28715-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439302765 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 05, 2015 at 09:08:37PM +1000, Dave Chinner wrote: > From: Dave Chinner > > On reception of an error, we can fail immediately, perform some > bound amount of retries or retry indefinitely. The current behaviour > we have is to retry forever. > > However, we'd like the ability to choose what behaviour we have, and > that requires the ability to configure the behaviour through the new > sysfs interfaces. Add configuration options for fail fast, slow or > never to reflect the three choices above. Fail fast or fail never > don't require any other options, but "fail slow" needs configuration > to bound the retry behaviour. Add both a maximum retry count and a > retry timeout so that we can bound by time and/or physical IO > attempts. > > Finally, plumb these into xfs_buf_iodone error processing so that > the error behaviour follows the selected configuration. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.h | 23 +++++++++- > fs/xfs/xfs_buf_item.c | 22 +++++++++- > fs/xfs/xfs_mount.h | 2 + > fs/xfs/xfs_sysfs.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 164 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index ed0ea41..afc2d2b 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -181,7 +181,28 @@ typedef struct xfs_buf { > unsigned int b_page_count; /* size of page array */ > unsigned int b_offset; /* page offset in first page */ > int b_error; /* error code on I/O */ > - int b_last_error; /* previous async I/O error */ > + > + /* > + * async write failure retry count. Initialised to zero on the first > + * failure, then when it exceeds the maximum configured without a > + * success the write is considered to be failed permanently and the > + * iodone handler will take appropriate action. > + * > + * For retry timeouts, we record the jiffie of the first failure. This > + * means that we can change the retry timeout and it on the next error > + * it will be checked against the newly configured timeout. This > + * prevents buffers getting stuck in retry loops with a really long > + * timeout. > + * > + * last_error is used to ensure that we are getting repeated errors, not > + * different errors. e.g. a block device might change ENOSPC to EIO when > + * a failure timeout occurs, so we want to re-initialise the error > + * retry behaviour appropriately when that happens. > + */ > + int b_retries; > + unsigned long b_first_retry_time; /* in jiffies */ > + int b_last_error; > + > const struct xfs_buf_ops *b_ops; > > #ifdef XFS_BUF_LOCK_TRACKING > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index a09ae26..c785698 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -968,6 +968,9 @@ xfs_buf_iodone_callback_error( There's a 5 second xfs_buf_ioerror_alert() further up in this function. I wonder if we should figure out a way to tie that into the failure speed mechanism..? It might make sense to retain the original alert to indicate that a failure occurred in the first place, but I'm not sure a 5 second repetition makes sense if an admin has set a 5 minute error timeout, for example. It also might be a good idea to make this initial alert more informative in terms of indicating the error sequence has kicked in and retries are in progress. Perhaps even indicate what metric (timeout, retries) triggers a final shutdown if we get to that point. Otherwise, it's not really clear to the user where we're at when alerts start firing, particularly for somebody who might not know that fs shutdown is the endgame. > bp->b_flags |= (XBF_WRITE | XBF_ASYNC | > XBF_DONE | XBF_WRITE_FAIL); > bp->b_last_error = bp->b_error; > + bp->b_retries = 0; > + bp->b_first_retry_time = jiffies; > + > xfs_buf_ioerror(bp, 0); > xfs_buf_submit(bp); > return true; > @@ -977,9 +980,25 @@ xfs_buf_iodone_callback_error( > * Repeated failure on an async write. Take action according to the > * error configuration we have been set up to use. > */ > - if (cfg->fail_speed == XFS_ERR_FAIL_FAST) > + switch (cfg->fail_speed) { > + case XFS_ERR_FAIL_FAST: > goto permanent_error; > > + case XFS_ERR_FAIL_SLOW: > + if (++bp->b_retries > cfg->max_retries) > + goto permanent_error; > + if (!cfg->retry_timeout) > + break; > + if (time_after(jiffies, > + cfg->retry_timeout + bp->b_first_retry_time)) > + goto permanent_error; > + break; > + > + case XFS_ERR_FAIL_NEVER: > + default: > + break; > + } > + Where is the actual resubmission for the fail slow/never cases? > /* still a transient error, higher layers will retry */ > xfs_buf_ioerror(bp, 0); > xfs_buf_relse(bp); > @@ -1021,6 +1040,7 @@ xfs_buf_iodone_callbacks( > * retry state here in preparation for the next error that may occur. > */ > bp->b_last_error = 0; > + bp->b_retries = 0; > > xfs_buf_do_callbacks(bp); > bp->b_fspriv = NULL; > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 21caa5a..a684a72b 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -62,6 +62,8 @@ enum { > struct xfs_error_cfg { > struct xfs_kobj kobj; > int fail_speed; > + int max_retries; /* INT_MAX = retry forever */ > + unsigned long retry_timeout; /* in jiffies, 0 = no timeout */ > }; > > typedef struct xfs_mount { > diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c > index 9d66095..1f078e1 100644 > --- a/fs/xfs/xfs_sysfs.c > +++ b/fs/xfs/xfs_sysfs.c > @@ -252,7 +252,119 @@ struct kobj_type xfs_log_ktype = { > * and any other future type of IO (e.g. special inode or directory error > * handling) we care to support. > */ > +static ssize_t > +failure_speed_store( > + const char *buf, > + size_t count, > + void *data) > +{ > + struct xfs_error_cfg *cfg = data; > + char *str = kstrdup(buf, GFP_KERNEL); > + char *sp; > + int len; > + > + if (!str) > + return -ENOMEM; > + > + sp = strstrip(str); > + len = strlen(sp); > + if (strncmp(sp, "fast", len) == 0) > + cfg->fail_speed = XFS_ERR_FAIL_FAST; > + else if (strncmp(sp, "slow", len) == 0) > + cfg->fail_speed = XFS_ERR_FAIL_SLOW; > + else if (strncmp(sp, "never", len) == 0) > + cfg->fail_speed = XFS_ERR_FAIL_NEVER; > + else > + count = -EINVAL; > + kfree(str); > + return count; > +} > + > +static ssize_t > +failure_speed_show( > + char *buf, > + void *data) > +{ > + struct xfs_error_cfg *cfg = data; > + > + if (cfg->fail_speed == XFS_ERR_FAIL_FAST) > + return snprintf(buf, PAGE_SIZE, "[fast] slow never\n"); > + if (cfg->fail_speed == XFS_ERR_FAIL_SLOW) > + return snprintf(buf, PAGE_SIZE, "fast [slow] never\n"); > + return snprintf(buf, PAGE_SIZE, "fast slow [never]\n"); > +} > +XFS_SYSFS_ATTR_RW(failure_speed); > + > +static ssize_t > +max_retries_store( > + const char *buf, > + size_t count, > + void *data) > +{ > + struct xfs_error_cfg *cfg = data; > + int ret; > + int val; > + > + ret = kstrtoint(buf, 0, &val); > + if (ret) > + return ret; > + > + if (val < 0 || val > INT_MAX) > + return -EINVAL; > + > + cfg->max_retries = val; > + return count; > +} > + > +static ssize_t > +max_retries_show( > + char *buf, > + void *data) > +{ > + struct xfs_error_cfg *cfg = data; > + > + return snprintf(buf, PAGE_SIZE, "%d\n", cfg->max_retries); > +} > +XFS_SYSFS_ATTR_RW(max_retries); > + > +static ssize_t > +retry_timeout_seconds_store( > + const char *buf, > + size_t count, > + void *data) > +{ > + struct xfs_error_cfg *cfg = data; > + int ret; > + int val; > + > + ret = kstrtoint(buf, 0, &val); > + if (ret) > + return ret; > + > + /* 1 day timeout maximum */ > + if (val < 0 || val > 86400) > + return -EINVAL; > + > + cfg->retry_timeout = msecs_to_jiffies(val * MSEC_PER_SEC); > + return count; > +} > + > +static ssize_t > +retry_timeout_seconds_show( > + char *buf, > + void *data) > +{ > + struct xfs_error_cfg *cfg = data; > + > + return snprintf(buf, PAGE_SIZE, "%ld\n", Trailing whitespace above. > + jiffies_to_msecs(cfg->retry_timeout) * MSEC_PER_SEC); ... and a conversion to microseconds. ;) Brian > +} > +XFS_SYSFS_ATTR_RW(retry_timeout_seconds); > + > static struct attribute *xfs_error_attrs[] = { > + ATTR_LIST(failure_speed), > + ATTR_LIST(max_retries), > + ATTR_LIST(retry_timeout_seconds), > NULL, > }; > > @@ -312,11 +424,15 @@ struct kobj_type xfs_error_ktype = { > struct xfs_error_init { > char *name; > int fail_speed; > + int max_retries; > + int retry_timeout; /* in seconds */ > }; > > static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = { > { .name = "Default", > .fail_speed = XFS_ERR_FAIL_NEVER, > + .max_retries = INT_MAX, > + .retry_timeout = 0, > }, > }; > > @@ -347,6 +463,9 @@ xfs_error_sysfs_init_class( > goto out_error; > > cfg->fail_speed = init[i].fail_speed; > + cfg->max_retries = init[i].max_retries; > + cfg->retry_timeout = msecs_to_jiffies( > + init[i].retry_timeout * MSEC_PER_SEC); > } > return 0; > > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 11 09:20:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 95CE77F54 for ; Tue, 11 Aug 2015 09:20:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E848304051 for ; Tue, 11 Aug 2015 07:20:59 -0700 (PDT) X-ASG-Debug-ID: 1439302858-04cb6c67403b0810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t6iRCN1pGSKG1GLn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 07:20:58 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id ED52B8E75F; Tue, 11 Aug 2015 14:20:57 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7BEKvhB011909; Tue, 11 Aug 2015 10:20:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9203D124C43; Tue, 11 Aug 2015 10:20:56 -0400 (EDT) Date: Tue, 11 Aug 2015 10:20:56 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 00/10] xfs: configurable error behaviours Message-ID: <20150811142056.GD59636@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC, PATCH 00/10] xfs: configurable error behaviours References: <1438772921-28715-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438772921-28715-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439302858 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 05, 2015 at 09:08:31PM +1000, Dave Chinner wrote: > Hi folks, > > This is my first pass at introducing a framework for configuring the > error handling behaviour of various subsystems in XFS. This is being > driven by the need to handle things like ENOSPC from thin > provisioned block devices in a sane manner, as well as from the mm/ > side of the kernel for more configurable memory allocation failure > behaviour. > By and large, this looks pretty good to me. I sent some comments on the individual patches separately. A few more random thoughts below... > The patchset introduces the concepts of: > > - "failure speed", which defines the obvious behaviour of > the error handlers. "fast" will fail immediately, "slow" > will fail after a bound number of retries or timeout, and > "never" means exactly that. The current behaviour is > "never", and this patchset mostly leaves the default > behaviour configured this way. > > - "error class", which is the subsystem or error location > the error handlers configure the behaviour for. "metadata" > configures async write errors in metadata buffers, "kmem" > configures memory allocation failure behaviour and we'll > add others as we see fit. > > - "error handler", which is the specific error the > configuration applies to. For IO errors, it's obvious that > EIO, ENOSPC, ENODEV, etc are errors that need to be > handled in different ways. But for the kmem class, the > only error is ENOMEM, so while that it is currently > configured that way, the error handlers are more likely to > refer to failures in transaction context, in buffer > allocation context, etc. IOWs, the name and failure > context can change, but the same "failure speed" > definition still applies. > At first thought, I'm not a huge fan of encoding the error codes into the sysfs interface. This stuff probably shouldn't change much, if ever, but it's not exactly under our control since we're talking about underlying device error codes. On one hand, I think it would be nice to have something like 'out_of_space' in the sysfs tree rather than ENOSPC, for example. Then the filesystem would just do the right thing for whatever error code that happens to reflect. On the other hand, one could have some 3rd party storage device that reports EIO or something else in the context where a thin volume is out of space, for example. The user would have no sense of how to configure that for this particular device without the error code based configuration. > As a result, the infrastructure is quite flexible - anywhere you > have a struct xfs_mount you can look up an error handling > configuration and apply it appropriately for that context. The > patchset really only implements a metadata buffer async write IO > error context handler, but that is just the tip of the iceberg.... > > I've tried to make the initialisation as generic and simple as > possible. It's all table based, so all the default values are in one > place and easy to find - you don't have to touch the initialisation > code to modify the default error config, or to add new errors. Only > sysfs handlers need to be added for new error classes and handlers. > > The current sysfs layout looks like this: > > $ find /sys/fs/xfs/vdc/error > /sys/fs/xfs/vdc/error > /sys/fs/xfs/vdc/error/kmem > /sys/fs/xfs/vdc/error/kmem/ENOMEM > /sys/fs/xfs/vdc/error/kmem/ENOMEM/max_retries > /sys/fs/xfs/vdc/error/kmem/ENOMEM/failure_speed > /sys/fs/xfs/vdc/error/kmem/ENOMEM/fail_at_unmount > /sys/fs/xfs/vdc/error/kmem/ENOMEM/retry_timeout_seconds > /sys/fs/xfs/vdc/error/kmem/Default > /sys/fs/xfs/vdc/error/kmem/Default/max_retries > /sys/fs/xfs/vdc/error/kmem/Default/failure_speed > /sys/fs/xfs/vdc/error/kmem/Default/fail_at_unmount > /sys/fs/xfs/vdc/error/kmem/Default/retry_timeout_seconds > /sys/fs/xfs/vdc/error/metadata > /sys/fs/xfs/vdc/error/metadata/EIO > /sys/fs/xfs/vdc/error/metadata/EIO/max_retries > /sys/fs/xfs/vdc/error/metadata/EIO/failure_speed > /sys/fs/xfs/vdc/error/metadata/EIO/fail_at_unmount > /sys/fs/xfs/vdc/error/metadata/EIO/retry_timeout_seconds > /sys/fs/xfs/vdc/error/metadata/ENODEV > /sys/fs/xfs/vdc/error/metadata/ENODEV/max_retries > /sys/fs/xfs/vdc/error/metadata/ENODEV/failure_speed > /sys/fs/xfs/vdc/error/metadata/ENODEV/fail_at_unmount > /sys/fs/xfs/vdc/error/metadata/ENODEV/retry_timeout_seconds > /sys/fs/xfs/vdc/error/metadata/ENOSPC > /sys/fs/xfs/vdc/error/metadata/ENOSPC/max_retries > /sys/fs/xfs/vdc/error/metadata/ENOSPC/failure_speed > /sys/fs/xfs/vdc/error/metadata/ENOSPC/fail_at_unmount > /sys/fs/xfs/vdc/error/metadata/ENOSPC/retry_timeout_seconds > /sys/fs/xfs/vdc/error/metadata/Default > /sys/fs/xfs/vdc/error/metadata/Default/max_retries > /sys/fs/xfs/vdc/error/metadata/Default/failure_speed > /sys/fs/xfs/vdc/error/metadata/Default/fail_at_unmount > /sys/fs/xfs/vdc/error/metadata/Default/retry_timeout_seconds > $ > The error context isn't quite clear from this organization. It is consistent and seems functionally sane from the code. I just wonder whether users might get confused considering that some of these errors can originate from the filesystem vs. the underlying device. Clearly we're interested in the latter, but how is that evident from the sysfs interface? Maybe tweaking the class name would help clarify a bit. E.g., metadata_io..? Brian > Which shows the classes and error handlers, and how different > classes can have different error handlers. > > The patchset runs through xfstests without problems on the default > configuration it sets. Note that the default config for the metadata > class now sets "fail at unmount" so errors that have been retries > indefinitely will fail at unmount and trigger a shutdown at that > point. This is preferable to hanging unmount as currently happens. > > Anyway, have a play, have a poke, and let me know what you think... > > Cheers, > > Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Tue Aug 11 11:41:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9E9E67CBE for ; Tue, 11 Aug 2015 11:41:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 21EAAAC003 for ; Tue, 11 Aug 2015 09:41:00 -0700 (PDT) X-ASG-Debug-ID: 1439311258-04cbb0416d32d980001-NocioJ Received: from mail-io0-f177.google.com (mail-io0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id kZfBpL2sRroJCGXr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Aug 2015 09:40:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iods203 with SMTP id s203so11171030iod.0 for ; Tue, 11 Aug 2015 09:40:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=jg/eMt/cSX27ufaf8QnOSFgfioRmwNOCr8OdRW/7Wp4=; b=YgT9CnNq334jPQYCV5iTILKZQ4w83Su2zXHCQ/VS2zsjD+aoyDg28v90v3TMzqBhP+ OTiAeVWrRxPGY+Jsc7omxBx//TwEjZQwImOqeFDEzPlwZxfsKbuFBahqVeDdgAUPoFJQ N1hj7Ga7gSBWPI2HmEAWXiIagO3McyCFAilPjXtTGz630G1d4bxopS84OddukH/EcLp3 ZGas/IUWx+JwW3MInNA0SWZgghikQVOK0CuCyr6hiN4q07PneA4wYEd2pJ3xE08bP8zx hlykBkauUQP5In6bP+9QH2cmo/90ynPhKepCqBq8QXtYHIN+TEJOR6hXjzez7l3L8sim c+5w== X-Gm-Message-State: ALoCoQnL4BRZv4tpDYH8wDf83Ur8NzHWLeUxUPO/cmisrgtWsutrHG5DnY7J5RdSSMSTD7txHVcy X-Received: by 10.107.151.75 with SMTP id z72mr26484497iod.46.1439311258608; Tue, 11 Aug 2015 09:40:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Tue, 11 Aug 2015 09:40:39 -0700 (PDT) In-Reply-To: <1490980415.3591793.1438866795648.JavaMail.zimbra@redhat.com> References: <1156743222.24471614.1436281858017.JavaMail.zimbra@redhat.com> <1436346893-11831-1-git-send-email-jtulak@redhat.com> <1508777144.956841.1437482376774.JavaMail.zimbra@redhat.com> <20150726162530.GE29329@infradead.org> <1326157887.2004059.1438598404429.JavaMail.zimbra@redhat.com> <55BFA2C5.20408@redhat.com> <1050814645.2742881.1438702230663.JavaMail.zimbra@redhat.com> <55C0E73B.1000904@sandeen.net> <1490980415.3591793.1438866795648.JavaMail.zimbra@redhat.com> From: Jan Tulak Date: Tue, 11 Aug 2015 18:40:39 +0200 Message-ID: Subject: Re: [PATCH v3] xfsprogs: blkid is now mandatory To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH v3] xfsprogs: blkid is now mandatory Cc: Christoph Hellwig , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11406ee64aa27b051d0bc4ab X-Barracuda-Connect: mail-io0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1439311258 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --001a11406ee64aa27b051d0bc4ab Content-Type: text/plain; charset=UTF-8 On Thu, Aug 6, 2015 at 3:13 PM, Jan Tulak wrote: > > It looks like it works. Though I need to do some testing before I send the patch. > Unfortunately, making FS tests without the ability to mount it on the machine > requires USB drive shuffling and it is hard to automate it... :-) > (Sorry for spam, Eric, resubmitting it with mailing list in cc) My hope was premature. After long searching for "why there is not created any FS," I found that using mkfs on OS X on block devices probably wasn't ever enabled. Some platform_ functions in libxfs/darwin.h used for block device work are empty (so it just silently fails). I edited the doc/INSTALL respectively and once I check and clean the patches, I submit the updates in the compatibility patchset with block devices disabled. Cheers, Jan -- Jan Tulak jtulak@redhat.com --001a11406ee64aa27b051d0bc4ab Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Thu, Aug 6, 2015 at 3:13 PM, Jan Tul= ak <jtulak@redhat= .com> wrote:
>
> It looks like it works. Though I need t= o do some testing before I send the patch.
> Unfortunately, making FS= tests without the ability to mount it on the machine
> requires USB = drive shuffling and it is hard to automate it... :-)
>
(Sorry for spam, Eric, resubmitting it with mailing list in= cc)

My hope was premature. After long searching = for "why there is not created any FS,"
I found that usi= ng mkfs on OS X on block devices probably wasn't ever enabled.
Some platform_ functions in libxfs/darwin.h used for block device work ar= e empty
(so it just silently fails).

I e= dited the doc/INSTALL respectively and once I check and clean the patches,<= /div>
I submit the updates in the compatibility patchset with block dev= ices disabled.

Ch= eers,
Jan

--
--001a11406ee64aa27b051d0bc4ab-- From dave@fromorbit.com Tue Aug 11 17:04:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 25A3A7F50 for ; Tue, 11 Aug 2015 17:04:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11194304043 for ; Tue, 11 Aug 2015 15:04:43 -0700 (PDT) X-ASG-Debug-ID: 1439330678-04cbb0416c335840002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id YqK0tGo0Y34XFnPM for ; Tue, 11 Aug 2015 15:04:41 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B/GABfcMpVPBkyLHldgxuBPYFFhQ2jOAEBAQEBAQaNAZAFTQEBAQEBAQcBAQEBQAE/hCQBBScvIxAIGDE5AwcUGYgtz12GH45uBYcchTyIOIYpgUeGRIc/kQKBcQGCRCwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 07:34:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPHeZ-0005Tt-3V; Wed, 12 Aug 2015 08:04:15 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPHeZ-0000ma-2g; Wed, 12 Aug 2015 08:04:15 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: oleg@redhat.com, jack@suse.cz Subject: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks Date: Wed, 12 Aug 2015 08:04:08 +1000 X-ASG-Orig-Subj: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks Message-Id: <1439330648-1057-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439330648-1057-1-git-send-email-david@fromorbit.com> References: <1439330648-1057-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439330681 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21514 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The recent change to the readdir locking made in 40194ec ("xfs: reinstate the ilock in xfs_readdir") for CXFS directory sanity was probably the wrong thing to do. Deep in the readdir code we can take page faults in the filldir callback, and so taking a page fault while holding an inode ilock creates a new set of locking issues that lockdep warns all over the place about. The locking order for regular inodes w.r.t. page faults is io_lock -> pagefault -> mmap_sem -> ilock. The directory readdir code now triggers ilock -> page fault -> mmap_sem. While we cannot deadlock at this point, it inverts all the locking patterns that lockdep normally sees on XFS inodes, and so triggers lockdep. We worked around this with commit 93a8614 ("xfs: fix directory inode iolock lockdep false positive"), but that then just moved the lockdep warning to deeper in the page fault path and triggered on security inode locks. Fixing the shmem issue there just moved the lockdep reports somewhere else, and now we are getting false positives from filesystem freezing annotations getting confused. Further, if we enter memory reclaim in a readdir path, we now get lockdep warning about potential deadlocks because the ilock is held when we enter reclaim. This, again, is different to a regular file in that we never allow memory reclaim to run while holding the ilock for regular files. Hence lockdep now throws ilock->kmalloc->reclaim->ilock warnings. Basically, the problem is that the ilock is being used to protect the directory data and the inode metadata, whereas for a regular file the iolock protects the data and the ilock protects the metadata. From the VFS perspective, the i_mutex serialises all accesses to the directory data, and so not holding the ilock for readdir doesn't matter. The issue is that CXFS doesn't access directory data via the VFS, so it has no "data serialisaton" mechanism. Hence we need to hold the IOLOCK in the correct places to provide this low level directory data access serialisation. The ilock can then be used just when the extent list needs to be read, just like we do for regular files. The directory modification code can take the iolock exclusive when the ilock is also taken, and this then ensures that readdir is correct excluded while modifications are in progress. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_dir2.c | 3 +++ fs/xfs/xfs_dir2_readdir.c | 11 ++++++++--- fs/xfs/xfs_inode.c | 34 +++++++++++++++++++++------------- fs/xfs/xfs_symlink.c | 7 ++++--- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index a69fb3a..42799d8 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -362,6 +362,7 @@ xfs_dir_lookup( struct xfs_da_args *args; int rval; int v; /* type-checking value */ + int lock_mode; ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_lookup); @@ -387,6 +388,7 @@ xfs_dir_lookup( if (ci_name) args->op_flags |= XFS_DA_OP_CILOOKUP; + lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { rval = xfs_dir2_sf_lookup(args); goto out_check_rval; @@ -419,6 +421,7 @@ out_check_rval: } } out_free: + xfs_iunlock(dp, lock_mode); kmem_free(args); return rval; } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 098cd78..a989a9c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -171,6 +171,7 @@ xfs_dir2_block_getdents( int wantoff; /* starting block offset */ xfs_off_t cook; struct xfs_da_geometry *geo = args->geo; + int lock_mode; /* * If the block number in the offset is out of range, we're done. @@ -178,7 +179,9 @@ xfs_dir2_block_getdents( if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) return 0; + lock_mode = xfs_ilock_data_map_shared(dp); error = xfs_dir3_block_read(NULL, dp, &bp); + xfs_iunlock(dp, lock_mode); if (error) return error; @@ -529,9 +532,12 @@ xfs_dir2_leaf_getdents( * current buffer, need to get another one. */ if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { + int lock_mode; + lock_mode = xfs_ilock_data_map_shared(dp); error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, &curoff, &bp); + xfs_iunlock(dp, lock_mode); if (error || !map_info->map_valid) break; @@ -653,7 +659,6 @@ xfs_readdir( struct xfs_da_args args = { NULL }; int rval; int v; - uint lock_mode; trace_xfs_readdir(dp); @@ -666,7 +671,7 @@ xfs_readdir( args.dp = dp; args.geo = dp->i_mount->m_dir_geo; - lock_mode = xfs_ilock_data_map_shared(dp); + xfs_ilock(dp, XFS_IOLOCK_SHARED); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_getdents(&args, ctx); else if ((rval = xfs_dir2_isblock(&args, &v))) @@ -675,7 +680,7 @@ xfs_readdir( rval = xfs_dir2_block_getdents(&args, ctx); else rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); - xfs_iunlock(dp, lock_mode); + xfs_iunlock(dp, XFS_IOLOCK_SHARED); return rval; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 793e6c9..83b0752 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -672,30 +672,29 @@ xfs_lookup( { xfs_ino_t inum; int error; - uint lock_mode; trace_xfs_lookup(dp, name); if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return -EIO; - lock_mode = xfs_ilock_data_map_shared(dp); + xfs_ilock(dp, XFS_IOLOCK_SHARED); error = xfs_dir_lookup(NULL, dp, name, &inum, ci_name); - xfs_iunlock(dp, lock_mode); - if (error) - goto out; + goto out_unlock; error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp); if (error) goto out_free_name; + xfs_iunlock(dp, XFS_IOLOCK_SHARED); return 0; out_free_name: if (ci_name) kmem_free(ci_name->name); -out: +out_unlock: + xfs_iunlock(dp, XFS_IOLOCK_SHARED); *ipp = NULL; return error; } @@ -1197,7 +1196,8 @@ xfs_create( goto out_trans_cancel; - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | + XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); unlock_dp_on_error = true; xfs_bmap_init(&free_list, &first_block); @@ -1236,7 +1236,7 @@ xfs_create( * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); unlock_dp_on_error = false; error = xfs_dir_createname(tp, dp, name, ip->i_ino, @@ -1309,7 +1309,7 @@ xfs_create( xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_ILOCK_EXCL); + xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); return error; } @@ -1457,10 +1457,11 @@ xfs_link( if (error) goto error_return; + xfs_ilock(tdp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, tdp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); /* * If we are using project inheritance, we only allow hard link @@ -2563,9 +2564,10 @@ xfs_remove( goto out_trans_cancel; } + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); /* @@ -2946,6 +2948,12 @@ xfs_rename( * whether the target directory is the same as the source * directory, we can lock from 2 to 4 inodes. */ + if (!new_parent) + xfs_ilock(src_dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); + else + xfs_lock_two_inodes(src_dp, target_dp, + XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); + xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL); /* @@ -2953,9 +2961,9 @@ xfs_rename( * we can rely on either trans_commit or trans_cancel to unlock * them. */ - xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, src_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); if (new_parent) - xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, target_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); if (target_ip) xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 4be27b0..7a01486 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -240,7 +240,8 @@ xfs_symlink( if (error) goto out_trans_cancel; - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | + XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); unlock_dp_on_error = true; /* @@ -288,7 +289,7 @@ xfs_symlink( * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); unlock_dp_on_error = false; /* @@ -421,7 +422,7 @@ out_release_inode: xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_ILOCK_EXCL); + xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); return error; } -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:04:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 84F7A7F50 for ; Tue, 11 Aug 2015 17:04:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7277F304039 for ; Tue, 11 Aug 2015 15:04:42 -0700 (PDT) X-ASG-Debug-ID: 1439330678-04cbb0416c335840001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GlzdfgzBHqoKzYdp for ; Tue, 11 Aug 2015 15:04:39 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ChCwBfcMpVPBkyLHldgxuID6M4AQEBAQEBBp0GTQEBAQEBAQcBAQEBQAE/hQAjGIECAweIWs9dhh+KWYQVBZUQjjSUW4NmgXEBCwGCOCyCfwEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 07:34:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPHeZ-0005Tr-2r; Wed, 12 Aug 2015 08:04:15 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPHeZ-0000mS-1k; Wed, 12 Aug 2015 08:04:15 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: oleg@redhat.com, jack@suse.cz Subject: [PATCH 0/2] xfs: kill lockdep false positives from readdir Date: Wed, 12 Aug 2015 08:04:06 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfs: kill lockdep false positives from readdir Message-Id: <1439330648-1057-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439330678 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21514 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Folks, These two patches change the XFS directory locking to shut up lockdep. Ever since we changed the locking to serialise readdir via the ILOCK for CXFS, lockdep has been producing false positive warnings because filldir can trigger page faults and lockdep can't be easily told that you can't take page faults on directory inodes so it warns about all sorts of stuff that just can't deadlock. To fix this, we need to change the directory locking (again!) to use a different structure that separates the page fault path out from underneath the ILOCK. TO do this, we have to treat the directory data the same way we treat file data: The IOLOCK serialises access to the data sections of the inode, the ILOCK serialises access to the metadata sections of the inode. This means that we need to take the IOLOCK in operations that modify the directory data, which means we need nested PARENT lockdep annotations because we need to lock two inodes at a time, so the inode subclass lockdep annotations need a complete rework to support this. This annotation rework is the first patch in the series. THe second patch in the series is the directory locking rework. It's all relatively straight forward - on modification the IOLOCK is taken EXCL before we start transactions, the transaction join is modified to understand the IOLOCK is also held, and the transaction commit releases the IOLOCK. On readdir, we hold the IOLOCK in SHARED mode across the readdir operation, and only hold the ILOCK when doing operations that walk the extent tree and map directory buffers. Oleg and Jan, this patchset should fix the lockdep issues that have been seen with the freeze rework. Oleg, can you you try it with your current patchset and testing and let me know if there are any issues that you see? Cheers, Dave. From dave@fromorbit.com Tue Aug 11 17:04:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A44F87F51 for ; Tue, 11 Aug 2015 17:04:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91A70304039 for ; Tue, 11 Aug 2015 15:04:45 -0700 (PDT) X-ASG-Debug-ID: 1439330681-04cb6c673e3bc9f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id KDeGgCC7GGBsCJmq for ; Tue, 11 Aug 2015 15:04:42 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CmCwBfcMpVPBkyLHlVCIMbgT2GUqM4AQEBAQEBBp0GTQEBAQEBAQcBAQEBQAE/hCQBBScvIxAIGDE5AwcUGRuIEs9dhh+JYgIOhHwFhxyNdIdwnwWBcQFDHIFlLDOBBQEfgScBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 07:34:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPHeZ-0005Ts-3E; Wed, 12 Aug 2015 08:04:15 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPHeZ-0000mV-2L; Wed, 12 Aug 2015 08:04:15 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: oleg@redhat.com, jack@suse.cz Subject: [PATCH 1/2] xfs: clean up inode lockdep annotations Date: Wed, 12 Aug 2015 08:04:07 +1000 X-ASG-Orig-Subj: [PATCH 1/2] xfs: clean up inode lockdep annotations Message-Id: <1439330648-1057-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439330648-1057-1-git-send-email-david@fromorbit.com> References: <1439330648-1057-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439330681 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21514 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Lockdep annotations are a maintenance nightmare. Locking has to be modified to suit the limitations of the annotations, and we're always having to fix the annotations because they are unable to express the complexity of locking heirarchies correctly. So, next up, we've got more issues with lockdep annotations for inode locking w.r.t. XFS_LOCK_PARENT: - lockdep classes are exclusive and can't be ORed together to form new classes. - IOLOCK needs multiple PARENT subclasses to express the changes needed for the readdir locking rework needed to stop the endless flow of lockdep false positives involving readdir calling filldir under the ILOCK. - there are only 8 unique lockdep subclasses available, so we can't create a generic solution. IOWs we need to treat the 3-bit space available to each lock type differently: - IOLOCK uses xfs_lock_two_inodes(), so needs: - at least 2 IOLOCK subclasses - at least 2 IOLOCK_PARENT subclasses - MMAPLOCK uses xfs_lock_two_inodes(), so needs: - at least 2 MMAPLOCK subclasses - ILOCK uses xfs_lock_inodes with up to 5 inodes, so needs: - at least 5 ILOCK subclasses - one ILOCK_PARENT subclass - one RTBITMAP subclass - one RTSUM subclass For the IOLOCK, split the space into two sets of subclasses. For the MMAPLOCK, just use half the space for the one subclass to match the non-parent lock classes of the IOLOCK. For the ILOCK, use 0-4 as the ILOCK subclasses, 5-7 for the remaining individual subclasses. Because they are now all different, modify xfs_lock_inumorder() to handle the nested subclasses, and to assert fail if passed an invalid subclass. Further, annotate xfs_lock_inodes() to assert fail if an invalid combination of lock primitives and inode counts are passed that would result in a lockdep subclass annotation overflow. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 68 ++++++++++++++++++++++++++++++++----------- fs/xfs/xfs_inode.h | 85 +++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 110 insertions(+), 43 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8d0cbb5..793e6c9 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -164,7 +164,7 @@ xfs_ilock( (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); if (lock_flags & XFS_IOLOCK_EXCL) mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); @@ -212,7 +212,7 @@ xfs_ilock_nowait( (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); if (lock_flags & XFS_IOLOCK_EXCL) { if (!mrtryupdate(&ip->i_iolock)) @@ -281,7 +281,7 @@ xfs_iunlock( (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); ASSERT(lock_flags != 0); if (lock_flags & XFS_IOLOCK_EXCL) @@ -364,30 +364,38 @@ int xfs_lock_delays; /* * Bump the subclass so xfs_lock_inodes() acquires each lock with a different - * value. This shouldn't be called for page fault locking, but we also need to - * ensure we don't overrun the number of lockdep subclasses for the iolock or - * mmaplock as that is limited to 12 by the mmap lock lockdep annotations. + * value. This can be called for any type of inode lock combination, including + * parent locking. Care must be taken to ensure we don't overrun the subclass + * storage fields in the class mask we build. */ static inline int xfs_lock_inumorder(int lock_mode, int subclass) { + int class = 0; + + ASSERT(!(lock_mode & (XFS_ILOCK_PARENT | XFS_ILOCK_RTBITMAP | + XFS_ILOCK_RTSUM))); + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { - ASSERT(subclass + XFS_LOCK_INUMORDER < - (1 << (XFS_MMAPLOCK_SHIFT - XFS_IOLOCK_SHIFT))); - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_IOLOCK_SHIFT; + ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); + ASSERT(subclass + XFS_IOLOCK_PARENT_VAL < + MAX_LOCKDEP_SUBCLASSES); + class += subclass << XFS_IOLOCK_SHIFT; + if (lock_mode & XFS_IOLOCK_PARENT) + class += XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT; } if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) { - ASSERT(subclass + XFS_LOCK_INUMORDER < - (1 << (XFS_ILOCK_SHIFT - XFS_MMAPLOCK_SHIFT))); - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << - XFS_MMAPLOCK_SHIFT; + ASSERT(subclass <= XFS_MMAPLOCK_MAX_SUBCLASS); + class += subclass << XFS_MMAPLOCK_SHIFT; } - if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_ILOCK_SHIFT; + if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) { + ASSERT(subclass <= XFS_ILOCK_MAX_SUBCLASS); + class += subclass << XFS_ILOCK_SHIFT; + } - return lock_mode; + return (lock_mode & ~XFS_LOCK_SUBCLASS_MASK) | class; } /* @@ -399,6 +407,11 @@ xfs_lock_inumorder(int lock_mode, int subclass) * transaction (such as truncate). This can result in deadlock since the long * running trans might need to wait for the inode we just locked in order to * push the tail and free space in the log. + * + * xfs_lock_inodes() can only be used to lock one type of lock at a time - + * the iolock, the mmaplock or the ilock, but not more than one at a time. If we + * lock more than one at a time, lockdep will report false positives saying we + * have violated locking orders. */ void xfs_lock_inodes( @@ -409,8 +422,29 @@ xfs_lock_inodes( int attempts = 0, i, j, try_lock; xfs_log_item_t *lp; - /* currently supports between 2 and 5 inodes */ + /* + * Currently supports between 2 and 5 inodes with exclusive locking. We + * support an arbitrary depth of locking here, but absolute limits on + * inodes depend on the the type of locking and the limits placed by + * lockdep annotations in xfs_lock_inumorder. These are all checked by + * the asserts. + */ ASSERT(ips && inodes >= 2 && inodes <= 5); + ASSERT(lock_mode & (XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL | + XFS_ILOCK_EXCL)); + ASSERT(!(lock_mode & (XFS_IOLOCK_SHARED | XFS_MMAPLOCK_SHARED | + XFS_ILOCK_SHARED))); + ASSERT(!(lock_mode & XFS_IOLOCK_EXCL) || + inodes <= XFS_IOLOCK_MAX_SUBCLASS + 1); + ASSERT(!(lock_mode & XFS_MMAPLOCK_EXCL) || + inodes <= XFS_MMAPLOCK_MAX_SUBCLASS + 1); + ASSERT(!(lock_mode & XFS_ILOCK_EXCL) || + inodes <= XFS_ILOCK_MAX_SUBCLASS + 1); + + if (lock_mode & XFS_IOLOCK_EXCL) { + ASSERT(!(lock_mode & (XFS_MMAPLOCK_EXCL | XFS_ILOCK_EXCL))); + } else if (lock_mode & XFS_MMAPLOCK_EXCL) + ASSERT(!(lock_mode & XFS_ILOCK_EXCL)); try_lock = 0; i = 0; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 8f22d20..ca9e119 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -284,9 +284,9 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) * Flags for lockdep annotations. * * XFS_LOCK_PARENT - for directory operations that require locking a - * parent directory inode and a child entry inode. The parent gets locked - * with this flag so it gets a lockdep subclass of 1 and the child entry - * lock will have a lockdep subclass of 0. + * parent directory inode and a child entry inode. IOLOCK requires nesting, + * MMAPLOCK does not support this class, ILOCK requires a single subclass + * to differentiate parent from child. * * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary * inodes do not participate in the normal lock order, and thus have their @@ -295,30 +295,63 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) * XFS_LOCK_INUMORDER - for locking several inodes at the some time * with xfs_lock_inodes(). This flag is used as the starting subclass * and each subsequent lock acquired will increment the subclass by one. - * So the first lock acquired will have a lockdep subclass of 4, the - * second lock will have a lockdep subclass of 5, and so on. It is - * the responsibility of the class builder to shift this to the correct - * portion of the lock_mode lockdep mask. + * However, MAX_LOCKDEP_SUBCLASSES == 8, which means we are greatly + * limited to the subclasses we can represent via nesting. We need at least + * 5 inodes nest depth for the ILOCK through rename, and we also have to support + * XFS_ILOCK_PARENT, which gives 6 subclasses. Then we have XFS_ILOCK_RTBITMAP + * and XFS_ILOCK_RTSUM, which are another 2 unique subclasses, so that's all + * 8 subclasses supported by lockdep. + * + * This also means we have to number the sub-classes in the lowest bits of + * the mask we keep, and we have to ensure we never exceed 3 bits of lockdep + * mask and we can't use bit-masking to build the subclasses. What a mess. + * + * Bit layout: + * + * Bit Lock Region + * 16-19 XFS_IOLOCK_SHIFT dependencies + * 20-23 XFS_MMAPLOCK_SHIFT dependencies + * 24-31 XFS_ILOCK_SHIFT dependencies + * + * IOLOCK values + * + * 0-3 subclass value + * 4-7 PARENT subclass values + * + * MMAPLOCK values + * + * 0-3 subclass value + * 4-7 unused + * + * ILOCK values + * 0-4 subclass values + * 5 PARENT subclass (not nestable) + * 6 RTBITMAP subclass (not nestable) + * 7 RTSUM subclass (not nestable) + * */ -#define XFS_LOCK_PARENT 1 -#define XFS_LOCK_RTBITMAP 2 -#define XFS_LOCK_RTSUM 3 -#define XFS_LOCK_INUMORDER 4 - -#define XFS_IOLOCK_SHIFT 16 -#define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) - -#define XFS_MMAPLOCK_SHIFT 20 - -#define XFS_ILOCK_SHIFT 24 -#define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) -#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) -#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) - -#define XFS_IOLOCK_DEP_MASK 0x000f0000 -#define XFS_MMAPLOCK_DEP_MASK 0x00f00000 -#define XFS_ILOCK_DEP_MASK 0xff000000 -#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | \ +#define XFS_IOLOCK_SHIFT 16 +#define XFS_IOLOCK_PARENT_VAL 4 +#define XFS_IOLOCK_MAX_SUBCLASS (XFS_IOLOCK_PARENT_VAL - 1) +#define XFS_IOLOCK_DEP_MASK 0x000f0000 +#define XFS_IOLOCK_PARENT (XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT) + +#define XFS_MMAPLOCK_SHIFT 20 +#define XFS_MMAPLOCK_NUMORDER 0 +#define XFS_MMAPLOCK_MAX_SUBCLASS 3 +#define XFS_MMAPLOCK_DEP_MASK 0x00f00000 + +#define XFS_ILOCK_SHIFT 24 +#define XFS_ILOCK_PARENT_VAL 5 +#define XFS_ILOCK_MAX_SUBCLASS (XFS_ILOCK_PARENT_VAL - 1) +#define XFS_ILOCK_RTBITMAP_VAL 6 +#define XFS_ILOCK_RTSUM_VAL 7 +#define XFS_ILOCK_DEP_MASK 0xff000000 +#define XFS_ILOCK_PARENT (XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTBITMAP (XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_RTSUM (XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT) + +#define XFS_LOCK_SUBCLASS_MASK (XFS_IOLOCK_DEP_MASK | \ XFS_MMAPLOCK_DEP_MASK | \ XFS_ILOCK_DEP_MASK) -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:49:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4C1CA7F50 for ; Tue, 11 Aug 2015 17:49:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1E99AC003 for ; Tue, 11 Aug 2015 15:49:57 -0700 (PDT) X-ASG-Debug-ID: 1439333392-04cbb0416d336400002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id QdNUm8JOpejF2WpN for ; Tue, 11 Aug 2015 15:49:55 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ChCwC/espVPBkyLHldgxuID6M4AQEBAQEBBp0FTQEBAQEBAQcBAQEBQAE/hFEvO4ECAweIWqlCphWGH4pZhBUFlRCONIc/hQ1DizKBcQELATccgWUsgn8BAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMg-0005YD-VN for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMg-0004OM-Uh for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:50 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC, PATCH 0/8] xfs: get rid of xfs_cluster_write() Date: Wed, 12 Aug 2015 08:49:40 +1000 X-ASG-Orig-Subj: [RFC, PATCH 0/8] xfs: get rid of xfs_cluster_write() Message-Id: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333395 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patchset is the first small step to removing bufferheads from the ->writepage path. The first step to doing this is to simplify the ->writepage path such that we only look up pages once in the radix tree for writeback. This means we only operate on a single page at a time, but a simple conversion loses the mapping efficiency that xfs_cluster_write() gives us. To do this without losing any efficiency we need to retain the active bmbt mapping and ioend chains we build across multiple calls to ->writepage. In general, those multiple sequential page calls come from ->writepages, so we can create a context structure at xfs_vm_writepages() and pass that all the way through to every xfs_vm_writepage() call that occurs from a single writepages context. This allows us to cache the current bmbt mapping as well as keep the ioend chain connected and not have to continually remap the same extent or submit page sized bios and rely on block layer merging to build large IOs. This patch series introduces the struct xfs_writepage_context to act as the holding container for this state, converts the code to use it and removes xfs_cluster_write() as it is no longer needed to efficiently build large IOs. Indeed, the new code is more efficient than the existing code as it does not have arbitrary write clustering limits, and it only does one radix tree lookup per page instead of two. Hence the new code has less CPU overhead, builds larger IOs where appropriate and removes more code than it adds. The last patch of the series (patch 8) is not really a patch - I've included it as information/documentation for the next series of changes that will follow this series that begin one the path of removing bufferheads - mapping pages direct to bios and chaining bios to ioends rather than using bufferheads for this purpose. Once the writepage path is not dependent on bufferheads, we can move to working on the VFS read/write paths that use bufferheads. This will be based on the multipage-write pages that have been floating around for years to - again - map pages directly and operate on them according to the mapping state rather than bufferhead state. This needs to be done to make the COW operations for reflink sane, so that's what is driving this patchset even if it doesn't appear to be connected yet. Comments, flames, thoughts and testing appreciated! -Dave. From dave@fromorbit.com Tue Aug 11 17:49:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7E7737F50 for ; Tue, 11 Aug 2015 17:49:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 582828F8035 for ; Tue, 11 Aug 2015 15:49:59 -0700 (PDT) X-ASG-Debug-ID: 1439333392-04cbb0416d336400003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id CFqBSvZLYyHaH5mI for ; Tue, 11 Aug 2015 15:49:57 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CjCwC/espVPBkyLHldgxuBPYZSozgBAQEBAQEGmz2BSE0BAQEBAQEHAQEBAUABP4QkAQUnLzMIGDE5AwcUGR6ID89Xhh+KMCmEFQWHHI10m0OLMoFxAQuCOSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YG-0O for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMg-0004OZ-Vw for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:50 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/8] xfs: remove nonblocking mode from xfs_vm_writepage Date: Wed, 12 Aug 2015 08:49:43 +1000 X-ASG-Orig-Subj: [PATCH 3/8] xfs: remove nonblocking mode from xfs_vm_writepage Message-Id: <1439333388-16452-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333396 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Remove the nonblocking optimisation done for mapping lookups during writeback. It's not clear that leaving a hole in the writeback range just because we couldn't get a lock is really a win, as it makes us do another small random IO later on rather than a large sequential IO now. As this gets inteh way of sane error handling later on, just remove for the moment and we can re-introduce an equivalent optimisation in future if we see problems due to extent map lock contention. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 4d5479d..b718156 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -285,8 +285,7 @@ xfs_map_blocks( struct inode *inode, loff_t offset, struct xfs_bmbt_irec *imap, - int type, - int nonblocking) + int type) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; @@ -302,12 +301,7 @@ xfs_map_blocks( if (type == XFS_IO_UNWRITTEN) bmapi_flags |= XFS_BMAPI_IGSTATE; - if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) { - if (nonblocking) - return -EAGAIN; - xfs_ilock(ip, XFS_ILOCK_SHARED); - } - + xfs_ilock(ip, XFS_ILOCK_SHARED); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || (ip->i_df.if_flags & XFS_IFEXTENTS)); ASSERT(offset <= mp->m_super->s_maxbytes); @@ -958,7 +952,6 @@ xfs_do_writepage( ssize_t len; int err, uptodate = 1; int count = 0; - int nonblocking = 0; trace_xfs_writepage(inode, page, 0, 0); @@ -1057,9 +1050,6 @@ xfs_do_writepage( bh = head = page_buffers(page); offset = page_offset(page); - if (wbc->sync_mode == WB_SYNC_NONE) - nonblocking = 1; - do { int new_ioend = 0; @@ -1121,7 +1111,7 @@ xfs_do_writepage( */ new_ioend = 1; err = xfs_map_blocks(inode, offset, &wpc->imap, - wpc->io_type, nonblocking); + wpc->io_type); if (err) goto error; wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, @@ -1192,9 +1182,6 @@ error: if (iohead) xfs_cancel_ioend(iohead); - if (err == -EAGAIN) - goto redirty; - xfs_aops_discard_page(page); ClearPageUptodate(page); unlock_page(page); -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:49:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA9047F51 for ; Tue, 11 Aug 2015 17:49:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D2F2AC003 for ; Tue, 11 Aug 2015 15:49:56 -0700 (PDT) X-ASG-Debug-ID: 1439333392-04cbb0416d336400001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4j1BoJmKa0G7ZIbs for ; Tue, 11 Aug 2015 15:49:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ClCwC/espVPBkyLHldgxuBPYZSozgBAQEBAQEGnQVNAQEBAQEBBwEBAQFAAT+EJAEFJy8zCBgxOQMHFBmILc9Xhh+ObgWHHI10pnWBcQELOByBZSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YF-05 for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMg-0004OU-VM for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:50 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/8] xfs: io type needs to be part of the writepage context Date: Wed, 12 Aug 2015 08:49:42 +1000 X-ASG-Orig-Subj: [PATCH 2/8] xfs: io type needs to be part of the writepage context Message-Id: <1439333388-16452-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333392 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If we don't pass the IO type we are mapping with the writepage context, then the imap is recalculated on every delalloc page that is passed to xfs_do_writepage(). This defeats the purpose of having a cached imap between calls and increases the overhead of delalloc writeback significantly. Fix this by moving the io type into the writepage context structure so that it moves with the cached imap through the stack. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 6dc1154..4d5479d 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -42,6 +42,7 @@ struct xfs_writepage_ctx { struct xfs_bmbt_irec imap; bool imap_valid; + unsigned int io_type; }; void @@ -952,7 +953,6 @@ xfs_do_writepage( struct buffer_head *bh, *head; xfs_ioend_t *ioend = NULL, *iohead = NULL; loff_t offset; - unsigned int type; __uint64_t end_offset; pgoff_t end_index, last_index; ssize_t len; @@ -1056,7 +1056,6 @@ xfs_do_writepage( bh = head = page_buffers(page); offset = page_offset(page); - type = XFS_IO_OVERWRITE; if (wbc->sync_mode == WB_SYNC_NONE) nonblocking = 1; @@ -1081,18 +1080,18 @@ xfs_do_writepage( } if (buffer_unwritten(bh)) { - if (type != XFS_IO_UNWRITTEN) { - type = XFS_IO_UNWRITTEN; + if (wpc->io_type != XFS_IO_UNWRITTEN) { + wpc->io_type = XFS_IO_UNWRITTEN; wpc->imap_valid = false; } } else if (buffer_delay(bh)) { - if (type != XFS_IO_DELALLOC) { - type = XFS_IO_DELALLOC; + if (wpc->io_type != XFS_IO_DELALLOC) { + wpc->io_type = XFS_IO_DELALLOC; wpc->imap_valid = false; } } else if (buffer_uptodate(bh)) { - if (type != XFS_IO_OVERWRITE) { - type = XFS_IO_OVERWRITE; + if (wpc->io_type != XFS_IO_OVERWRITE) { + wpc->io_type = XFS_IO_OVERWRITE; wpc->imap_valid = false; } } else { @@ -1121,8 +1120,8 @@ xfs_do_writepage( * time. */ new_ioend = 1; - err = xfs_map_blocks(inode, offset, &wpc->imap, type, - nonblocking); + err = xfs_map_blocks(inode, offset, &wpc->imap, + wpc->io_type, nonblocking); if (err) goto error; wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, @@ -1130,10 +1129,10 @@ xfs_do_writepage( } if (wpc->imap_valid) { lock_buffer(bh); - if (type != XFS_IO_OVERWRITE) + if (wpc->io_type != XFS_IO_OVERWRITE) xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, type, &ioend, - new_ioend); + xfs_add_to_ioend(inode, bh, offset, wpc->io_type, + &ioend, new_ioend); count++; } @@ -1214,7 +1213,9 @@ xfs_vm_writepage( struct page *page, struct writeback_control *wbc) { - struct xfs_writepage_ctx wpc = {}; + struct xfs_writepage_ctx wpc = { + .io_type = XFS_IO_OVERWRITE, + }; return xfs_do_writepage(page, wbc, &wpc); } @@ -1224,7 +1225,9 @@ xfs_vm_writepages( struct address_space *mapping, struct writeback_control *wbc) { - struct xfs_writepage_ctx wpc = {}; + struct xfs_writepage_ctx wpc = { + .io_type = XFS_IO_OVERWRITE, + }; struct blk_plug plug; int ret; -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:50:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 79B757F59 for ; Tue, 11 Aug 2015 17:50:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43B168F8035 for ; Tue, 11 Aug 2015 15:50:00 -0700 (PDT) X-ASG-Debug-ID: 1439333397-04bdf06bcf2fa080001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BJmt7JcxzZuRUYQV for ; Tue, 11 Aug 2015 15:49:57 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CjCwC/espVPBkyLHldgxuBPYZSozgBAQEBAQEGmz2BSE0BAQEBAQEHAQEBAUABP4QkAQUnLzMIGDE5AwcUGYgtz1eGH4owhD4FhxyNdKZ1gXEBCzUDHIFlLDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMg-0005YE-Vi for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMg-0004OP-V2 for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:50 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/8] xfs: Introduce writeback context for writepages Date: Wed, 12 Aug 2015 08:49:41 +1000 X-ASG-Orig-Subj: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-Id: <1439333388-16452-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333397 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_vm_writepages() calls generic_writepages to writeback a range of a file, but then xfs_vm_writepage() clusters pages itself as it does not have any context it can pass between->writepage calls from __write_cache_pages(). Introduce a writeback context for xfs_vm_writepages() and call __write_cache_pages directly with our own writepage callback so that we can pass that context to each writepage invocation. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 73 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 3859f5e..6dc1154 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -36,6 +36,14 @@ #include #include +/* + * structure owned by writepages passed to individual writepage calls + */ +struct xfs_writepage_ctx { + struct xfs_bmbt_irec imap; + bool imap_valid; +}; + void xfs_count_page_state( struct page *page, @@ -334,7 +342,7 @@ xfs_map_blocks( return 0; } -STATIC int +STATIC bool xfs_imap_valid( struct inode *inode, struct xfs_bmbt_irec *imap, @@ -934,20 +942,21 @@ out_invalidate: * For any other dirty buffer heads on the page we should flush them. */ STATIC int -xfs_vm_writepage( +xfs_do_writepage( struct page *page, - struct writeback_control *wbc) + struct writeback_control *wbc, + void *data) { + struct xfs_writepage_ctx *wpc = data; struct inode *inode = page->mapping->host; struct buffer_head *bh, *head; - struct xfs_bmbt_irec imap; xfs_ioend_t *ioend = NULL, *iohead = NULL; loff_t offset; unsigned int type; __uint64_t end_offset; pgoff_t end_index, last_index; ssize_t len; - int err, imap_valid = 0, uptodate = 1; + int err, uptodate = 1; int count = 0; int nonblocking = 0; @@ -1067,24 +1076,24 @@ xfs_vm_writepage( * buffers covering holes here. */ if (!buffer_mapped(bh) && buffer_uptodate(bh)) { - imap_valid = 0; + wpc->imap_valid = false; continue; } if (buffer_unwritten(bh)) { if (type != XFS_IO_UNWRITTEN) { type = XFS_IO_UNWRITTEN; - imap_valid = 0; + wpc->imap_valid = false; } } else if (buffer_delay(bh)) { if (type != XFS_IO_DELALLOC) { type = XFS_IO_DELALLOC; - imap_valid = 0; + wpc->imap_valid = false; } } else if (buffer_uptodate(bh)) { if (type != XFS_IO_OVERWRITE) { type = XFS_IO_OVERWRITE; - imap_valid = 0; + wpc->imap_valid = false; } } else { if (PageUptodate(page)) @@ -1095,13 +1104,14 @@ xfs_vm_writepage( * subsequent writeable buffers into a new * ioend. */ - imap_valid = 0; + wpc->imap_valid = false; continue; } - if (imap_valid) - imap_valid = xfs_imap_valid(inode, &imap, offset); - if (!imap_valid) { + if (wpc->imap_valid) + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); + if (!wpc->imap_valid) { /* * If we didn't have a valid mapping then we need to * put the new mapping into a separate ioend structure. @@ -1111,16 +1121,17 @@ xfs_vm_writepage( * time. */ new_ioend = 1; - err = xfs_map_blocks(inode, offset, &imap, type, + err = xfs_map_blocks(inode, offset, &wpc->imap, type, nonblocking); if (err) goto error; - imap_valid = xfs_imap_valid(inode, &imap, offset); + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); } - if (imap_valid) { + if (wpc->imap_valid) { lock_buffer(bh); if (type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, &imap, offset); + xfs_map_at_offset(inode, bh, &wpc->imap, offset); xfs_add_to_ioend(inode, bh, offset, type, &ioend, new_ioend); count++; @@ -1147,10 +1158,10 @@ xfs_vm_writepage( * completion path as we have marked the initial page as under writeback * and unlocked it. */ - if (imap_valid) { + if (wpc->imap_valid) { xfs_off_t end_index; - end_index = imap.br_startoff + imap.br_blockcount; + end_index = wpc->imap.br_startoff + wpc->imap.br_blockcount; /* to bytes */ end_index <<= inode->i_blkbits; @@ -1162,7 +1173,7 @@ xfs_vm_writepage( if (end_index > last_index) end_index = last_index; - xfs_cluster_write(inode, page->index + 1, &imap, &ioend, + xfs_cluster_write(inode, page->index + 1, &wpc->imap, &ioend, wbc, end_index); } @@ -1188,6 +1199,8 @@ error: xfs_aops_discard_page(page); ClearPageUptodate(page); unlock_page(page); + mapping_set_error(page->mapping, err); + wpc->imap_valid = false; return err; redirty: @@ -1197,12 +1210,30 @@ redirty: } STATIC int +xfs_vm_writepage( + struct page *page, + struct writeback_control *wbc) +{ + struct xfs_writepage_ctx wpc = {}; + + return xfs_do_writepage(page, wbc, &wpc); +} + +STATIC int xfs_vm_writepages( struct address_space *mapping, struct writeback_control *wbc) { + struct xfs_writepage_ctx wpc = {}; + struct blk_plug plug; + int ret; + xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); - return generic_writepages(mapping, wbc); + blk_start_plug(&plug); + ret = write_cache_pages(mapping, wbc, xfs_do_writepage, &wpc); + blk_finish_plug(&plug); + + return ret; } /* -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:50:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A6327F61 for ; Tue, 11 Aug 2015 17:50:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 738E08F8039 for ; Tue, 11 Aug 2015 15:50:01 -0700 (PDT) X-ASG-Debug-ID: 1439333392-04cbb0416d336400004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id EaZIznipe6MEHH9r for ; Tue, 11 Aug 2015 15:49:59 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ClCwC/espVPBkyLHldgxuBPYZSozgBAQEBAQEGnQVNAQEBAQEBBwEBAQFAAT+EJAEFJy8zCBgxOQMHFBmILc9Xhh+ObgWRdYMbh3CGRIgxh2aIKoFxAQs4HIFlLDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YL-2g for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMh-0004Oy-1x for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 8/8] xfs: bufferheads are not needed in ->writepage Date: Wed, 12 Aug 2015 08:49:48 +1000 X-ASG-Orig-Subj: [PATCH 8/8] xfs: bufferheads are not needed in ->writepage Message-Id: <1439333388-16452-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333398 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner TO get rid of bufferheads from the writepage path, we have to get rid of the bufferhead chaining that is done in the ioends to keep track of the blocks under IO. We also mark the page clean indirectly through bufferhead IO completion callbacks. To move away from bufferheads, we need to track bios rather than bufferheads, and on ioend completion we need to mark pages clean directly. This makes it "interesting" for filesystems with sub-page block size, because the bufferheads are used to track sub-page dirty state. That is, only when all the bufferheads are clean is the page marked clean. For now, we will ignore the sub-page block size problem and address the block size = page size configuration first. Once the bio/page handling infrastructure is in place we can add support of sub-page block sizes. Right now an xfs_ioend tracks a sequential region via a bufferhead chain that is, at IO submission, converted to bios and then submitted. A single xfs_ioend may require multiple bios to be submitted, and so the ioend keeps a reference count of the number of bios it needs completions from before it can process the IO completion of the bufferhead chain across that region. As such, we have a dual layer IO submission/completion process. Assumming block size = page size, what we have is this: pages +-+-+-+-+-+-+-+-+-+ bufferhead +-+-+-+-+-+-+-+-+-+ xfs_ioend +eeeeeee+eeeeeeeee+ bios +bbb+bbb+bbbbbb+bb+ So IO submission looks like: - .writepage is given a page - XFS creates an ioend or pulls the existing one from the writepage context, - XFS walks the bufferheads on the page and adds the bufferheads to it. - XFS will chains ioends together when some kind of IO discontiguity occurs - When all the page walks are complete, XFS "submits" the ioend - XFS walks the bufferheads, marking them as under async writeback - XFS walks the bufferheads again, building bios from the pages backing the bufferheads. When bios are too large to have more pages added to them or there is a discontinuity in the IO mapping, the bio is submitted and anew one is started. On IO completion: - xfs grabs the ioend from the bio, drops the bio and decrements the reference count on the ioend. - ioend reference count goes to zero, runs endio callbacks (e.g. size update, unwritten extent conversion). - ioend is destroyed - destroy walks bufferhead chain on ioend, calling bufferhead IO completion - bufferhead IO completion calls page_end_writeback appropriately. IOWs, the xfs_ioend is really a mapping layer between bufferheads and bios, and the bufferheads kind of hide us from pages in the IO submission path. To get rid of bufferheads, we have to get rid of the dependency on bufferhead chaining for building bios and marking pages clean on IO completion. What we really want is this: pages +-+-+-+-+-+-+-+-+-+ xfs_ioend +eeeeeee+eeeeeeeee+ bios +bbb+bbb+bbbbbb+bb+ And for us to be able to hold on to the bios being completed until they are all done before we start ioend processing. It looks like we can use chaining via the bi_private field (i.e. a single linked list) to attach all the bios to the ioend prior to submission, we replace that with a reference count and apointer to the ioend during submission, and then rebuild the chain during IO completion. We then don't drop the bio references until we destroy the ioend, after we've walked all the pages held by the bios and ended writeback on them. This will also handle sub-page block sizes that may require multiple bios to clean a page as long as submission always creates page granularity ioends. Hence IO submission should look like: - .writepage is given a page - XFS creates an ioend or pulls the existing one from the writepage context - XFS grabs the iomap from from the wpc or gets a new one - XFS checks page is adjacent to previous. Yes, checks mapping is valid. No to either, grabs new iomap, create new bio, chain bio to ioend. Then add page to bio, mark page as under io. - When all the page walks are complete, XFS "submits" the ioend - XFS walks the bio chain, removing them, taking references to the ioend, bi_private = ioend, and then submitting i them in order. On IO completion: - xfs grabs the ioend for the bio, chains the bio back to the ioend. Stashes the error in the ioend. drops the refernce to the ioend. - ioend reference count goes to zero, runs endio callbacks (e.g. size update, unwritten extent conversion). - ioend is destroyed - destroy walks the bio chain, calling page_end_writeback() on the pages within, dropping bio references to free them. Simples, yes? In a few patches time, writepage will no longer have any bufferheads in it. However, until we get rid of bufferheads completely, we still need to make sure their state reflects the page state. Hence as a stop-gap measure, the ioend bio submission and destruction will need to walk the buffers on the pages and change their state appropriately. This will be a wart on the side that will get removed when bufferheads are removed from the other buffered IO paths in XFS. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 08a0205..e52eb0e 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -36,6 +36,7 @@ #include #include + /* * structure owned by writepages passed to individual writepage calls */ -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:50:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 073D77F61 for ; Tue, 11 Aug 2015 17:50:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DE0AAC004 for ; Tue, 11 Aug 2015 15:50:01 -0700 (PDT) X-ASG-Debug-ID: 1439333397-04bdf06bcf2fa080002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id VK3qoAA0jyPnTR6n for ; Tue, 11 Aug 2015 15:49:59 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ClCwC/espVPBkyLHldgxuBPYZSozgBAQEBAQEGnQVNAQEBAQEBBwEBAQFAAT+EJAEFJyAPMwgYGBk5AwcUGYgtvkGRFoYfikyEIgWHHI10pnWBcQELOByBZSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YI-1g for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMh-0004Oj-0V for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/8] xfs: writepage context needs to handle discontiguous page ranges Date: Wed, 12 Aug 2015 08:49:45 +1000 X-ASG-Orig-Subj: [PATCH 5/8] xfs: writepage context needs to handle discontiguous page ranges Message-Id: <1439333388-16452-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333399 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If the pages sent down by write_cache_pages to the writepage callback are discontiguous, we need to detect this and put each discontiguous page range into individual ioends. This is needed to ensure that the ioend accurately represents the range of the file that it covers so that file size updates during IO completion set the size correctly. Failure to take into account the discontiguous ranges results in files being too small when writeback patterns are non-sequential. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 82 ++++++++++++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e4184f5..93bf13c 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -45,6 +45,7 @@ struct xfs_writepage_ctx { unsigned int io_type; struct xfs_ioend *iohead; struct xfs_ioend *ioend; + sector_t last_block; }; void @@ -537,29 +538,27 @@ xfs_add_to_ioend( struct inode *inode, struct buffer_head *bh, xfs_off_t offset, - unsigned int type, - xfs_ioend_t **result, - int need_ioend) + struct xfs_writepage_ctx *wpc) { - xfs_ioend_t *ioend = *result; - - if (!ioend || need_ioend || type != ioend->io_type) { - xfs_ioend_t *previous = *result; - - ioend = xfs_alloc_ioend(inode, type); - ioend->io_offset = offset; - ioend->io_buffer_head = bh; - ioend->io_buffer_tail = bh; - if (previous) - previous->io_list = ioend; - *result = ioend; + if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || + bh->b_blocknr != wpc->last_block + 1) { + struct xfs_ioend *new; + + new = xfs_alloc_ioend(inode, wpc->io_type); + new->io_offset = offset; + new->io_buffer_head = bh; + new->io_buffer_tail = bh; + if (wpc->ioend) + wpc->ioend->io_list = new; + wpc->ioend = new; } else { - ioend->io_buffer_tail->b_private = bh; - ioend->io_buffer_tail = bh; + wpc->ioend->io_buffer_tail->b_private = bh; + wpc->ioend->io_buffer_tail = bh; } bh->b_private = NULL; - ioend->io_size += bh->b_size; + wpc->ioend->io_size += bh->b_size; + wpc->last_block = bh->b_blocknr; } STATIC void @@ -656,17 +655,15 @@ xfs_convert_page( struct inode *inode, struct page *page, loff_t tindex, - struct xfs_bmbt_irec *imap, - xfs_ioend_t **ioendp, + struct xfs_writepage_ctx *wpc, struct writeback_control *wbc) { struct buffer_head *bh, *head; xfs_off_t end_offset; unsigned long p_offset; - unsigned int type; int len, page_dirty; int count = 0, done = 0, uptodate = 1; - xfs_off_t offset = page_offset(page); + xfs_off_t offset = page_offset(page); if (page->index != tindex) goto fail; @@ -676,7 +673,7 @@ xfs_convert_page( goto fail_unlock_page; if (page->mapping != inode->i_mapping) goto fail_unlock_page; - if (!xfs_check_page_type(page, (*ioendp)->io_type, false)) + if (!xfs_check_page_type(page, wpc->ioend->io_type, false)) goto fail_unlock_page; /* @@ -712,7 +709,7 @@ xfs_convert_page( * writeback. Hence for more optimal IO patterns, we should always * avoid partial page writeback due to multiple mappings on a page here. */ - if (!xfs_imap_valid(inode, imap, end_offset)) + if (!xfs_imap_valid(inode, &wpc->imap, end_offset)) goto fail_unlock_page; len = 1 << inode->i_blkbits; @@ -744,23 +741,22 @@ xfs_convert_page( if (buffer_unwritten(bh) || buffer_delay(bh) || buffer_mapped(bh)) { if (buffer_unwritten(bh)) - type = XFS_IO_UNWRITTEN; + wpc->io_type = XFS_IO_UNWRITTEN; else if (buffer_delay(bh)) - type = XFS_IO_DELALLOC; + wpc->io_type = XFS_IO_DELALLOC; else - type = XFS_IO_OVERWRITE; + wpc->io_type = XFS_IO_OVERWRITE; /* * imap should always be valid because of the above * partial page end_offset check on the imap. */ - ASSERT(xfs_imap_valid(inode, imap, offset)); + ASSERT(xfs_imap_valid(inode, &wpc->imap, offset)); lock_buffer(bh); - if (type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, imap, offset); - xfs_add_to_ioend(inode, bh, offset, type, - ioendp, done); + if (wpc->io_type != XFS_IO_OVERWRITE) + xfs_map_at_offset(inode, bh, &wpc->imap, offset); + xfs_add_to_ioend(inode, bh, offset, wpc); page_dirty--; count++; @@ -795,8 +791,7 @@ STATIC void xfs_cluster_write( struct inode *inode, pgoff_t tindex, - struct xfs_bmbt_irec *imap, - xfs_ioend_t **ioendp, + struct xfs_writepage_ctx *wpc, struct writeback_control *wbc, pgoff_t tlast) { @@ -812,7 +807,7 @@ xfs_cluster_write( for (i = 0; i < pagevec_count(&pvec); i++) { done = xfs_convert_page(inode, pvec.pages[i], tindex++, - imap, ioendp, wbc); + wpc, wbc); if (done) break; } @@ -1041,8 +1036,6 @@ xfs_do_writepage( offset = page_offset(page); do { - int new_ioend = 0; - if (offset >= end_offset) break; if (!buffer_uptodate(bh)) @@ -1091,15 +1084,6 @@ xfs_do_writepage( wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, offset); if (!wpc->imap_valid) { - /* - * If we didn't have a valid mapping then we need to - * put the new mapping into a separate ioend structure. - * This ensures non-contiguous extents always have - * separate ioends, which is particularly important - * for unwritten extent conversion at I/O completion - * time. - */ - new_ioend = 1; err = xfs_map_blocks(inode, offset, &wpc->imap, wpc->io_type); if (err) @@ -1111,8 +1095,7 @@ xfs_do_writepage( lock_buffer(bh); if (wpc->io_type != XFS_IO_OVERWRITE) xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, wpc->io_type, - &wpc->ioend, new_ioend); + xfs_add_to_ioend(inode, bh, offset, wpc); count++; } @@ -1152,8 +1135,7 @@ xfs_do_writepage( if (end_index > last_index) end_index = last_index; - xfs_cluster_write(inode, page->index + 1, &wpc->imap, - &wpc->ioend, wbc, end_index); + xfs_cluster_write(inode, page->index + 1, wpc, wbc, end_index); } return 0; -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:50:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 317987F6D for ; Tue, 11 Aug 2015 17:50:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3CE6AC003 for ; Tue, 11 Aug 2015 15:50:02 -0700 (PDT) X-ASG-Debug-ID: 1439333395-04cb6c673e3bd760001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id oVMc96udtcVUnq6E for ; Tue, 11 Aug 2015 15:49:56 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CjCwC/espVPBkyLHlVCIMbgT2GUqM4AQEBAQEBBps9gUhNAQEBAQEBBwEBAQFAAT+EJAEFJy8zCBgxOQMHFBmILc9Xhh+JZEyEPgWHHI10m0OLMoFxAQs4HIFlLDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YH-0n for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMh-0004Oe-06 for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:50 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/8] xfs: add ioend and iohead to xfs_writepage_ctx Date: Wed, 12 Aug 2015 08:49:44 +1000 X-ASG-Orig-Subj: [PATCH 4/8] xfs: add ioend and iohead to xfs_writepage_ctx Message-Id: <1439333388-16452-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333395 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we have a cross-writepage context, we don't need to submit IO at the end of the writepage call - we can continue to aggregate ioends across the entire writepages call if the iohead and ioend are held in the writepage context. This requires us to move the ioend submission up to the level where the writepage context is declared. This does mean we do not submit IO until we packaged the entire writeback range, but with the block plugging in the writepages call this is the way IO is submitted, anyway. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 122 +++++++++++++++++++++++++++--------------------------- 1 file changed, 60 insertions(+), 62 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index b718156..e4184f5 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -43,6 +43,8 @@ struct xfs_writepage_ctx { struct xfs_bmbt_irec imap; bool imap_valid; unsigned int io_type; + struct xfs_ioend *iohead; + struct xfs_ioend *ioend; }; void @@ -525,38 +527,6 @@ xfs_submit_ioend( } /* - * Cancel submission of all buffer_heads so far in this endio. - * Toss the endio too. Only ever called for the initial page - * in a writepage request, so only ever one page. - */ -STATIC void -xfs_cancel_ioend( - xfs_ioend_t *ioend) -{ - xfs_ioend_t *next; - struct buffer_head *bh, *next_bh; - - do { - next = ioend->io_list; - bh = ioend->io_buffer_head; - do { - next_bh = bh->b_private; - clear_buffer_async_write(bh); - /* - * The unwritten flag is cleared when added to the - * ioend. We're not submitting for I/O so mark the - * buffer unwritten again for next time around. - */ - if (ioend->io_type == XFS_IO_UNWRITTEN) - set_buffer_unwritten(bh); - unlock_buffer(bh); - } while ((bh = next_bh) != NULL); - - mempool_free(ioend, xfs_ioend_pool); - } while ((ioend = next) != NULL); -} - -/* * Test to see if we've been building up a completion structure for * earlier buffers -- if so, we try to append to this ioend if we * can, otherwise we finish off any current ioend and start another. @@ -928,6 +898,27 @@ out_invalidate: return; } +static int +xfs_writepage_submit( + struct xfs_writepage_ctx *wpc, + struct writeback_control *wbc, + int status) +{ + struct blk_plug plug; + + /* Reserve log space if we might write beyond the on-disk inode size. */ + if (!status && wpc->ioend && wpc->ioend->io_type != XFS_IO_UNWRITTEN && + xfs_ioend_is_append(wpc->ioend)) + status = xfs_setfilesize_trans_alloc(wpc->ioend); + + if (wpc->iohead) { + blk_start_plug(&plug); + xfs_submit_ioend(wbc, wpc->iohead, status); + blk_finish_plug(&plug); + } + return status; +} + /* * Write out a dirty page. * @@ -945,7 +936,6 @@ xfs_do_writepage( struct xfs_writepage_ctx *wpc = data; struct inode *inode = page->mapping->host; struct buffer_head *bh, *head; - xfs_ioend_t *ioend = NULL, *iohead = NULL; loff_t offset; __uint64_t end_offset; pgoff_t end_index, last_index; @@ -1122,12 +1112,12 @@ xfs_do_writepage( if (wpc->io_type != XFS_IO_OVERWRITE) xfs_map_at_offset(inode, bh, &wpc->imap, offset); xfs_add_to_ioend(inode, bh, offset, wpc->io_type, - &ioend, new_ioend); + &wpc->ioend, new_ioend); count++; } - if (!iohead) - iohead = ioend; + if (!wpc->iohead) + wpc->iohead = wpc->ioend; } while (offset += len, ((bh = bh->b_this_page) != head)); @@ -1137,10 +1127,10 @@ xfs_do_writepage( xfs_start_page_writeback(page, 1, count); /* if there is no IO to be submitted for this page, we are done */ - if (!ioend) + if (!count) return 0; - ASSERT(iohead); + ASSERT(wpc->iohead); /* * Any errors from this point onwards need tobe reported through the IO @@ -1162,31 +1152,37 @@ xfs_do_writepage( if (end_index > last_index) end_index = last_index; - xfs_cluster_write(inode, page->index + 1, &wpc->imap, &ioend, - wbc, end_index); + xfs_cluster_write(inode, page->index + 1, &wpc->imap, + &wpc->ioend, wbc, end_index); } - - /* - * Reserve log space if we might write beyond the on-disk inode size. - */ - err = 0; - if (ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) - err = xfs_setfilesize_trans_alloc(ioend); - - xfs_submit_ioend(wbc, iohead, err); - return 0; error: - if (iohead) - xfs_cancel_ioend(iohead); + /* + * We have to fail the iohead here because we buffers locked in the + * ioend chain. If we don't do this, we'll deadlock invalidating the + * page as that tries to lock the buffers on the page. Also, because we + * have set pages under writeback, we have to run IO completion to mark + * the error state of the IO appropriately, so we can't cancel the ioend + * directly here. That means we have to mark this page as under + * writeback if we included any buffers from it in the ioend chain. + */ + if (count) + xfs_start_page_writeback(page, 0, count); + xfs_writepage_submit(wpc, wbc, err); - xfs_aops_discard_page(page); - ClearPageUptodate(page); - unlock_page(page); + /* + * We can only discard the page we had the IO error on if we haven't + * included it in the ioend above. If it has already been errored out, + * the it is unlocked and we can't touch it here. + */ + if (!count) { + xfs_aops_discard_page(page); + ClearPageUptodate(page); + unlock_page(page); + } mapping_set_error(page->mapping, err); - wpc->imap_valid = false; return err; redirty: @@ -1203,8 +1199,12 @@ xfs_vm_writepage( struct xfs_writepage_ctx wpc = { .io_type = XFS_IO_OVERWRITE, }; + int ret; - return xfs_do_writepage(page, wbc, &wpc); + ret = xfs_do_writepage(page, wbc, &wpc); + if (ret) + return ret; + return xfs_writepage_submit(&wpc, wbc, ret); } STATIC int @@ -1215,15 +1215,13 @@ xfs_vm_writepages( struct xfs_writepage_ctx wpc = { .io_type = XFS_IO_OVERWRITE, }; - struct blk_plug plug; int ret; xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); - blk_start_plug(&plug); ret = write_cache_pages(mapping, wbc, xfs_do_writepage, &wpc); - blk_finish_plug(&plug); - - return ret; + if (ret) + return ret; + return xfs_writepage_submit(&wpc, wbc, ret); } /* -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:50:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A77157F6F for ; Tue, 11 Aug 2015 17:50:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FE3B304043 for ; Tue, 11 Aug 2015 15:50:03 -0700 (PDT) X-ASG-Debug-ID: 1439333397-04bdf06bcf2fa080003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id MiRFHBhfktWf9D7M for ; Tue, 11 Aug 2015 15:50:01 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ClCwC/espVPBkyLHlVCIMbgT2GUqM4AQEBAQEBBp0FTQEBAQEBAQcBAQEBQAE/hCQBBScvMwgYMTkDBxQZiC3PV4YfiWSFCgWHHI10m0OLMoFxAQuCOSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:53 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YK-2L for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMh-0004Ot-1Y for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/8] xfs: factor mapping out of xfs_do_writepage Date: Wed, 12 Aug 2015 08:49:47 +1000 X-ASG-Orig-Subj: [PATCH 7/8] xfs: factor mapping out of xfs_do_writepage Message-Id: <1439333388-16452-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333400 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Separate out the bufferhead based mapping from the writepage code so that we have a clear separation of the page operations and the bufferhead state. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 221 +++++++++++++++++++++++++++++------------------------- 1 file changed, 119 insertions(+), 102 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 1fb1ec9..08a0205 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -741,6 +741,116 @@ xfs_writepage_submit( return status; } +static int +xfs_writepage_map( + struct xfs_writepage_ctx *wpc, + struct inode *inode, + struct page *page, + loff_t offset, + __uint64_t end_offset) +{ + struct buffer_head *bh, *head; + ssize_t len = 1 << inode->i_blkbits; + int error = 0; + int uptodate = 1; + int count = 0; + + bh = head = page_buffers(page); + offset = page_offset(page); + + do { + if (offset >= end_offset) + break; + if (!buffer_uptodate(bh)) + uptodate = 0; + + /* + * set_page_dirty dirties all buffers in a page, independent + * of their state. The dirty state however is entirely + * meaningless for holes (!mapped && uptodate), so skip + * buffers covering holes here. + */ + if (!buffer_mapped(bh) && buffer_uptodate(bh)) { + wpc->imap_valid = false; + continue; + } + + if (buffer_unwritten(bh)) { + if (wpc->io_type != XFS_IO_UNWRITTEN) { + wpc->io_type = XFS_IO_UNWRITTEN; + wpc->imap_valid = false; + } + } else if (buffer_delay(bh)) { + if (wpc->io_type != XFS_IO_DELALLOC) { + wpc->io_type = XFS_IO_DELALLOC; + wpc->imap_valid = false; + } + } else if (buffer_uptodate(bh)) { + if (wpc->io_type != XFS_IO_OVERWRITE) { + wpc->io_type = XFS_IO_OVERWRITE; + wpc->imap_valid = false; + } + } else { + if (PageUptodate(page)) + ASSERT(buffer_mapped(bh)); + /* + * This buffer is not uptodate and will not be + * written to disk. Ensure that we will put any + * subsequent writeable buffers into a new + * ioend. + */ + wpc->imap_valid = false; + continue; + } + + if (wpc->imap_valid) + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); + if (!wpc->imap_valid) { + error = xfs_map_blocks(inode, offset, &wpc->imap, + wpc->io_type); + if (error) + goto out_error; + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); + } + if (wpc->imap_valid) { + lock_buffer(bh); + if (wpc->io_type != XFS_IO_OVERWRITE) + xfs_map_at_offset(inode, bh, &wpc->imap, offset); + xfs_add_to_ioend(inode, bh, offset, wpc); + count++; + } + + if (!wpc->iohead) + wpc->iohead = wpc->ioend; + + } while (offset += len, ((bh = bh->b_this_page) != head)); + + if (uptodate && bh == head) + SetPageUptodate(page); + + xfs_start_page_writeback(page, 1, count); + ASSERT(wpc->iohead || !count); + return 0; + +out_error: + /* + * We can only discard the page we had the IO error on if we haven't + * included it in the ioend above. If it has already been added to the + * ioend, then we can't touch it here and need to rely on IO submission + * to unlock it. + */ + if (count) + xfs_start_page_writeback(page, 0, count); + else { + xfs_aops_discard_page(page); + ClearPageUptodate(page); + unlock_page(page); + } + return error; +} + /* * Write out a dirty page. * @@ -757,13 +867,10 @@ xfs_do_writepage( { struct xfs_writepage_ctx *wpc = data; struct inode *inode = page->mapping->host; - struct buffer_head *bh, *head; loff_t offset; __uint64_t end_offset; pgoff_t end_index; - ssize_t len; - int err, uptodate = 1; - int count = 0; + int error = 0; trace_xfs_writepage(inode, page, 0, 0); @@ -856,113 +963,23 @@ xfs_do_writepage( end_offset = offset; } - len = 1 << inode->i_blkbits; - - bh = head = page_buffers(page); - offset = page_offset(page); - - do { - if (offset >= end_offset) - break; - if (!buffer_uptodate(bh)) - uptodate = 0; - - /* - * set_page_dirty dirties all buffers in a page, independent - * of their state. The dirty state however is entirely - * meaningless for holes (!mapped && uptodate), so skip - * buffers covering holes here. - */ - if (!buffer_mapped(bh) && buffer_uptodate(bh)) { - wpc->imap_valid = false; - continue; - } - - if (buffer_unwritten(bh)) { - if (wpc->io_type != XFS_IO_UNWRITTEN) { - wpc->io_type = XFS_IO_UNWRITTEN; - wpc->imap_valid = false; - } - } else if (buffer_delay(bh)) { - if (wpc->io_type != XFS_IO_DELALLOC) { - wpc->io_type = XFS_IO_DELALLOC; - wpc->imap_valid = false; - } - } else if (buffer_uptodate(bh)) { - if (wpc->io_type != XFS_IO_OVERWRITE) { - wpc->io_type = XFS_IO_OVERWRITE; - wpc->imap_valid = false; - } - } else { - if (PageUptodate(page)) - ASSERT(buffer_mapped(bh)); - /* - * This buffer is not uptodate and will not be - * written to disk. Ensure that we will put any - * subsequent writeable buffers into a new - * ioend. - */ - wpc->imap_valid = false; - continue; - } - - if (wpc->imap_valid) - wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, - offset); - if (!wpc->imap_valid) { - err = xfs_map_blocks(inode, offset, &wpc->imap, - wpc->io_type); - if (err) - goto error; - wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, - offset); - } - if (wpc->imap_valid) { - lock_buffer(bh); - if (wpc->io_type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, wpc); - count++; - } - - if (!wpc->iohead) - wpc->iohead = wpc->ioend; - - } while (offset += len, ((bh = bh->b_this_page) != head)); - - if (uptodate && bh == head) - SetPageUptodate(page); - - xfs_start_page_writeback(page, 1, count); - ASSERT(wpc->iohead || !count); + error = xfs_writepage_map(wpc, inode, page, offset, end_offset); + if (error) + goto out_error; return 0; -error: +out_error: /* * We have to fail the iohead here because we buffers locked in the * ioend chain. If we don't do this, we'll deadlock invalidating the * page as that tries to lock the buffers on the page. Also, because we * have set pages under writeback, we have to run IO completion to mark * the error state of the IO appropriately, so we can't cancel the ioend - * directly here. That means we have to mark this page as under - * writeback if we included any buffers from it in the ioend chain. + * directly here. */ - if (count) - xfs_start_page_writeback(page, 0, count); - xfs_writepage_submit(wpc, wbc, err); - - /* - * We can only discard the page we had the IO error on if we haven't - * included it in the ioend above. If it has already been errored out, - * the it is unlocked and we can't touch it here. - */ - if (!count) { - xfs_aops_discard_page(page); - ClearPageUptodate(page); - unlock_page(page); - } - mapping_set_error(page->mapping, err); - return err; + xfs_writepage_submit(wpc, wbc, error); + mapping_set_error(page->mapping, error); + return error; redirty: redirty_page_for_writepage(wbc, page); -- 2.5.0 From dave@fromorbit.com Tue Aug 11 17:50:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95F897F7B for ; Tue, 11 Aug 2015 17:50:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02A4AAC003 for ; Tue, 11 Aug 2015 15:50:03 -0700 (PDT) X-ASG-Debug-ID: 1439333392-04cbb0416d336400005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id nrFNfe3DJ2XvGx6B for ; Tue, 11 Aug 2015 15:50:01 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ClCwC/espVPBkyLHldgxuBPYZSozgBAQEBAQEGnQVNAQEBAQEBBwEBAQFAAT+EJAEFJy8zCBgxOQMHFBmILc9Xhh+JYoUMBYccjXSbQ4sygXEBCzUDHIFlLDOBBYFHAQEB Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 08:19:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZPIMh-0005YJ-1t for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZPIMh-0004Oo-1D for xfs@oss.sgi.com; Wed, 12 Aug 2015 08:49:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/8] xfs: xfs_cluster_write is redundant Date: Wed, 12 Aug 2015 08:49:46 +1000 X-ASG-Orig-Subj: [PATCH 6/8] xfs: xfs_cluster_write is redundant Message-Id: <1439333388-16452-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1439333388-16452-1-git-send-email-david@fromorbit.com> References: <1439333388-16452-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439333400 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_cluster_write() is not necessary now that xfs_vm_writepages() aggregates writepage calls across a single mapping. This means we no longer need to do page lookups in xfs_cluster_write, so writeback only needs to look up th epage cache once per page being written. This also removes a large amount of mostly duplicate code between xfs_do_writepage() and xfs_convert_page(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 215 ++---------------------------------------------------- 1 file changed, 6 insertions(+), 209 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 93bf13c..1fb1ec9 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -644,179 +644,6 @@ xfs_check_page_type( return false; } -/* - * Allocate & map buffers for page given the extent map. Write it out. - * except for the original page of a writepage, this is called on - * delalloc/unwritten pages only, for the original page it is possible - * that the page has no mapping at all. - */ -STATIC int -xfs_convert_page( - struct inode *inode, - struct page *page, - loff_t tindex, - struct xfs_writepage_ctx *wpc, - struct writeback_control *wbc) -{ - struct buffer_head *bh, *head; - xfs_off_t end_offset; - unsigned long p_offset; - int len, page_dirty; - int count = 0, done = 0, uptodate = 1; - xfs_off_t offset = page_offset(page); - - if (page->index != tindex) - goto fail; - if (!trylock_page(page)) - goto fail; - if (PageWriteback(page)) - goto fail_unlock_page; - if (page->mapping != inode->i_mapping) - goto fail_unlock_page; - if (!xfs_check_page_type(page, wpc->ioend->io_type, false)) - goto fail_unlock_page; - - /* - * page_dirty is initially a count of buffers on the page before - * EOF and is decremented as we move each into a cleanable state. - * - * Derivation: - * - * End offset is the highest offset that this page should represent. - * If we are on the last page, (end_offset & (PAGE_CACHE_SIZE - 1)) - * will evaluate non-zero and be less than PAGE_CACHE_SIZE and - * hence give us the correct page_dirty count. On any other page, - * it will be zero and in that case we need page_dirty to be the - * count of buffers on the page. - */ - end_offset = min_t(unsigned long long, - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, - i_size_read(inode)); - - /* - * If the current map does not span the entire page we are about to try - * to write, then give up. The only way we can write a page that spans - * multiple mappings in a single writeback iteration is via the - * xfs_vm_writepage() function. Data integrity writeback requires the - * entire page to be written in a single attempt, otherwise the part of - * the page we don't write here doesn't get written as part of the data - * integrity sync. - * - * For normal writeback, we also don't attempt to write partial pages - * here as it simply means that write_cache_pages() will see it under - * writeback and ignore the page until some point in the future, at - * which time this will be the only page in the file that needs - * writeback. Hence for more optimal IO patterns, we should always - * avoid partial page writeback due to multiple mappings on a page here. - */ - if (!xfs_imap_valid(inode, &wpc->imap, end_offset)) - goto fail_unlock_page; - - len = 1 << inode->i_blkbits; - p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), - PAGE_CACHE_SIZE); - p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; - page_dirty = p_offset / len; - - /* - * The moment we find a buffer that doesn't match our current type - * specification or can't be written, abort the loop and start - * writeback. As per the above xfs_imap_valid() check, only - * xfs_vm_writepage() can handle partial page writeback fully - we are - * limited here to the buffers that are contiguous with the current - * ioend, and hence a buffer we can't write breaks that contiguity and - * we have to defer the rest of the IO to xfs_vm_writepage(). - */ - bh = head = page_buffers(page); - do { - if (offset >= end_offset) - break; - if (!buffer_uptodate(bh)) - uptodate = 0; - if (!(PageUptodate(page) || buffer_uptodate(bh))) { - done = 1; - break; - } - - if (buffer_unwritten(bh) || buffer_delay(bh) || - buffer_mapped(bh)) { - if (buffer_unwritten(bh)) - wpc->io_type = XFS_IO_UNWRITTEN; - else if (buffer_delay(bh)) - wpc->io_type = XFS_IO_DELALLOC; - else - wpc->io_type = XFS_IO_OVERWRITE; - - /* - * imap should always be valid because of the above - * partial page end_offset check on the imap. - */ - ASSERT(xfs_imap_valid(inode, &wpc->imap, offset)); - - lock_buffer(bh); - if (wpc->io_type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, wpc); - - page_dirty--; - count++; - } else { - done = 1; - break; - } - } while (offset += len, (bh = bh->b_this_page) != head); - - if (uptodate && bh == head) - SetPageUptodate(page); - - if (count) { - if (--wbc->nr_to_write <= 0 && - wbc->sync_mode == WB_SYNC_NONE) - done = 1; - } - xfs_start_page_writeback(page, !page_dirty, count); - - return done; - fail_unlock_page: - unlock_page(page); - fail: - return 1; -} - -/* - * Convert & write out a cluster of pages in the same extent as defined - * by mp and following the start page. - */ -STATIC void -xfs_cluster_write( - struct inode *inode, - pgoff_t tindex, - struct xfs_writepage_ctx *wpc, - struct writeback_control *wbc, - pgoff_t tlast) -{ - struct pagevec pvec; - int done = 0, i; - - pagevec_init(&pvec, 0); - while (!done && tindex <= tlast) { - unsigned len = min_t(pgoff_t, PAGEVEC_SIZE, tlast - tindex + 1); - - if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) - break; - - for (i = 0; i < pagevec_count(&pvec); i++) { - done = xfs_convert_page(inode, pvec.pages[i], tindex++, - wpc, wbc); - if (done) - break; - } - - pagevec_release(&pvec); - cond_resched(); - } -} - STATIC void xfs_vm_invalidatepage( struct page *page, @@ -933,7 +760,7 @@ xfs_do_writepage( struct buffer_head *bh, *head; loff_t offset; __uint64_t end_offset; - pgoff_t end_index, last_index; + pgoff_t end_index; ssize_t len; int err, uptodate = 1; int count = 0; @@ -963,12 +790,9 @@ xfs_do_writepage( if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) goto redirty; - /* Is this page beyond the end of the file? */ - offset = i_size_read(inode); - end_index = offset >> PAGE_CACHE_SHIFT; - last_index = (offset - 1) >> PAGE_CACHE_SHIFT; - /* + * Is this page beyond the end of the file? + * * The page index is less than the end_index, adjust the end_offset * to the highest offset that this page should represent. * ----------------------------------------------------- @@ -979,6 +803,8 @@ xfs_do_writepage( * | desired writeback range | see else | * ---------------------------------^------------------| */ + offset = i_size_read(inode); + end_index = offset >> PAGE_CACHE_SHIFT; if (page->index < end_index) end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; else { @@ -1108,36 +934,7 @@ xfs_do_writepage( SetPageUptodate(page); xfs_start_page_writeback(page, 1, count); - - /* if there is no IO to be submitted for this page, we are done */ - if (!count) - return 0; - - ASSERT(wpc->iohead); - - /* - * Any errors from this point onwards need tobe reported through the IO - * completion path as we have marked the initial page as under writeback - * and unlocked it. - */ - if (wpc->imap_valid) { - xfs_off_t end_index; - - end_index = wpc->imap.br_startoff + wpc->imap.br_blockcount; - - /* to bytes */ - end_index <<= inode->i_blkbits; - - /* to pages */ - end_index = (end_index - 1) >> PAGE_CACHE_SHIFT; - - /* check against file size */ - if (end_index > last_index) - end_index = last_index; - - xfs_cluster_write(inode, page->index + 1, wpc, wbc, end_index); - } - + ASSERT(wpc->iohead || !count); return 0; error: -- 2.5.0 From darrick.wong@oracle.com Tue Aug 11 18:50:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3CD4D7F50 for ; Tue, 11 Aug 2015 18:50:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 296118F8035 for ; Tue, 11 Aug 2015 16:50:43 -0700 (PDT) X-ASG-Debug-ID: 1439337041-04cb6c673f3be830001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KZ2wOngBFJNEPAFz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 16:50:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7BNodgJ012333 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 11 Aug 2015 23:50:40 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7BNodpv026938 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 11 Aug 2015 23:50:39 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7BNodld022602; Tue, 11 Aug 2015 23:50:39 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 11 Aug 2015 16:50:39 -0700 Date: Tue, 11 Aug 2015 16:50:38 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: [PATCH] libxfs: readahead of dir3 data blocks should use the read verifier Message-ID: <20150811235038.GL10043@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] libxfs: readahead of dir3 data blocks should use the read verifier MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439337041 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21517 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines In the dir3 data block readahead function, use the regular read verifier to check the block's CRC and spot-check the block contents instead of directly calling only the spot-checking routine. This prevents corrupted directory data blocks from being read into the kernel, which can lead to garbage ls output and directory loops (if say one of the entries contains slashes and other junk). Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_dir2_data.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index de1ea16..534bbf2 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c @@ -252,7 +252,8 @@ xfs_dir3_data_reada_verify( return; case cpu_to_be32(XFS_DIR2_DATA_MAGIC): case cpu_to_be32(XFS_DIR3_DATA_MAGIC): - xfs_dir3_data_verify(bp); + bp->b_ops = &xfs_dir3_data_buf_ops; + bp->b_ops->verify_read(bp); return; default: xfs_buf_ioerror(bp, -EFSCORRUPTED); From katsuki.uwatoko@toshiba.co.jp Tue Aug 11 19:57:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 70EE47F50 for ; Tue, 11 Aug 2015 19:57:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E08FFAC007 for ; Tue, 11 Aug 2015 17:57:28 -0700 (PDT) X-ASG-Debug-ID: 1439341043-04cbb0416d3383e0001-NocioJ Received: from imx2.toshiba.co.jp (imx2.toshiba.co.jp [106.186.93.51]) by cuda.sgi.com with ESMTP id 0j9Lvn5ctUFBUSDD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 17:57:24 -0700 (PDT) X-Barracuda-Envelope-From: katsuki.uwatoko@toshiba.co.jp X-ASG-Whitelist: Sender X-Barracuda-Apparent-Source-IP: 106.186.93.51 Received: from tsbmgw-mgw02.tsbmgw-mgw02.toshiba.co.jp ([133.199.200.50]) by imx2.toshiba.co.jp with ESMTP id t7C0uQsc021553 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Aug 2015 09:56:26 +0900 (JST) Received: from tsbmgw-mgw02 (localhost [127.0.0.1]) by tsbmgw-mgw02.tsbmgw-mgw02.toshiba.co.jp (8.13.8/8.14.5) with ESMTP id t7C0uQsI007919; Wed, 12 Aug 2015 09:56:26 +0900 Received: from localhost ([127.0.0.1]) by tsbmgw-mgw02 (JAMES SMTP Server 2.3.1) with SMTP ID 104; Wed, 12 Aug 2015 09:56:26 +0900 (JST) Received: from arc1.toshiba.co.jp ([133.199.194.235]) by tsbmgw-mgw02.tsbmgw-mgw02.toshiba.co.jp (8.13.8/8.14.5) with ESMTP id t7C0uQxw007913; Wed, 12 Aug 2015 09:56:26 +0900 Received: (from root@localhost) by arc1.toshiba.co.jp id t7C0uQnx012234; Wed, 12 Aug 2015 09:56:26 +0900 (JST) Received: from unknown [133.199.192.144] by arc1.toshiba.co.jp with ESMTP id KAA12231; Wed, 12 Aug 2015 09:56:26 +0900 Received: from mx.toshiba.co.jp (localhost [127.0.0.1]) by ovp2.toshiba.co.jp with ESMTP id t7C0uPVS027244; Wed, 12 Aug 2015 09:56:25 +0900 (JST) Received: from TGXML330.toshiba.local by toshiba.co.jp id t7C0uPwb000919; Wed, 12 Aug 2015 09:56:25 +0900 (JST) Received: from TGXML337.toshiba.local ([169.254.3.227]) by TGXML330.toshiba.local ([133.199.60.17]) with mapi id 14.03.0235.001; Wed, 12 Aug 2015 09:56:25 +0900 From: To: , , CC: , , , , , , , , Subject: Re: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' Thread-Topic: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' X-ASG-Orig-Subj: Re: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' Thread-Index: AQHQ1Jm2b+YMYk5vfESvcZQbbdkFYw== Date: Wed, 12 Aug 2015 00:56:25 +0000 Message-ID: References: <5579B804.9050707@skylable.com> <20150612122108.GB60661@bfoster.bfoster> <557AD4D4.3010901@skylable.com> <20150612225209.GA20262@dastard> In-Reply-To: <20150612225209.GA20262@dastard> Accept-Language: ja-JP, en-US Content-Language: en-US x-originating-ip: [133.199.67.13] msscp.transfermailtomossagent: 103 Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-Barracuda-Connect: imx2.toshiba.co.jp[106.186.93.51] X-Barracuda-Start-Time: 1439341044 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 T24gU2F0LCAxMyBKdW4gMjAxNSAwODo1MjowOSArMTAwMCwgRGF2ZSBDaGlubmVyIHdyb3RlOg0K DQo+IFl1cCwgdGhhdCdzIGxvb2tpbmcgbGlrZSBhIHRvb2xjaGFpbiBidWcuIFRocmVhZCBhYm91 dCBhcm0gZGlyZWN0b3J5DQo+IHJlYWQgY29ycnVwdGlvbjoNCg0KSSB0aGluayB0aGF0IHRoaXMg aXMgbm90IGEgdG9vbGNoYWluIGJ1ZywgdGhpcyBpcyByZWxhdGVkIHRvIA0KU3ViamVjdDogW1BB VENIIHYyIDEvMV0gQVJNIDogbWlzc2luZyBjb3JydXB0ZWQgcmVnIGluIF9fZG9fZGl2X2FzbQ0K aHR0cDovL3d3dy5zcGluaWNzLm5ldC9saXN0cy9hcm0ta2VybmVsL21zZzQyNjY4NC5odG1sDQoN Ci0tDQoNClRoZSBwcm9ibGVtYXRpYyBsaW5lIGluIHhmcyBpczogDQppcmVjcy0+YnJfc3RhcnRi bG9jayA9IFhGU19EQUREUl9UT19GU0IobXAsIG1hcHBlZGJubykNCmluIHhmc19kYWJ1Zl9tYXAo KS9mcy94ZnMveGZzX2RhX2J0cmVlLmMuDQoNClRoZSBleHBhbnNpb24gb2YgaXQgaXM6IA0KDQog IGxkID0gbWFwcGVkYm5vID4+IG1wLT5tX2Jsa2JiX2xvZzsNCiAgZG9fZGl2KGxkLCBtcC0+bV9z Yi5zYl9hZ2Jsb2Nrcyk7DQogIHN0YXJ0YmxvY2sgPSBsZCA8PCBtcC0+bV9zYi5zYl9hZ2Jsa2xv ZzsNCiAgbGQgPSBtYXBwZWRibm8gPj4gbXAtPm1fYmxrYmJfbG9nOw0KICBzdGFydGJsb2NrIHw9 IGRvX2RpdihsZCwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOw0KICBpcmVjcy0+YnJfc3RhcnRibG9j ayA9IHN0YXJ0YmxvY2s7DQoNClRoZSBhc3NlbWJsZXIgb2YgdGhlc2UgYXJlOg0KDQo6DQoJYmwJ X19kb19kaXY2NA0KCWxkcglyMSwgW3NwLCAjNDRdDQoJc3VicwlyMywgcjcsICMzMg0KCW9ycgly MSwgcjEsIHIyLCBsc3IgcjUNCglhZGQJcjUsIHNwLCAjODANCglzdHIJcjUsIFtzcCwgIzY0XQ0K CWxkcglyNSwgW3NwLCAjNjBdDQoJbW92cGwJcjEsIHIyLCBhc2wgcjMNCgltb3YJcjIsIHIyLCBh c2wgcjcNCglzdHIJcjIsIFtzcCwgIzQwXQ0KCXN0cglyMSwgW3NwLCAjNDRdDQoJbW92CXIxLCBy OQ0KCXN0cglyNSwgW3NwLCAjOTZdDQoJbW92CXI3LCAjMA0KCWxkcglyMiwgW3NwLCAjOTZdDQoJ bW92CXI1LCAjMQ0KCWxkcglmcCwgW3NwLCAjNjRdDQoJc3RyCXI3LCBbc3AsICM4NF0NCgltb3YJ cjksIHIyLCBhc3IgIzMxDQoJc3RyCXI3LCBbc3AsICMxMDRdDQoJYmwJX19kb19kaXY2NA0KOg0K DQpieSBHQ0MgNC43LjIgd2l0aCAtTzIgb3B0aW9uLg0KDQpCZWNhdXNlIGEgcmVzdWx0IG9mIGRv X2RpdiBpcyBzdG9yZWQgaW4gdGhlIDFzdCBhcmcgKHIwKSwNCnIwLCB3aGljaCBpcyAibGQiIGlu IHRoZSBDLCAgbXVzdCBiZSByZWxvYWRlZCBhZnRlciB0aGUgMXN0IGNhbGwgb2YgZG9fZGl2LCBi ZWZvcmUgdGhlIDJuZCBjYWxsIG9mIGRvX2Rpdi4NCkJ1dCBpdCBpcyBub3QgcmVsb2FkZWQgaW4g dGhlIGFib3ZlIGFzc2VtYmxlci4NClRoZSBwcm9ibGVtIGlzIG1hY3JvIF9fZG9fZGl2X2FzbSwg YXMgdGhlIHBhdGNoIGRlc2NyaWJlcy4NCg0KSSBjb25maXJtZWQgdGhhdCB0aGUgcGF0Y2ggZml4 ZWQgdGhpcyBwcm9ibGVtLg0KDQoJbW92CXIxLCBzbA0KCXN0cglyMiwgW3NwLCAjNTZdDQoJbW92 CXIwLCBmcA0KCWJsCV9fZG9fZGl2NjQNCglsZHIJaXAsIFtzcCwgIzM2XQ0KCXJzYglyNiwgcjUs ICMzMg0KCXN1YnMJcjMsIHI1LCAjMzINCglsZHIJcjEsIFtzcCwgIzU2XQ0KCW9ycglpcCwgaXAs IHIyLCBsc3IgcjYNCglzdHIJcjcsIFtzcCwgIzk2XQ0KCW1vdglyNiwgIzENCglzdHIJcjgsIFtz cCwgIzgwXQ0KCW1vdglyMCwgaXANCglzdHIJcjEsIFtzcCwgIzUyXQ0KCW1vdnBsCXIwLCByMiwg YXNsIHIzDQoJbW92CXIyLCByMiwgYXNsIHI1DQoJc3RyCXIwLCBbc3AsICMzNl0NCgltb3YJcjEs IHNsDQoJc3RyCXIyLCBbc3AsICMzMl0NCgltb3YJcjAsIGZwDQoJYmwJX19kb19kaXY2NA0KDQpi eSBHQ0MgNC43LjIgd2l0aCAtTzIgb3B0aW9uIGFuZCB0aGUgcGF0Y2guDQoNClRoYW5rIHlvdSwN Ci0tIA0KVVdBVE9LTw== From david@fromorbit.com Tue Aug 11 22:14:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5562F7F50 for ; Tue, 11 Aug 2015 22:14:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 207AD8F8035 for ; Tue, 11 Aug 2015 20:14:12 -0700 (PDT) X-ASG-Debug-ID: 1439349249-04bdf06bd22fe180001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cjpO5r97qVqFHVvm for ; Tue, 11 Aug 2015 20:14:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AxCwBSucpVPBkyLHldgxtUaaoKDAEBAQEBAQaVOgqFcwQCAoFITQEBAQEBAQcBAQEBQAE/hCMBAQEEAQIkExwjEAgDFwEJJQ8FFBEDBwwhiC0Oz1kBAQEBAQUBAQEBAR0ZhgaFMoUJBxeDAYEUBZUQigmCXoFNhz+RAoQ2LDMBgksBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2015 12:44:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZPMUR-0005xD-Oa; Wed, 12 Aug 2015 13:14:07 +1000 Date: Wed, 12 Aug 2015 13:14:07 +1000 From: Dave Chinner To: katsuki.uwatoko@toshiba.co.jp Cc: xfs@oss.sgi.com, linux-arm-kernel@lists.infradead.org, edwin@skylable.com, bfoster@redhat.com, karanvir.singh@hgst.com, christopher.squires@hgst.com, wayne.burri@hgst.com, sandeen@sandeen.net, luca@skylable.com, linux@arm.linux.org.uk, gangchen@rdamicro.com Subject: Re: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' Message-ID: <20150812031407.GB20596@dastard> X-ASG-Orig-Subj: Re: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' References: <5579B804.9050707@skylable.com> <20150612122108.GB60661@bfoster.bfoster> <557AD4D4.3010901@skylable.com> <20150612225209.GA20262@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439349249 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 12, 2015 at 12:56:25AM +0000, katsuki.uwatoko@toshiba.co.jp wrote: > On Sat, 13 Jun 2015 08:52:09 +1000, Dave Chinner wrote: > > > Yup, that's looking like a toolchain bug. Thread about arm directory > > read corruption: > > I think that this is not a toolchain bug, this is related to > Subject: [PATCH v2 1/1] ARM : missing corrupted reg in __do_div_asm > http://www.spinics.net/lists/arm-kernel/msg426684.html Interesting! Very good work finding that bug, Katsuki-san. FWIW, I suspect this fix will need to go back into stable kernels, too. > -- > > The problematic line in xfs is: > irecs->br_startblock = XFS_DADDR_TO_FSB(mp, mappedbno) > in xfs_dabuf_map()/fs/xfs/xfs_da_btree.c. > > The expansion of it is: > > ld = mappedbno >> mp->m_blkbb_log; > do_div(ld, mp->m_sb.sb_agblocks); > startblock = ld << mp->m_sb.sb_agblklog; > ld = mappedbno >> mp->m_blkbb_log; > startblock |= do_div(ld, mp->m_sb.sb_agblocks); > irecs->br_startblock = startblock; > > The assembler of these are: > > : > bl __do_div64 > ldr r1, [sp, #44] > subs r3, r7, #32 > orr r1, r1, r2, lsr r5 > add r5, sp, #80 > str r5, [sp, #64] > ldr r5, [sp, #60] > movpl r1, r2, asl r3 > mov r2, r2, asl r7 > str r2, [sp, #40] > str r1, [sp, #44] > mov r1, r9 > str r5, [sp, #96] > mov r7, #0 > ldr r2, [sp, #96] > mov r5, #1 > ldr fp, [sp, #64] > str r7, [sp, #84] > mov r9, r2, asr #31 > str r7, [sp, #104] > bl __do_div64 > : > > by GCC 4.7.2 with -O2 option. To close the loop, what code do the other versions GCC produce for this macro? Evidence so far says that the result depends on the compiler version, so I would like to have confirmation that other versions of the compiler generate working code. There are other XFS_DADDR_TO_FSB() calls in the XFS code, too - do they demonstrate the same problem, maybe with different compiler versions? Basically I'm asking what is the scope of the problem you've found? i.e. when was the bug introduced, what compilers expose it, etc so that when ARM users report XFS corruptions we have some idea of whether their kernel/compiler combination might have caused the issue they are seeing... Cheers, Dave. -- Dave Chinner david@fromorbit.com From katsuki.uwatoko@toshiba.co.jp Wed Aug 12 01:19:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6181D7F50 for ; Wed, 12 Aug 2015 01:19:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3AE4E8F8037 for ; Tue, 11 Aug 2015 23:19:55 -0700 (PDT) X-ASG-Debug-ID: 1439360391-04cbb0416d33d7a0001-NocioJ Received: from imx2.toshiba.co.jp (imx2.toshiba.co.jp [106.186.93.51]) by cuda.sgi.com with ESMTP id 0cGaNFT3yLjMpJnc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Aug 2015 23:19:53 -0700 (PDT) X-Barracuda-Envelope-From: katsuki.uwatoko@toshiba.co.jp X-ASG-Whitelist: Sender X-Barracuda-Apparent-Source-IP: 106.186.93.51 Received: from tsbmgw-mgw02.tsbmgw-mgw02.toshiba.co.jp ([133.199.200.50]) by imx2.toshiba.co.jp with ESMTP id t7C6J8Cr022452 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Aug 2015 15:19:08 +0900 (JST) Received: from tsbmgw-mgw02 (localhost [127.0.0.1]) by tsbmgw-mgw02.tsbmgw-mgw02.toshiba.co.jp (8.13.8/8.14.5) with ESMTP id t7C6J8WN024283; Wed, 12 Aug 2015 15:19:08 +0900 Received: from localhost ([127.0.0.1]) by tsbmgw-mgw02 (JAMES SMTP Server 2.3.1) with SMTP ID 447; Wed, 12 Aug 2015 15:19:08 +0900 (JST) Received: from arc1.toshiba.co.jp ([133.199.194.235]) by tsbmgw-mgw02.tsbmgw-mgw02.toshiba.co.jp (8.13.8/8.14.5) with ESMTP id t7C6J8kL024280; Wed, 12 Aug 2015 15:19:08 +0900 Received: (from root@localhost) by arc1.toshiba.co.jp id t7C6J8iW020795; Wed, 12 Aug 2015 15:19:08 +0900 (JST) Received: from ovp2.toshiba.co.jp [133.199.192.144] by arc1.toshiba.co.jp with ESMTP id RAA20794; Wed, 12 Aug 2015 15:19:08 +0900 Received: from mx.toshiba.co.jp (localhost [127.0.0.1]) by ovp2.toshiba.co.jp with ESMTP id t7C6J8Cv013258; Wed, 12 Aug 2015 15:19:08 +0900 (JST) Received: from tgxml308.toshiba.local by toshiba.co.jp id t7C6J7oV012349; Wed, 12 Aug 2015 15:19:07 +0900 (JST) Received: from TGXML337.toshiba.local ([169.254.3.227]) by tgxml308.toshiba.local ([133.199.66.203]) with mapi id 14.03.0235.001; Wed, 12 Aug 2015 15:19:07 +0900 From: To: CC: , , , , , , , , , , Subject: Re: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' Thread-Topic: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' X-ASG-Orig-Subj: Re: PROBLEM: XFS on ARM corruption 'Structure needs cleaning' Thread-Index: AQHQ1Jm2b+YMYk5vfESvcZQbbdkFY54HGdKAgAAzroA= Date: Wed, 12 Aug 2015 06:19:07 +0000 Message-ID: References: <557AD4D4.3010901@skylable.com> <20150612225209.GA20262@dastard> <20150812031407.GB20596@dastard> In-Reply-To: <20150812031407.GB20596@dastard> Accept-Language: ja-JP, en-US Content-Language: en-US x-originating-ip: [133.199.67.13] msscp.transfermailtomossagent: 103 Content-Type: text/plain; charset="iso-2022-jp" Content-ID: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: imx2.toshiba.co.jp[106.186.93.51] X-Barracuda-Start-Time: 1439360392 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 12 Aug 2015 13:14:07 +1000, Dave Chinner wrote: > To close the loop, what code do the other versions GCC produce for > this macro? Evidence so far says that the result depends on the > compiler version, so I would like to have confirmation that other > versions of the compiler generate working code. There are other > XFS_DADDR_TO_FSB() calls in the XFS code, too - do they demonstrate > the same problem, maybe with different compiler versions? >=20 > Basically I'm asking what is the scope of the problem you've found? > i.e. when was the bug introduced, what compilers expose it, etc > so that when ARM users report XFS corruptions we have some idea of > whether their kernel/compiler combination might have caused the > issue they are seeing... I have the following versions of GCC now. 4.5.1 4.6.4 4.7.2 # Sorry I don't have the recent versions of GCC. And the results are: 4.5.1 (-O2) OK. 4.6.4 (-O2) BAD. 4.7.2 (-O2) BAD. But even using gcc 4.7, this bug does not happen with -Os instead of -O2. It means that when CONFIG_CC_OPTIMIZE_FOR_SIZE Kernel option is used, it do= es not happen. As for the version of kernel, I am using 3.10 now. At least. it is the same= as 2.6.32. -- The following are codes generated by GCCs. GCC 4.5.1 with -O2 (OK) 178: 41a00003 movmi r0, r3 17c: 51a00057 asrpl r0, r7, r0 180: e58da02c str sl, [sp, #44] ; 0x2c 184: ebfffffe bl 0 <__do_div64> 188: e1cd26f8 strd r2, [sp, #104] ; 0x68 18c: e3a08000 mov r8, #0 190: e5d51175 ldrb r1, [r5, #373] ; 0x175 194: e59d2068 ldr r2, [sp, #104] ; 0x68 198: e251e020 subs lr, r1, #32 19c: e5d5308c ldrb r3, [r5, #140] ; 0x8c 1a0: e261c020 rsb ip, r1, #32 1a4: e1a00136 lsr r0, r6, r1 1a8: e1800c17 orr r0, r0, r7, lsl ip 1ac: e2634020 rsb r4, r3, #32 1b0: 51a00e57 asrpl r0, r7, lr 1b4: e253c020 subs ip, r3, #32 1b8: e1a0b432 lsr fp, r2, r4 1bc: e1a0a312 lsl sl, r2, r3 1c0: 51a0bc12 lslpl fp, r2, ip 1c4: e59dc024 ldr ip, [sp, #36] ; 0x24 1c8: e5954064 ldr r4, [r5, #100] ; 0x64 1cc: e1a01157 asr r1, r7, r1 1d0: e58d804c str r8, [sp, #76] ; 0x4c 1d4: e58dc048 str ip, [sp, #72] ; 0x48 1d8: ebfffffe bl 0 <__do_div64> GCC 4.6.4 with -O2 (BAD) 19c: 51a0025e asrpl r0, lr, r2 1a0: e3a0a001 mov sl, #1 1a4: ebfffffe bl 0 <__do_div64> 1a8: e1a0bb32 lsr fp, r2, fp 1ac: e2553020 subs r3, r5, #32 1b0: e1a01008 mov r1, r8 1b4: e58d704c str r7, [sp, #76] ; 0x4c 1b8: e1a0800b mov r8, fp 1bc: e58d7060 str r7, [sp, #96] ; 0x60 1c0: 51a08312 lslpl r8, r2, r3 1c4: e1a02512 lsl r2, r2, r5 1c8: e58d8034 str r8, [sp, #52] ; 0x34 1cc: e1a0500a mov r5, sl 1d0: e58d2030 str r2, [sp, #48] ; 0x30 1d4: e28d8048 add r8, sp, #72 ; 0x48 1d8: ebfffffe bl 0 <__do_div64> GCC 4.7.2 with -Os (OK) 1a0: e1cd02d8 ldrd r0, [sp, #40] ; 0x28 1a4: e1a0200b mov r2, fp 1a8: ebfffffe bl 0 <__aeabi_lasr> 1ac: e5954064 ldr r4, [r5, #100] ; 0x64 1b0: ebfffffe bl 0 <__do_div64> 1b4: e3a01000 mov r1, #0 1b8: e1a00002 mov r0, r2 1bc: e5d5208c ldrb r2, [r5, #140] ; 0x8c 1c0: ebfffffe bl 0 <__aeabi_llsl> 1c4: e1a0200b mov r2, fp 1c8: e1a06000 mov r6, r0 1cc: e1a07001 mov r7, r1 1d0: e1cd02d8 ldrd r0, [sp, #40] ; 0x28 1d4: ebfffffe bl 0 <__aeabi_lasr> 1d8: e58da040 str sl, [sp, #64] ; 0x40 1dc: ebfffffe bl 0 <__do_div64> Thank you, --=20 UWATOKO= From BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 12 02:15:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 355A97F50 for ; Wed, 12 Aug 2015 02:15:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1DB958F8033 for ; Wed, 12 Aug 2015 00:15:20 -0700 (PDT) X-ASG-Debug-ID: 1439363718-04cb6c67403c6320001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id oev7NueCxTLAawnH (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 00:15:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPQFq-0005Kv-7M; Wed, 12 Aug 2015 07:15:18 +0000 Date: Wed, 12 Aug 2015 00:15:18 -0700 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count Message-ID: <20150812071518.GA14237@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-2-git-send-email-bfoster@redhat.com> <20150809073641.GA3163@infradead.org> <20150810123726.GA18933@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150810123726.GA18933@bfoster.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439363718 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21527 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 10, 2015 at 08:37:27AM -0400, Brian Foster wrote: > > As a follow on we should be able to remove atomic_inc_return and > > replace it with a local iterator in xfs_bmap_finish(). > > > > I'm not sure what you mean here... efi_next_extent is not only used is to find a 'slot' for the extent in xfs_trans_log_efi_extent. For that we don't need an atomic_t in the EFI, but can have a local variable in xfs_bmap_finish. From BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 12 02:17:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 51DDB7F50 for ; Wed, 12 Aug 2015 02:17:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 17718304043 for ; Wed, 12 Aug 2015 00:17:29 -0700 (PDT) X-ASG-Debug-ID: 1439363847-04bdf06bcf302460001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 6nX4XNafgDBy6NeM (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 00:17:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPQHv-00066L-9Y; Wed, 12 Aug 2015 07:17:27 +0000 Date: Wed, 12 Aug 2015 00:17:27 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 12/13] xfs: add helper to conditionally remove items from the AIL Message-ID: <20150812071727.GB14237@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 12/13] xfs: add helper to conditionally remove items from the AIL References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439233309-19959-13-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439233309-19959-13-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439363847 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21527 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + xfs_trans_ail_remove(lip->li_ailp, lip, > + SHUTDOWN_LOG_IO_ERROR); I'd say remove the ail argument, lip->li_ailp can be derferenced inside xfs_trans_ail_remove safely. From BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 12 02:21:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C1BF7F50 for ; Wed, 12 Aug 2015 02:21:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59089304039 for ; Wed, 12 Aug 2015 00:21:11 -0700 (PDT) X-ASG-Debug-ID: 1439364069-04cb6c673f3c6560001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tIpvcI75bWhuEDXP (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 00:21:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPQLV-00089e-3Y; Wed, 12 Aug 2015 07:21:09 +0000 Date: Wed, 12 Aug 2015 00:21:09 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/13] xfs: add missing bmap cancel calls in error paths Message-ID: <20150812072109.GC14237@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v3 13/13] xfs: add missing bmap cancel calls in error paths References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439233309-19959-14-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439233309-19959-14-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439364069 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21528 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 10, 2015 at 03:01:49PM -0400, Brian Foster wrote: > If a failure occurs after the bmap free list is populated and before > xfs_bmap_finish() completes successfully (which returns a partial list > on failure), the bmap free list must be cancelled. Otherwise, the extent > items on the list are never freed and a memory leak occurs. > > Several random error paths throughout the code suffer this problem. Fix > these up such that xfs_bmap_cancel() is always called on error. Looks sensible. I wonder if we should attach the freelist to the transaction and make xfs_trans_commit call into bmap_finish and xfs_trans_cancel into xfs_bmap_cancel in the longer run? > +STATIC int > xfs_growfs_rt_alloc( > - xfs_mount_t *mp, /* file system mount point */ > - xfs_extlen_t oblocks, /* old count of blocks */ > - xfs_extlen_t nblocks, /* new count of blocks */ > - xfs_inode_t *ip) /* inode (bitmap/summary) */ > + struct xfs_mount *mp, /* file system mount point */ > + xfs_extlen_t oblocks, /* old count of blocks */ > + xfs_extlen_t nblocks, /* new count of blocks */ > + struct xfs_inode *ip) /* inode (bitmap/summary) */ > { > - xfs_fileoff_t bno; /* block number in file */ > - xfs_buf_t *bp; /* temporary buffer for zeroing */ > - int committed; /* transaction committed flag */ > - xfs_daddr_t d; /* disk block address */ > - int error; /* error return value */ > - xfs_fsblock_t firstblock; /* first block allocated in xaction */ > - xfs_bmap_free_t flist; /* list of freed blocks */ > - xfs_fsblock_t fsbno; /* filesystem block for bno */ > - xfs_bmbt_irec_t map; /* block map output */ > - int nmap; /* number of block maps */ > - int resblks; /* space reservation */ > + xfs_fileoff_t bno; /* block number in file */ > + struct xfs_buf *bp; /* temporary buffer for zeroing */ > + int committed; /* transaction committed flag */ > + xfs_daddr_t d; /* disk block address */ > + int error; /* error return value */ > + xfs_fsblock_t firstblock;/* first block allocated in xaction */ > + struct xfs_bmap_free flist; /* list of freed blocks */ > + xfs_fsblock_t fsbno; /* filesystem block for bno */ > + struct xfs_bmbt_irec map; /* block map output */ > + int nmap; /* number of block maps */ > + int resblks; /* space reservation */ > + struct xfs_trans *tp; Do we really need all this unrelated reformatting? From BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 12 02:26:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 43F097F50 for ; Wed, 12 Aug 2015 02:26:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0ED128F8033 for ; Wed, 12 Aug 2015 00:26:39 -0700 (PDT) X-ASG-Debug-ID: 1439364395-04bdf06bd2302790001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id d9RlGTB8vTCslOC1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 00:26:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPQQl-0002vj-BG; Wed, 12 Aug 2015 07:26:35 +0000 Date: Wed, 12 Aug 2015 00:26:35 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-ID: <20150812072635.GA32399@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439333388-16452-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439364395 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.10 X-Barracuda-Spam-Status: No, SCORE=2.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA717, BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21528 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 2.00 BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL Custom Rule HREF_FROM_MISMATCH_TEXT_URIx1_HL Introducing this separate from the actual users is a bit odd to follow. Compare to my patch from a few years ago: http://thread.gmane.org/gmane.comp.file-systems.xfs.general/39030/focus=39009 From BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 12 02:27:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B3F2C7F50 for ; Wed, 12 Aug 2015 02:27:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8F16A8F8033 for ; Wed, 12 Aug 2015 00:27:43 -0700 (PDT) X-ASG-Debug-ID: 1439364462-04bdf06bd23027f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id eaGDfI9Ro9N6hB3Q (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 00:27:42 -0700 (PDT) X-Barracuda-Envelope-From: BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPQRq-0003Py-6N; Wed, 12 Aug 2015 07:27:42 +0000 Date: Wed, 12 Aug 2015 00:27:42 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/8] xfs: remove nonblocking mode from xfs_vm_writepage Message-ID: <20150812072742.GB32399@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/8] xfs: remove nonblocking mode from xfs_vm_writepage References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439333388-16452-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439364462 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21528 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This error handling was the biggest obstacle last time we tried it, so let's remove it for now. However: On Wed, Aug 12, 2015 at 08:49:43AM +1000, Dave Chinner wrote: > Remove the nonblocking optimisation done for mapping lookups during > writeback. It's not clear that leaving a hole in the writeback range > just because we couldn't get a lock is really a win, as it makes us > do another small random IO later on rather than a large sequential > IO now. The fs-writeback.c will usually move to a different inode, so I don't think it's actually that bad. From BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 12 02:28:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BDAFB7F50 for ; Wed, 12 Aug 2015 02:28:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 98F928F804B for ; Wed, 12 Aug 2015 00:28:36 -0700 (PDT) X-ASG-Debug-ID: 1439364515-04bdf06bd1302840001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 61At1VheiFKcd8F1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 00:28:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+598c32ccc3a9ece13a58+4371+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPQSg-0003mx-BP; Wed, 12 Aug 2015 07:28:34 +0000 Date: Wed, 12 Aug 2015 00:28:34 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] libxfs: readahead of dir3 data blocks should use the read verifier Message-ID: <20150812072834.GC32399@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] libxfs: readahead of dir3 data blocks should use the read verifier References: <20150811235038.GL10043@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150811235038.GL10043@birch.djwong.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439364515 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21528 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 11, 2015 at 04:50:38PM -0700, Darrick J. Wong wrote: > In the dir3 data block readahead function, use the regular read > verifier to check the block's CRC and spot-check the block contents > instead of directly calling only the spot-checking routine. This > prevents corrupted directory data blocks from being read into the > kernel, which can lead to garbage ls output and directory loops (if > say one of the entries contains slashes and other junk). > > Signed-off-by: Darrick J. Wong Looks good, Reviewed-by: Christoph Hellwig From eguan@redhat.com Wed Aug 12 05:12:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E535829DF5 for ; Wed, 12 Aug 2015 05:12:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D232A304032 for ; Wed, 12 Aug 2015 03:12:09 -0700 (PDT) X-ASG-Debug-ID: 1439374328-04cbb0416c3425c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LrMrHrnFk0pdQOLU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 03:12:08 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id D2E63FC0CA; Wed, 12 Aug 2015 10:12:07 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7CAC5bP027077; Wed, 12 Aug 2015 06:12:06 -0400 Date: Wed, 12 Aug 2015 18:12:04 +0800 From: Eryu Guan To: xfs@oss.sgi.com Cc: tj@kernel.org, jack@suse.cz, axboe@fb.com Subject: generic/04[89] fail on XFS due to change in writeback code Message-ID: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: generic/04[89] fail on XFS due to change in writeback code MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="OROCMA9jn6tkzFBc" Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439374328 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --OROCMA9jn6tkzFBc Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi all, I've been seeing generic/04[89] fails on XFS since 4.2-rc1 from time to time, but the failure isn't reproduced on every test host. Recently I finally got a host that could reproduce the failure reliably. It's a regression since 4.1 kernel based on my tests, 4.1 kernel passed the tests and the failures showed up starting from 4.2-rc1. What xfstests generic/04[89] test is [root@dhcp-66-86-11 xfstests]# ./lsqa.pl tests/generic/04[89] FSQA Test No. 048 Test for NULL files problem test inode size is on disk after sync -------------------------------------------------- FSQA Test No. 049 Test for NULL files problem test inode size is on disk after sync - expose log replay bug -------------------------------------------------- And the failure is like (test files have zero size) root@dhcp-66-86-11 xfstests]# ./check generic/048 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 dhcp-66-86-11 4.2.0-rc5 MKFS_OPTIONS -- -f -bsize=4096 /dev/sda6 MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/sda6 /mnt/testarea/scratch generic/048 28s ... - output mismatch (see /root/xfstests/results//generic/048.out.bad) --- tests/generic/048.out 2015-07-16 17:28:15.800000000 +0800 +++ /root/xfstests/results//generic/048.out.bad 2015-08-12 18:04:52.923000000 +0800 @@ -1 +1,32 @@ QA output created by 048 +file /mnt/testarea/scratch/969 has incorrect size - sync failed +file /mnt/testarea/scratch/970 has incorrect size - sync failed +file /mnt/testarea/scratch/971 has incorrect size - sync failed +file /mnt/testarea/scratch/972 has incorrect size - sync failed +file /mnt/testarea/scratch/973 has incorrect size - sync failed +file /mnt/testarea/scratch/974 has incorrect size - sync failed ... And I bisected to the following commit commit e79729123f6392b36450113c6c52074b7d389c85 Author: Tejun Heo Date: Fri May 22 17:13:48 2015 -0400 writeback: don't issue wb_writeback_work if clean There are several places in fs/fs-writeback.c which queues wb_writeback_work without checking whether the target wb (bdi_writeback) has dirty inodes or not. The only thing wb_writeback_work does is writing back the dirty inodes for the target wb and queueing a work item for a clean wb is essentially noop. There are some side effects such as bandwidth stats being updated and triggering tracepoints but these don't affect the operation in any meaningful way. This patch makes all writeback_inodes_sb_nr() and sync_inodes_sb() skip wb_queue_work() if the target bdi is clean. Also, it moves dirtiness check from wakeup_flusher_threads() to __wb_start_writeback() so that all its callers benefit from the check. While the overhead incurred by scheduling a noop work isn't currently significant, the overhead may be higher with cgroup writeback support as we may end up issuing noop work items to a lot of clean wb's. Signed-off-by: Tejun Heo Cc: Jens Axboe Cc: Jan Kara Signed-off-by: Jens Axboe Attachments are my xfstests config file and host info requested by http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F If you need more info please let me know. Thanks, Eryu --OROCMA9jn6tkzFBc Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=hostinfo It's a RHEL7 kvm guest running on RHEL6.6 with 8G mem and 4 vcpus. The disk configuration in guest xml is
[root@dhcp-66-86-11 ~]# grep -c proc /proc/cpuinfo 4 [root@dhcp-66-86-11 ~]# cat /proc/meminfo MemTotal: 7912932 kB MemFree: 7547480 kB MemAvailable: 7599440 kB Buffers: 944 kB Cached: 219292 kB SwapCached: 0 kB Active: 170072 kB Inactive: 106352 kB Active(anon): 56476 kB Inactive(anon): 8384 kB Active(file): 113596 kB Inactive(file): 97968 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 8257532 kB SwapFree: 8257532 kB Dirty: 42556 kB Writeback: 0 kB AnonPages: 56020 kB Mapped: 33008 kB Shmem: 8552 kB Slab: 42520 kB SReclaimable: 18648 kB SUnreclaim: 23872 kB KernelStack: 2336 kB PageTables: 3280 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 12213996 kB Committed_AS: 260636 kB VmallocTotal: 34359738367 kB VmallocUsed: 26336 kB VmallocChunk: 34359623680 kB HardwareCorrupted: 0 kB AnonHugePages: 12288 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 69620 kB DirectMap2M: 8318976 kB [root@dhcp-66-86-11 ~]# cat /proc/mounts proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0 devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=3943408k,nr_inodes=985852,mode=755 0 0 securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0 devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0 tmpfs /sys/fs/cgroup tmpfs rw,seclabel,nosuid,nodev,noexec,mode=755 0 0 cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0 pstore /sys/fs/pstore pstore rw,seclabel,nosuid,nodev,noexec,relatime 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0 configfs /sys/kernel/config configfs rw,relatime 0 0 /dev/sda3 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0 mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0 /dev/sda1 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 /dev/sda6 /mnt/testarea/scratch xfs rw,context=system_u:object_r:nfs_t:s0,relatime,attr2,inode64,noquota 0 0 /dev/sda5 /mnt/testarea/test xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 [root@dhcp-66-86-11 ~]# cat /proc/partitions major minor #blocks name 8 0 314572800 sda 8 1 512000 sda1 8 2 8257536 sda2 8 3 52428800 sda3 8 4 1 sda4 8 5 15728640 sda5 8 6 15728640 sda6 8 7 15728640 sda7 8 8 15728640 sda8 8 9 15728640 sda9 8 10 15728640 sda10 8 11 15728640 sda11 8 16 104857600 sdb 8 17 104856576 sdb1 [root@dhcp-66-86-11 ~]# lvs [root@dhcp-66-86-11 ~]# --OROCMA9jn6tkzFBc Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="local.config" TEST_DEV=/dev/sda5 TEST_DIR=/mnt/testarea/test # mount point of TEST PARTITION SCRATCH_MNT=/mnt/testarea/scratch # mount point for SCRATCH PARTITION SCRATCH_DEV=/dev/sda6 --OROCMA9jn6tkzFBc-- From eguan@redhat.com Wed Aug 12 05:27:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 151AC29DF5 for ; Wed, 12 Aug 2015 05:27:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D7951304043 for ; Wed, 12 Aug 2015 03:27:32 -0700 (PDT) X-ASG-Debug-ID: 1439375251-04bdf06bd1306aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mxjAuAIlCF8AFS1T (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 03:27:31 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 4D4B68F232; Wed, 12 Aug 2015 10:27:31 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7CARTkA023956; Wed, 12 Aug 2015 06:27:30 -0400 Date: Wed, 12 Aug 2015 18:27:28 +0800 From: Eryu Guan To: xfs@oss.sgi.com Cc: tj@kernel.org, axboe@fb.com, jack@suse.cz Subject: Re: generic/04[89] fail on XFS due to change in writeback code Message-ID: <20150812102728.GF17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439375251 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 12, 2015 at 06:12:04PM +0800, Eryu Guan wrote: > Hi all, > > I've been seeing generic/04[89] fails on XFS since 4.2-rc1 from time to > time, but the failure isn't reproduced on every test host. Recently I > finally got a host that could reproduce the failure reliably. [snip] > > Attachments are my xfstests config file and host info requested by > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F Oh, one more thing, I'm using xfsprogs 4.2.0-rc1 from upstream, but xfsprogs version doesn't matter here, xfsprogs-3.2.2-1.el7 shipped with RHEL7.1 makes no difference in my testing. Thanks, Eryu From oleg@redhat.com Wed Aug 12 06:44:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B15607F50 for ; Wed, 12 Aug 2015 06:44:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8B391304032 for ; Wed, 12 Aug 2015 04:44:41 -0700 (PDT) X-ASG-Debug-ID: 1439379880-04bdf06bcf308e20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v0SVGlH7KqrGPhYb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 04:44:40 -0700 (PDT) X-Barracuda-Envelope-From: oleg@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id D90024B; Wed, 12 Aug 2015 11:44:39 +0000 (UTC) Received: from tranklukator.brq.redhat.com (dhcp-1-102.brq.redhat.com [10.34.1.102]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id t7CBicIL028899; Wed, 12 Aug 2015 07:44:38 -0400 Received: by tranklukator.brq.redhat.com (nbSMTP-1.00) for uid 500 oleg@redhat.com; Wed, 12 Aug 2015 13:42:27 +0200 (CEST) Date: Wed, 12 Aug 2015 13:42:25 +0200 From: Oleg Nesterov To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz Subject: Re: [PATCH 0/2] xfs: kill lockdep false positives from readdir Message-ID: <20150812114225.GA3712@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: kill lockdep false positives from readdir References: <1439330648-1057-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439330648-1057-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439379880 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/12, Dave Chinner wrote: > > Oleg and Jan, this patchset should fix the lockdep issues that have > been seen with the freeze rework. Oleg, can you you try it with your > current patchset and testing and let me know if there are any issues > that you see? Tested-by: Oleg Nesterov To clarify, I tested these patches with [PATCH v2 0/8] change sb_writers to use percpu_rw_semaphore I sent yesterday first. Then I applied the additional patch (attached below) which just restores the lockdep improvements from v1, everything looks fine: Ran: generic/068 generic/085 generic/280 generic/311 xfs/011 xfs/119 xfs/297 Passed all 7 tests nothing interesting in dmesg. Thanks Dave! Oleg. From oleg@redhat.com Wed Aug 12 06:46:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A50D57CBE for ; Wed, 12 Aug 2015 06:46:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8338F8F8035 for ; Wed, 12 Aug 2015 04:46:03 -0700 (PDT) X-ASG-Debug-ID: 1439379962-04cb6c673f3cd000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id n5ALloPVUzYwSv8o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 04:46:02 -0700 (PDT) X-Barracuda-Envelope-From: oleg@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E5CE83F0AB; Wed, 12 Aug 2015 11:46:01 +0000 (UTC) Received: from tranklukator.brq.redhat.com (dhcp-1-102.brq.redhat.com [10.34.1.102]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id t7CBk0TW003387; Wed, 12 Aug 2015 07:46:00 -0400 Received: by tranklukator.brq.redhat.com (nbSMTP-1.00) for uid 500 oleg@redhat.com; Wed, 12 Aug 2015 13:43:49 +0200 (CEST) Date: Wed, 12 Aug 2015 13:43:47 +0200 From: Oleg Nesterov To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz Subject: Re: [PATCH 0/2] xfs: kill lockdep false positives from readdir Message-ID: <20150812114347.GB3712@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: kill lockdep false positives from readdir References: <1439330648-1057-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439330648-1057-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439379962 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 forgot to show the patch, sorry for double posting... On 08/12, Dave Chinner wrote: > > Oleg and Jan, this patchset should fix the lockdep issues that have > been seen with the freeze rework. Oleg, can you you try it with your > current patchset and testing and let me know if there are any issues > that you see? Tested-by: Oleg Nesterov To clarify, I tested these patches with [PATCH v2 0/8] change sb_writers to use percpu_rw_semaphore I sent yesterday first. Then I applied the additional patch (attached below) which just restores the lockdep improvements from v1, everything looks fine: Ran: generic/068 generic/085 generic/280 generic/311 xfs/011 xfs/119 xfs/297 Passed all 7 tests nothing interesting in dmesg. Thanks Dave! Oleg. --- a/fs/super.c +++ b/fs/super.c @@ -1215,25 +1215,31 @@ EXPORT_SYMBOL(__sb_start_write); static void sb_wait_write(struct super_block *sb, int level) { percpu_down_write(sb->s_writers.rw_sem + level-1); - /* - * We are going to return to userspace and forget about this lock, the - * ownership goes to the caller of thaw_super() which does unlock. - * - * FIXME: we should do this before return from freeze_super() after we - * called sync_filesystem(sb) and s_op->freeze_fs(sb), and thaw_super() - * should re-acquire these locks before s_op->unfreeze_fs(sb). However - * this leads to lockdep false-positives, so currently we do the early - * release right after acquire. - */ - percpu_rwsem_release(sb->s_writers.rw_sem + level-1, 0, _THIS_IP_); } -static void sb_freeze_unlock(struct super_block *sb) +/* + * We are going to return to userspace and forget about these locks, the + * ownership goes to the caller of thaw_super()->sb_freeze_acquire(). + */ +static void sb_freeze_release(struct super_block *sb) +{ + int level; + + for (level = SB_FREEZE_LEVELS; --level >= 0; ) + percpu_rwsem_release(sb->s_writers.rw_sem + level, 0, _THIS_IP_); +} + +static void sb_freeze_acquire(struct super_block *sb) { int level; for (level = 0; level < SB_FREEZE_LEVELS; ++level) percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); +} + +static void sb_freeze_unlock(struct super_block *sb) +{ + int level; for (level = SB_FREEZE_LEVELS; --level >= 0; ) percpu_up_write(sb->s_writers.rw_sem + level); @@ -1329,6 +1335,7 @@ int freeze_super(struct super_block *sb) * sees write activity when frozen is set to SB_FREEZE_COMPLETE. */ sb->s_writers.frozen = SB_FREEZE_COMPLETE; + sb_freeze_release(sb); up_write(&sb->s_umount); return 0; } @@ -1355,11 +1362,14 @@ int thaw_super(struct super_block *sb) goto out; } + sb_freeze_acquire(sb); + if (sb->s_op->unfreeze_fs) { error = sb->s_op->unfreeze_fs(sb); if (error) { printk(KERN_ERR "VFS:Filesystem thaw failed\n"); + sb_freeze_release(sb); up_write(&sb->s_umount); return error; } From bfoster@redhat.com Wed Aug 12 07:48:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 68F557F3F for ; Wed, 12 Aug 2015 07:48:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 433B1304032 for ; Wed, 12 Aug 2015 05:48:02 -0700 (PDT) X-ASG-Debug-ID: 1439383680-04cb6c673e3cee90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OFvm8X36Wg5vI39Y (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 05:48:01 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id D34B63FE62; Wed, 12 Aug 2015 12:48:00 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7CCm0nH010149; Wed, 12 Aug 2015 08:48:00 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A16AB124C44; Wed, 12 Aug 2015 08:47:59 -0400 (EDT) Date: Wed, 12 Aug 2015 08:47:59 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count Message-ID: <20150812124759.GA20635@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: disentagle EFI release from the extent count References: <1438883072-28706-1-git-send-email-bfoster@redhat.com> <1438883072-28706-2-git-send-email-bfoster@redhat.com> <20150809073641.GA3163@infradead.org> <20150810123726.GA18933@bfoster.bfoster> <20150812071518.GA14237@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812071518.GA14237@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439383681 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 12, 2015 at 12:15:18AM -0700, Christoph Hellwig wrote: > On Mon, Aug 10, 2015 at 08:37:27AM -0400, Brian Foster wrote: > > > As a follow on we should be able to remove atomic_inc_return and > > > replace it with a local iterator in xfs_bmap_finish(). > > > > > > > I'm not sure what you mean here... > > efi_next_extent is not only used is to find a 'slot' for the extent > in xfs_trans_log_efi_extent. For that we don't need an atomic_t > in the EFI, but can have a local variable in xfs_bmap_finish. Ok, I see. efi_next_extent isn't used for much at this point. We could kill it entirely, we'd just have to add an index parameter to the EFI logging function (or change up the params). We do still have asserts in the logging and item format handlers that help ensure a properly constructed EFI, so there is some use I suppose. I'm not sure it needed to be atomic though, even prior to the changes in this series... Brian From bfoster@redhat.com Wed Aug 12 07:48:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 54FC37F3F for ; Wed, 12 Aug 2015 07:48:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DCD13AC004 for ; Wed, 12 Aug 2015 05:48:13 -0700 (PDT) X-ASG-Debug-ID: 1439383692-04cb6c67403ceec0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id R4d5XyjTtfzUQwax (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 05:48:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 7E9152F8; Wed, 12 Aug 2015 12:48:12 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7CCmCDG010272; Wed, 12 Aug 2015 08:48:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4EF9D124C44; Wed, 12 Aug 2015 08:48:11 -0400 (EDT) Date: Wed, 12 Aug 2015 08:48:11 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 12/13] xfs: add helper to conditionally remove items from the AIL Message-ID: <20150812124810.GB20635@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 12/13] xfs: add helper to conditionally remove items from the AIL References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439233309-19959-13-git-send-email-bfoster@redhat.com> <20150812071727.GB14237@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812071727.GB14237@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439383692 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 12, 2015 at 12:17:27AM -0700, Christoph Hellwig wrote: > > + xfs_trans_ail_remove(lip->li_ailp, lip, > > + SHUTDOWN_LOG_IO_ERROR); > > I'd say remove the ail argument, lip->li_ailp can be derferenced inside > xfs_trans_ail_remove safely. Ok. Brian From bfoster@redhat.com Wed Aug 12 07:48:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 68CCB7F3F for ; Wed, 12 Aug 2015 07:48:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5486D8F8037 for ; Wed, 12 Aug 2015 05:48:43 -0700 (PDT) X-ASG-Debug-ID: 1439383721-04cb6c673f3cef00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ukXIjMDyrbNKoWm3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 05:48:42 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id BE68A18B32C; Wed, 12 Aug 2015 12:48:41 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7CCmfNv015389; Wed, 12 Aug 2015 08:48:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8E26B124C44; Wed, 12 Aug 2015 08:48:40 -0400 (EDT) Date: Wed, 12 Aug 2015 08:48:40 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/13] xfs: add missing bmap cancel calls in error paths Message-ID: <20150812124840.GC20635@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 13/13] xfs: add missing bmap cancel calls in error paths References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439233309-19959-14-git-send-email-bfoster@redhat.com> <20150812072109.GC14237@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812072109.GC14237@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439383722 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 12, 2015 at 12:21:09AM -0700, Christoph Hellwig wrote: > On Mon, Aug 10, 2015 at 03:01:49PM -0400, Brian Foster wrote: > > If a failure occurs after the bmap free list is populated and before > > xfs_bmap_finish() completes successfully (which returns a partial list > > on failure), the bmap free list must be cancelled. Otherwise, the extent > > items on the list are never freed and a memory leak occurs. > > > > Several random error paths throughout the code suffer this problem. Fix > > these up such that xfs_bmap_cancel() is always called on error. > > Looks sensible. I wonder if we should attach the freelist to the > transaction and make xfs_trans_commit call into bmap_finish and > xfs_trans_cancel into xfs_bmap_cancel in the longer run? > Perhaps... that's an interesting thought. I guess we'd also need to consider other transaction operations (i.e., xfs_trans_roll()) to support patterns such as that in xfs_attr_set(), for example. That one also joins the inode between handling of the free list and transaction commit, so that would need to be pushed down one way or another. I wonder if there are enough vanilla bmap_finish()->trans_commit() callers (e.g., without any intermediate code) to justify creation of a new higher level xfs_trans_bmap_finish_commit() helper or some such that handles both (retaining the existing interfaces for everything else). > > +STATIC int > > xfs_growfs_rt_alloc( > > - xfs_mount_t *mp, /* file system mount point */ > > - xfs_extlen_t oblocks, /* old count of blocks */ > > - xfs_extlen_t nblocks, /* new count of blocks */ > > - xfs_inode_t *ip) /* inode (bitmap/summary) */ > > + struct xfs_mount *mp, /* file system mount point */ > > + xfs_extlen_t oblocks, /* old count of blocks */ > > + xfs_extlen_t nblocks, /* new count of blocks */ > > + struct xfs_inode *ip) /* inode (bitmap/summary) */ > > { > > - xfs_fileoff_t bno; /* block number in file */ > > - xfs_buf_t *bp; /* temporary buffer for zeroing */ > > - int committed; /* transaction committed flag */ > > - xfs_daddr_t d; /* disk block address */ > > - int error; /* error return value */ > > - xfs_fsblock_t firstblock; /* first block allocated in xaction */ > > - xfs_bmap_free_t flist; /* list of freed blocks */ > > - xfs_fsblock_t fsbno; /* filesystem block for bno */ > > - xfs_bmbt_irec_t map; /* block map output */ > > - int nmap; /* number of block maps */ > > - int resblks; /* space reservation */ > > + xfs_fileoff_t bno; /* block number in file */ > > + struct xfs_buf *bp; /* temporary buffer for zeroing */ > > + int committed; /* transaction committed flag */ > > + xfs_daddr_t d; /* disk block address */ > > + int error; /* error return value */ > > + xfs_fsblock_t firstblock;/* first block allocated in xaction */ > > + struct xfs_bmap_free flist; /* list of freed blocks */ > > + xfs_fsblock_t fsbno; /* filesystem block for bno */ > > + struct xfs_bmbt_irec map; /* block map output */ > > + int nmap; /* number of block maps */ > > + int resblks; /* space reservation */ > > + struct xfs_trans *tp; > > Do we really need all this unrelated reformatting? No, I've just been conditioned at this point to try and fix up any of the typedefs that I notice in functions I touch so we can eventually kill them. This was RT code, so I suspect isn't touched often and ended up larger than typical. Brian From bfoster@redhat.com Wed Aug 12 08:00:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 17FB77F50 for ; Wed, 12 Aug 2015 08:00:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 030E68F804C for ; Wed, 12 Aug 2015 06:00:56 -0700 (PDT) X-ASG-Debug-ID: 1439384455-04cb6c673e3cf6c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8OKcPOCsCEYvyRIa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 06:00:56 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 44B183812B0 for ; Wed, 12 Aug 2015 13:00:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-184.bos.redhat.com [10.18.41.184]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7CD0sNx017527 for ; Wed, 12 Aug 2015 09:00:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C912F124C44; Wed, 12 Aug 2015 09:00:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 12/13] xfs: add helper to conditionally remove items from the AIL Date: Wed, 12 Aug 2015 09:00:53 -0400 X-ASG-Orig-Subj: [PATCH v4 12/13] xfs: add helper to conditionally remove items from the AIL Message-Id: <1439384453-34048-1-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-13-git-send-email-bfoster@redhat.com> References: <1439233309-19959-13-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439384455 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Several areas of code duplicate a pattern where we take the AIL lock, check whether an item is in the AIL and remove it if so. Create a new helper for this pattern and use it where appropriate. Signed-off-by: Brian Foster --- v4: - Drop the xfs_ail parameter and use the AIL reference from the log item. fs/xfs/xfs_buf_item.c | 6 +----- fs/xfs/xfs_dquot.c | 8 ++------ fs/xfs/xfs_extfree_item.c | 14 +------------- fs/xfs/xfs_inode_item.c | 11 ++--------- fs/xfs/xfs_trans_priv.h | 15 +++++++++++++++ 5 files changed, 21 insertions(+), 33 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 092d652..919057e 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -647,11 +647,7 @@ xfs_buf_item_unlock( xfs_buf_item_relse(bp); else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); - if (lip->li_flags & XFS_LI_IN_AIL) { - spin_lock(&lip->li_ailp->xa_lock); - xfs_trans_ail_delete(lip->li_ailp, lip, - SHUTDOWN_LOG_IO_ERROR); - } + xfs_trans_ail_remove(lip, SHUTDOWN_LOG_IO_ERROR); xfs_buf_item_relse(bp); } } diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 4143dc7..6964d7c 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -954,12 +954,8 @@ xfs_qm_dqflush( struct xfs_log_item *lip = &dqp->q_logitem.qli_item; dqp->dq_flags &= ~XFS_DQ_DIRTY; - spin_lock(&mp->m_ail->xa_lock); - if (lip->li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(mp->m_ail, lip, - SHUTDOWN_CORRUPT_INCORE); - else - spin_unlock(&mp->m_ail->xa_lock); + xfs_trans_ail_remove(lip, SHUTDOWN_CORRUPT_INCORE); + error = -EIO; goto out_unlock; } diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index ce1d4fb..4aa0153 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -286,20 +286,8 @@ void xfs_efi_release( struct xfs_efi_log_item *efip) { - struct xfs_ail *ailp = efip->efi_item.li_ailp; - if (atomic_dec_and_test(&efip->efi_refcount)) { - spin_lock(&ailp->xa_lock); - /* - * We don't know whether the EFI made it to the AIL. Remove it - * if so. Note that xfs_trans_ail_delete() drops the AIL lock. - */ - if (efip->efi_item.li_flags & XFS_LI_IN_AIL) - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); - else - spin_unlock(&ailp->xa_lock); - + xfs_trans_ail_remove(&efip->efi_item, SHUTDOWN_LOG_IO_ERROR); xfs_efi_item_free(efip); } } diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index bf13a5a..62bd80f 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -703,17 +703,10 @@ xfs_iflush_abort( xfs_inode_log_item_t *iip = ip->i_itemp; if (iip) { - struct xfs_ail *ailp = iip->ili_item.li_ailp; if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { - spin_lock(&ailp->xa_lock); - if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &iip->ili_item, - stale ? - SHUTDOWN_LOG_IO_ERROR : + xfs_trans_ail_remove(&iip->ili_item, + stale ? SHUTDOWN_LOG_IO_ERROR : SHUTDOWN_CORRUPT_INCORE); - } else - spin_unlock(&ailp->xa_lock); } iip->ili_logged = 0; /* diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 1b73629..49931b7 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -119,6 +119,21 @@ xfs_trans_ail_delete( xfs_trans_ail_delete_bulk(ailp, &lip, 1, shutdown_type); } +static inline void +xfs_trans_ail_remove( + struct xfs_log_item *lip, + int shutdown_type) +{ + struct xfs_ail *ailp = lip->li_ailp; + + spin_lock(&ailp->xa_lock); + /* xfs_trans_ail_delete() drops the AIL lock */ + if (lip->li_flags & XFS_LI_IN_AIL) + xfs_trans_ail_delete(ailp, lip, shutdown_type); + else + spin_unlock(&ailp->xa_lock); +} + void xfs_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_ail_push_all(struct xfs_ail *); void xfs_ail_push_all_sync(struct xfs_ail *); -- 2.1.0 From jack@suse.cz Wed Aug 12 08:53:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E68E97F50 for ; Wed, 12 Aug 2015 08:53:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF760304043 for ; Wed, 12 Aug 2015 06:53:26 -0700 (PDT) X-ASG-Debug-ID: 1439387603-04bdf06bd230dfc0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id AbOoCpqMq2DhfTYh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 06:53:24 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B2D14ABC6 for ; Wed, 12 Aug 2015 13:53:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3E1D982822; Wed, 12 Aug 2015 15:53:19 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: Jan Kara Subject: [PATCH] xfsprogs: Fix attr leaf block definition Date: Wed, 12 Aug 2015 15:53:14 +0200 X-ASG-Orig-Subj: [PATCH] xfsprogs: Fix attr leaf block definition Message-Id: <1439387594-8747-1-git-send-email-jack@suse.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439387604 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- struct xfs_attr_leafblock contains 'entries' array which is declared with size 1 altough it can in fact contain much more entries. Since this array is followed by further struct members, gcc (at least in version 4.8.3) thinks that the delared size of the array is the real one and thus optimizes away all accesses beyond the end of array resulting in non-working code. Signed-off-by: Jan Kara --- include/xfs_da_format.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/xfs_da_format.h b/include/xfs_da_format.h index 11f142078e12..39bfeb042844 100644 --- a/include/xfs_da_format.h +++ b/include/xfs_da_format.h @@ -1180,8 +1180,14 @@ typedef struct xfs_attr_leaf_name_remote { typedef struct xfs_attr_leafblock { xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ + /* + * Definitions below are commented out so that gcc doesn't optimize + * away accesses into 'entries' for indexes larger than 1 + */ +#if 0 xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ +#endif } xfs_attr_leafblock_t; /* -- 2.1.4 From 3v1zLVQcQA1oAF7GAFYK6J7.MMM55AA.4GEP7KGKK.K8A.4GE@photos-server.bounces.google.com Wed Aug 12 09:48:34 2015 Return-Path: <3v1zLVQcQA1oAF7GAFYK6J7.MMM55AA.4GEP7KGKK.K8A.4GE@photos-server.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AEFC17F50 for ; Wed, 12 Aug 2015 09:48:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C6EF8F8033 for ; Wed, 12 Aug 2015 07:48:34 -0700 (PDT) X-ASG-Debug-ID: 1439390912-04bdf06bcf30fcb0001-NocioJ Received: from mail-pa0-f74.google.com (mail-pa0-f74.google.com [209.85.220.74]) by cuda.sgi.com with ESMTP id naDzafd3eQsDTCjH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 07:48:32 -0700 (PDT) X-Barracuda-Envelope-From: 3v1zLVQcQA1oAF7GAFYK6J7.MMM55AA.4GEP7KGKK.K8A.4GE@photos-server.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.220.74 X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.220.74] Received: by paxl1 with SMTP id l1so1499894pax.0 for ; Wed, 12 Aug 2015 07:48:31 -0700 (PDT) X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.220.74] X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.220.74] X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; bh=oMHYbK4rLi1CpKGBoh6orATlUDWMR/bQmGK7nFxQ20Y=; b=h8l075w9Fkz9tr6nRth2H/xIV1JR0o/P/Wy2cSr3Sy3vJ6fPuSxSKZ78fUAVsLbqfw zrvCCJpFgHCKt9tlUKp1qPCh3mutRpQOG/R5e5P5Pod4lmFWqxOl+koFxE9oDB6QtHEE UgINWJ9cQuQuPZJmLIh6EqkNDck/2hwXbypi1tMwWOacfjTH6EmvdmbVhu6Kke0lAK25 7RLkB2LuyoVbM3OInYruEsDuFW6RnTmcNIvhu7JWlllVNu00L/DpWxImosp/+FVRFDqK de4czeksV21OxQPvDj9FDLQwsWro3Fu/+RLsxbR5qd+Gc+WjfuHPP8UMpFjUkggZmgVb ijXA== MIME-Version: 1.0 X-Received: by 10.66.185.41 with SMTP id ez9mr16943812pac.43.1439390911661; Wed, 12 Aug 2015 07:48:31 -0700 (PDT) Reply-To: Quality Laser Safety Glasses Supply Message-ID: <047d7bf0e712fb874d051d1e4fda@google.com> Date: Wed, 12 Aug 2015 14:48:31 +0000 Subject: Quality Laser Safety Glasses Supply shared an album with you. From: Quality Laser Safety Glasses Supply X-ASG-Orig-Subj: Quality Laser Safety Glasses Supply shared an album with you. To: xfs@oss.sgi.com Content-Type: multipart/related; boundary=047d7bf0e712fb872d051d1e4fd8 X-Barracuda-Connect: mail-pa0-f74.google.com[209.85.220.74] X-Barracuda-Start-Time: 1439390912 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21535 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bf0e712fb872d051d1e4fd8 Content-Type: multipart/alternative; boundary=047d7bf0e712fb872a051d1e4fd7 --047d7bf0e712fb872a051d1e4fd7 Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Dear Sir / Madam, I know you from your great website, we come from China and glad to introduce our laser safety products for your quality lasers. With a brief introducing of us, we specialize in laser safety field from year 2002, and now forming decades series laser safety glasses and goggles for different laser type Our advantage is. - HIGH QUALITY WITH CE MARK, FROM MANUFACTURE DIRECTLY, WITH ATTRACTIVE PRICE, GOOD AT WORLDWIDE SHIPPING WITH FASTEST SHIPMENT ???? Below is some our normal type which are widely used by our customers, I hope it is useful for you, ? ? DTY laser safety glasses, Protect wavelength: 800 - 1700nm Special for: 808nm, 980nm, 1064nm, 1320nm Transmission> 40% RTD laser safety glasses, Protect wavelength: 620 - 660nm & 800 - 830nm Special for: 635nm, 808nm V.L.T> 30% YHP laser safety glasses, Protect wavelength: 800 - 1100nm Special for: 808nm, 980nm V.L.T> 50% IPL safety glasses, Protect wavelength: 200 - 1400nm V.L.T> 10% Look forward to hearing back from you. Best regards, Hui HUANG https://picasaweb.google.com/lh/sredir?uname=101580620250012205043&target=ALBUM&id=6133119550560549089&authkey=Gv1sRgCLue26604dnqMQ&invite=COXK6egI&feat=email --047d7bf0e712fb872a051d1e4fd7 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
You are invited to view Quality Laser Safety Glasses Supply's ph= oto album: Quality Laser Safety Glasses 20= 15
Quality Laser Safety Glasses 2015
Jul 2, 2014
by Quality Laser Safety Glasses Supply
View Album
Message = from Quality Laser Safety Glasses Supply:
Dear Sir / Madam,

I know you from your great website, we co= me from China and glad to introduce our laser safety
products for your q= uality lasers.

With a brief introducing of us, we specialize in lase= r safety field from year 2002, and now forming decades series laser safety = glasses and goggles for different laser type Our advantage is. -
HIGH QU= ALITY WITH CE MARK,
FROM MANUFACTURE DIRECTLY, WITH ATTRACTIVE PRICE,GOOD AT WORLDWIDE SHIPPING WITH FASTEST SHIPMENT
????
Below is some = our normal type which are widely used by our customers, I hope it is useful= for you,
?
?
DTY laser safety glasses,
Protect wavelength: 800= - 1700nm
Special for: 808nm, 980nm, 1064nm, 1320nm
Transmission> = 40%

RTD laser safety glasses,
Protect wavelength: 620 - 660nm &am= p; 800 - 830nm
Special for: 635nm, 808nm
V.L.T> 30%

YHP las= er safety glasses,
Protect wavelength: 800 - 1100nm
Special for: 808n= m, 980nm
V.L.T> 50%

IPL safety glasses,
Protect wavelength:= 200 - 1400nm
V.L.T> 10%

Look forward to hearing back from you= .

Best regards,

Hui HUANG
To share your photos or receive notification when your friends sha= re photos, get your own free Picas= a Web Albums account.
--047d7bf0e712fb872a051d1e4fd7-- --047d7bf0e712fb872d051d1e4fd8 Content-Type: image/gif; name="picasaweblogo-en_US.gif" Content-Disposition: attachment; filename="picasaweblogo-en_US.gif" Content-Transfer-Encoding: base64 Content-ID: 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 Ry6fdwSwZ4NKuIRMWAZBAAA7 --047d7bf0e712fb872d051d1e4fd8 Content-Type: image/jpeg; name="email.jpg" Content-Disposition: attachment; filename="email.jpg" Content-Transfer-Encoding: base64 Content-ID: <6133119550560549089> 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 1AQmygDNlAGFKAEoJC4oAQLSGemKYhKCaR//2Q== --047d7bf0e712fb872d051d1e4fd8-- From xfs@tlinx.org Wed Aug 12 19:24:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C4B1C7F54 for ; Wed, 12 Aug 2015 19:24:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 940C98F8039 for ; Wed, 12 Aug 2015 17:24:14 -0700 (PDT) X-ASG-Debug-ID: 1439425452-04bdf06bd1329260001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id sfuwr20G79hA5gj5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Aug 2015 17:24:12 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.9/8.14.4/SuSE Linux 0.8) with ESMTP id t7D0O6b9085668; Wed, 12 Aug 2015 17:24:08 -0700 Message-ID: <55CBE3A5.1070206@tlinx.org> Date: Wed, 12 Aug 2015 17:24:05 -0700 From: "L.A. Walsh" User-Agent: Thunderbird MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: why crc req on free-inobt & file-type-indir options? References: <55C41D75.4040504@tlinx.org> <55C43B70.4050300@sandeen.net> <55C468F0.2040707@tlinx.org> <20150807225531.GG3902@dastard> X-ASG-Orig-Subj: Re: why crc req on free-inobt & file-type-indir options? In-Reply-To: <20150807225531.GG3902@dastard> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1439425452 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words (re: timelag: It took me a few revisions to get this out..) Dave Chinner wrote: > Can you please ensure that you are running an up-to-date xfsprogs > and not some mix-and-match of different versions with differing > feature support capabilities? ---- Will the latest version allow me to specify finobt=1, ftype=1 && projid32bit=0 with crc=1? I'm pretty sure I don't have a version of xfs_admin that disallows setting the GUID in the presence of a mkfs.xfs that does. As to how they would get mismatched, I have "/" on a different partition from "/usr" (among others). My distro has been moving files from "/" -> /usr primarily the bin & lib dirs. xfs_admin in their setup was in /usr/sbin/ before this "move", while mkfs.xfs was in /sbin (along with xfs_repair and fsck.xfs). They have been "supporting the old paths by moving the binaries under /usr, while putting symlinks from progs like "/bin/mount" -> "/usr/bin/mount". On systems like mine, that would result in system that boots but can't mount any other file systems. So wrote script that detected "mount order", and dereferenced unsafe symlinks that pointed to file systems later in the mount order. Since the xfsprogs were split, and I hadn't gotten around to inspecting date-stamps on binaries (I *did* manage to do version checks on libraries, as mount's libraries were moved to /usr/lib64 before mount was -- so the /bin/mount wouldn't load w/o /usr mounted. There's also the fact that I've tried to keep the mkfs & xfsrestore utils on the rootfs -- since that's allowed me to recover/restore /usr and /var partitions that have gone belly up, but backups and such aren't that important to most people, it seems. Also, needless to say, suse couldn't move from /usr to "/", because "/" is now on device /dev/rootfs, so programs and users won't easily know when they are running in a "container" or "virtualized" root. Anyway, this move has caused a few headaches and not just to me. As for the 'crc' option: I wouldn't mind having the 'crc option being a default' just as 'recovery' and 'uuid' are default -- I.e. allow mounting a crc-fs w/o crc checks -- so a known bad disk can still have data recovered from it. It seems the ability to make a file system with crc=0 while other options (finobt ftype) can be on would be a pre-rerequisite for allowing that at *mount* time (in addition to mkfs time). I use norecovery, to mount 'temporary' snapshots as I know, the logs may be out-of-sync with the contents, but for my purposes that's never been a problem. Since it seems that 'ftype' is headed toward crc-independence, and finobt (I think) is hoped to be more efficient for free space allocation, -- just how much metadata is normally associated with free space (i.e. normally I think of time/date/access/ext_attrs as metadata)? I keep trying to keep my xfs-repair and restore utils on my rootfs (whether it has /usr on it or not), since, more than once I've been able to restore a /usr or /var from the rootfs alone. From david@fromorbit.com Wed Aug 12 19:44:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1F9807F54 for ; Wed, 12 Aug 2015 19:44:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0DE78F804B for ; Wed, 12 Aug 2015 17:44:46 -0700 (PDT) X-ASG-Debug-ID: 1439426682-04bdf06bd132a100001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0MsQAQpMuFITDVKB for ; Wed, 12 Aug 2015 17:44:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ATDADi58tVPBkyLHlDGoMbVGmqHgEBAQEBB4pLinIMhGeBCgICAQECgT9NAQEBAQEBBwEBAQFBP4QjAQEBAwEBAQE3HBgLBQsIAw4GBAklDwUTEgMHGhOIJgcOPNAYAQsBHxmGB4QwgQOBPQGBL4E5EQFRB4QsBYcaAoU9gSuEB4MIhQSHZYFNRoNhgxmRB4I0DQ8VgVAsMwGBDYE+AQEB Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Aug 2015 10:14:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZPgdH-0008VH-Ql; Thu, 13 Aug 2015 10:44:35 +1000 Date: Thu, 13 Aug 2015 10:44:35 +1000 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com, tj@kernel.org, axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150813004435.GN3902@dastard> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439426682 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 BSF_SC0_SA085 Custom Rule SA085 [cc linux-fsdevel because it looks like a sync regression in the generic writeback code. Also, not trimming away original email so people can read it in full. ] On Wed, Aug 12, 2015 at 06:12:04PM +0800, Eryu Guan wrote: > Hi all, > > I've been seeing generic/04[89] fails on XFS since 4.2-rc1 from time to > time, but the failure isn't reproduced on every test host. Recently I > finally got a host that could reproduce the failure reliably. > > It's a regression since 4.1 kernel based on my tests, 4.1 kernel passed > the tests and the failures showed up starting from 4.2-rc1. I've seen this failure twice on one of my 1p/1GB RAM VMs in the past couple of weeks running 4.2-rc4 and 4.2-rc6, but I haven't been able to reproduce it reliably (2 failures in ~50 runs on the VM) so haven't been able to track down the cause. I even thought yesterday I should ask and see if anyone else is seeing this test fail occasionally, but then shit happened around here.... It might be a couple of days before I really get a chance to dig into this, so it might be best if Tejun can look into it first. Cheers, Dave. > What xfstests generic/04[89] test is > > [root@dhcp-66-86-11 xfstests]# ./lsqa.pl tests/generic/04[89] > FSQA Test No. 048 > > Test for NULL files problem > test inode size is on disk after sync > > -------------------------------------------------- > FSQA Test No. 049 > > Test for NULL files problem > test inode size is on disk after sync - expose log replay bug > > -------------------------------------------------- > > And the failure is like (test files have zero size) > > root@dhcp-66-86-11 xfstests]# ./check generic/048 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 dhcp-66-86-11 4.2.0-rc5 > MKFS_OPTIONS -- -f -bsize=4096 /dev/sda6 > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/sda6 /mnt/testarea/scratch > > generic/048 28s ... - output mismatch (see /root/xfstests/results//generic/048.out.bad) > --- tests/generic/048.out 2015-07-16 17:28:15.800000000 +0800 > +++ /root/xfstests/results//generic/048.out.bad 2015-08-12 18:04:52.923000000 +0800 > @@ -1 +1,32 @@ > QA output created by 048 > +file /mnt/testarea/scratch/969 has incorrect size - sync failed > +file /mnt/testarea/scratch/970 has incorrect size - sync failed > +file /mnt/testarea/scratch/971 has incorrect size - sync failed > +file /mnt/testarea/scratch/972 has incorrect size - sync failed > +file /mnt/testarea/scratch/973 has incorrect size - sync failed > +file /mnt/testarea/scratch/974 has incorrect size - sync failed > ... > > > And I bisected to the following commit > > commit e79729123f6392b36450113c6c52074b7d389c85 > Author: Tejun Heo > Date: Fri May 22 17:13:48 2015 -0400 > > writeback: don't issue wb_writeback_work if clean > > There are several places in fs/fs-writeback.c which queues > wb_writeback_work without checking whether the target wb > (bdi_writeback) has dirty inodes or not. The only thing > wb_writeback_work does is writing back the dirty inodes for the target > wb and queueing a work item for a clean wb is essentially noop. There > are some side effects such as bandwidth stats being updated and > triggering tracepoints but these don't affect the operation in any > meaningful way. > > This patch makes all writeback_inodes_sb_nr() and sync_inodes_sb() > skip wb_queue_work() if the target bdi is clean. Also, it moves > dirtiness check from wakeup_flusher_threads() to > __wb_start_writeback() so that all its callers benefit from the check. > > While the overhead incurred by scheduling a noop work isn't currently > significant, the overhead may be higher with cgroup writeback support > as we may end up issuing noop work items to a lot of clean wb's. > > Signed-off-by: Tejun Heo > Cc: Jens Axboe > Cc: Jan Kara > Signed-off-by: Jens Axboe > > > Attachments are my xfstests config file and host info requested by > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > If you need more info please let me know. > > Thanks, > Eryu > It's a RHEL7 kvm guest running on RHEL6.6 with 8G mem and 4 vcpus. > > The disk configuration in guest xml is > > > > > > >
> > > [root@dhcp-66-86-11 ~]# grep -c proc /proc/cpuinfo > 4 > [root@dhcp-66-86-11 ~]# cat /proc/meminfo > MemTotal: 7912932 kB > MemFree: 7547480 kB > MemAvailable: 7599440 kB > Buffers: 944 kB > Cached: 219292 kB > SwapCached: 0 kB > Active: 170072 kB > Inactive: 106352 kB > Active(anon): 56476 kB > Inactive(anon): 8384 kB > Active(file): 113596 kB > Inactive(file): 97968 kB > Unevictable: 0 kB > Mlocked: 0 kB > SwapTotal: 8257532 kB > SwapFree: 8257532 kB > Dirty: 42556 kB > Writeback: 0 kB > AnonPages: 56020 kB > Mapped: 33008 kB > Shmem: 8552 kB > Slab: 42520 kB > SReclaimable: 18648 kB > SUnreclaim: 23872 kB > KernelStack: 2336 kB > PageTables: 3280 kB > NFS_Unstable: 0 kB > Bounce: 0 kB > WritebackTmp: 0 kB > CommitLimit: 12213996 kB > Committed_AS: 260636 kB > VmallocTotal: 34359738367 kB > VmallocUsed: 26336 kB > VmallocChunk: 34359623680 kB > HardwareCorrupted: 0 kB > AnonHugePages: 12288 kB > HugePages_Total: 0 > HugePages_Free: 0 > HugePages_Rsvd: 0 > HugePages_Surp: 0 > Hugepagesize: 2048 kB > DirectMap4k: 69620 kB > DirectMap2M: 8318976 kB > [root@dhcp-66-86-11 ~]# cat /proc/mounts > proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 > sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0 > devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=3943408k,nr_inodes=985852,mode=755 0 0 > securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0 > tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0 > devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 > tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0 > tmpfs /sys/fs/cgroup tmpfs rw,seclabel,nosuid,nodev,noexec,mode=755 0 0 > cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0 > pstore /sys/fs/pstore pstore rw,seclabel,nosuid,nodev,noexec,relatime 0 0 > cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 > cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0 > cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 > cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 > cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 > cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 > cgroup /sys/fs/cgroup/net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls 0 0 > cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0 > cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0 > configfs /sys/kernel/config configfs rw,relatime 0 0 > /dev/sda3 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 > selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 > systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 > debugfs /sys/kernel/debug debugfs rw,seclabel,relatime 0 0 > hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0 > mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0 > /dev/sda1 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 > /dev/sda6 /mnt/testarea/scratch xfs rw,context=system_u:object_r:nfs_t:s0,relatime,attr2,inode64,noquota 0 0 > /dev/sda5 /mnt/testarea/test xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 > [root@dhcp-66-86-11 ~]# cat /proc/partitions > major minor #blocks name > > 8 0 314572800 sda > 8 1 512000 sda1 > 8 2 8257536 sda2 > 8 3 52428800 sda3 > 8 4 1 sda4 > 8 5 15728640 sda5 > 8 6 15728640 sda6 > 8 7 15728640 sda7 > 8 8 15728640 sda8 > 8 9 15728640 sda9 > 8 10 15728640 sda10 > 8 11 15728640 sda11 > 8 16 104857600 sdb > 8 17 104856576 sdb1 > [root@dhcp-66-86-11 ~]# lvs > [root@dhcp-66-86-11 ~]# > TEST_DEV=/dev/sda5 > TEST_DIR=/mnt/testarea/test # mount point of TEST PARTITION > SCRATCH_MNT=/mnt/testarea/scratch # mount point for SCRATCH PARTITION > SCRATCH_DEV=/dev/sda6 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 12 20:29:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C66B77F54 for ; Wed, 12 Aug 2015 20:29:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 721F0AC003 for ; Wed, 12 Aug 2015 18:29:47 -0700 (PDT) X-ASG-Debug-ID: 1439429384-04bdf06bd032bfd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ZPEawrtWkFOQ6qRP for ; Wed, 12 Aug 2015 18:29:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CUCQCo8stVPBkyLHldgxuBPYJWg3yjTgEBAQEGmz8CAgEBAoFBTQEBAQEBAQcBAQEBQT+EIwEBAQMBJxMcIwULCAMOCgklDwUlAwcaE4gmB9BJAQEBBwIBHxmGB4UzhQkHhCwFjFqIP4xpmiGCMR+BZSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Aug 2015 10:59:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZPhKu-00008I-Ti; Thu, 13 Aug 2015 11:29:40 +1000 Date: Thu, 13 Aug 2015 11:29:40 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: Fix attr leaf block definition Message-ID: <20150813012940.GO3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: Fix attr leaf block definition References: <1439387594-8747-1-git-send-email-jack@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439387594-8747-1-git-send-email-jack@suse.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439429384 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21552 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 12, 2015 at 03:53:14PM +0200, Jan Kara wrote: > struct xfs_attr_leafblock contains 'entries' array which is declared > with size 1 altough it can in fact contain much more entries. Since this > array is followed by further struct members, gcc (at least in version > 4.8.3) thinks that the delared size of the array is the real one and > thus optimizes away all accesses beyond the end of array resulting in > non-working code. What are the symptoms displayed by this "non-working code"? I'm using 4.9.3 (more recent than 4.8.3) for all my kernel and xfsprogs testing, and I'm not seeing any issues.... > Signed-off-by: Jan Kara > --- > include/xfs_da_format.h | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/include/xfs_da_format.h b/include/xfs_da_format.h > index 11f142078e12..39bfeb042844 100644 > --- a/include/xfs_da_format.h > +++ b/include/xfs_da_format.h > @@ -1180,8 +1180,14 @@ typedef struct xfs_attr_leaf_name_remote { > typedef struct xfs_attr_leafblock { > xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ > xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ > + /* > + * Definitions below are commented out so that gcc doesn't optimize > + * away accesses into 'entries' for indexes larger than 1 > + */ > +#if 0 > xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ > xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ > +#endif > } xfs_attr_leafblock_t; So this same declaration is in the kernel code. FWIW, if you look at the struct xfs_attr3_leafblock, this structure is declared like this: struct xfs_attr3_leafblock { struct xfs_attr3_leaf_hdr hdr; struct xfs_attr_leaf_entry entries[1]; /* * The rest of the block contains the following structures after the * leaf entries, growing from the bottom up. The variables are never * referenced, the locations accessed purely from helper functions. * * struct xfs_attr_leaf_name_local * struct xfs_attr_leaf_name_remote */ }; This situation is the same - the xfs_attr_leafblock variables are only accessed by helper functions that return pointers. Can you modify the declaration to match the xfs_attr3_leafblock declaration? FWIW, if gcc 4.8.3 is producing non-working xfsprogs code due to these declarations, then I have to wonder if it is also generating bad kernel code. There's also a bigger issue: XFS uses the array[1] declaration technique for several variable size structures across the code base. Are all of these declarations resulting in gcc 4.8.3 doing the wrong thing? Or does the problem only manifest when the array definition is followed by more variables? If the problem does not manifest in the second case, why is this inconsistency not considered a broken compiler optimisation? Hence I'm guessing we need to convert all the "array[1]" definitions for variable sized arrays in XFS structures to "array[]" to avoid gcc making wrong assumptions about the code? i.e: all of these in kernel space: $ git grep "\[1\];" fs/xfs/*.h fs/xfs/*/*.h fs/xfs/libxfs/xfs_attr_sf.h: __uint8_t nameval[1]; /* name & value bytes concatenated */ fs/xfs/libxfs/xfs_attr_sf.h: } list[1]; /* variable sized array */ fs/xfs/libxfs/xfs_da_format.h: __u8 nameval[1]; /* name/value bytes */ fs/xfs/libxfs/xfs_da_format.h: __u8 name[1]; /* name bytes */ fs/xfs/libxfs/xfs_da_format.h: xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ fs/xfs/libxfs/xfs_da_format.h: struct xfs_attr_leaf_entry entries[1]; fs/xfs/libxfs/xfs_log_format.h: xfs_extent_t efi_extents[1]; /* array of extents to free */ fs/xfs/libxfs/xfs_log_format.h: xfs_extent_32_t efi_extents[1]; /* array of extents to free */ fs/xfs/libxfs/xfs_log_format.h: xfs_extent_64_t efi_extents[1]; /* array of extents to free */ fs/xfs/libxfs/xfs_log_format.h: xfs_extent_t efd_extents[1]; /* array of extents freed */ fs/xfs/libxfs/xfs_log_format.h: xfs_extent_32_t efd_extents[1]; /* array of extents freed */ fs/xfs/libxfs/xfs_log_format.h: xfs_extent_64_t efd_extents[1]; /* array of extents freed */ fs/xfs/xfs_attr.h: __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */ fs/xfs/xfs_attr.h: char a_name[1]; $ And all of those plus a couple more in userspace.... ---- FWIW, I'm getting quite worried by the reports over the past year or so about different versions of gcc compilers that produce "non-working" XFS code. e.g. the ARM do_div() kernel bug that only manifests on certain compiler versions with certain optimisation options, the reports of certain versions of gcc intel->arm cross-compilers producing broken code, etc. I used to not have to think about whether the compiler generated good code or not - if we now have to start considering that the compiler is equally suspect as a random user's hardware then we're being put in a really, really bad situation here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 12 20:32:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8FACE7F54 for ; Wed, 12 Aug 2015 20:32:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1598CAC005 for ; Wed, 12 Aug 2015 18:32:49 -0700 (PDT) X-ASG-Debug-ID: 1439429566-04cbb0416f36d0e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XKhGTh6QIbmj5N0c for ; Wed, 12 Aug 2015 18:32:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CwEQCo8stVPBkyLHldgxtUaYJWpzwOAQEBAQaVToVxBAICgUFNAQEBAQEBBwEBAQFBP0EDg2ABAQQ6HCMQCAMOCgklDwUlAwcaE4gtDtA7AQsgGYYHhTOFCQeELAWVGYUEh2WCE5gOgjQcgWUsMwEBAQGCSAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Aug 2015 11:02:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZPhNs-00008b-Rr; Thu, 13 Aug 2015 11:32:44 +1000 Date: Thu, 13 Aug 2015 11:32:44 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-ID: <20150813013244.GP3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-2-git-send-email-david@fromorbit.com> <20150812072635.GA32399@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150812072635.GA32399@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439429566 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21552 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 12, 2015 at 12:26:35AM -0700, Christoph Hellwig wrote: > Introducing this separate from the actual users is a bit odd to follow. > Compare to my patch from a few years ago: > > http://thread.gmane.org/gmane.comp.file-systems.xfs.general/39030/focus=39009 I completely forgot you did this. I'll go back and look at it and see what I can pull from it. Thanks for the reminder, Christoph. Cheers, Dave. -- Dave Chinner david@fromorbit.com From lrhorer@mygrande.net Thu Aug 13 01:21:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF5F87F50 for ; Thu, 13 Aug 2015 01:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9CF208F8035 for ; Wed, 12 Aug 2015 23:21:32 -0700 (PDT) X-ASG-Debug-ID: 1439446888-04bdf06bd1339b90001-NocioJ Received: from mail01.lsn.net (mail01.lsn.net [66.90.130.120]) by cuda.sgi.com with ESMTP id O9SGInVwAGDEpDed for ; Wed, 12 Aug 2015 23:21:29 -0700 (PDT) X-Barracuda-Envelope-From: lrhorer@mygrande.net X-Barracuda-Apparent-Source-IP: 66.90.130.120 Received: from [192.168.1.121] (66-90-232-145.dyn.grandenetworks.net [66.90.232.145]) (authenticated bits=0) by mail01.lsn.net (8.14.4/8.13.6) with ESMTP id t7D6LFwU019833 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 13 Aug 2015 01:21:16 -0500 X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.98.4 at av02.lsn.net Message-ID: <55CC375C.10902@mygrande.net> Date: Thu, 13 Aug 2015 01:21:16 -0500 From: Leslie Rhorer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: Brian Foster , Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <03864DDC681E664EBF5D47682BE7D7CF0D358740@USADCWVEMBX07.corp.global.level3.com> <55AAF73A.4040903@mygrande.net> <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55C8006C.8070807@mygrande.net> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail01.lsn.net[66.90.130.120] X-Barracuda-Start-Time: 1439446888 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The compressed tarball containing the dump file and the image are on my web site. http://fletchergeek.com/images/metadump.tar.gz It's 22G in size. On 8/9/2015 8:37 PM, Leslie Rhorer wrote: > Well, nice try, but it doesn't wash for several reasons: > > 1. Power supply issues would be highly unlikely to be the cause of such > a highly specific failure at always a very specific point in a process. > Problems would crop up all over the place, not just with one, very > specific failure. While I am thinking of it, I also ran memtest86+ > again on the new memory. It passed all tests with flying colors. > > 2. The system has not been under a heavy load when this happens. In > fact, it's piddling. Rsync and tar are single threaded, eating up at > most 1 CPU core at a time. I have processes that can regularly bang all > 8 cores right to the wall with no errors. The I/O stream is even more > piddling. Rsync is transferring nearly 120 MBps (it's a 1G link) during > the process, and some portions of the tar process can bang out well over > 2Gbps. Creating a directory is nothing. > > 3. All the power supply rails are nominal - I checked. > > 4. Most damning of all, I am able to reproduce the issue, now, on > another machine. I'm not entirely sure why creating the image on one > partition and then copying it to the root or across the LAN stopped it > from failing, but I took the 1.5T drive and moved it to the backup > machine, which as I related earlier is nearly identical in hardware and > highly similar in software to the primary system. It's failing there > repeatedly and consistently: > > RR274x/Driver/Freebsd/rr274x_3x-bsd-8.0-v1.0.10.0712.tgz > RR274x/Driver/Linux/ > RR274x/Driver/Linux/Debian/ > tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Structure needs cleaning > RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/ > tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Input/output error > tar: RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386: Cannot > mkdir: No such file or directory > RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/boot/ > tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Input/output error > tar: RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/boot: Cannot > mkdir: No such file or directory > RR274x/Driver/Linux/Debian/rr274x_3x-debian-5.0.1-i386/boot/rr274x_3x2.6.26-2-486i386.ko.gz > > tar: RR274x/Driver/Linux/Debian: Cannot mkdir: Input/output error > > gzip: stdin: Input/output error > tar: Unexpected EOF in archive > tar: RR274x/Driver/Linux: Cannot utime: Input/output error > tar: RR274x/Driver/Linux: Cannot change ownership to uid 0, gid 1000: > Input/output error > tar: RR274x/Driver/Linux: Cannot change mode to rwxr-xr-x: Input/output > error > tar: RR274x/Driver: Cannot utime: Input/output error > tar: RR274x/Driver: Cannot change ownership to uid 0, gid 1000: > Input/output error > tar: RR274x/Driver: Cannot change mode to rwxr-xr-x: Input/output error > tar: RR274x: Cannot utime: Input/output error > tar: RR274x: Cannot change ownership to uid 0, gid 1000: Input/output error > tar: RR274x: Cannot change mode to rwxr-xr-x: Input/output error > tar: Error is not recoverable: exiting now > > > dmesg: > [26743.775522] XFS (sdk): Mounting V4 Filesystem > [26743.904281] XFS (sdk): Ending clean mount > [26743.912614] Loading kernel module for a network device with > CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev- instead. > > > > [26772.528827] loop: module loaded > [26772.601043] XFS (loop0): Mounting V4 Filesystem > [26772.764360] XFS (loop0): Ending clean mount > [26772.770627] Loading kernel module for a network device with > CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev- instead. > > > > [26899.019942] XFS (loop0): xfs_iread: validation failed for inode > 124656869424 failed > [26899.019952] ffff8800b473e000: 49 4e 00 00 03 02 00 00 00 30 00 70 00 > 00 03 e8 IN.......0.p.... > [26899.019957] ffff8800b473e010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 00 > 00 00 16 ..... .o........ > [26899.019960] ffff8800b473e020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c 00 > 00 00 20 .W7.+]"...a.... > [26899.019964] ffff8800b473e030: ff ff 00 d2 1b f6 27 90 00 00 00 00 00 > 00 00 00 ......'......... > [26899.019993] XFS (loop0): Internal error xfs_iread at line 392 of file > /build/linux-u5KAtC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. Caller > xfs_iget+0x24b/0x690 [xfs] > [26899.020000] CPU: 6 PID: 3756 Comm: tar Not tainted 3.16.0-4-amd64 #1 > Debian 3.16.7-ckt11-1+deb8u2 > [26899.020004] Hardware name: To be filled by O.E.M. To be filled by > O.E.M./SABERTOOTH 990FX R2.0, BIOS 0803 08/15/2012 > [26899.020007] 0000000000000001 ffffffff8150b3d5 ffff8800065b9800 > ffffffffa06bd5cb > [26899.020014] 0000018800000010 ffffffffa06c2f6b ffff88000a680400 > ffff8800065b9800 > [26899.020019] 0000000000000075 ffff88000527f140 ffffffffa0708b3a > ffffffffa06c2f6b > [26899.020024] Call Trace: > [26899.020034] [] ? dump_stack+0x41/0x51 > [26899.020052] [] ? xfs_corruption_error+0x5b/0x80 [xfs] > [26899.020069] [] ? xfs_iget+0x24b/0x690 [xfs] > [26899.020090] [] ? xfs_iread+0xea/0x400 [xfs] > [26899.020106] [] ? xfs_iget+0x24b/0x690 [xfs] > [26899.020124] [] ? xfs_iget+0x24b/0x690 [xfs] > [26899.020146] [] ? xfs_ialloc+0xa6/0x500 [xfs] > [26899.020192] [] ? kmem_zone_alloc+0x6e/0xe0 [xfs] > [26899.020215] [] ? xfs_dir_ialloc+0x62/0x2a0 [xfs] > [26899.020237] [] ? xfs_trans_reserve+0x1f5/0x200 [xfs] > [26899.020261] [] ? xfs_create+0x489/0x700 [xfs] > [26899.020267] [] ? kern_path_create+0xaa/0x190 > [26899.020286] [] ? xfs_generic_create+0xca/0x250 [xfs] > [26899.020292] [] ? vfs_mkdir+0xb0/0x160 > [26899.020296] [] ? SyS_mkdirat+0xab/0xe0 > [26899.020303] [] ? > system_call_fast_compare_end+0x10/0x15 > [26899.020307] XFS (loop0): Corruption detected. Unmount and run xfs_repair > [26899.020337] XFS (loop0): Internal error xfs_trans_cancel at line 959 > of file /build/linux-u5KAtC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. > Caller xfs_create+0x2b2/0x700 [xfs] > [26899.020342] CPU: 6 PID: 3756 Comm: tar Not tainted 3.16.0-4-amd64 #1 > Debian 3.16.7-ckt11-1+deb8u2 > [26899.020345] Hardware name: To be filled by O.E.M. To be filled by > O.E.M./SABERTOOTH 990FX R2.0, BIOS 0803 08/15/2012 > [26899.020347] 000000000000000c ffffffff8150b3d5 ffff88000527f140 > ffffffffa06d1e07 > [26899.020354] ffff88000a729800 ffff8800066e3ec8 ffff8800065b9800 > ffffffffa07037d2 > [26899.020359] 0000000000000001 ffff8800066e3e20 ffff8800066e3e1c > ffff8800066e3eb0 > [26899.020364] Call Trace: > [26899.020370] [] ? dump_stack+0x41/0x51 > [26899.020388] [] ? xfs_trans_cancel+0xc7/0xf0 [xfs] > [26899.020409] [] ? xfs_create+0x2b2/0x700 [xfs] > [26899.020414] [] ? kern_path_create+0xaa/0x190 > [26899.020432] [] ? xfs_generic_create+0xca/0x250 [xfs] > [26899.020437] [] ? vfs_mkdir+0xb0/0x160 > [26899.020442] [] ? SyS_mkdirat+0xab/0xe0 > [26899.020447] [] ? > system_call_fast_compare_end+0x10/0x15 > [26899.020454] XFS (loop0): xfs_do_force_shutdown(0x8) called from line > 960 of file /build/linux-u5KAtC/linux-3.16.7-ckt11/fs/xfs/xfs_trans.c. > Return address = 0xffffffffa06d1e20 > [26899.407181] XFS (loop0): Corruption of in-memory data detected. > Shutting down filesystem > [26899.407190] XFS (loop0): Please umount the filesystem and rectify the > problem(s) > [26923.319559] XFS (loop0): xfs_log_force: error 5 returned. > > > > Xfs_repair still reports no faults. I'm compressing the dump file and > image file right now to be posted on http:/flethergeek.com/images when > it is done, but it is taking a very long time. I'll also try > decompresssing the image to the other array to see if it still fails > before I upload the file. 'No point in uploading if putting it through > the compression process results in an image that does not fail. > > On 8/4/2015 5:42 PM, Dave Chinner wrote: >> On Tue, Aug 04, 2015 at 02:52:33AM -0500, Leslie Rhorer wrote: >>> It's failing, again. The rsync job failed and when I attempt to >>> untar the file in the image mount, it fails there, as well. See >>> below. I formatted a 1.5T drive as xfs and mounted it under /media. >>> I then dumped the failing FS to a file on /media using xfs_metadump >>> and used xfs_mdrestore to create an image of the FS. I then mounted >>> the image, copied over the tarball to its location, and ran tar to >>> extract the files: >>> >>> [131874.545344] loop: module loaded >>> [131874.549914] XFS (loop0): Mounting V4 Filesystem >> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >> >>> [131874.555540] XFS (loop0): Ending clean mount >>> [132020.964431] XFS (loop0): xfs_iread: validation failed for inode >>> 124656869424 failed >>> [132020.964435] ffff88028b078000: 49 4e 00 00 03 02 00 00 00 30 00 70 >>> 00 00 03 e8 IN.......0.p.... >>> [132020.964437] ffff88028b078010: 00 00 00 00 06 20 b0 6f 01 2e 00 00 >>> 00 00 00 16 ..... .o........ >>> [132020.964438] ffff88028b078020: 01 57 37 fd 2b 5d 22 9e 1e 0a 61 8c >>> 00 00 00 20 .W7.+]"...a.... >>> [132020.964440] ffff88028b078030: ff ff 00 d2 1b f6 27 90 00 00 00 00 >>> 00 00 00 00 ......'......... >>> [132020.964454] XFS (loop0): Internal error xfs_iread at line 392 of >>> file /build/linux-QZaPpC/linux-3.16.7-ckt11/fs/xfs/xfs_inode_buf.c. >>> Caller xfs_iget+0x24b/0x690 [xfs] >> >> That's a different error to all the ones you've previously posted. >> This is an inode allocation that has found a bad inode on disk. >> >> Decoding the 64 bytes above: >> >> di_magic = 0x494e >> di_mode = 0 >> di_version = 3 <<< That's *wrong* >> di_format = 2 >> di_onlink = 0 >> di_uid = 0x300070 <<< Looks unlikely >> di_gid = 0x3e8 >> ---- >> di_nlink = 0 >> di_projlo = 0x620 <<< should be zero >> di_projhi = 0xb06f <<< should be zero >> di_pad[6] = 0x1 0x2e 0 0 0 0 <<< should be zero >> di_flushiter = 0x16 <<< should be zero for v3 inode >> --- >> di_atime >> di_mtime >> di_ctime >> di_size = 0x20ffff00d2 <<< should be zero >> ---- >> di_nblocks = 0x1bf6279000000000 <<< should be zero >> di_extsize = 0 >> ---- >> >> You've just created and mounted a v4 filesystem, which means it is >> using v2 inodes. This inode read back as a v3 inode, with lots of >> crap in places where there should be zeros for either v2 or v3 inodes. >> >> This does not look like a filesystem problem - it's clear that what >> has come from disk (or a cached memory buffer) is full of garbage >> and contains invalid configuration, and the filesystem has quite >> correctly detected the corruption and shut down. The filesystem >> would give the same errors if it tried to *write* such a corrupt >> block, so we know what was just been detected has not come from the >> filesytem code... >> >> FWIW, I've occasionally seen this sort of thing happen when a power >> supply had gone bad - it wasn't bad enough to make things fail, it >> ust caused transient issues under load that manifest as corruptions >> and crashes. Given that you've already found one set of hardware >> problems and the corruption patterns are unlike any >> filesystem/storage problem I've ever seen, I'd suggest that you >> still have some kind of hardware issue... >> >> Cheers, >> >> Dave. >> > From BATV+a1229740eb3c8dbf1894+4372+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 13 01:53:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3011D7F50 for ; Thu, 13 Aug 2015 01:53:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AC07BAC00A for ; Wed, 12 Aug 2015 23:53:02 -0700 (PDT) X-ASG-Debug-ID: 1439448779-04cb6c673e401670001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ECIHQkBF7PNAZ1j6 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 12 Aug 2015 23:52:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a1229740eb3c8dbf1894+4372+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPmNm-0000kY-TK; Thu, 13 Aug 2015 06:52:58 +0000 Date: Wed, 12 Aug 2015 23:52:58 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-ID: <20150813065258.GA677@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-2-git-send-email-david@fromorbit.com> <20150812072635.GA32399@infradead.org> <20150813013244.GP3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813013244.GP3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439448779 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.10 X-Barracuda-Spam-Status: No, SCORE=2.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 2.00 BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL Custom Rule HREF_FROM_MISMATCH_TEXT_URIx1_HL On Thu, Aug 13, 2015 at 11:32:44AM +1000, Dave Chinner wrote: > > http://thread.gmane.org/gmane.comp.file-systems.xfs.general/39030/focus=39009 > > I completely forgot you did this. I'll go back and look at it > and see what I can pull from it. Thanks for the reminder, Christoph. As far as I can tell your new version is superior in all aspects except for the patch split :) From eguan@redhat.com Thu Aug 13 02:01:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C006C7F50 for ; Thu, 13 Aug 2015 02:01:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 547F4AC004 for ; Thu, 13 Aug 2015 00:01:28 -0700 (PDT) X-ASG-Debug-ID: 1439449283-04cbb0416e383ea0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CVCzGzNjewkOs19W (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 00:01:24 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id AA1C8AB0 for ; Thu, 13 Aug 2015 07:01:23 +0000 (UTC) Received: from localhost (dhcp-12-142.nay.redhat.com [10.66.12.142]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7D71LYb027529; Thu, 13 Aug 2015 03:01:22 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] repair: fix wrong logic when validating node magic number Date: Thu, 13 Aug 2015 15:01:16 +0800 X-ASG-Orig-Subj: [PATCH] repair: fix wrong logic when validating node magic number Message-Id: <1439449276-1699-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439449284 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Magic number is wrong only when != XFS_DA_NODE_MAGIC and != XFS_DA3_NODE_MAGIC. This is triggered by shared/002 when testing 512 block size XFS. Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 bad magic number febe in block 64 (108) for directory inode 35 ...... Fix it by changing "||" to "&&". Signed-off-by: Eryu Guan --- repair/attr_repair.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 62f80e7..83a07a8 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -570,7 +570,7 @@ verify_da_path(xfs_mount_t *mp, * entry count, verify level */ bad = 0; - if (nodehdr.magic != XFS_DA_NODE_MAGIC || + if (nodehdr.magic != XFS_DA_NODE_MAGIC && nodehdr.magic != XFS_DA3_NODE_MAGIC) { do_warn( _("bad magic number %x in block %u (%" PRIu64 ") for directory inode %" PRIu64 "\n"), -- 2.4.3 From BATV+a1229740eb3c8dbf1894+4372+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 13 02:06:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 73D117F50 for ; Thu, 13 Aug 2015 02:06:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02F07AC004 for ; Thu, 13 Aug 2015 00:06:24 -0700 (PDT) X-ASG-Debug-ID: 1439449583-04bdf06bd033aa00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id l0xLVcbBWBsjxawp (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 00:06:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a1229740eb3c8dbf1894+4372+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZPmal-0005W7-2e; Thu, 13 Aug 2015 07:06:23 +0000 Date: Thu, 13 Aug 2015 00:06:23 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: Fix attr leaf block definition Message-ID: <20150813070623.GA15348@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: Fix attr leaf block definition References: <1439387594-8747-1-git-send-email-jack@suse.com> <20150813012940.GO3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813012940.GO3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439449583 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 13, 2015 at 11:29:40AM +1000, Dave Chinner wrote: > This situation is the same - the xfs_attr_leafblock variables are > only accessed by helper functions that return pointers. Can you > modify the declaration to match the xfs_attr3_leafblock declaration? Yes, I think that's the best approach. > FWIW, if gcc 4.8.3 is producing non-working xfsprogs code due to > these declarations, then I have to wonder if it is also generating > bad kernel code. There's also a bigger issue: XFS uses the array[1] > declaration technique for several variable size structures across > the code base. Are all of these declarations resulting in gcc 4.8.3 > doing the wrong thing? Or does the problem only manifest when the > array definition is followed by more variables? > > If the problem does not manifest in the second case, why is this > inconsistency not considered a broken compiler optimisation? > > Hence I'm guessing we need to convert all the "array[1]" > definitions for variable sized arrays in XFS structures to "array[]" > to avoid gcc making wrong assumptions about the code? i.e: all of > these in kernel space: C compilers are moving away from beeing the portable assemblers we (ab)use them for, and add all kinds of optimizations that are questionable from our POV and sometimes make behavior illegal that's required for low level programming. That being said a one element array in the middle of a structure is totally bogus, and I wondered what crack the authors of the code smoked when I killed most of these during the initial btree refactoring and CRC work. That's unlike a one element array at the end of a structure which was the only way to do a variable length array before the [0] GNU extention and [] from C99. I don't expect a compiler to trip over those any time soon, but I'd still prefer to convert them to the modern portable form. I suspect the reason why you can I haven't seen this bug is tht the kernel uses very conservative optimization flags, while Jan probably used some more aggressive SuSE default to compile an xfsprogs package. From eguan@redhat.com Thu Aug 13 02:15:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF7097F50 for ; Thu, 13 Aug 2015 02:15:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C08AF304032 for ; Thu, 13 Aug 2015 00:15:30 -0700 (PDT) X-ASG-Debug-ID: 1439450129-04bdf06bd233adb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NOPvj95OKuIyzCgA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 00:15:29 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id EE137A101A for ; Thu, 13 Aug 2015 07:15:28 +0000 (UTC) Received: from localhost (dhcp-12-142.nay.redhat.com [10.66.12.142]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7D7FPJK031956 for ; Thu, 13 Aug 2015 03:15:26 -0400 Date: Thu, 13 Aug 2015 15:15:24 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: Re: [PATCH] repair: fix wrong logic when validating node magic number Message-ID: <20150813071524.GI17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] repair: fix wrong logic when validating node magic number References: <1439449276-1699-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439449276-1699-1-git-send-email-eguan@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439450129 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 13, 2015 at 03:01:16PM +0800, Eryu Guan wrote: > Magic number is wrong only when != XFS_DA_NODE_MAGIC and > != XFS_DA3_NODE_MAGIC. > > This is triggered by shared/002 when testing 512 block size XFS. > > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - scan filesystem freespace and inode maps... > - found root inode chunk > Phase 3 - for each AG... > - scan (but don't clear) agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > bad magic number febe in block 64 (108) for directory inode 35 > ...... > > Fix it by changing "||" to "&&". > > Signed-off-by: Eryu Guan With this patch applied, shared/002 still fails on 512 block size XFS, full xfs_repair -n output is *** xfs_repair -n output *** Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 problem with attribute contents in inode 35 would clear attr fork bad nblocks 67 for inode 35, would reset to 0 bad anextents 5 for inode 35, would reset to 0 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. *** end xfs_repair output And a simplified reproducer is just adding >= 577 xattrs to file foo on 512 block size XFS, no dmflaky is needed. num_xattrs=577 for ((i = 1; i <= $num_xattrs; i++)); do name="user.attr_$(printf "%04d" $i)" $SETFATTR_PROG -n $name -v "val_$(printf "%04d" $i)" $SCRATCH_MNT/foo done And it's easily reproduced. Thanks, Eryu From jack@suse.cz Thu Aug 13 03:46:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E2DFC7F50 for ; Thu, 13 Aug 2015 03:46:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 604ACAC004 for ; Thu, 13 Aug 2015 01:46:54 -0700 (PDT) X-ASG-Debug-ID: 1439455611-04cbb0416e3865e0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id krnmnPV9GgVrcNgM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 01:46:52 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9F945ADBF; Thu, 13 Aug 2015 08:46:50 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 1C3B282822; Thu, 13 Aug 2015 10:46:47 +0200 (CEST) Date: Thu, 13 Aug 2015 10:46:47 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: Fix attr leaf block definition Message-ID: <20150813084647.GB26599@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: Fix attr leaf block definition References: <1439387594-8747-1-git-send-email-jack@suse.com> <20150813012940.GO3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813012940.GO3902@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439455611 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 13-08-15 11:29:40, Dave Chinner wrote: > On Wed, Aug 12, 2015 at 03:53:14PM +0200, Jan Kara wrote: > > struct xfs_attr_leafblock contains 'entries' array which is declared > > with size 1 altough it can in fact contain much more entries. Since this > > array is followed by further struct members, gcc (at least in version > > 4.8.3) thinks that the delared size of the array is the real one and > > thus optimizes away all accesses beyond the end of array resulting in > > non-working code. > > What are the symptoms displayed by this "non-working code"? I'm > using 4.9.3 (more recent than 4.8.3) for all my kernel and xfsprogs > testing, and I'm not seeing any issues.... Sorry for not revealing all the details. The real failure actually happened with somewhat older version of xfsprogs (3.1.8) to which I was backporting xfs_metadump fixes. The manifestation of the problem was that loop in process_attr_block() was taken only once instead of being taken 'nentries' times. Somehow the code in current xfsprogs is reorganized enough that the same compiler didn't decide to do the optimization. Not sure why but certainly the compiler is allowed to optimize away accesses beyond end of array since they are undefined and gcc heuristics on identifying "struct hack" (flexible sized array) don't trigger when there are further elements in the struct. > > Signed-off-by: Jan Kara > > --- > > include/xfs_da_format.h | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/include/xfs_da_format.h b/include/xfs_da_format.h > > index 11f142078e12..39bfeb042844 100644 > > --- a/include/xfs_da_format.h > > +++ b/include/xfs_da_format.h > > @@ -1180,8 +1180,14 @@ typedef struct xfs_attr_leaf_name_remote { > > typedef struct xfs_attr_leafblock { > > xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ > > xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ > > + /* > > + * Definitions below are commented out so that gcc doesn't optimize > > + * away accesses into 'entries' for indexes larger than 1 > > + */ > > +#if 0 > > xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ > > xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ > > +#endif > > } xfs_attr_leafblock_t; > > So this same declaration is in the kernel code. > > FWIW, if you look at the struct xfs_attr3_leafblock, this > structure is declared like this: > > struct xfs_attr3_leafblock { > struct xfs_attr3_leaf_hdr hdr; > struct xfs_attr_leaf_entry entries[1]; > > /* > * The rest of the block contains the following structures after the > * leaf entries, growing from the bottom up. The variables are never > * referenced, the locations accessed purely from helper functions. > * > * struct xfs_attr_leaf_name_local > * struct xfs_attr_leaf_name_remote > */ > }; > > This situation is the same - the xfs_attr_leafblock variables are > only accessed by helper functions that return pointers. Can you > modify the declaration to match the xfs_attr3_leafblock declaration? Sure I didn't notice the kernel has done it differently. I'll send an updated patch. > FWIW, if gcc 4.8.3 is producing non-working xfsprogs code due to > these declarations, then I have to wonder if it is also generating > bad kernel code. There's also a bigger issue: XFS uses the array[1] > declaration technique for several variable size structures across > the code base. Are all of these declarations resulting in gcc 4.8.3 > doing the wrong thing? Or does the problem only manifest when the > array definition is followed by more variables? So using array[1] for flexible sized array has always been undefined according to C standard but people use it and compiler people kept it working. But it has always been a fuzzy thing - apparently there are heuristics in gcc determining whether array[1] is actually a flexible size array (accesses beyond end are kept) or normal array (accesses beyond end are undefined). When the array is at the end of struct, I'd hope it is always considered a flexible size array (otherwise too much code would break and we'd notice quickly). When the array is in the middle of the struct I can understand that the compiler decided this isn't a flexible size array and started to optimize. > If the problem does not manifest in the second case, why is this > inconsistency not considered a broken compiler optimisation? > > Hence I'm guessing we need to convert all the "array[1]" > definitions for variable sized arrays in XFS structures to "array[]" > to avoid gcc making wrong assumptions about the code? i.e: all of > these in kernel space: Using array[] is definitely a safer option than array[1] since there the behavior is well defined by C99 standard and you don't have to rely on gcc heuristics (similarly safe is also array[0]). > $ git grep "\[1\];" fs/xfs/*.h fs/xfs/*/*.h > fs/xfs/libxfs/xfs_attr_sf.h: __uint8_t nameval[1]; /* name & value bytes concatenated */ > fs/xfs/libxfs/xfs_attr_sf.h: } list[1]; /* variable sized array */ This one is interesting but likely OK... > fs/xfs/libxfs/xfs_da_format.h: __u8 nameval[1]; /* name/value bytes */ > fs/xfs/libxfs/xfs_da_format.h: __u8 name[1]; /* name bytes */ These two are safe. > fs/xfs/libxfs/xfs_da_format.h: xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ Here gcc could optimize I think. > fs/xfs/libxfs/xfs_da_format.h: struct xfs_attr_leaf_entry entries[1]; > fs/xfs/libxfs/xfs_log_format.h: xfs_extent_t efi_extents[1]; /* array of extents to free */ > fs/xfs/libxfs/xfs_log_format.h: xfs_extent_32_t efi_extents[1]; /* array of extents to free */ > fs/xfs/libxfs/xfs_log_format.h: xfs_extent_64_t efi_extents[1]; /* array of extents to free */ > fs/xfs/libxfs/xfs_log_format.h: xfs_extent_t efd_extents[1]; /* array of extents freed */ > fs/xfs/libxfs/xfs_log_format.h: xfs_extent_32_t efd_extents[1]; /* array of extents freed */ > fs/xfs/libxfs/xfs_log_format.h: xfs_extent_64_t efd_extents[1]; /* array of extents freed */ > fs/xfs/xfs_attr.h: __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */ > fs/xfs/xfs_attr.h: char a_name[1]; These are all safe. > ---- > > FWIW, I'm getting quite worried by the reports over the past year or > so about different versions of gcc compilers that produce > "non-working" XFS code. e.g. the ARM do_div() kernel bug that only > manifests on certain compiler versions with certain optimisation > options, the reports of certain versions of gcc intel->arm > cross-compilers producing broken code, etc. > > I used to not have to think about whether the compiler generated > good code or not - if we now have to start considering that the > compiler is equally suspect as a random user's hardware then we're > being put in a really, really bad situation here.... Yeah, compiler issues are bad (it took me the whole morning to figure this particular issue out). The issue is that we sometimes rely on undefined behavior and when compiler people decide how that behaves, we are screwed (and I'm sometimes surprised by the amount of things that are undefined by the standard). Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Aug 13 04:11:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F29747F51 for ; Thu, 13 Aug 2015 04:11:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D211A304032 for ; Thu, 13 Aug 2015 02:11:50 -0700 (PDT) X-ASG-Debug-ID: 1439457108-04cb6c673e404860001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Lcdbhry9kWOL9SMu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 02:11:49 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 15102ADBF; Thu, 13 Aug 2015 09:11:48 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id C76FE82822; Thu, 13 Aug 2015 11:11:43 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: Dave Chinner , Jan Kara Subject: [PATCH] xfsprogs: Fix attr leaf block definition Date: Thu, 13 Aug 2015 11:11:40 +0200 X-ASG-Orig-Subj: [PATCH] xfsprogs: Fix attr leaf block definition Message-Id: <1439457100-19977-1-git-send-email-jack@suse.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439457109 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- struct xfs_attr_leafblock contains 'entries' array which is declared with size 1 altough it can in fact contain much more entries. Since this array is followed by further struct members, gcc (at least in version 4.8.3) thinks that the array has the fixed size of 1 element and thus optimizes away all accesses beyond the end of array resulting in non-working code. In particular this problem was seen with xfsprogs-3.1.8. Signed-off-by: Jan Kara --- include/xfs_da_format.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/xfs_da_format.h b/include/xfs_da_format.h index 11f142078e12..f5e1d9df6a5c 100644 --- a/include/xfs_da_format.h +++ b/include/xfs_da_format.h @@ -1180,8 +1180,15 @@ typedef struct xfs_attr_leaf_name_remote { typedef struct xfs_attr_leafblock { xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ - xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ - xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced and definining them can actually make gcc optimize away + * accesses to the 'entries' array above index 0 so don't do that. + * + * xfs_attr_leaf_name_local_t namelist; + * xfs_attr_leaf_name_remote_t valuelist; + */ } xfs_attr_leafblock_t; /* -- 2.1.4 From jack@suse.cz Thu Aug 13 04:26:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D62C97F54 for ; Thu, 13 Aug 2015 04:26:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0ED2304039 for ; Thu, 13 Aug 2015 02:26:53 -0700 (PDT) X-ASG-Debug-ID: 1439458010-04cbb0416e3875a0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 0YHCaCFcx4YFJzzj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 02:26:51 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 510ABAAC2; Thu, 13 Aug 2015 09:26:50 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 8F47D82822; Thu, 13 Aug 2015 11:26:46 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: Dave Chinner , Jan Kara Subject: [PATCH] xfs: Fix xfs_attr_leafblock definition Date: Thu, 13 Aug 2015 11:26:40 +0200 X-ASG-Orig-Subj: [PATCH] xfs: Fix xfs_attr_leafblock definition Message-Id: <1439458000-28395-1-git-send-email-jack@suse.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439458011 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- struct xfs_attr_leafblock contains 'entries' array which is declared with size 1 altough it can in fact contain much more entries. Since this array is followed by further struct members, gcc (at least in version 4.8.3) thinks that the array has the fixed size of 1 element and thus may optimize away all accesses beyond the end of array resulting in non-working code. This problem was only observed with userspace code in xfsprogs, however it's better to be safe in kernel as well and have matching kernel and xfsprogs definitions. Signed-off-by: Jan Kara --- fs/xfs/libxfs/xfs_da_format.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) This is a kernel version of the xfsprogs patch I've sent a while ago. diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index 74bcbabfa523..b14bbd6bb05f 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -680,8 +680,15 @@ typedef struct xfs_attr_leaf_name_remote { typedef struct xfs_attr_leafblock { xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ - xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ - xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced and definining them can actually make gcc optimize away + * accesses to the 'entries' array above index 0 so don't do that. + * + * xfs_attr_leaf_name_local_t namelist; + * xfs_attr_leaf_name_remote_t valuelist; + */ } xfs_attr_leafblock_t; /* -- 2.1.4 From jtulak@redhat.com Thu Aug 13 06:14:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6CF547F55 for ; Thu, 13 Aug 2015 06:14:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3F68D304032 for ; Thu, 13 Aug 2015 04:14:50 -0700 (PDT) X-ASG-Debug-ID: 1439464484-04bdf06bd0340710001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id myiqjemvWXCidO5E (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 04:14:45 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igfj19 with SMTP id j19so33488303igf.1 for ; Thu, 13 Aug 2015 04:14:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=uKDyQKyO1vFn11vCTNRgJrDCw0lorNORnTEVTvqxm58=; b=YYVpnY4VC6mVBBL6drm69+IM8EbRnchj9U2gyAJ//1l3Ii+3R863PndCkEiWmXQXYe 0PAFnQyD3yZjJ+G2x9DmDf+AZBA4agBH+XwfeQOIgjglqRIh+GBCtRG6aY0FsX+B/N/C nV0+hDdEXOGqfAAF/SjZY00pl/SBdpxeDX7WqriSxt1+nwqyMDPtLGFJluqAc5TPaH3R G5JY2n/iS/KCEjSmm+r3c0M4XPJ+Hz5fX8el8nOB2U7AfqdG2IwMihVJ9OtSK9g58l00 vOs3AjQlFEst+JIiUPCtRgQfmuhFP3kLdKDl2QPg4XZLWtpYX6rm+tHK9/KeybdmQqCQ ZeiA== X-Gm-Message-State: ALoCoQnF7/fWl3RlydxxM3ZLW7mfed50cBQ7gB/SC+sLwJoWRJIqWhA4MBD493yaUhJfF3rOLicF X-Received: by 10.50.79.169 with SMTP id k9mr2155811igx.63.1439464484490; Thu, 13 Aug 2015 04:14:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Thu, 13 Aug 2015 04:14:25 -0700 (PDT) In-Reply-To: <55C4E007.90709@sandeen.net> References: <55C43FBA.1080408@sandeen.net> <20150807113742.GB8322@bfoster.bfoster> <55C4E007.90709@sandeen.net> From: Jan Tulak Date: Thu, 13 Aug 2015 13:14:25 +0200 Message-ID: Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Cc: Brian Foster , xfs-oss Content-Type: multipart/alternative; boundary=089e013a01c843ea15051d2f711b X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1439464484 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e013a01c843ea15051d2f711b Content-Type: text/plain; charset=UTF-8 On Fri, Aug 7, 2015 at 6:42 PM, Eric Sandeen wrote: > > > > > IIRC, I think this is one of the core problems the big mkfs option > > parsing rework that Jan is working on is supposed to fix. > > Yeah, I think so - Jan, if this gets in your way, let us know - > I didn't mean to make your life difficult by fixing little > things while you work. :) Well, I would not mind if the entire codebase froze... :-D But realistically, every time I do git fetch I get so many collisions that one more or less changes nothing. :-) And yes, in my tests I'm trying to cover the arguments order issue too. Cheers, Jan -- Jan Tulak jtulak@redhat.com --089e013a01c843ea15051d2f711b Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

On Fri, Aug 7, 2015 at 6:42 PM, Eric Sandeen <sandeen@sandeen.net> wrote:
>= ;
> >
> > IIRC, I think this is one of the core problems = the big mkfs option
> > parsing rework that Jan is working on is s= upposed to fix.
>
> Yeah, I think so - Jan, if this gets in you= r way, let us know -
> I didn't mean to make your life difficult = by fixing little
> things while you work. =C2=A0:)

Well, I wou= ld not mind if the entire codebase froze... :-D
But realistically, every= time I do git fetch I get so many collisions that one=C2=A0
more or le= ss=C2=A0changes nothing. :-)

And yes, in my tests = I'm trying to cover the arguments order issue too.

=
Cheers,
Jan

--
Jan Tulak
jtulak@redhat.com
--089e013a01c843ea15051d2f711b-- From metco@s433.c4.crucialx.net Thu Aug 13 07:29:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=HTML_IMAGE_ONLY_20, HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F07BA7F59 for ; Thu, 13 Aug 2015 07:29:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E40FAC003 for ; Thu, 13 Aug 2015 05:29:18 -0700 (PDT) X-ASG-Debug-ID: 1439468954-04cb6c673d4091c0001-NocioJ Received: from s433.c4.crucialx.net (s433z.c4.crucialx.net [208.76.246.119]) by cuda.sgi.com with ESMTP id xRmbHB6P1tiffU7h (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 05:29:15 -0700 (PDT) X-Barracuda-Envelope-From: metco@s433.c4.crucialx.net X-Barracuda-Apparent-Source-IP: 208.76.246.119 Received: from metco by s433.c4.crucialx.net with local (Exim 4.85) (envelope-from ) id 1ZPrdA-002VHy-Ic for xfs@oss.sgi.com; Thu, 13 Aug 2015 07:29:12 -0500 To: xfs@oss.sgi.com Subject: IPT Training Center Istanbul Date: Thu, 13 Aug 2015 07:29:12 -0500 X-ASG-Orig-Subj: IPT Training Center Istanbul From: IPT Training Center Message-ID: <5c7ff382190a66f882e6c9192bd0452b@www.wa3ecenter.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.10 (https://github.com/PHPMailer/PHPMailer/) MIME-Version: 1.0 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - s433.c4.crucialx.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [3210 32003] / [47 12] X-AntiAbuse: Sender Address Domain - s433.c4.crucialx.net X-Get-Message-Sender-Via: s433.c4.crucialx.net: authenticated_id: metco/only user confirmed/virtual account not confirmed X-Source: X-Source-Args: /usr/sbin/proxyexec -q -d -s /var/lib/proxyexec/cagefs.sock/socket /bin/cagefs.server X-Source-Dir: wa3ecenter.com:/public_html/marketing X-Barracuda-Connect: s433z.c4.crucialx.net[208.76.246.119] X-Barracuda-Start-Time: 1439468955 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.75 X-Barracuda-Spam-Status: No, SCORE=1.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_ONLY_20, HTML_IMAGE_ONLY_20_2, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21563 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_IMAGE_ONLY_20 BODY: HTML: images with 1600-2000 bytes of words 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.70 HTML_IMAGE_ONLY_20_2 HTML: images with 1600-2000 bytes of words

Greeting From IPT Training Center Istanbul

IPT Training Center's primary focus is on learning and development planning rather than matching participants against a set of criteria. Our practical and interactive approach to courses follows the case study methodology and focuses on clear learning and skills development to meet the ever changing demands of business professionals.

Call Us

+90 (545) 603 65 57
+90 (212) 231 78 82

Address

Taksim Square, Istanbul, Turkey

Email

info@ipt-edu.com

Website

www.ipt-edu.com

From tinguely@sgi.com Thu Aug 13 08:17:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BA7187F61 for ; Thu, 13 Aug 2015 08:17:18 -0500 (CDT) Received: from eagdhcp-232-128.americas.sgi.com (eagdhcp-232-128.americas.sgi.com [128.162.232.128]) by relay2.corp.sgi.com (Postfix) with ESMTP id 878C130404E; Thu, 13 Aug 2015 06:17:15 -0700 (PDT) Message-ID: <55CC98DD.6060700@sgi.com> Date: Thu, 13 Aug 2015 08:17:17 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Jan Kara CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix xfs_attr_leafblock definition References: <1439458000-28395-1-git-send-email-jack@suse.com> In-Reply-To: <1439458000-28395-1-git-send-email-jack@suse.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/13/15 04:26, Jan Kara wrote: > struct xfs_attr_leafblock contains 'entries' array which is declared > with size 1 altough it can in fact contain much more entries. Since this > array is followed by further struct members, gcc (at least in version > 4.8.3) thinks that the array has the fixed size of 1 element and thus > may optimize away all accesses beyond the end of array resulting in > non-working code. This problem was only observed with userspace code in > xfsprogs, however it's better to be safe in kernel as well and have > matching kernel and xfsprogs definitions. > > Signed-off-by: Jan Kara > --- I hit this bug in SLES12 and RHEL7 XFS kernel code. It is the gcc 4.8's new loop optimization routine. A person can bypass it with the option: -fno-aggressive-loop-optimizations but this fixes the source of the problem. Acked-by: Mark Tinguely From jtulak@redhat.com Thu Aug 13 09:07:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9DECF7F6A for ; Thu, 13 Aug 2015 09:07:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D19EAC001 for ; Thu, 13 Aug 2015 07:07:13 -0700 (PDT) X-ASG-Debug-ID: 1439474832-04cb6c673d40bb30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AC4jxFUjxdSYBS0P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 07:07:12 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 1836396C5; Thu, 13 Aug 2015 14:07:12 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DE79WM027273; Thu, 13 Aug 2015 10:07:10 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 06/11] xfsprogs: Add includes required for OS X builds Date: Thu, 13 Aug 2015 16:07:07 +0200 X-ASG-Orig-Subj: [PATCH 06/11] xfsprogs: Add includes required for OS X builds Message-Id: <1439474827-5355-1-git-send-email-jtulak@redhat.com> In-Reply-To: <20150804111841.GE18906@infradead.org> References: <20150804111841.GE18906@infradead.org> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439474832 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UPDATE: updated for libdisk gone Signed-off-by: Jan Tulak --- include/darwin.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index abdf4e3..8b5a661 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -18,12 +18,20 @@ #ifndef __XFS_DARWIN_H__ #define __XFS_DARWIN_H__ +#include +#include +#include #include #include #include #include #include #include +#include +#include +#include +#include +#include #include #define __BYTE_ORDER BYTE_ORDER -- 2.4.5 From jtulak@redhat.com Thu Aug 13 09:08:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CACC87F6C for ; Thu, 13 Aug 2015 09:08:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA74B304032 for ; Thu, 13 Aug 2015 07:08:27 -0700 (PDT) X-ASG-Debug-ID: 1439474905-04cb6c673f40bbb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JFCWGGXBm8lp6gHX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 07:08:25 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 03B024C36E; Thu, 13 Aug 2015 14:08:24 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DE8MsL010419; Thu, 13 Aug 2015 10:08:23 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, Jan Tulak Subject: [PATCH 10/11] xfsprogs: replace obsolete memalign with posix_memalign Date: Thu, 13 Aug 2015 16:08:20 +0200 X-ASG-Orig-Subj: [PATCH 10/11] xfsprogs: replace obsolete memalign with posix_memalign Message-Id: <1439474900-5409-1-git-send-email-jtulak@redhat.com> In-Reply-To: <20150805225703.GY16638@dastard> References: <20150805225703.GY16638@dastard> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439474905 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UPDATE: code format Memalign from was marked obsolete in favor of a posix variant from . So replace all calls and remove includes. This also enhances support on other posix platforms, which doesn't have . Because posix_memalign returns any error as a return code, not in errno, change relevant checks in code (and add a missing one). Signed-off-by: Jan Tulak --- copy/xfs_copy.c | 2 +- db/attrset.c | 2 +- fsr/xfs_fsr.c | 3 ++- include/darwin.h | 1 - include/freebsd.h | 1 - include/gnukfreebsd.h | 1 - include/linux.h | 1 - io/pread.c | 4 ++-- libxfs/rdwr.c | 12 ++++++++---- mkfs/xfs_mkfs.c | 3 ++- repair/incore.c | 2 +- repair/incore_ino.c | 7 ++++--- repair/phase1.c | 2 +- repair/prefetch.c | 7 +++---- repair/sb.c | 10 +++++----- rtcp/xfs_rtcp.c | 7 ++++++- 16 files changed, 36 insertions(+), 29 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index e13f468..8109ac5 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -333,7 +333,7 @@ wbuf * wbuf_init(wbuf *buf, int data_size, int data_align, int min_io_size, int id) { ASSERT(data_size % BBSIZE == 0); - while ((buf->data = memalign(data_align, data_size)) == NULL) { + while (posix_memalign((void**)&(buf->data), data_align, data_size)) { data_size >>= 1; if (data_size < min_io_size) return NULL; diff --git a/db/attrset.c b/db/attrset.c index ec9da5a..539765f 100644 --- a/db/attrset.c +++ b/db/attrset.c @@ -141,7 +141,7 @@ attr_set_f( name = argv[optind]; if (valuelen) { - value = (char *)memalign(getpagesize(), valuelen); + posix_memalign((void**)&value, getpagesize(), valuelen); if (!value) { dbprintf(_("cannot allocate buffer (%d)\n"), valuelen); goto out; diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 4912b73..ad52990 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1306,7 +1306,8 @@ packfile(char *fname, char *tname, int fd, dio.d_maxiosz, pagesize); } - if (!(fbuf = (char *)memalign(dio.d_mem, blksz_dio))) { + posix_memalign((void **)&fbuf, dio.d_mem, blksz_dio); + if (!fbuf) { fsrprintf(_("could not allocate buf: %s\n"), tname); goto out; } diff --git a/include/darwin.h b/include/darwin.h index 775dfc8..e3ec863 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef int64_t xfs_daddr_t; #define pwrite64 pwrite #define ftruncate64 ftruncate #define fdatasync fsync -#define memalign(a,sz) valloc(sz) #define O_LARGEFILE 0 #ifndef O_DIRECT diff --git a/include/freebsd.h b/include/freebsd.h index 902b940..7289159 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -40,7 +40,6 @@ #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync -#define memalign(a,sz) valloc(sz) #define constpp char * const * diff --git a/include/gnukfreebsd.h b/include/gnukfreebsd.h index 95c4c13..4605234 100644 --- a/include/gnukfreebsd.h +++ b/include/gnukfreebsd.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include diff --git a/include/linux.h b/include/linux.h index 8804c2d..7493b76 100644 --- a/include/linux.h +++ b/include/linux.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include diff --git a/io/pread.c b/io/pread.c index 1c77c41..74ba47e 100644 --- a/io/pread.c +++ b/io/pread.c @@ -77,7 +77,7 @@ alloc_iovec( buffersize = 0; for (i = 0; i < vectors; i++) { - iov[i].iov_base = memalign(pagesize, bsize); + posix_memalign((void**)&(iov[i].iov_base), pagesize, bsize); if (!iov[i].iov_base) { perror("memalign"); goto unwind; @@ -108,7 +108,7 @@ alloc_buffer( if (bsize > highwater) { if (buffer) free(buffer); - buffer = memalign(pagesize, bsize); + posix_memalign((void**)&buffer, pagesize, bsize); if (!buffer) { perror("memalign"); highwater = buffersize = 0; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 4f8212f..7884cf8 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -74,12 +74,14 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len) ssize_t zsize, bytes; char *z; int fd; + int ret; zsize = min(BDSTRAT_SIZE, BBTOB(len)); - if ((z = memalign(libxfs_device_alignment(), zsize)) == NULL) { + ret = posix_memalign((void **)&z, libxfs_device_alignment(), zsize); + if (!z) { fprintf(stderr, _("%s: %s can't memalign %d bytes: %s\n"), - progname, __FUNCTION__, (int)zsize, strerror(errno)); + progname, __FUNCTION__, (int)zsize, strerror(ret)); exit(1); } memset(z, 0, zsize); @@ -409,6 +411,7 @@ static void __initbuf(xfs_buf_t *bp, struct xfs_buftarg *btp, xfs_daddr_t bno, unsigned int bytes) { + int ret; bp->b_flags = 0; bp->b_bn = bno; bp->b_bcount = bytes; @@ -416,12 +419,13 @@ __initbuf(xfs_buf_t *bp, struct xfs_buftarg *btp, xfs_daddr_t bno, bp->b_target = btp; bp->b_error = 0; if (!bp->b_addr) - bp->b_addr = memalign(libxfs_device_alignment(), bytes); + ret = posix_memalign((void**)&(bp->b_addr), + libxfs_device_alignment(), bytes); if (!bp->b_addr) { fprintf(stderr, _("%s: %s can't memalign %u bytes: %s\n"), progname, __FUNCTION__, bytes, - strerror(errno)); + strerror(ret)); exit(1); } memset(bp->b_addr, 0, bytes); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 69d61c7..d349b4f 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -770,7 +770,8 @@ zero_old_xfs_structures( * read in existing filesystem superblock, use its geometry * settings and zero the existing secondary superblocks. */ - buf = memalign(libxfs_device_alignment(), new_sb->sb_sectsize); + posix_memalign((void**)&buf, libxfs_device_alignment(), + new_sb->sb_sectsize); if (!buf) { fprintf(stderr, _("error reading existing superblock -- failed to memalign buffer\n")); diff --git a/repair/incore.c b/repair/incore.c index cb57316..81d3b8c 100644 --- a/repair/incore.c +++ b/repair/incore.c @@ -224,7 +224,7 @@ init_rt_bmap( rt_bmap_size = roundup(mp->m_sb.sb_rextents / (NBBY / XR_BB), sizeof(__uint64_t)); - rt_bmap = memalign(sizeof(__uint64_t), rt_bmap_size); + posix_memalign((void**)&rt_bmap, sizeof(__uint64_t), rt_bmap_size); if (!rt_bmap) { do_error( _("couldn't allocate realtime block map, size = %" PRIu64 "\n"), diff --git a/repair/incore_ino.c b/repair/incore_ino.c index 32d7678..dd95996 100644 --- a/repair/incore_ino.c +++ b/repair/incore_ino.c @@ -626,8 +626,8 @@ set_inode_parent( irec->ino_un.plist = ptbl; ptbl->pmask = 1LL << offset; - ptbl->pentries = (xfs_ino_t*)memalign(sizeof(xfs_ino_t), - sizeof(xfs_ino_t)); + posix_memalign((void**)&(ptbl->pentries),sizeof(xfs_ino_t), + sizeof(xfs_ino_t)); if (!ptbl->pentries) do_error(_("couldn't memalign pentries table\n")); #ifdef DEBUG @@ -673,7 +673,8 @@ set_inode_parent( #endif ASSERT(cnt >= target); - tmp = (xfs_ino_t*)memalign(sizeof(xfs_ino_t), (cnt + 1) * sizeof(xfs_ino_t)); + posix_memalign((void**)&tmp, sizeof(xfs_ino_t), + (cnt + 1) * sizeof(xfs_ino_t)); if (!tmp) do_error(_("couldn't memalign pentries table\n")); diff --git a/repair/phase1.c b/repair/phase1.c index 126d0b3..7a1fc7d 100644 --- a/repair/phase1.c +++ b/repair/phase1.c @@ -35,7 +35,7 @@ alloc_ag_buf(int size) { char *bp; - bp = (char *)memalign(libxfs_device_alignment(), size); + posix_memalign((void**)&bp, libxfs_device_alignment(), size); if (!bp) do_error(_("could not allocate ag header buffer (%d bytes)\n"), size); diff --git a/repair/prefetch.c b/repair/prefetch.c index 8b261ae..c6c9450 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -631,10 +631,9 @@ pf_io_worker( void *param) { prefetch_args_t *args = param; - void *buf = memalign(libxfs_device_alignment(), - pf_max_bytes); - - if (buf == NULL) + void *buf; + posix_memalign((void**)&buf, libxfs_device_alignment(), pf_max_bytes); + if (!buf) return NULL; pthread_mutex_lock(&args->lock); diff --git a/repair/sb.c b/repair/sb.c index 4eef14a..cf1ea8b 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -102,7 +102,7 @@ find_secondary_sb(xfs_sb_t *rsb) do_warn(_("\nattempting to find secondary superblock...\n")); - sb = (xfs_sb_t *)memalign(libxfs_device_alignment(), BSIZE); + posix_memalign((void**)&sb, libxfs_device_alignment(), BSIZE); if (!sb) { do_error( _("error finding secondary superblock -- failed to memalign buffer\n")); @@ -438,8 +438,8 @@ write_primary_sb(xfs_sb_t *sbp, int size) if (no_modify) return; - buf = memalign(libxfs_device_alignment(), size); - if (buf == NULL) { + posix_memalign((void**)&buf, libxfs_device_alignment(), size); + if (!buf) { do_error(_("failed to memalign superblock buffer\n")); return; } @@ -472,8 +472,8 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) int error, rval; xfs_dsb_t *buf; - buf = memalign(libxfs_device_alignment(), size); - if (buf == NULL) { + posix_memalign((void**)&buf, libxfs_device_alignment(), size); + if (!buf) { do_error( _("error reading superblock %u -- failed to memalign buffer\n"), agno); diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index f604b46..e2e3ece 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -327,7 +327,12 @@ rtcp( char *source, char *target, int fextsize) } iosz = dioattr.d_miniosz; - fbuf = memalign( dioattr.d_mem, iosz); + posix_memalign((void**)&fbuf, dioattr.d_mem, iosz); + if (!fbuf) { + perror( + _("error finding secondary superblock -- failed to memalign buffer\n")); + exit(1); + } memset(fbuf, 0, iosz); /* -- 2.4.5 From jtulak@redhat.com Thu Aug 13 09:10:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B8D157F51 for ; Thu, 13 Aug 2015 09:10:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 994378F8039 for ; Thu, 13 Aug 2015 07:10:48 -0700 (PDT) X-ASG-Debug-ID: 1439475047-04cb6c674040bcd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vipCa4EyGQR83zIa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 07:10:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 79B363672B2 for ; Thu, 13 Aug 2015 14:10:47 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DEAkrX014010; Thu, 13 Aug 2015 10:10:46 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 12/11] xfsprogs: Update doc for OS X Date: Thu, 13 Aug 2015 16:10:43 +0200 X-ASG-Orig-Subj: [PATCH 12/11] xfsprogs: Update doc for OS X Message-Id: <1439475043-5473-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439475047 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Update build info and limitations. Signed-off-by: Jan Tulak --- doc/INSTALL | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index ba3472b..b0443a3 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -52,12 +52,16 @@ Mac OS X Instructions ===================== 0. Note: since there is no XFS implementation on Mac OS X, you are - severely limited in what you can do. mkfs.xfs(8), xfs_db(8) and + severely limited in what you can do. mkfs.xfs(8), xfs_db(8) and xfs_repair(8) are the only functional tools on this platform, as they do not interact with the XFS kernel code at all. Still, it can be useful to have access to these utilities from Mac OS X in a dual boot configuration, for example. + However, keep on mind that mkfs.xfs on Mac OS X has disabled + device access, although you can create a filesystem in a file. + Also note that existing filesystem detection is disabled. + 1. Configure, build and install the package The xfsprogs package uses autoconf/configure and expects a GNU build @@ -65,7 +69,8 @@ Mac OS X Instructions and glibtool). You will also need to have built and installed the UUID library which - is provided by the e2fsprogs source package. + is provided by the e2fsprogs source package. (Or use Homebrew, Macports + or any other 3rd party package manager.) Building libuuid: @@ -84,7 +89,7 @@ Mac OS X Instructions TAR=/usr/bin/gnutar LIBTOOL=/usr/bin/glibtool INSTALL_GROUP=wheel - LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no" + LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no --enable-blkid=no" $ make $ su root -- 2.4.5 From jtulak@redhat.com Thu Aug 13 09:11:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41B897F51 for ; Thu, 13 Aug 2015 09:11:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03300304032 for ; Thu, 13 Aug 2015 07:10:59 -0700 (PDT) X-ASG-Debug-ID: 1439475058-04bdf06bd23459c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GZEAhEuL2vK6whZA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 07:10:59 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id B035F8E3CE for ; Thu, 13 Aug 2015 14:10:58 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DEAvmI012994; Thu, 13 Aug 2015 10:10:57 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 13/11] xfsprogs: Add a way to compile without blkid Date: Thu, 13 Aug 2015 16:10:55 +0200 X-ASG-Orig-Subj: [PATCH 13/11] xfsprogs: Add a way to compile without blkid Message-Id: <1439475055-5519-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439475059 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Because not all platforms have up-to-date blkid with required functions, allow at least partial functionality by adding --enable-blkid=yes/no optional configure argument. When blkid is disabled, signature detection and device geometry detection doesn't work. Signed-off-by: Jan Tulak --- configure.ac | 10 +++++++++- include/builddefs.in | 1 + mkfs/xfs_mkfs.c | 22 +++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 9ea8b22..a734926 100644 --- a/configure.ac +++ b/configure.ac @@ -26,6 +26,11 @@ AC_ARG_ENABLE(gettext, enable_gettext=yes) AC_SUBST(enable_gettext) +AC_ARG_ENABLE(blkid, +[ --enable-blkid=[yes/no] Enable use of block device id library [default=yes]],, + enable_blkid=yes) +AC_SUBST(enable_blkid) + AC_ARG_ENABLE(readline, [ --enable-readline=[yes/no] Enable readline command editing [default=no]], test $enable_readline = yes && libreadline="-lreadline", @@ -115,11 +120,14 @@ AC_HAVE_FALLOCATE AC_HAVE_FIEMAP AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE -AC_HAVE_BLKID_TOPO AC_HAVE_READDIR AC_HAVE_MNTENT AC_HAVE_FLS +if test "$enable_blkid" = yes; then +AC_HAVE_BLKID_TOPO +fi + AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([char *]) AC_TYPE_UMODE_T diff --git a/include/builddefs.in b/include/builddefs.in index 8851956..f3f8089 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -89,6 +89,7 @@ ENABLE_SHARED = @enable_shared@ ENABLE_GETTEXT = @enable_gettext@ ENABLE_EDITLINE = @enable_editline@ ENABLE_READLINE = @enable_readline@ +ENABLE_BLKID = @enable_blkid@ HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d349b4f..656c3f9 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -18,7 +18,9 @@ #include "libxfs.h" #include -#include +#ifdef ENABLE_BLKID +# include +#endif /* ENABLE_BLKID */ #include "xfs_mkfs.h" /* @@ -298,6 +300,7 @@ calc_stripe_factors( * 0 for nothing found * -1 for internal error */ +#ifdef ENABLE_BLKID static int check_overwrite( char *device) @@ -451,6 +454,19 @@ out_free_probe: _("warning: unable to probe device topology for device %s\n"), device); } +#else /* ifdef ENABLE_BLKID */ +/* + * Without blkid, we can't do a good check for signatures. + * So instead of some messy attempts, just disable any checks + * and always return 'nothing found'. + */ +static int +check_overwrite( + char *device) +{ + return 0; +} +#endif /* ENABLE_BLKID */ static void get_topology( libxfs_init_t *xi, @@ -483,16 +499,20 @@ static void get_topology( } else ft->psectorsize = ft->lsectorsize = BBSIZE; } else { +#ifdef ENABLE_BLKID blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, &ft->lsectorsize, &ft->psectorsize, force_overwrite); +#endif /* ENABLE_BLKID */ } if (xi->rtname && !xi->risfile) { int sunit, lsectorsize, psectorsize; +#ifdef ENABLE_BLKID blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth, &lsectorsize, &psectorsize, force_overwrite); +#endif /* ENABLE_BLKID */ } } -- 2.4.5 From ag@iss-integration.com Thu Aug 13 09:25:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 49E6F7F6A for ; Thu, 13 Aug 2015 09:25:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35247304059 for ; Thu, 13 Aug 2015 07:25:59 -0700 (PDT) X-ASG-Debug-ID: 1439475956-04cbb0416c38ee10001-NocioJ Received: from mail-yk0-f178.google.com (mail-yk0-f178.google.com [209.85.160.178]) by cuda.sgi.com with ESMTP id nEQpcV4fkPrUGvxq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 07:25:57 -0700 (PDT) X-Barracuda-Envelope-From: ag@iss-integration.com X-Barracuda-Apparent-Source-IP: 209.85.160.178 Received: by ykay144 with SMTP id y144so42253573yka.3 for ; Thu, 13 Aug 2015 07:25:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=Xy5ecLUBp0snsvuuH2uGAnh/tKhsSqovY60rDkjXeyk=; b=mOnTsYa0+Kuid+9zTS5S3KE9e3G9bHz+c5I0qa3Z6HE7Jaw/k8SIVpPs/Ghg2ZVwX4 LXH9fG5Tw6oOocDHVk7SMAMy94CWX1BUIo32wYi6uwRbZvMOQZdQzX5VZyRsUgRB/KW3 wE8xZYEAJvFsfymNfkdh/eYYFWvnss0NaBt77xlqWB7Ib33s89NzFiKMEAqT5eLJuNxY +Gs/wVPrVfxE7qMqjK3/vOqxZQLvgYPBOMRMVuWgFMda4ZigjZsDh/L7J6MPA6VwV+yX EakcqUBr3YGHOzxcgByyEECK4aKdkToy5plqpfj3raCqSdXEZOm1KVT2ZPyAE773SolM bDoA== X-Gm-Message-State: ALoCoQkphaJofTSXwA/iuIFwzr1eumqDW9lAxH+ACWYDEb4NJYybc1wdefAZw8BqO47YXb/f6sos MIME-Version: 1.0 X-Received: by 10.170.42.21 with SMTP id 21mr38083970ykk.3.1439475956386; Thu, 13 Aug 2015 07:25:56 -0700 (PDT) Received: by 10.37.207.16 with HTTP; Thu, 13 Aug 2015 07:25:56 -0700 (PDT) In-Reply-To: References: <20150703235141.GQ7943@dastard> <20150704233802.GS7943@dastard> <20150705232443.GA3902@dastard> <20150707003542.GW7943@dastard> Date: Thu, 13 Aug 2015 10:25:56 -0400 Message-ID: Subject: Re: Failing XFS filesystem underlying Ceph OSDs From: Alex Gorbachev X-ASG-Orig-Subj: Re: Failing XFS filesystem underlying Ceph OSDs To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a1137d3c00b511c051d321db4 X-Barracuda-Connect: mail-yk0-f178.google.com[209.85.160.178] X-Barracuda-Start-Time: 1439475956 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21565 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC5_SA210e Custom Rule SA210e --001a1137d3c00b511c051d321db4 Content-Type: text/plain; charset=UTF-8 Good morning, We have experienced one more failure like the ones originally described. I am assuming the vm.min_free_kbytes at 256 MB helped (only one hit, OSD went down but the rest of the cluster stayed up unlike the previous massive storms). So I went ahead and increased the vm.min_free_kbytes to 1 GB. I do not know of any way to reproduce the problem, or what causes it. There is no unusual IO pattern at the time that we are aware of. Thanks, Alex On Wed, Jul 22, 2015 at 8:23 AM, Alex Gorbachev wrote: > Hi Dave, > > On Mon, Jul 6, 2015 at 8:35 PM, Dave Chinner wrote: > >> On Mon, Jul 06, 2015 at 03:20:19PM -0400, Alex Gorbachev wrote: >> > On Sun, Jul 5, 2015 at 7:24 PM, Dave Chinner >> wrote: >> > > On Sun, Jul 05, 2015 at 12:25:47AM -0400, Alex Gorbachev wrote: >> > > > > > sysctl vm.swappiness=20 (can probably be 1 as per article) >> > > > > > >> > > > > > sysctl vm.min_free_kbytes=262144 >> > > > > >> > > [...] >> > > > >> > > > We have experienced the problem in various guises with kernels 3.14, >> > > 3.19, >> > > > 4.1-rc2 and now 4.1, so it's not new to us, just different error >> stack. >> > > > Below are some other stack dumps of what manifested as the same >> error. >> > > > >> > > > [] schedule+0x29/0x70 >> > > > [] _xfs_log_force+0x187/0x280 [xfs] >> > > > [] ? try_to_wake_up+0x2a0/0x2a0 >> > > > [] xfs_log_force+0x39/0xc0 [xfs] >> > > > [] xfsaild_push+0x552/0x5a0 [xfs] >> > > > [] ? schedule_timeout+0x124/0x210 >> > > > [] xfsaild+0x9f/0x140 [xfs] >> > > > [] ? xfsaild_push+0x5a0/0x5a0 [xfs] >> > > > [] kthread+0xc9/0xe0 >> > > > [] ? flush_kthread_worker+0x90/0x90 >> > > > [] ret_from_fork+0x58/0x90 >> > > > [] ? flush_kthread_worker+0x90/0x90 >> > > > INFO: task xfsaild/sdg1:2606 blocked for more than 120 seconds. >> > > > Not tainted 3.19.4-031904-generic #201504131440 >> > > > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this >> > > message. >> > > >> > > That's indicative of IO completion problems, but not a crash. >> > > >> > > > BUG: unable to handle kernel NULL pointer dereference at >> > > (null) >> > > > IP: [] xfs_count_page_state+0x3f/0x70 [xfs] >> > > .... >> > > > [] xfs_vm_releasepage+0x40/0x120 [xfs] >> > > > [] try_to_release_page+0x32/0x50 >> > > > [] shrink_page_list+0x69d/0x720 >> > > > [] shrink_inactive_list+0x1dd/0x5d0 >> > > .... >> > > >> > > Again, this is indicative of a page cache issue: a page without >> > > buffers has been passed to xfs_vm_releasepage(), which implies the >> > > page flags are not correct. i.e PAGE_FLAGS_PRIVATE is set but >> > > page->private is null... >> > > >> > > Again, this is unlikely to be an XFS issue. >> > > >> > >> > Sorry for my ignorance, but would this likely come from Ceph code or a >> > hardware issue of some kind, such as a disk drive? I have reached out >> to >> > RedHat and Ceph community on that as well. >> >> More likely a kernel bug somewhere in the page cache or memory >> reclaim paths. The issue is that we only notice the problem long >> after it has occurred. i.e. when XFS goes to tear down the page it has >> been handed, the page is already in a bad state and so it doesn't >> really tell us anything about the cause of the problem. >> >> Realisticaly, we need a script that reproduces the problem (that >> doesn't require a Ceph cluster) to be able to isolate the cause. >> In the mean time, you can always try running CONFIG_XFS_WARN=y to >> see if that catches problems earlier, and you might also want to do >> things like turn on memory poisoning and other kernel debugging >> options to try to isolate the cause of the issue.... >> > > We have been error free for almost 3 weeks now with these changes: > > vm.swappiness=1 > vm.min_free_kbytes=262144 > > I wonder if this is related to us using high speed Areca HBAs with RAM > writeback cache and having had vm.swappiness=0 previously. POssibly the > HBA handing down a large chunk of IO very fast and page cache not being to > handle it with swappiness=0. I will keep monitoring, but thank you very > much for the analysis and info. > > Alex > > > >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > --001a1137d3c00b511c051d321db4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Good morning,

We have experienced one m= ore failure like the ones originally described.=C2=A0 I am assuming the=C2= =A0vm.min_free_kbytes at 256 M= B helped (only one hit, OSD went down but the rest of the cluster=C2=A0stay= ed=C2=A0up unlike the=C2=A0previous massive storms).=C2=A0 So I went ahead = and increased the=C2=A0= vm.min_free_kbytes to 1 GB. =C2=A0

I do not know of any way to reproduce the problem, or what ca= uses it.=C2=A0 There is no unusual IO pattern at the time that we are aware= of.

Thanks,
Alex

On Wed, Jul 22,= 2015 at 8:23 AM, Alex Gorbachev <ag@iss-integration.com> wrote:
Hi Dave,

= On Mon, Jul 6, 2015 at 8:35 PM, Dave Chinner <david@fromorbit.com&g= t; wrote:
On Mon, Jul 06, 2015 at 03:20:19PM -04= 00, Alex Gorbachev wrote:
> On Sun, Jul 5, 2015 at 7:24 PM, Dave Chinner <david@fromorbit.com> wrote= :
> > On Sun, Jul 05, 2015 at 12:25:47AM -0400, Alex Gorbachev wrote: > > > > > sysctl vm.swappiness=3D20 (can probably be 1 as pe= r article)
> > > > >
> > > > > sysctl vm.min_free_kbytes=3D262144
> > > >
> > [...]
> > >
> > > We have experienced the problem in various guises with kerne= ls 3.14,
> > 3.19,
> > > 4.1-rc2 and now 4.1, so it's not new to us, just differe= nt error stack.
> > > Below are some other stack dumps of what manifested as the s= ame error.
> > >
> > >=C2=A0 [<ffffffff817cf4b9>] schedule+0x29/0x70
> > >=C2=A0 [<ffffffffc07caee7>] _xfs_log_force+0x187/0x280 = [xfs]
> > >=C2=A0 [<ffffffff810a4150>] ? try_to_wake_up+0x2a0/0x2a= 0
> > >=C2=A0 [<ffffffffc07cb019>] xfs_log_force+0x39/0xc0 [xf= s]
> > >=C2=A0 [<ffffffffc07d6542>] xfsaild_push+0x552/0x5a0 [x= fs]
> > >=C2=A0 [<ffffffff817d2264>] ? schedule_timeout+0x124/0x= 210
> > >=C2=A0 [<ffffffffc07d662f>] xfsaild+0x9f/0x140 [xfs] > > >=C2=A0 [<ffffffffc07d6590>] ? xfsaild_push+0x5a0/0x5a0 = [xfs]
> > >=C2=A0 [<ffffffff81095e29>] kthread+0xc9/0xe0
> > >=C2=A0 [<ffffffff81095d60>] ? flush_kthread_worker+0x90= /0x90
> > >=C2=A0 [<ffffffff817d3718>] ret_from_fork+0x58/0x90
> > >=C2=A0 [<ffffffff81095d60>] ? flush_kthread_worker+0x90= /0x90
> > >=C2=A0 INFO: task xfsaild/sdg1:2606 blocked for more than 120= seconds.
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 Not tainted 3.19.4-031904-= generic #201504131440
> > >=C2=A0 "echo 0 > /proc/sys/kernel/hung_task_tim= eout_secs" disables this
> > message.
> >
> > That's indicative of IO completion problems, but not a crash.=
> >
> > >=C2=A0 BUG: unable to handle kernel NULL pointer dereference = at
> >=C2=A0 (null)
> > >=C2=A0 IP: [<ffffffffc04be80f>] xfs_count_page_state+0x= 3f/0x70 [xfs]
> > ....
> > >=C2=A0 =C2=A0[<ffffffffc04be880>] xfs_vm_releasepage+0x= 40/0x120 [xfs]
> > >=C2=A0 =C2=A0[<ffffffff8118a7d2>] try_to_release_page+0= x32/0x50
> > >=C2=A0 =C2=A0[<ffffffff8119fe6d>] shrink_page_list+0x69= d/0x720
> > >=C2=A0 =C2=A0[<ffffffff811a058d>] shrink_inactive_list+= 0x1dd/0x5d0
> > ....
> >
> > Again, this is indicative of a page cache issue: a page without > > buffers has been passed to xfs_vm_releasepage(), which implies th= e
> > page flags are not correct. i.e PAGE_FLAGS_PRIVATE is set but
> > page->private is null...
> >
> > Again, this is unlikely to be an XFS issue.
> >
>
> Sorry for my ignorance, but would this likely come from Ceph code or a=
> hardware issue of some kind, such as a disk drive?=C2=A0 I have reache= d out to
> RedHat and Ceph community on that as well.

More likely a kernel bug somewhere in the page cache or memory
reclaim paths. The issue is that we only notice the problem long
after it has occurred. i.e. when XFS goes to tear down the page it has
been handed, the page is already in a bad state and so it doesn't
really tell us anything about the cause of the problem.

Realisticaly, we need a script that reproduces the problem (that
doesn't require a Ceph cluster) to be able to isolate the cause.
In the mean time, you can always try running=C2=A0 CONFIG_XFS_WARN=3Dy to see if that catches problems earlier, and you might also want to do
things like turn on memory poisoning and other kernel debugging
options to try to isolate the cause of the issue....
<= br>
We have been error free for almost 3 weeks now wi= th these changes:

vm.swappiness=3D1
vm.min_free_kbytes=3D262144

I wonder = if this is related to us using high speed Areca HBAs with RAM writeback cac= he and having had vm.swappiness=3D0 previously.=C2=A0 POssibly the HBA hand= ing down a large chunk of IO very fast and page cache not being to handle i= t with swappiness=3D0.=C2=A0 I will keep monitoring, but thank you very muc= h for the analysis and info.

Alex
=
=C2=A0

Cheers,

Dave.
--
Dave Chinner
david@fromo= rbit.com


--001a1137d3c00b511c051d321db4-- From zlang@redhat.com Thu Aug 13 10:07:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A1DA97F7C for ; Thu, 13 Aug 2015 10:07:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9062430405F for ; Thu, 13 Aug 2015 08:07:50 -0700 (PDT) X-ASG-Debug-ID: 1439478468-04cbb0416e38ff20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Be6o8xY3bKDnDp4m (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 08:07:49 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id D07D24C67C for ; Thu, 13 Aug 2015 15:07:48 +0000 (UTC) Received: from localhost (vpn1-7-21.pek2.redhat.com [10.72.7.21]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DF7lJM023896; Thu, 13 Aug 2015 11:07:48 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: Zorro Lang Subject: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device Date: Thu, 13 Aug 2015 23:07:45 +0800 X-ASG-Orig-Subj: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device Message-Id: <1439478465-14072-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439478469 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When I run xfstests xfs/032 in ppc64le, I hit a failure: xfs_copy: read failed: Invalid argument xfs_copy: size check failed xfs_copy: /dev/sda5 filesystem failed to initialize xfs_copy: Aborting. Copy failed for Sector size 4096 Block size 4096 I try to use gdb trace xfs_copy. I find it try to open the source device with DIRECT flag, then read the device with ((1< --- Hi, I'm not so familiar for xfsprogs, so I'm not sure this's the best idea to fix this problem. Please help to check, and maybe give me better suggestions. Thanks very much, Zorro Lang copy/xfs_copy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index e13f468..1cd6253 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -666,7 +666,6 @@ main(int argc, char **argv) /* prepare the libxfs_init structure */ memset(&xargs, 0, sizeof(xargs)); - xargs.isdirect = LIBXFS_DIRECT; xargs.isreadonly = LIBXFS_ISREADONLY; if (source_is_file) { @@ -689,6 +688,8 @@ main(int argc, char **argv) 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL); sb = &mbuf.m_sb; libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); + if (sb->sb_sectsize == BBSIZE) + xargs.isdirect = LIBXFS_DIRECT; /* Do it again, now with proper length and verifier */ libxfs_putbuf(sbp); -- 1.9.3 From htejun@gmail.com Thu Aug 13 10:34:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CC3E77F7C for ; Thu, 13 Aug 2015 10:34:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9688304066 for ; Thu, 13 Aug 2015 08:34:50 -0700 (PDT) X-ASG-Debug-ID: 1439480085-04cbb0416e390a90001-NocioJ Received: from mail-yk0-f181.google.com (mail-yk0-f181.google.com [209.85.160.181]) by cuda.sgi.com with ESMTP id 0ozuVCfQYIEXaptD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 08:34:46 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] Received: by ykay144 with SMTP id y144so44199620yka.3 for ; Thu, 13 Aug 2015 08:34:45 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=Yea/bf77SErWZU8QQeC1Z4C2MGuJWtnYpqTetUzS1z4=; b=WlGORt6m/JEB470lpEBtMZf5eaDH7Yech3LhoQxaukkIZb9f8jGd8YA5PpqvtQsz/Y 5c2qHMSDBeCbj4al/8Hufq2A5veO6MarPL4yiOyjiBBXU4SDldnaYsZug6h3eF8TsaUr L6f1xnnvHganI9eUD27rtVz/W2Uo/i1TUKjanYulUtrNBNk7W4w56FkxwTTi00BwNj+6 gZm/d1Iq0WGKsNWTla0mekRy+0OeFHoilx/MUg0VFFJxCunf8e576Bnwti6WGA+fnKjB 6ziXBeDLNBBuViM6i3plBy1ETxotKFMFhxg434LBWqRamEhSKNnbRTC4v8XYEYduG7+A ftxA== X-Received: by 10.170.180.65 with SMTP id w62mr20511426ykd.60.1439480085448; Thu, 13 Aug 2015 08:34:45 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::a600]) by smtp.gmail.com with ESMTPSA id h7sm2341262ywb.10.2015.08.13.08.34.43 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Aug 2015 08:34:44 -0700 (PDT) Sender: Tejun Heo Date: Thu, 13 Aug 2015 11:34:42 -0400 From: Tejun Heo To: Dave Chinner Cc: Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150813153442.GE4496@mtj.duckdns.org> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813004435.GN3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f181.google.com[209.85.160.181] X-Barracuda-Start-Time: 1439480085 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21566 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Aug 13, 2015 at 10:44:35AM +1000, Dave Chinner wrote: > It might be a couple of days before I really get a chance to dig > into this, so it might be best if Tejun can look into it first. Yeap, have been looking into it since yesterday. I have some suspicions. I'll write once I know more. Thanks. -- tejun From sandeen@sandeen.net Thu Aug 13 11:23:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D81407F76 for ; Thu, 13 Aug 2015 11:23:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C56778F8037 for ; Thu, 13 Aug 2015 09:23:25 -0700 (PDT) X-ASG-Debug-ID: 1439483003-04cbb0416c391f20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nTEv7xHbpRIT9R5J for ; Thu, 13 Aug 2015 09:23:24 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (nat-pool-rdu-t.redhat.com [66.187.233.202]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4D2AB63CBFE5; Thu, 13 Aug 2015 11:23:23 -0500 (CDT) Message-ID: <55CCC47A.5030706@sandeen.net> Date: Thu, 13 Aug 2015 11:23:22 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Zorro Lang , xfs@oss.sgi.com Subject: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device References: <1439478465-14072-1-git-send-email-zlang@redhat.com> X-ASG-Orig-Subj: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device In-Reply-To: <1439478465-14072-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439483003 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/13/15 10:07 AM, Zorro Lang wrote: > When I run xfstests xfs/032 in ppc64le, I hit a failure: > > xfs_copy: read failed: Invalid argument > xfs_copy: size check failed > xfs_copy: /dev/sda5 filesystem failed to initialize > xfs_copy: Aborting. > Copy failed for Sector size 4096 Block size 4096 > > I try to use gdb trace xfs_copy. I find it try to open the > source device with DIRECT flag, then read the device with > ((1< 4k sector, directly read 512 bytes will be failed. > > xfs_copy '-b' option only work for target file/device, to > sure it will open the target without DIRECT flag. But useless > for source device open. > > So I make DIRECT flag only be enabled when source device > sector size equal BBSIZE. Which version of xfsprogs did you test? This is recently upstream: commit c63ce10a9450020382bbbe2c48788961b19830f4 Author: Eric Sandeen Date: Fri Jul 31 09:03:11 2015 +1000 xfs_copy: fix copy of hard 4k devices If we have a pure 4k device with no 512 emulation, xfs_copy fails straightaway because it tries to do a 512-byte direct IO read of the superblock. Do like we do in xfs_db, and read in the max possible sector size, because we don't yet know what the filesystem's sector size is. This fixes a failure in xfs/032 on a hard 4k device. -Eric > Signed-off-by: Zorro Lang > --- > > Hi, > > I'm not so familiar for xfsprogs, so I'm not sure this's the best > idea to fix this problem. Please help to check, and maybe give me > better suggestions. > > Thanks very much, > Zorro Lang > > copy/xfs_copy.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c > index e13f468..1cd6253 100644 > --- a/copy/xfs_copy.c > +++ b/copy/xfs_copy.c > @@ -666,7 +666,6 @@ main(int argc, char **argv) > /* prepare the libxfs_init structure */ > > memset(&xargs, 0, sizeof(xargs)); > - xargs.isdirect = LIBXFS_DIRECT; > xargs.isreadonly = LIBXFS_ISREADONLY; > > if (source_is_file) { > @@ -689,6 +688,8 @@ main(int argc, char **argv) > 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL); > sb = &mbuf.m_sb; > libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); > + if (sb->sb_sectsize == BBSIZE) > + xargs.isdirect = LIBXFS_DIRECT; > > /* Do it again, now with proper length and verifier */ > libxfs_putbuf(sbp); > From zlang@redhat.com Thu Aug 13 11:40:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 771C829DF6 for ; Thu, 13 Aug 2015 11:40:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 50D088F804B for ; Thu, 13 Aug 2015 09:40:26 -0700 (PDT) X-ASG-Debug-ID: 1439484023-04cb6c673e410310001-NocioJ Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by cuda.sgi.com with ESMTP id e86EBgUzoiuoB23o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 09:40:23 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.37 Received: from zmail21.collab.prod.int.phx2.redhat.com (zmail21.collab.prod.int.phx2.redhat.com [10.5.83.24]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DGeMwW048720; Thu, 13 Aug 2015 12:40:22 -0400 Date: Thu, 13 Aug 2015 12:40:22 -0400 (EDT) From: Zirong Lang To: Eric Sandeen Cc: xfs@oss.sgi.com Message-ID: <510394920.8151266.1439484022770.JavaMail.zimbra@redhat.com> In-Reply-To: <55CCC47A.5030706@sandeen.net> References: <1439478465-14072-1-git-send-email-zlang@redhat.com> <55CCC47A.5030706@sandeen.net> Subject: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.72.7.21] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF38 (Linux)/8.0.6_GA_5922) Thread-Topic: xfs_copy: don't use DIRECT IO to copy 4k sector device Thread-Index: D4ykoxhuC9HY6TGNj0226mJ/bBV1sA== X-Barracuda-Connect: mx5-phx2.redhat.com[209.132.183.37] X-Barracuda-Start-Time: 1439484023 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21568 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- =E5=8E=9F=E5=A7=8B=E9=82=AE=E4=BB=B6 ----- > =E5=8F=91=E4=BB=B6=E4=BA=BA: "Eric Sandeen" > =E6=94=B6=E4=BB=B6=E4=BA=BA: "Zorro Lang" , xfs@oss.sgi= .com > =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: =E6=98=9F=E6=9C=9F=E4=BA=94, 2015= =E5=B9=B4 8 =E6=9C=88 14=E6=97=A5 =E4=B8=8A=E5=8D=88 12:23:22 > =E4=B8=BB=E9=A2=98: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to cop= y 4k sector device >=20 > On 8/13/15 10:07 AM, Zorro Lang wrote: > > When I run xfstests xfs/032 in ppc64le, I hit a failure: > >=20 > > xfs_copy: read failed: Invalid argument > > xfs_copy: size check failed > > xfs_copy: /dev/sda5 filesystem failed to initialize > > xfs_copy: Aborting. > > Copy failed for Sector size 4096 Block size 4096 > >=20 > > I try to use gdb trace xfs_copy. I find it try to open the > > source device with DIRECT flag, then read the device with > > ((1< > 4k sector, directly read 512 bytes will be failed. > >=20 > > xfs_copy '-b' option only work for target file/device, to > > sure it will open the target without DIRECT flag. But useless > > for source device open. > >=20 > > So I make DIRECT flag only be enabled when source device > > sector size equal BBSIZE. >=20 > Which version of xfsprogs did you test? This is recently upstream: Sorry I didn't notice that you have fix this problem. I test on the newest version from git://oss.sgi.com/xfs/cmds/xfsprogs, it haven't fix this problem. I test this patch on it at first. Then I find there is another version in git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-de= v.git I don't know they are too different, so I didn't check if this xfsprogs-dev= has fixed it, and just did this patch on it and send out. Sorry for this mistake, and your patch is really better:) Thanks, Zorro Lang >=20 > commit c63ce10a9450020382bbbe2c48788961b19830f4 > Author: Eric Sandeen > Date: Fri Jul 31 09:03:11 2015 +1000 >=20 > xfs_copy: fix copy of hard 4k devices > =20 > If we have a pure 4k device with no 512 emulation, xfs_copy > fails straightaway because it tries to do a 512-byte direct > IO read of the superblock. > =20 > Do like we do in xfs_db, and read in the max possible sector size, > because we don't yet know what the filesystem's sector size is. > =20 > This fixes a failure in xfs/032 on a hard 4k device. >=20 > -Eric >=20 > > Signed-off-by: Zorro Lang > > --- > >=20 > > Hi, > >=20 > > I'm not so familiar for xfsprogs, so I'm not sure this's the best > > idea to fix this problem. Please help to check, and maybe give me > > better suggestions. > >=20 > > Thanks very much, > > Zorro Lang > >=20 > > copy/xfs_copy.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > >=20 > > diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c > > index e13f468..1cd6253 100644 > > --- a/copy/xfs_copy.c > > +++ b/copy/xfs_copy.c > > @@ -666,7 +666,6 @@ main(int argc, char **argv) > > =09/* prepare the libxfs_init structure */ > > =20 > > =09memset(&xargs, 0, sizeof(xargs)); > > -=09xargs.isdirect =3D LIBXFS_DIRECT; > > =09xargs.isreadonly =3D LIBXFS_ISREADONLY; > > =20 > > =09if (source_is_file) { > > @@ -689,6 +688,8 @@ main(int argc, char **argv) > > =09=09=09 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL); > > =09sb =3D &mbuf.m_sb; > > =09libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); > > +=09if (sb->sb_sectsize =3D=3D BBSIZE) > > +=09=09xargs.isdirect =3D LIBXFS_DIRECT; > > =20 > > =09/* Do it again, now with proper length and verifier */ > > =09libxfs_putbuf(sbp); > >=20 >=20 >=20 From sandeen@sandeen.net Thu Aug 13 11:54:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 202CB7F88 for ; Thu, 13 Aug 2015 11:54:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C834AC003 for ; Thu, 13 Aug 2015 09:54:33 -0700 (PDT) X-ASG-Debug-ID: 1439484870-04cbb0416f392be0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id QVDoX9waHtyzWUvf for ; Thu, 13 Aug 2015 09:54:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (nat-pool-rdu-t.redhat.com [66.187.233.202]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 852416622B58; Thu, 13 Aug 2015 11:54:29 -0500 (CDT) Message-ID: <55CCCBC3.6040404@sandeen.net> Date: Thu, 13 Aug 2015 11:54:27 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Zirong Lang CC: xfs@oss.sgi.com Subject: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device References: <1439478465-14072-1-git-send-email-zlang@redhat.com> <55CCC47A.5030706@sandeen.net> <510394920.8151266.1439484022770.JavaMail.zimbra@redhat.com> X-ASG-Orig-Subj: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device In-Reply-To: <510394920.8151266.1439484022770.JavaMail.zimbra@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439484870 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/13/15 11:40 AM, Zirong Lang wrote: > > > ----- 原始邮件 ----- >> å‘件人: "Eric Sandeen" >> 收件人: "Zorro Lang" , xfs@oss.sgi.com >> å‘逿—¶é—´: 星期五, 2015å¹´ 8 月 14æ—¥ ä¸Šåˆ 12:23:22 >> 主题: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device >> >> On 8/13/15 10:07 AM, Zorro Lang wrote: >>> When I run xfstests xfs/032 in ppc64le, I hit a failure: >>> >>> xfs_copy: read failed: Invalid argument >>> xfs_copy: size check failed >>> xfs_copy: /dev/sda5 filesystem failed to initialize >>> xfs_copy: Aborting. >>> Copy failed for Sector size 4096 Block size 4096 >>> >>> I try to use gdb trace xfs_copy. I find it try to open the >>> source device with DIRECT flag, then read the device with >>> ((1<>> 4k sector, directly read 512 bytes will be failed. >>> >>> xfs_copy '-b' option only work for target file/device, to >>> sure it will open the target without DIRECT flag. But useless >>> for source device open. >>> >>> So I make DIRECT flag only be enabled when source device >>> sector size equal BBSIZE. >> >> Which version of xfsprogs did you test? This is recently upstream: > > Sorry I didn't notice that you have fix this problem. I test on the > newest version from git://oss.sgi.com/xfs/cmds/xfsprogs, it haven't > fix this problem. I test this patch on it at first. Then I find > there is another version in git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > > I don't know they are too different, so I didn't check if this xfsprogs-dev has > fixed it, and just did this patch on it and send out. > > Sorry for this mistake, and your patch is really better:) No problem, thanks for looking into it! I'm not sure why the sgi git tree is a bit behind right now. -Eric From htejun@gmail.com Thu Aug 13 14:16:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 91A4C7F81 for ; Thu, 13 Aug 2015 14:16:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6038A8F8050 for ; Thu, 13 Aug 2015 12:16:06 -0700 (PDT) X-ASG-Debug-ID: 1439493364-04bdf06bd034eb70001-NocioJ Received: from mail-yk0-f181.google.com (mail-yk0-f181.google.com [209.85.160.181]) by cuda.sgi.com with ESMTP id SLCN04fqduKlvUqX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 12:16:04 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] Received: by ykay144 with SMTP id y144so49871255yka.3 for ; Thu, 13 Aug 2015 12:16:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=oEPonsmDgG8sI3WMPqbD2w010CnouYgxNcLWuKjCgbg=; b=JfY/iN/QR8MhHQXsxBqveMXlCB+c6dyyiMSHt9Q+iFm475ssXBMG38hlYwzYVjpoJE uUPR81jHLQ6sYLr5G1dAIYCILv0TyR1nvsS8TltzfNrTAo6bXl7ddKow1uWa3XV2a1At uow9m4tthbsas6cXWAL6k0Z/3lXEWCk4Hi0eeDPK4Yxa352/X4/Kcn0Qr64m2eCRKiBk 2OpkM2LIEIdYpl3UhQ0RqYjw+MaBPxUPk7fqJpdC5iy80EzCQ6fhMOIhq+ZS766kyAsB 4t6GOe2zhHGUBjWvcSmu72BXtg9Us5WwMUkm5VCJ41fMoKEeMHz+OiLtkCZJub3NUj70 q8sg== X-Received: by 10.129.130.69 with SMTP id s66mr40812733ywf.62.1439493364132; Thu, 13 Aug 2015 12:16:04 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::a600]) by smtp.gmail.com with ESMTPSA id n124sm2895157ywe.1.2015.08.13.12.16.03 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Aug 2015 12:16:03 -0700 (PDT) Sender: Tejun Heo Date: Thu, 13 Aug 2015 15:16:02 -0400 From: Tejun Heo To: Dave Chinner Cc: Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150813191602.GF4496@mtj.duckdns.org> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813153442.GE4496@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813153442.GE4496@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f181.google.com[209.85.160.181] X-Barracuda-Start-Time: 1439493364 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Aug 13, 2015 at 11:34:42AM -0400, Tejun Heo wrote: > On Thu, Aug 13, 2015 at 10:44:35AM +1000, Dave Chinner wrote: > > It might be a couple of days before I really get a chance to dig > > into this, so it might be best if Tejun can look into it first. > > Yeap, have been looking into it since yesterday. I have some > suspicions. I'll write once I know more. So, here are what I've found out till now. * I can't reproduce it for some reason. * There's a bug in b_dirty_time handling. sync_inodes_sb() should schedule writebacks regardless of b_dirty_time but it currently isn't. I'm working on a patch to fix it. * But I can't see how the above bug would lead to failure of size sync. One possibility is that wb_has_dirty_io() and/or bdi_has_dirty_io() is getting out of sync for some reason. I'll write up a debug patch for this. Thanks. -- tejun From htejun@gmail.com Thu Aug 13 17:44:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D9FC87F6F for ; Thu, 13 Aug 2015 17:44:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C75188F8039 for ; Thu, 13 Aug 2015 15:44:22 -0700 (PDT) X-ASG-Debug-ID: 1439505857-04cb6c224400180001-NocioJ Received: from mail-yk0-f181.google.com (mail-yk0-f181.google.com [209.85.160.181]) by cuda.sgi.com with ESMTP id IbCtLLP9EXpvOqGe (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 15:44:18 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] Received: by ykaz130 with SMTP id z130so54740176yka.0 for ; Thu, 13 Aug 2015 15:44:17 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=+Yhucxw3sdapmKB7BP/8NTcGZvwpVk82jQcTyowAiww=; b=VAiG/xHW/6iDwy1+LeD8hUGhEjdZ6Gjmk4W+37kHie1Z5hX08ywkjTJgkJeQx19pUk HlT7l53FjqoF4sPN+8LWVC72OtPfOreCUxwTTI2hKqFy2frhPlNrwXcbePE/S2dG2IKx 0P9sMj2Hi+5TBXZJzyU8av0XFXOj5EKIRot+k+KvpW5J6BD8Nzg6xkicfnyiBkRqR0YK hNSRGvzH8JTKSBvwn4sGj9H3n5G83f2y4pZheNkry+rprOONFTLRvOZBmFQ5eEri7kBc brGqIpe7XI410Gs1Npo/X9Ecg9790iQPIAQFqWAMUPU/Anh4j3QPD3gxDkV2o83hIwTm KbTg== X-Received: by 10.129.59.9 with SMTP id i9mr41174951ywa.100.1439505857696; Thu, 13 Aug 2015 15:44:17 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::a600]) by smtp.gmail.com with ESMTPSA id g63sm3392747ywd.50.2015.08.13.15.44.16 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Aug 2015 15:44:17 -0700 (PDT) Sender: Tejun Heo Date: Thu, 13 Aug 2015 18:44:15 -0400 From: Tejun Heo To: Jens Axboe , Jan Kara Cc: Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150813224415.GG4496@mtj.duckdns.org> X-ASG-Orig-Subj: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813004435.GN3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f181.google.com[209.85.160.181] X-Barracuda-Start-Time: 1439505858 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21578 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature e79729123f63 ("writeback: don't issue wb_writeback_work if clean") updated writeback path to avoid kicking writeback work items if there are no inodes to be written out; unfortunately, the avoidance logic was too aggressive and made sync_inodes_sb() skip I_DIRTY_TIME inodes. This patch fixes the breakage by * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs(). The callers are already testing the condition. * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that it always calls into bdi_split_work_to_wbs(). * Making bdi_split_work_to_wbs() consider the b_dirty_time list for WB_SYNC_ALL writebacks. Signed-off-by: Tejun Heo Fixes: e79729123f63 ("writeback: don't issue wb_writeback_work if clean") Cc: Ted Ts'o Cc: Jan Kara --- Hello, So, this fixes I_DIRTY_TIME syncing problem for ext4 but AFAICS xfs doesn't even use the generic inode metadata writeback path, so this most likely won't do anything for the originally reported problem. I'll post another patch for debugging. Thanks. fs/fs-writeback.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -844,14 +844,15 @@ static void bdi_split_work_to_wbs(struct struct wb_iter iter; might_sleep(); - - if (!bdi_has_dirty_io(bdi)) - return; restart: rcu_read_lock(); bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { - if (!wb_has_dirty_io(wb) || - (skip_if_busy && writeback_in_progress(wb))) + /* SYNC_ALL writes out I_DIRTY_TIME too */ + if (!wb_has_dirty_io(wb) && + (base_work->sync_mode == WB_SYNC_NONE || + list_empty(&wb->b_dirty_time))) + continue; + if (skip_if_busy && writeback_in_progress(wb)) continue; base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); @@ -899,8 +900,7 @@ static void bdi_split_work_to_wbs(struct { might_sleep(); - if (bdi_has_dirty_io(bdi) && - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { base_work->auto_free = 0; base_work->single_wait = 0; base_work->single_done = 0; @@ -2275,8 +2275,8 @@ void sync_inodes_sb(struct super_block * }; struct backing_dev_info *bdi = sb->s_bdi; - /* Nothing to do? */ - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) + /* bdi_has_dirty() ignores I_DIRTY_TIME but we can't, always kick wbs */ + if (bdi == &noop_backing_dev_info) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); From htejun@gmail.com Thu Aug 13 18:24:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2FB0B29DF6 for ; Thu, 13 Aug 2015 18:24:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9A2D8AC002 for ; Thu, 13 Aug 2015 16:24:05 -0700 (PDT) X-ASG-Debug-ID: 1439508242-04cb6c224100e90001-NocioJ Received: from mail-yk0-f177.google.com (mail-yk0-f177.google.com [209.85.160.177]) by cuda.sgi.com with ESMTP id YxmjD7iJ13FAsZy1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 16:24:03 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.177] Received: by ykaz130 with SMTP id z130so55405410yka.0 for ; Thu, 13 Aug 2015 16:24:02 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=ZyRk4n/NBc2/Ok5TEWkbhCRiWgiMiinigRR+o7RcD+s=; b=CHb9eUn8KqdfyEMHzmVWfAg7v4sn3jT114K56CCu+rUJiB6j/DqsuE3zm81HC7gwm0 tUkuQFsuArhv+vIqN9WgnFf96i7RSTgmpRL3JxW1hgqy1eXDIPMjHseGYuHKUaVmawdK MrIaQKdGg69H3SNVXisu5QAbF7muhw3s47fB9TsVstGUfR2mosPJJkACQ1pZBj1uwe4M 1iO5g9CO7lt/0ri2D+sbNECgcnfmWWDe9HXsXcYzDVn5d/KGtNP/b1KrCV6Wd7Vwlpsn GFwmcAHUK5kDtz23jlmll2grgdBCGet3Z8NhPQ16H3TirGooCrtp3O+Kko6pCK7i5bzG 6kmA== X-Received: by 10.170.143.10 with SMTP id k10mr42689778ykc.55.1439508242791; Thu, 13 Aug 2015 16:24:02 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::a600]) by smtp.gmail.com with ESMTPSA id a126sm3134601ywc.13.2015.08.13.16.24.02 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Aug 2015 16:24:02 -0700 (PDT) Sender: Tejun Heo Date: Thu, 13 Aug 2015 19:24:00 -0400 From: Tejun Heo To: Eryu Guan Cc: Dave Chinner , xfs@oss.sgi.com, axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150813232400.GH4496@mtj.duckdns.org> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813004435.GN3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f177.google.com[209.85.160.177] X-Barracuda-Start-Time: 1439508243 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Eryu. Can you please do the followings? 1. See if the "writeback: fix syncing of I_DIRTY_TIME inodes" patch changes anything. 2. If not, apply this patch. This patch *should* make the failures go away and might print out some error messages along with stack trace. Can you please verify that the failures go away with this patch and report the kernel messages if any trigger? Thanks a lot. Index: work/fs/fs-writeback.c =================================================================== --- work.orig/fs/fs-writeback.c +++ work/fs/fs-writeback.c @@ -103,7 +103,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(wbc_writepa static bool wb_io_lists_populated(struct bdi_writeback *wb) { - if (wb_has_dirty_io(wb)) { + if (test_bit(WB_has_dirty_io, &wb->state)) { return false; } else { set_bit(WB_has_dirty_io, &wb->state); @@ -844,14 +844,13 @@ static void bdi_split_work_to_wbs(struct struct wb_iter iter; might_sleep(); - - if (!bdi_has_dirty_io(bdi)) - return; restart: rcu_read_lock(); bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { - if (!wb_has_dirty_io(wb) || - (skip_if_busy && writeback_in_progress(wb))) + /* SYNC_ALL writes out I_DIRTY_TIME too */ + if (!wb_has_dirty_io(wb) && base_work->sync_mode == WB_SYNC_NONE) + continue; + if (skip_if_busy && writeback_in_progress(wb)) continue; base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); @@ -899,8 +898,7 @@ static void bdi_split_work_to_wbs(struct { might_sleep(); - if (bdi_has_dirty_io(bdi) && - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { base_work->auto_free = 0; base_work->single_wait = 0; base_work->single_done = 0; @@ -2275,8 +2273,8 @@ void sync_inodes_sb(struct super_block * }; struct backing_dev_info *bdi = sb->s_bdi; - /* Nothing to do? */ - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) + /* bdi_has_dirty() ignores I_DIRTY_TIME but we can't, always kick wbs */ + if (bdi == &noop_backing_dev_info) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); Index: work/include/linux/backing-dev.h =================================================================== --- work.orig/include/linux/backing-dev.h +++ work/include/linux/backing-dev.h @@ -38,7 +38,17 @@ extern struct workqueue_struct *bdi_wq; static inline bool wb_has_dirty_io(struct bdi_writeback *wb) { - return test_bit(WB_has_dirty_io, &wb->state); + bool ret = test_bit(WB_has_dirty_io, &wb->state); + + if (!ret && (!list_empty(&wb->b_dirty) || !list_empty(&wb->b_io) || + !list_empty(&wb->b_more_io))) { + const char *name = wb->bdi->dev ? dev_name(wb->bdi->dev) : "UNK"; + + pr_err("wb_has_dirty_io: ERR %s has_dirty=%d b_dirty=%d b_io=%d b_more_io=%d\n", + name, ret, !list_empty(&wb->b_dirty), !list_empty(&wb->b_io), !list_empty(&wb->b_more_io)); + WARN_ON(1); + } + return ret; } static inline bool bdi_has_dirty_io(struct backing_dev_info *bdi) @@ -47,7 +57,18 @@ static inline bool bdi_has_dirty_io(stru * @bdi->tot_write_bandwidth is guaranteed to be > 0 if there are * any dirty wbs. See wb_update_write_bandwidth(). */ - return atomic_long_read(&bdi->tot_write_bandwidth); + bool ret = atomic_long_read(&bdi->tot_write_bandwidth); + + if (ret != wb_has_dirty_io(&bdi->wb)) { + const char *name = bdi->dev ? dev_name(bdi->dev) : "UNK"; + + pr_err("bdi_has_dirty_io: ERR %s tot_write_bw=%ld b_dirty=%d b_io=%d b_more_io=%d\n", + name, atomic_long_read(&bdi->tot_write_bandwidth), + !list_empty(&bdi->wb.b_dirty), !list_empty(&bdi->wb.b_io), !list_empty(&bdi->wb.b_more_io)); + WARN_ON(1); + } + + return ret; } static inline void __add_wb_stat(struct bdi_writeback *wb, From nippip@gmail.com Thu Aug 13 18:35:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 98C7A7F3F for ; Thu, 13 Aug 2015 18:35:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86CB030404E for ; Thu, 13 Aug 2015 16:35:39 -0700 (PDT) X-ASG-Debug-ID: 1439508931-04cb6c224401190001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id DaAohlEFXJsdlb8v (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 16:35:31 -0700 (PDT) X-Barracuda-Envelope-From: nippip@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] Received: by obbop1 with SMTP id op1so49812359obb.2 for ; Thu, 13 Aug 2015 16:35:31 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=2WbblCiBVlcP+5UVBKNO7hH6nqdtk9nN70T9lm1BUCY=; b=hdWV49Qbdi6OBfJJMDAVlMBv7E826hy+JmBsECBrno9jaK+JYpzalQo3ScLD1XUTUE nDmyNedfMaX17I7Ft3lmTX+v7l5HhgIJovB6n4fiMQxfgSWIKNKMfXZL43F1tm0dImkX B4TilRzZ+d5gyVKW7DuwQSptJao9wx5hTxnEVilPUIakFtwSYAaT9rh0ZOdcbJRaZrin W5Wz1QfFizbJvnIF9+WXbeTxsqvUrFLrTvWh+bL+rv5LXpwSNRxVHJqpFUIxcRvCQRXT BfYRbPl7K6FRsyWxsPVEjCZ+EMra2MTJZ+DdK7pwqt05Rc1v7mh+De+3cleBnSTNEQgD 6/Gw== MIME-Version: 1.0 X-Received: by 10.182.246.202 with SMTP id xy10mr37053615obc.64.1439508931340; Thu, 13 Aug 2015 16:35:31 -0700 (PDT) Received: by 10.76.132.71 with HTTP; Thu, 13 Aug 2015 16:35:31 -0700 (PDT) Date: Thu, 13 Aug 2015 17:35:31 -0600 Message-ID: Subject: Looking to confirm issue and seek advice on fix for inode btree fragmentation From: Pippin Wallace X-ASG-Orig-Subj: Looking to confirm issue and seek advice on fix for inode btree fragmentation To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e01634d6a80efcf051d39cafe X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1439508931 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --089e01634d6a80efcf051d39cafe Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable I am writing to confirm the issue I think I have and get advice on the best short term and long term =E2=80=9Cfixes=E2=80=9D. In reading the following threads and others I am pretty sure I have inode btree fragmentation and I have included detailed output below to help confirm this. Is XFS suitable for 350 million files on 20TB storage? http://oss.sgi.com/archives/xfs/2014-09/msg00046.html Bad performance on touch/cp file on XFS system http://oss.sgi.com/archives/xfs/2014-08/msg00348.html Extremely slow file creation/deletion after xfs ran full http://oss.sgi.com/archives/xfs/2015-01/msg00203.html In addition to diagnosis I want to insure I take the right steps to improve performance in the short term and fix it correctly and thoroughly for the long term. Our workload is heavy write/delete and light reads. Most files are smallish and we cannot mount xfs with inode64 as our primary app is 32 bit. Our hosts are running as VM=E2=80=99s on a KVM hypervisor. Suggestion from Dave in post http://oss.sgi.com/archives/xfs/2014-08/msg00349.html If this is still the best short term fix would you please direct me to the =E2=80=9CHow To=E2=80=9D for doing this? *=E2=80=9Cfilling in all the holes (by creating a bunch of zero length file= s in the* *appropriate AGs) might take some time, but it should make the* *problem go away until you remove more filesystem and create random* *free inode holes again...=E2=80=9D* Is this also a possible short term fix? http://osvault.blogspot.com/2011/03/fixing-1tbyte-inode-problem-in-xfs-file= .html Long term fix is upgrade kernel to >=3D 3.16, xfsprogs >=3D3.2.1 and rebuil= d fs with new finobt structure. # mkfs.xfs -m crc=3D1,finobt=3D1 Here is info others have asked for in previous threads and further below that is data collected based on =E2=80=9CWhat information should I include = when reporting a problem?=E2=80=9D from your FAQ. If a command line in bold below starts with a VM then this command was run on the Virtual Machine or guest OS and if it starts with a HV then it was run on the physical HyperVisor machine that is hosting the guest OS. *VM# perf top* Samples: 378K of event 'cpu-clock', Event count (approx.): 188377 14.10% [kernel] [k] xfs_inobt_get_rec 9.58% [kernel] [k] xfs_btree_increment 9.08% [kernel] [k] xfs_btree_get_rec 8.83% [kernel] [k] _xfs_buf_find 5.84% [kernel] [k] xfs_btree_get_block 3.91% [kernel] [k] xfs_btree_rec_offset 3.85% [kernel] [k] xfs_dialloc_ag 3.64% [kernel] [k] xfs_btree_readahead 3.15% [kernel] [k] _raw_spin_unlock_irqrestore 2.97% [kernel] [k] xfs_btree_rec_addr 2.31% [kernel] [k] xfs_trans_buf_item_match 1.67% [kernel] [k] xfs_btree_setbuf *VM# time xfs_db -r -c "frag" /dev/vdc1 * actual 80103457, ideal 79500897, fragmentation factor 0.75% real 53m19.167s user 0m35.050s sys 3m35.390s *VM# xfs_db -r -c "frag -d" /dev/vdc1* actual 8947229, ideal 8406330, fragmentation factor 6.05% *VM# df -i /dev/vdc1* Filesystem Inodes IUsed IFree IUse% Mounted on /dev/vdc1 6,442,426,368 152,347,297 6,290,079,071 3% /exports *VM# for i in `seq 0 $((16-1))`; do echo "freespace in ag$i"; xfs_db -r -c "freesp -s -a $i" /dev/vdc1 | grep "total free" | sed 's/^/ /g'; done* freespace in ag0 total free extents 611688 total free blocks 45590165 freespace in ag1 total free extents 606085 total free blocks 45576240 freespace in ag2 total free extents 606482 total free blocks 45571903 freespace in ag3 total free extents 604576 total free blocks 45572111 freespace in ag4 total free extents 74367 total free blocks 15129234 freespace in ag5 total free extents 172955 total free blocks 17015698 freespace in ag6 total free extents 176759 total free blocks 14716774 freespace in ag7 total free extents 170481 total free blocks 15031152 freespace in ag8 total free extents 173346 total free blocks 15677354 freespace in ag9 total free extents 177170 total free blocks 14914037 freespace in ag10 total free extents 169536 total free blocks 16267638 freespace in ag11 total free extents 173325 total free blocks 14618827 freespace in ag12 total free extents 174743 total free blocks 14634872 freespace in ag13 total free extents 173378 total free blocks 16412626 freespace in ag14 total free extents 171388 total free blocks 15198251 freespace in ag15 total free extents 170986 total free blocks 13790690 *=E2=80=9CWhat information should I include when reporting a problem?=E2=80= =9D* *VM# uname -a * Linux 3.8.13-55.1.2.el6uek.x86_64 #2 SMP Thu Dec 18 00:15:51 PST 2014 x86_64 x86_64 x86_64 GNU/Linux *HV# uname -a* Linux 2.6.32-431.el6.x86_64 #1 SMP Wed Nov 20 23:56:07 PST 2013 x86_64 x86_64 x86_64 GNU/Linux *VM# xfs_repair -V * xfs_repair version 3.1.11 *VM# dmidecode |grep -A3 Product* Product Name: KVM Version: RHEL 6.5.0 PC *HV# dmidecode |egrep -A4 "Product|Processor"* Product Name: SUN SERVER X4-2L Processor Information Socket Designation: P0 Family: Xeon Signature: Type 0, Family 6, Model 62, Stepping 4 Processor Information Socket Designation: P1 Family: Xeon Signature: Type 0, Family 6, Model 62, Stepping 4 *VM# cat /proc/cpuinfo (Total of 16 virtual cpu=E2=80=99s all with the same settings as cpu 0 below.)* processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 13 model name : QEMU Virtual CPU version (cpu64-rhel6) stepping : 3 microcode : 0x1 cpu MHz : 2693.508 cache size : 4096 KB fpu : yes fpu_exception : yes cpuid level : 4 wp : yes flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl pni cx16 hypervisor lahf_lm bogomips : 5387.01 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management: *VM# cat /proc/meminfo * MemTotal: 49463428 kB MemFree: 931832 kB Buffers: 81504 kB Cached: 16499856 kB SwapCached: 0 kB Active: 21534272 kB Inactive: 10518940 kB Active(anon): 13615056 kB Inactive(anon): 1859060 kB Active(file): 7919216 kB Inactive(file): 8659880 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2096124 kB SwapFree: 2096124 kB Dirty: 117192 kB Writeback: 0 kB AnonPages: 15468324 kB Mapped: 39484 kB Shmem: 3888 kB Slab: 7883016 kB SReclaimable: 6149288 kB SUnreclaim: 1733728 kB KernelStack: 11000 kB PageTables: 180756 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 26827836 kB Committed_AS: 21133332 kB VmallocTotal: 34359738367 kB VmallocUsed: 112668 kB VmallocChunk: 34359623568 kB HardwareCorrupted: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 10224 kB DirectMap2M: 50321408 kB *VM# cat /proc/mounts * rootfs / rootfs rw 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 devtmpfs /dev devtmpfs rw,relatime,size=3D24719668k,nr_inodes=3D6179917,mode=3D755 0 0 devpts /dev/pts devpts rw,relatime,gid=3D5,mode=3D620,ptmxmode=3D000 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 /dev/vda3 / ext3 rw,relatime,errors=3Dcontinue,user_xattr,acl,barrier=3D1,data=3Dordered 0 0 proc /rhel3/proc proc rw,relatime 0 0 /dev/vda5 /tmp ext3 rw,relatime,errors=3Dcontinue,user_xattr,acl,barrier=3D1,data=3Dordered 0 0 /dev/vda1 /boot ext3 rw,relatime,errors=3Dcontinue,user_xattr,acl,barrier=3D1,data=3Dordered 0 0 */dev/vdc1 /exports xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0* /dev/vdb1 /mnt xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /www xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /rhel3/www xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /chroot xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /home xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /nfscommon xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /opt xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 /dev/vdc1 /scratch xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D112= 64,noquota 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 nfsd /proc/fs/nfsd nfsd rw,relatime 0 0 10.140.110.106:/export/nfs/qa /nfs/qa nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,har= d,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.= 140.110.106,mountvers=3D3,mountport=3D36653,mountproto=3Dudp,local_lock=3Dn= one,addr=3D10.140.110.106 0 0 10.140.110.106:/export/nfs/install /nfs/install nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,har= d,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.= 140.110.106,mountvers=3D3,mountport=3D36653,mountproto=3Dudp,local_lock=3Dn= one,addr=3D10.140.110.106 0 0 10.140.110.105:/export/home /nfs/users nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,har= d,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.= 140.110.105,mountvers=3D3,mountport=3D37692,mountproto=3Dudp,local_lock=3Dn= one,addr=3D10.140.110.105 0 0 10.140.110.105:/export/nfs/project /nfs/project nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,har= d,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.= 140.110.105,mountvers=3D3,mountport=3D37692,mountproto=3Dudp,local_lock=3Dn= one,addr=3D10.140.110.105 0 0 10.140.110.105:/export/nfs/data /nfs/data nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,har= d,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.= 140.110.105,mountvers=3D3,mountport=3D37692,mountproto=3Dudp,local_lock=3Dn= one,addr=3D10.140.110.105 0 0 none /sys/kernel/debug debugfs rw,relatime 0 0 *VM# cat /proc/partitions * major minor #blocks name 251 0 104857600 vda 251 1 204800 vda1 251 2 2096128 vda2 251 3 16595968 vda3 251 4 1 vda4 251 5 85958656 vda5 251 16 6442450944 vdb 251 17 6442434560 vdb1 251 32 6442450944 vdc 251 33 6442426368 vdc1 *VM# xfs_info /dev/vdc1* meta-data=3D/dev/vdc1 isize=3D256 agcount=3D32, agsize=3D50= 331456 blks =3D sectsz=3D512 attr=3D2, projid32bit=3D1 =3D crc=3D0 data =3D bsize=3D4096 blocks=3D1610606592, imax= pct=3D25 =3D sunit=3D64 swidth=3D1408 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D521728, version= =3D2 =3D sectsz=3D512 sunit=3D64 blks, lazy-cou= nt=3D1 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D0 *VM# iostat -x -d -m 5* Linux 3.8.13-55.1.2.el6uek.x86_64 (hmswebdv01.int.dv.lan) 08/13/2015 _x86_64_ Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.13 23.96 4.69 9.77 0.08 0.13 29.83 0.17 11.64 2.64 3.81 vda1 0.00 0.01 0.00 0.00 0.00 0.00 86.76 0.00 7.73 4.22 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 14.68 0.00 2.08 1.81 0.00 vda3 0.13 19.58 4.65 8.29 0.08 0.11 29.68 0.15 11.36 2.79 3.60 vda4 0.00 0.00 0.00 0.00 0.00 0.00 7.67 0.00 29.50 29.50 0.00 vda5 0.01 4.37 0.04 1.44 0.00 0.02 32.06 0.02 14.22 2.41 0.35 vdb 0.00 0.00 36.47 0.13 0.28 0.04 17.96 0.11 3.09 2.87 10.50 vdb1 0.00 0.00 36.47 0.13 0.28 0.04 17.96 0.11 3.09 2.87 10.50 vdc 56.10 85.36 447.04 461.48 9.21 10.85 45.20 1.29 1.42 0.99 89.77 vdc1 56.10 85.36 447.04 461.48 9.21 10.85 45.20 1.28 1.42 0.99 89.77 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 13.20 1.40 3.00 0.01 0.06 33.45 0.01 2.91 2.32 1.02 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 10.00 1.40 2.60 0.01 0.05 29.60 0.01 3.20 2.55 1.02 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 3.20 0.00 0.40 0.00 0.01 72.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.00 0.00 1222.80 60.60 45.01 5.81 81.10 7.49 5.79 0.78 100.00 vdc1 0.00 0.00 1222.80 60.60 45.01 5.81 81.10 7.49 5.79 0.78 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 10.20 1.20 17.60 0.04 0.11 16.51 0.06 2.96 0.66 1.24 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 9.40 1.20 13.20 0.04 0.09 18.78 0.05 3.57 0.86 1.24 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.80 0.00 4.20 0.00 0.02 9.52 0.00 1.00 0.05 0.02 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.00 0.40 928.00 432.40 23.05 13.05 54.35 9.65 7.14 0.74 100.00 vdc1 0.00 0.40 928.00 432.40 23.05 13.05 54.35 9.65 7.14 0.74 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 7.60 0.00 2.40 0.00 0.04 32.00 0.10 41.67 16.33 3.92 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 7.60 0.00 2.00 0.00 0.04 38.40 0.09 46.60 16.20 3.24 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.00 293.20 352.20 1753.00 8.38 43.34 50.32 71.98 33.91 0.48 100.00 vdc1 0.00 293.20 352.20 1753.00 8.38 43.34 50.32 71.98 33.91 0.48 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 15.00 1.20 6.40 0.04 0.08 32.00 0.42 55.29 23.24 17.66 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 14.40 1.20 5.80 0.04 0.08 33.60 0.39 55.77 20.97 14.68 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.60 0.00 0.40 0.00 0.00 20.00 0.02 60.50 60.50 2.42 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.20 676.20 20.40 3131.60 0.20 26.83 17.56 144.45 45.74 0.32 100.00 vdc1 0.20 676.20 20.40 3131.60 0.20 26.83 17.56 144.45 45.74 0.32 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 3.60 2.80 2.60 0.02 0.02 17.78 0.48 89.63 52.41 28.30 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 3.60 2.80 2.60 0.02 0.02 17.78 0.48 89.63 52.41 28.30 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 1.40 518.00 51.80 3012.00 0.62 25.65 17.56 149.01 48.58 0.33 100.00 vdc1 1.40 518.00 51.80 3012.00 0.62 25.65 17.56 149.01 48.58 0.33 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 2.60 0.00 2.20 0.00 0.02 16.73 0.05 22.73 19.91 4.38 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 2.60 0.00 2.00 0.00 0.02 18.40 0.02 9.60 6.50 1.30 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 3.40 62.00 65.40 1936.20 1.84 9.35 11.45 153.92 76.42 0.50 100.00 vdc1 3.40 62.00 65.40 1936.20 1.84 9.35 11.45 153.92 76.42 0.50 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 3.80 0.20 2.80 0.00 0.02 17.07 0.17 55.47 30.87 9.26 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 3.80 0.20 2.40 0.00 0.02 19.69 0.15 58.69 30.31 7.88 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 1.00 224.20 379.20 1752.60 5.32 14.94 19.46 100.70 47.71 0.47 100.00 vdc1 1.00 224.20 379.20 1752.60 5.32 14.94 19.46 100.70 47.71 0.47 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 15.00 3.20 7.00 0.04 0.09 25.25 0.04 4.29 2.49 2.54 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 15.00 3.20 6.80 0.04 0.09 25.76 0.04 4.38 2.54 2.54 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.40 45.00 390.60 1060.60 8.16 8.61 23.66 80.59 56.24 0.68 99.20 vdc1 0.40 45.00 390.60 1060.60 8.16 8.61 23.66 80.59 56.24 0.68 99.20 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 91.40 3.00 48.20 0.03 0.55 23.00 0.11 2.20 0.33 1.70 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 66.00 3.00 38.40 0.03 0.41 21.64 0.10 2.34 0.41 1.68 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 25.40 0.00 9.80 0.00 0.14 28.73 0.02 1.61 0.08 0.08 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.00 0.20 863.60 191.60 30.72 13.77 86.35 6.17 5.85 0.95 99.86 vdc1 0.00 0.20 863.60 191.60 30.72 13.77 86.35 6.17 5.85 0.95 99.86 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 32.20 0.00 13.80 0.00 0.18 26.55 1.20 86.84 6.93 9.56 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 32.20 0.00 13.60 0.00 0.18 26.94 1.20 88.10 7.01 9.54 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.00 0.60 791.00 359.00 16.53 36.44 94.34 25.17 21.87 0.87 100.00 vdc1 0.00 0.60 791.00 359.00 16.53 36.44 94.34 25.17 21.87 0.87 100.00 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util vda 0.00 16.80 0.80 23.00 0.00 0.15 13.58 0.03 1.08 0.24 0.58 vda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda3 0.00 11.00 0.80 17.20 0.00 0.11 12.98 0.02 1.26 0.31 0.56 vda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vda5 0.00 5.80 0.00 5.40 0.00 0.04 16.59 0.00 0.59 0.07 0.04 vdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 vdc 0.00 0.00 1143.40 12.40 40.78 3.05 77.67 6.23 5.39 0.87 100.02 vdc1 0.00 0.00 1143.40 12.40 40.78 3.05 77.67 6.23 5.39 0.87 100.02 *VM# vmstat 5 12 * procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 6 3 0 1022148 77808 16266636 0 0 618 712 0 0 4 10 80 6 0 4 1 0 1086272 77384 16232348 0 0 24294 39514 19557 15659 2 24 54 20 0 0 4 0 1079320 77324 16239100 0 0 4667 25202 8772 11317 1 5 74 20 0 3 3 0 1094136 77308 16234064 0 0 1102 27323 8101 12963 3 4 79 14 0 5 10 0 1178908 77296 16156332 0 0 1370 18625 9776 11009 1 8 64 27 0 4 5 0 1387024 77020 15991676 0 0 10094 3260 19037 14185 1 23 61 14 0 4 3 0 1300224 77028 15920712 0 0 3219 20062 17265 14902 7 18 63 12 0 1 11 0 1522772 77064 15796712 0 0 1095 23720 13740 15666 7 11 50 32 0 6 1 0 1557288 77172 15810492 0 0 4626 31199 16900 14040 6 18 53 23 0 5 2 0 1529284 77204 15850112 0 0 9396 6547 17183 13949 2 21 57 20 0 3 1 0 1480028 77212 15881516 0 0 10033 3002 20339 14766 1 26 64 9 0 6 2 0 1447844 77228 15915300 0 0 10855 4226 19170 14180 3 23 65 9 0 *HV# /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -a0 * Adapter #0 Number of Virtual Disks: 2 Virtual Drive: 0 (Target Id: 0) Name : RAID Level : Primary-6, Secondary-0, RAID Level Qualifier-3 Size : 45.998 GB Parity Size : 4.181 GB State : Optimal Strip Size : 256 KB Number Of Drives : 24 Span Depth : 1 Default Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU Current Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU Default Access Policy: Read/Write Current Access Policy: Read/Write Disk Cache Policy : Disabled Encryption Type : None Is VD Cached: No Number of Spans: 1 Span: 0 - Number of PDs: 24 PD: 0 Information Enclosure Device ID: 34 Slot Number: 0 Drive's postion: DiskGroup: 0, Span: 0, Arm: 0 Enclosure position: 0 Device Id: 35 WWN: 5000CCA01D350CC3 Sequence Number: 2 Media Error Count: 0 Other Error Count: 0 Predictive Failure Count: 0 Last Predictive Failure Event Seq Number: 0 PD Type: SAS Raw Size: 1.090 TB [0x8bba0cb0 Sectors] Non Coerced Size: 1.090 TB [0x8baa0cb0 Sectors] Coerced Size: 1.089 TB [0x8b94f800 Sectors] Firmware state: Online, Spun Up Is Commissioned Spare : NO Device Firmware Level: A600 Shield Counter: 0 Successful diagnostics completion on : N/A SAS Address(0): 0x5000cca01d350cc1 SAS Address(1): 0x0 Connected Port Number: 0(path0) Inquiry Data: HGST H101212SESUN1.2TA6001404DY5EPE FDE Enable: Disable Secured: Unsecured Locked: Unlocked Needs EKM Attention: No Foreign State: None Device Speed: 6.0Gb/s Link Speed: 6.0Gb/s Media Type: Hard Disk Device Drive Temperature :26C (78.80 F) PI Eligibility: No Drive is formatted for PI information: No PI: No PI Drive's write cache : Disabled Port-0 : Port status: Active Port's Linkspeed: 6.0Gb/s Port-1 : Port status: Active Port's Linkspeed: Unknown Drive has flagged a S.M.A.R.T alert : No *KERNEL OPTIONS: Which of these kernels should I choose for the best XFS support for this issue?* kernel-3.16.7-3.16.y.20141114.ol6.x86_64.rpm 14-Nov-2014 17:55 27.7 M kernel-3.17.3-3.17.y.20141114.ol6.x86_64.rpm 14-Nov-2014 23:55 26.6 M kernel-3.17.3-3.17.y.20141118.ol6.x86_64.rpm 18-Nov-2014 09:13 26.6 M kernel-3.17.8-3.17.y.20150113.ol6.x86_64.rpm 14-Jan-2015 06:50 27.9 M kernel-3.18.6-3.18.y.20150210.ol6.x86_64.rpm 10-Feb-2015 09:52 30.9 M kernel-3.18.7-3.18.y.20150217.ol6.x86_64.rpm 17-Feb-2015 09:53 30.9 M kernel-3.18.8-3.18.y.20150303.ol6.x86_64.rpm 03-Mar-2015 09:55 30.9 M kernel-3.19.5-3.19.y.20150421.ol6.x86_64.rpm 22-Apr-2015 05:42 31.1 M kernel-3.19.6-3.19.y.20150505.ol6.x86_64.rpm 06-May-2015 05:41 29.8 M kernel-3.19.8-3.19.y.20150512.ol6.x86_64.rpm 13-May-2015 05:42 29.8 M Thank you for your time and comments. Regards, Pippin Wallace Bozeman Montana --089e01634d6a80efcf051d39cafe Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

=C2=A0

I am writing to confirm the iss= ue I think I have and get advice on the best short term and long term =E2= =80=9Cfixes=E2=80=9D.

=C2=A0

In reading the followin= g threads and others I am pretty sure I have inode btree fragmentation and = I have included=C2=A0detailed=C2=A0output=C2=A0below to help confirm this.= =C2=A0

=C2=A0

Is XFS su= itable for 350 million files on 20TB storage?

http://oss.sgi.com/= archives/xfs/2014-09/msg00046.html

= =C2=A0

Bad performance on touch/cp file on XFS system <= u>

http://oss.sgi.com/archives/xfs/2014-08/msg00348.html=

=C2=A0

Extremely slow file creation/deletion= after xfs ran full

http://oss.sgi.com/archives/xfs/2015-01/msg002= 03.html

=C2=A0

= =C2=A0

In addition to diagnosis I want to insure I take th= e right steps to improve performance in the short term and fix it correctly= and thoroughly for the long term.

=C2=A0=

Our workload is heavy write/delete and light reads.=C2=A0 Mo= st files are smallish and we cannot mount xfs with inode64 as our primary a= pp is 32 bit.=C2=A0 Our hosts are running as VM=E2=80=99s on a KVM hypervis= or.

=C2=A0

Suggestion from = Dave in post =C2=A0http://oss.sgi.com/archives/xfs/2014-08/msg00349.html

If this is still the best short term fix would you pleas= e direct me to the =E2=80=9CHow To=E2=80=9D for doing this?

=E2=80=9Cfilling in all the holes (by creating a bunch of zero = length files in the

appropriate AGs) might t= ake some time, but it should make the

probl= em go away until you remove more filesystem and create random=

free inode holes again...=E2=80=9D

=C2=A0

Is this also a possible short term fix= ?=C2=A0 http://osvault.blogspot.com/201= 1/03/fixing-1tbyte-inode-problem-in-xfs-file.html<= /p>

=C2=A0

=C2=A0

Long ter= m fix is upgrade kernel to >=3D 3.16, xfsprogs >=3D3.2.1 and rebuild = fs with new finobt structure.<= /u>

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 # mkfs.xfs -m crc=3D1,finobt=3D1 <dev>

=C2=A0

=C2=A0<= u>

=C2=A0

Here is info others have asked for in previous threads and further below t= hat is data collected based on =E2=80=9CWhat information should I include w= hen reporting a problem?=E2=80=9D from your FAQ.

=C2=A0

If a command line = in bold below starts with a VM then this command was run on the Virtual Mac= hine or guest OS and if it starts with a HV then it was run on the physical= HyperVisor machine that is hosting the guest OS.

<= p class=3D"MsoNormal"><= u>
=C2=A0

=C2=A0

VM# perf= top

Samples: 378K of event 'cpu-clock&= #39;, Event count (approx.): 188377

14.10%=C2=A0 [k= ernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] xfs_inobt_get_rec<= u>

=C2=A0 9.58%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 [k] xfs_btree_increment

=C2=A0 9.08%=C2= =A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] xfs_btree_get_rec

=C2=A0 8.83%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0[k] _xfs_buf_find

=C2=A0 5.84%=C2= =A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] xfs_btree_get_block=

=C2=A0 3.91%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 [k] xfs_btree_rec_offset

=C2=A0 = 3.85%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] xfs_diallo= c_ag

=C2=A0 3.64%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 [k] xfs_btree_readahead

=C2= =A0 3.15%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] _raw_sp= in_unlock_irqrestore

=C2=A0 2.97%=C2=A0 [kernel]=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] xfs_btree_rec_addr

=C2=A0 2.31%=C2=A0 [kernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= [k] xfs_trans_buf_item_match

=C2=A0 1.67%=C2=A0 [k= ernel]=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [k] xfs_btree_setbuf

=C2=A0

=C2=A0<= u>

VM# time xfs_db -r -c "frag"= /dev/vdc1=C2=A0=C2=A0

actua= l 80103457, ideal 79500897, fragmentation factor 0.75%=

real=C2=A0=C2=A0=C2=A0 53m19.167s

user=C2=A0=C2=A0=C2=A0 0m35.050s

sys=C2=A0=C2=A0=C2=A0=C2=A0 3m35.390s

=C2=A0

=C2=A0

VM# xfs_db -r -c "frag -d" /dev/= vdc1

actual 8947229, ideal 84= 06330, fragmentation factor 6.05%

= =C2=A0

=C2=A0

VM# df -i = /dev/vdc1

Filesystem=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 Inodes=C2=A0=C2=A0=C2=A0=C2=A0 IUsed=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 IFree IUse% Mounted on

/dev/v= dc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 6,442,426,368 152,347,297 6,290,079,071= =C2=A0=C2=A0=C2=A0 3% /exports

=C2=A0=

=C2=A0

VM# for i in `seq 0 $((16-1))`; do echo "freespace in ag$i"; xfs= _db -r -c "freesp -s -a $i" /dev/vdc1 | grep "total free&quo= t; | sed 's/^/ /g'; done

freespace in ag0

total free ext= ents 611688

total free blocks 4559016= 5

freespace in ag1

total free extents 606085

total free blocks 45576240

f= reespace in ag2

total free extents 6= 06482

total free blocks 45571903

freespace in ag3

=

total free extents 604576

total free blocks 45572111

freespa= ce in ag4

total free extents 74367=

total free blocks 15129234

freespace in ag5

total free extents 172955

total= free blocks 17015698

freespace in ag= 6

total free extents 176759=

total free blocks 14716774

freespace in ag7

t= otal free extents 170481

total free b= locks 15031152

freespace in ag8<= /u>

total free extents 173346<= /span>

total free blocks 15677354

=

freespace in ag9

total = free extents 177170

total free blocks= 14914037

freespace in ag10=

total free extents 169536=

total free blocks 16267638

freespace in ag11

total free = extents 173325

total free blocks 14= 618827

freespace in ag12

total free extents 174743

total free blocks 14634872

freespace in ag13

total free ex= tents 173378

total free blocks 164126= 26

freespace in ag14

total free extents 171388

total free blocks 15198251

freespace in ag15

total free extents= 170986

total free blocks 13790690=

=C2=A0

=C2=A0

=E2=80=9CWhat info= rmation should I include when reporting a problem?=E2=80=9D

=C2=A0

=C2=A0

<= span style=3D"font-family:"Courier New"">VM# uname -a=C2=A0

Linux 3.8.13-55.1.2.el6uek.x86_64 #2 SMP Thu De= c 18 00:15:51 PST 2014 x86_64 x86_64 x86_64 GNU/Linux<= /p>

=C2=A0

HV# uname -a<= /u>

Linux 2.6.32-431.el6.x86_64 #1 SMP Wed Nov 20 23:56:07 PST 2013 = x86_64 x86_64 x86_64 GNU/Linux

=C2=A0

= =C2=A0=

VM# xfs_repair -V

xfs_repa= ir version 3.1.11

=C2=A0

=C2=A0

VM# dmidecode |grep -A3 Product

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Product = Name: KVM

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 Version: RHEL 6.5.0 PC

<= span style=3D"font-family:"Courier New"">=C2=A0

=C2=A0

HV# dmidecode |egrep -A4 "= Product|Processor"

=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 Product Name: SUN SERVER X4-2L=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0

Processor Information

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Socket Designation: P0<= u>

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Family: = Xeon

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Sig= nature: Type 0, Family 6, Model 62, Stepping 4

Proc= essor Information

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 Socket Designation: P1

=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 Family: Xeon

=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Signature: Type 0, Family 6, Model 62, Stepp= ing 4

=C2=A0

=C2=A0<= u>

VM# cat /proc/cpuinfo (Total of 16 virtual cpu=E2=80= =99s all with the same settings as cpu 0 below.)

processor=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 0

vendor_id=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : GenuineIntel=

cpu family=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 6

model=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = : 13

model name=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : QEM= U Virtual CPU version (cpu64-rhel6)

stepping=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 3

microcod= e=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 0x1

cpu MHz= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 2693.508

cache size=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 4096 KB

fpu=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 : yes

fpu_exception=C2=A0=C2=A0 : yes=

cpuid level=C2=A0=C2=A0=C2=A0=C2=A0 : 4=

wp=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 : yes

flags=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : fpu de pse tsc msr pae mce cx8 ap= ic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl= pni cx16 hypervisor lahf_lm

bogomips=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 5387.01

clflush = size=C2=A0=C2=A0=C2=A0 : 64

= cache_alignment : 64=

address sizes=C2=A0=C2=A0 : 46 bits physical, 48 bits= virtual

power management:

=

= =C2=A0

=C2=A0

VM# cat= /proc/meminfo

MemTotal:=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 49463428 kB

MemFree:=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 931832 kB

Cached:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 16499856 kB

SwapCached:=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 kB<= /p>

Active:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 21534272 kB

Inactive:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 10518940 = kB

Active(anon):=C2=A0=C2=A0 13615056 kB<= /u>

Inactive(anon):=C2=A0 1859060 kB

Acti= ve(file):=C2=A0=C2=A0=C2=A0 7919216 kB

Inactive(fil= e):=C2=A0 8659880 kB

Unevictable:=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 kB

Mlo= cked:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0 kB

SwapTotal:=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 2096124 kB

SwapFree:=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 2096124 kB

Dirty:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 117192 k= B

Writeback:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 kB

AnonPages:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 15468324 kB

Mapped:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 39484 kB=

Shmem:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 3888 kB

Slab:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 7883016 = kB

SReclaimable:=C2=A0=C2=A0=C2=A0 6149288 kB

SUnreclaim:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1733728 kB<= /u>

KernelStack:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 11000= kB

PageTables:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 180756 kB

NFS_Unstable:=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0 kB

Bounce:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0 kB

WritebackTmp:=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 kB

CommitLimit:=C2= =A0=C2=A0=C2=A0 26827836 kB

= Committed_AS:=C2=A0=C2= =A0 21133332 kB

VmallocTotal:=C2=A0=C2=A0 34359738= 367 kB

VmallocUsed:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1= 12668 kB

VmallocChunk:=C2=A0=C2=A0 34359623568 kB

HardwareCorrupted:=C2=A0=C2=A0=C2=A0=C2=A0 0 kB

HugePages_Total:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0<= u>

HugePages_Free:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0

HugePages_Rsvd:=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0

HugePages_Surp:=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0

<= span style=3D"font-family:"Courier New"">Hugepagesize:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 2048 kB

DirectMap4k:=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 10224 kB

DirectMa= p2M:=C2=A0=C2=A0=C2=A0 50321408 kB

=C2=A0=

=C2=A0

VM# cat /= proc/mounts

rootfs / rootfs rw 0 0<= u>

proc /proc proc rw,relatime 0 0

sy= sfs /sys sysfs rw,relatime 0 0

devtmpfs /dev devtmp= fs rw,relatime,size=3D24719668k,nr_inodes=3D6179917,mode=3D755 0 0

devpts /dev/pts devpts rw,relatime,gid=3D5,mode=3D620,ptmxm= ode=3D000 0 0

tmpfs /dev/shm tmpfs rw,relatime 0 0<= u>

/dev/vda3 / ext3 rw,relatime,errors=3Dcontinue,user= _xattr,acl,barrier=3D1,data=3Dordered 0 0

proc /rh= el3/proc proc rw,relatime 0 0

/dev/vda5 /tmp ext3 r= w,relatime,errors=3Dcontinue,user_xattr,acl,barrier=3D1,data=3Dordered 0 0<= u>

/dev/vda1 /boot ext3 rw,relatime,errors=3Dcontinue,= user_xattr,acl,barrier=3D1,data=3Dordered 0 0

/d= ev/vdc1 /exports xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sun= it=3D512,swidth=3D11264,noquota 0 0

/dev/vdb1 /= mnt xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swid= th=3D11264,noquota 0 0

/dev/vdc1 /www xfs rw,noatim= e,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D11264,noquot= a 0 0

/dev/vdc1 /rhel3/www xfs rw,noatime,attr2,ino= de32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D11264,noquota 0 0

/dev/vdc1 /chroot xfs rw,noatime,attr2,inode32,nobarrier= ,logbsize=3D256k,sunit=3D512,swidth=3D11264,noquota 0 0

/dev/vdc1 /home xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k= ,sunit=3D512,swidth=3D11264,noquota 0 0

/dev/vdc1 /= nfscommon xfs rw,noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D51= 2,swidth=3D11264,noquota 0 0

/dev/vdc1 /opt xfs rw,= noatime,attr2,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D11264,= noquota 0 0

/dev/vdc1 /scratch xfs rw,noatime,attr2= ,inode32,nobarrier,logbsize=3D256k,sunit=3D512,swidth=3D11264,noquota 0 0

none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatim= e 0 0

sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,= relatime 0 0

nfsd /proc/fs/nfsd nfsd rw,relatime 0 = 0

10.140.110.106:/export/nfs/qa /nfs/qa nfs rw,noat= ime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,hard,nocto= ,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.140.110= .106,mountvers=3D3,mountport=3D36653,mountproto=3Dudp,local_lock=3Dnone,add= r=3D10.140.110.106 0 0

10.140.110.106:/export/nfs/i= nstall /nfs/install nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize= =3D32768,namlen=3D255,hard,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,= sec=3Dsys,mountaddr=3D10.140.110.106,mountvers=3D3,mountport=3D36653,mountp= roto=3Dudp,local_lock=3Dnone,addr=3D10.140.110.106 0 0=

10.140.110.105:/export/home /nfs/users nfs rw,noatime,nodiratime,vers= =3D3,rsize=3D32768,wsize=3D32768,namlen=3D255,hard,nocto,noacl,proto=3Dtcp,= timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr=3D10.140.110.105,mountvers=3D3,= mountport=3D37692,mountproto=3Dudp,local_lock=3Dnone,addr=3D10.140.110.105 = 0 0

10.140.110.105:/export/nfs/project /nfs/project= nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768,wsize=3D32768,namlen=3D25= 5,hard,nocto,noacl,proto=3Dtcp,timeo=3D600,retrans=3D2,sec=3Dsys,mountaddr= =3D10.140.110.105,mountvers=3D3,mountport=3D37692,mountproto=3Dudp,local_lo= ck=3Dnone,addr=3D10.140.110.105 0 0

10.140.110.105:= /export/nfs/data /nfs/data nfs rw,noatime,nodiratime,vers=3D3,rsize=3D32768= ,wsize=3D32768,namlen=3D255,hard,nocto,noacl,proto=3Dtcp,timeo=3D600,retran= s=3D2,sec=3Dsys,mountaddr=3D10.140.110.105,mountvers=3D3,mountport=3D37692,= mountproto=3Dudp,local_lock=3Dnone,addr=3D10.140.110.105 0 0<= /span>

none /sys/kernel/debug debugfs rw,relatime 0 0

=C2=A0

=C2=A0<= /b>

VM# cat /proc/partitions

majo= r minor=C2=A0 #blocks=C2=A0 name

=C2=A0

251=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0=C2=A0 10485760= 0 vda

251=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 1=C2=A0=C2=A0=C2=A0=C2=A0 204800 vda1

251=C2=A0=C2= =A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A02=C2=A0=C2=A0=C2=A0 2096128 vda2

251=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 3=C2=A0=C2=A0= 16595968 vda3

251=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1 vda4=

251=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 5=C2= =A0=C2=A0 85958656 vda5

251=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 16 6442450944 vdb

251=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 17 6442434560 vdb1

251=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 32 6442450944 vdc

251=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 33 6442426368 vdc1

=C2=A0

=C2=A0

VM# xfs_info /dev/vdc1

meta-data=3D/dev/= vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 isize=3D256=C2=A0=C2=A0=C2=A0 agcount=3D32, agsize=3D50331456 blk= s

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = =3D=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 sectsz=3D512= =C2=A0=C2=A0 attr=3D2, projid32bit=3D1

=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 crc=3D0

data=C2=A0=C2=A0= =C2=A0=C2=A0 =3D=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= bsize=3D4096=C2=A0=C2=A0 blocks=3D1610606592, imaxpct=3D25

=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=3D=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 sunit=3D64=C2=A0=C2=A0=C2=A0= =C2=A0 swidth=3D1408 blks

naming=C2=A0=C2=A0 =3Dver= sion 2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 bsize=3D4096=C2=A0=C2=A0 ascii-ci=3D0

log= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3Dinternal=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 bsize=3D4096=C2=A0=C2= =A0 blocks=3D521728, version=3D2

=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 sectsz=3D512=C2=A0=C2=A0 sunit=3D64 blks, lazy-count=3D1=

realtime =3Dnone=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= extsz=3D4096=C2=A0=C2=A0 blocks=3D0, rtextents=3D0

=C2=A0

=C2=A0

VM# io= stat -x -d -m 5

Linux 3.8.13-55.1.2.el6uek.= x86_64 (hmswebdv01.int.dv.lan)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 08/13/20= 15=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 _x86_64_

= =C2=A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2= =A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgq= u-sz=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0 %util

vda= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0.13=C2=A0=C2=A0=C2=A0 23.96=C2=A0=C2=A0=C2=A0 4.69=C2=A0=C2=A0= =C2=A0 9.77=C2=A0=C2=A0=C2=A0=C2=A0 0.08=C2=A0=C2=A0=C2=A0=C2=A0 0.13=C2=A0= =C2=A0=C2=A0 29.83=C2=A0=C2=A0=C2=A0=C2=A0 0.17=C2=A0=C2=A0 11.64=C2=A0=C2= =A0 2.64=C2=A0=C2=A0 3.81

vda1=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.01=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 86.76=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 7.73=C2=A0=C2=A0 4.22=C2=A0=C2= =A0 0.00

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 14.68=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0 2.08=C2=A0=C2=A0 1.81=C2=A0=C2=A0 0.00=

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.13=C2=A0=C2=A0=C2=A0 19.58=C2=A0=C2=A0=C2=A0 4.6= 5=C2=A0=C2=A0=C2=A0 8.29=C2=A0=C2=A0=C2=A0=C2=A0 0.08=C2=A0=C2=A0=C2=A0=C2= =A0 0.11=C2=A0=C2=A0=C2=A0 29.68=C2=A0=C2=A0=C2=A0=C2=A0 0.15=C2=A0=C2=A0 1= 1.36=C2=A0=C2=A0 2.79=C2=A0=C2=A0 3.60

vda4=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 7.67=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 29.50=C2=A0 29.50= =C2=A0=C2=A0 0.00

vda5=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.01=C2=A0=C2=A0=C2=A0= =C2=A0 4.37=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0 1.44=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 32.06=C2=A0=C2= =A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0 14.22=C2=A0=C2=A0 2.41=C2=A0=C2=A0 0.35=

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0 36.47=C2=A0=C2=A0=C2=A0 0.13=C2=A0=C2=A0=C2=A0=C2=A0 0.28=C2=A0= =C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0 17.96=C2=A0=C2=A0=C2=A0=C2=A0 0.1= 1=C2=A0=C2=A0=C2=A0 3.09=C2=A0=C2=A0 2.87=C2=A0 10.50<= /p>

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 36.47=C2=A0=C2= =A0=C2=A0 0.13=C2=A0=C2=A0=C2=A0=C2=A0 0.28=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2= =A0=C2=A0=C2=A0 17.96=C2=A0=C2=A0=C2=A0=C2=A0 0.11=C2=A0=C2=A0=C2=A0 3.09= =C2=A0=C2=A0 2.87=C2=A0 10.50

vdc=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 56.10=C2=A0=C2= =A0=C2=A0 85.36=C2=A0 447.04=C2=A0 461.48=C2=A0=C2=A0=C2=A0=C2=A0 9.21=C2= =A0=C2=A0=C2=A0 10.85=C2=A0=C2=A0=C2=A0 45.20=C2=A0=C2=A0=C2=A0=C2=A0 1.29= =C2=A0=C2=A0=C2=A0 1.42=C2=A0=C2=A0 0.99=C2=A0 89.77

=C2=A0

Device:=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0= =C2=A0 r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0= =C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0 %util=

vda=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 13.20=C2=A0=C2= =A0=C2=A0 1.40=C2=A0=C2=A0=C2=A0 3.00=C2=A0=C2=A0=C2=A0=C2=A0 0.01=C2=A0=C2= =A0=C2=A0=C2=A0 0.06=C2=A0=C2=A0=C2=A0 33.45=C2=A0=C2=A0=C2=A0=C2=A0 0.01= =C2=A0=C2=A0=C2=A0 2.91=C2=A0=C2=A0 2.32=C2=A0=C2=A0 1.02

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda2= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda3=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A00.00=C2=A0= =C2=A0=C2=A0 10.00=C2=A0=C2=A0=C2=A0 1.40=C2=A0=C2=A0=C2=A0 2.60=C2=A0=C2= =A0=C2=A0=C2=A0 0.01=C2=A0=C2=A0=C2=A0=C2=A0 0.05=C2=A0=C2=A0=C2=A0 29.60= =C2=A0=C2=A0=C2=A0=C2=A0 0.01=C2=A0=C2=A0=C2=A0 3.20=C2=A0=C2=A0 2.55=C2=A0= =C2=A0 1.02

vda4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vda5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 3.20=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.40=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.01=C2=A0=C2=A0=C2=A0 72.00=C2=A0=C2=A0=C2=A0=C2=A0 0.0= 0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vdc=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00 1222.80=C2=A0=C2=A0 60.60=C2=A0=C2=A0=C2= =A0 45.01=C2=A0=C2=A0=C2=A0=C2=A0 5.81=C2=A0=C2=A0=C2=A0 81.10=C2=A0=C2=A0= =C2=A0=C2=A0 7.49=C2=A0=C2=A0=C2=A0 5.79=C2=A0=C2=A0 0.78 100.00<= /u>

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00 1222.80=C2=A0=C2=A0= 60.60=C2=A0=C2=A0=C2=A0 45.01=C2=A0=C2=A0=C2=A0=C2=A0 5.81=C2=A0=C2=A0=C2= =A0 81.10=C2=A0=C2=A0=C2=A0=C2=A0 7.49=C2=A0=C2=A0=C2=A0 5.79=C2=A0=C2=A0 0= .78 100.00

=C2=A0

Device:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s= =C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0 =C2=A0=C2=A0w/s=C2=A0=C2=A0=C2=A0 = rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2=A0 svc= tm=C2=A0 %util

vda=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 10.20=C2=A0=C2=A0=C2=A0 1.20=C2=A0=C2=A0 17.60=C2=A0=C2=A0=C2=A0=C2=A0 = 0.04=C2=A0=C2=A0=C2=A0=C2=A0 0.11=C2=A0=C2=A0=C2=A0 16.51=C2=A0=C2=A0=C2=A0= =C2=A0 0.06=C2=A0=C2=A0=C2=A0 2.96=C2=A0=C2=A0 0.66=C2=A0=C2=A0 1.24=

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0 =C2=A00.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda3= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 9.40=C2=A0=C2=A0=C2=A0 1.20=C2=A0=C2=A0 13= .20=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0=C2=A0 0.09=C2=A0=C2=A0= =C2=A0 18.78=C2=A0=C2=A0=C2=A0=C2=A0 0.05=C2=A0=C2=A0=C2=A0 3.57=C2=A0=C2= =A0 0.86=C2=A0=C2=A0 1.24

vda4=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0 =C2=A0= =C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 0.00

vda5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.80=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 4.20=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0=C2=A0 9.52=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 1.00=C2=A0=C2=A0 0.05=C2=A0=C2=A0 0.02<= u>

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 =C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.40=C2=A0 928.00=C2=A0 = 432.40=C2=A0=C2=A0=C2=A0 23.05=C2=A0=C2=A0=C2=A0 13.05=C2=A0=C2=A0=C2=A0 54= .35=C2=A0=C2=A0=C2=A0=C2=A0 9.65=C2=A0=C2=A0=C2=A0 7.14=C2=A0=C2=A0 0.74 10= 0.00

vdc1=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.40=C2= =A0 928.00=C2=A0 432.40=C2=A0=C2=A0=C2=A0 23.05=C2=A0=C2=A0=C2=A0 13.05=C2= =A0=C2=A0=C2=A0 54.35=C2=A0=C2=A0=C2=A0=C2=A0 9.65=C2=A0=C2=A0=C2=A0 7.14= =C2=A0=C2=A0 0.74 100.00

=C2=A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0= =C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0= =C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 aw= ait=C2=A0 svctm=C2=A0 %util

= vda=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 7.60=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 2.40=C2= =A0 =C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0 3= 2.00=C2=A0=C2=A0=C2=A0=C2=A0 0.10=C2=A0=C2=A0 41.67=C2=A0 16.33=C2=A0=C2=A0= 3.92

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0 0.00=C2=A0 =C2=A00.00=C2=A0=C2=A0 0.00<= /span>

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 7.60=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 2.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2= =A0 0.04=C2=A0=C2=A0=C2=A0 38.40=C2=A0=C2=A0=C2=A0=C2=A0 0.09=C2=A0=C2=A0 4= 6.60=C2=A0 16.20=C2=A0=C2=A0 3.24

vda4=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= 0.00=C2=A0=C2=A0 0.00

vda5=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00 =C2=A0=C2=A0=C2=A0=C2= =A00.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 293.20=C2=A0 352.20 1753.00=C2= =A0=C2=A0=C2=A0=C2=A0 8.38=C2=A0=C2=A0=C2=A0 43.34=C2=A0=C2=A0=C2=A0 50.32= =C2=A0=C2=A0=C2=A0 71.98=C2=A0=C2=A0 33.91=C2=A0=C2=A0 0.48 100.00

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 293.20=C2=A0 352.20 1753.00=C2=A0= =C2=A0=C2=A0=C2=A0 8.38=C2=A0=C2=A0=C2=A0 43.34=C2=A0=C2=A0=C2=A0 50.32=C2= =A0=C2=A0=C2=A0 71.98=C2=A0=C2=A0 33.91=C2=A0=C2=A0 0.48 100.00

=C2=A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 = r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 w= MB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0 %util<= /u>

vda=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 15.00=C2=A0=C2=A0=C2=A0 = 1.20=C2=A0=C2=A0=C2=A0 6.40=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0= =C2=A0 0.08=C2=A0=C2=A0=C2=A0 32.00=C2=A0=C2=A0=C2=A0=C2=A0 0.42=C2=A0=C2= =A0 55.29=C2=A0 23.24=C2=A0 17.66

vda1=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= 0.00=C2=A0=C2=A0 0.00

vda2=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 14.40=C2= =A0=C2=A0=C2=A0 1.20=C2=A0=C2=A0=C2=A0 5.80=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2= =A0=C2=A0=C2=A0=C2=A0 0.08=C2=A0=C2=A0=C2=A0 33.60=C2=A0=C2=A0=C2=A0=C2=A0 = 0.39=C2=A0=C2=A0 55.77=C2=A0 20.97=C2=A0 14.68

vda4= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda5=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.60=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.40=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 20.0= 0=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0 60.50=C2=A0 60.50=C2=A0=C2=A0 2.= 42

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /span>

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.20=C2=A0=C2=A0 676.20=C2=A0=C2=A0 20.40 3131.60= =C2=A0=C2=A0=C2=A0=C2=A0 0.20=C2=A0=C2=A0=C2=A0 26.83=C2=A0=C2=A0=C2=A0 17.= 56=C2=A0=C2=A0 144.45=C2=A0=C2=A0 45.74=C2=A0=C2=A0 0.32 100.00

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 0.20=C2=A0=C2=A0 676.20=C2=A0=C2=A0 20.40 3131.60=C2= =A0=C2=A0=C2=A0=C2=A0 0.20=C2=A0=C2=A0=C2=A0 26.83=C2=A0=C2=A0=C2=A0 17.56= =C2=A0=C2=A0 144.45=C2=A0=C2=A0 45.74=C2=A0=C2=A0 0.32 100.00=

=C2=A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 = r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 w= MB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0 %util<= /u>

vda=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 3.60=C2=A0=C2=A0= =C2=A0 2.80=C2=A0=C2=A0=C2=A0 2.60=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0= =C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 17.78=C2=A0=C2=A0=C2=A0=C2=A0 0.48=C2= =A0=C2=A0 89.63=C2=A0 52.41=C2=A0 28.30

vda1=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00=C2=A0=C2=A0 0.00

vda2=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 0.00

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 3.60=C2=A0=C2=A0=C2=A0 2.80=C2=A0=C2=A0=C2=A0 2.60=C2=A0=C2=A0=C2=A0=C2=A0 = 0.02=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 17.78=C2=A0=C2=A0=C2=A0= =C2=A0 0.48=C2=A0=C2=A0 89.63=C2=A0 52.41=C2=A0 28.30<= /p>

vda4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda5=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 0.00=C2=A0=C2=A0 0.00

vdb=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= 0.00=C2=A0=C2=A0 0.00

vdb1=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1.40=C2=A0=C2=A0 518.00=C2=A0= =C2=A0 51.80 3012.00=C2=A0=C2=A0=C2=A0=C2=A0 0.62=C2=A0=C2=A0=C2=A0 25.65= =C2=A0=C2=A0=C2=A0 17.56=C2=A0=C2=A0 149.01=C2=A0=C2=A0 48.58=C2=A0=C2=A0 0= .33 100.00

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1.40=C2=A0=C2=A0 518.00=C2=A0=C2= =A0 51.80 3012.00=C2=A0=C2=A0=C2=A0=C2=A0 0.62=C2=A0=C2=A0=C2=A0 25.65=C2= =A0=C2=A0=C2=A0 17.56=C2=A0=C2=A0 149.01=C2=A0=C2=A0 48.58=C2=A0=C2=A0 0.33= 100.00

=C2=A0

Device:=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2= =A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB= /s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2=A0 svctm= =C2=A0 %util

vda=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 2.60=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 2.20=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 16.73=C2=A0=C2= =A0=C2=A0=C2=A0 0.05=C2=A0=C2=A0 22.73=C2=A0 19.91=C2=A0=C2=A0 4.38<= u>

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 =C2=A00.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda3=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= 0.00=C2=A0=C2=A0=C2=A0=C2=A0 2.60=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= 2.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0= =C2=A0 18.40=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 9.60=C2=A0=C2= =A0 6.50=C2=A0=C2=A0 1.30

vda4=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 0.00

vda5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vdb=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 3.40=C2=A0=C2=A0=C2=A0 62.00=C2=A0=C2=A0 65.40 1936.2= 0=C2=A0=C2=A0=C2=A0 =C2=A01.84=C2=A0=C2=A0=C2=A0=C2=A0 9.35=C2=A0=C2=A0=C2= =A0 11.45=C2=A0=C2=A0 153.92=C2=A0=C2=A0 76.42=C2=A0=C2=A0 0.50 100.00

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 3.40=C2=A0=C2=A0=C2=A0 62.00=C2=A0=C2=A0 65.40 = 1936.20=C2=A0=C2=A0=C2=A0=C2=A0 1.84=C2=A0=C2=A0=C2=A0=C2=A0 9.35=C2=A0=C2= =A0=C2=A0 11.45=C2=A0=C2=A0 153.92=C2=A0=C2=A0 76.42=C2=A0=C2=A0 0.50 100.0= 0

=C2=A0

Device:=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2= =A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2= =A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0= %util

vda=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 3.80=C2=A0=C2=A0=C2=A0 0.20=C2=A0=C2=A0=C2=A0 2.80=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 17.07=C2=A0=C2=A0=C2=A0= =C2=A0 0.17=C2=A0=C2=A0 55.47=C2=A0 30.87=C2=A0=C2=A0 9.26

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda2= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00 =C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda3=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 3.80=C2=A0=C2=A0=C2=A0 0.20=C2=A0=C2=A0=C2=A0 2.40=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 19.6= 9=C2=A0=C2=A0=C2=A0=C2=A0 0.15=C2=A0=C2=A0 58.69=C2=A0 30.31=C2=A0=C2=A0 7.= 88

vda4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0 =C2=A0=C2=A0= =C2=A00.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vda5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vd= b1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0= =C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vdc=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1.= 00=C2=A0=C2=A0 224.20=C2=A0 379.20 1752.60=C2=A0=C2=A0=C2=A0=C2=A0 5.32=C2= =A0=C2=A0=C2=A0 14.94=C2=A0=C2=A0=C2=A0 19.46=C2=A0=C2=A0 100.70=C2=A0=C2= =A0 47.71=C2=A0=C2=A0 0.47 100.00

vdc1=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 1.00=C2= =A0=C2=A0 224.20=C2=A0 379.20 1752.60=C2=A0=C2=A0=C2=A0=C2=A0 5.32=C2=A0 = =C2=A0=C2=A014.94=C2=A0=C2=A0=C2=A0 19.46=C2=A0=C2=A0 100.70=C2=A0=C2=A0 47= .71=C2=A0=C2=A0 0.47 100.00

= =C2=A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2= =A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2= =A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0= await=C2=A0 svctm=C2=A0 %util

vda=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 15.00=C2=A0=C2=A0=C2=A0 3.20=C2=A0=C2=A0=C2=A0 7.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0=C2=A0 0.09=C2=A0=C2=A0=C2=A0 2= 5.25=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0 4.29=C2=A0=C2=A0 2.49= =C2=A0=C2=A0 2.54

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0= 0.00

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 15.00=C2=A0=C2=A0=C2= =A0 3.20=C2=A0=C2=A0=C2=A0 6.80=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2= =A0=C2=A0 0.09=C2=A0=C2=A0=C2=A0 25.76=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0= =C2=A0=C2=A0 4.38=C2=A0=C2=A0 2.54=C2=A0=C2=A0 2.54

vda4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda5=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00=C2=A0=C2=A0 0.00

vdb=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0 0.00

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0= 0.00

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.40=C2=A0=C2=A0=C2=A0 45.00=C2= =A0 390.60 1060.60=C2=A0=C2=A0=C2=A0=C2=A0 8.16=C2=A0=C2=A0=C2=A0=C2=A0 8.6= 1=C2=A0=C2=A0=C2=A0 23.66=C2=A0=C2=A0=C2=A0 80.59=C2=A0=C2=A0 56.24=C2=A0= =C2=A0 0.68=C2=A0 99.20

vdc1=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.40=C2=A0=C2=A0= =C2=A0 45.00=C2=A0 390.60 1060.60=C2=A0=C2=A0=C2=A0=C2=A0 8.16=C2=A0=C2=A0= =C2=A0=C2=A0 8.61=C2=A0=C2=A0=C2=A0 23.66=C2=A0=C2=A0=C2=A0 80.59=C2=A0=C2= =A0 56.24=C2=A0=C2=A0 0.68=C2=A0 99.20

=C2= =A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2=A0= =C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-s= z=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0 %util

vda=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0 91.40=C2=A0=C2=A0=C2=A0 3.00=C2=A0=C2=A0 48.2= 0=C2=A0=C2=A0=C2=A0=C2=A0 0.03=C2=A0=C2=A0=C2=A0=C2=A0 0.55=C2=A0=C2=A0=C2= =A0 23.00=C2=A0=C2=A0=C2=A0=C2=A0 0.11=C2=A0=C2=A0=C2=A0 2.20=C2=A0=C2=A0 0= .33=C2=A0=C2=A0 1.70

vda1=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.0= 0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.0= 0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 66.00=C2=A0=C2=A0=C2= =A0 3.00=C2=A0=C2=A0 38.40=C2=A0=C2=A0=C2=A0=C2=A0 0.03=C2=A0=C2=A0=C2=A0= =C2=A0 0.41=C2=A0=C2=A0=C2=A0 21.64=C2=A0=C2=A0=C2=A0=C2=A0 0.10=C2=A0=C2= =A0=C2=A0 2.34=C2=A0=C2=A0 0.41=C2=A0=C2=A0 1.68

vd= a4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda5=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 25.40=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 9.80=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.14=C2=A0=C2=A0=C2=A0 28.7= 3=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 1.61=C2=A0=C2=A0 0.08=C2= =A0=C2=A0 0.08

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 0.00

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.0= 0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.0= 0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.20=C2=A0 8= 63.60=C2=A0 191.60=C2=A0=C2=A0=C2=A0 30.72=C2=A0=C2=A0=C2=A0 13.77=C2=A0=C2= =A0=C2=A0 86.35=C2=A0=C2=A0=C2=A0=C2=A0 6.17=C2=A0=C2=A0=C2=A0 5.85=C2=A0= =C2=A0 0.95=C2=A0 99.86

vdc1=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 = =C2=A0=C2=A00.20=C2=A0 863.60=C2=A0 191.60=C2=A0=C2=A0=C2=A0 30.72=C2=A0=C2= =A0=C2=A0 13.77=C2=A0=C2=A0=C2=A0 86.35=C2=A0=C2=A0=C2=A0=C2=A0 6.17=C2=A0= =C2=A0=C2=A0 5.85=C2=A0=C2=A0 0.95=C2=A0 99.86

<= /u>=C2=A0

Device:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 rrqm/s=C2=A0=C2=A0 wrqm/s=C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0= =C2=A0=C2=A0 w/s=C2=A0=C2=A0=C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz a= vgqu-sz=C2=A0=C2=A0 await=C2=A0 svctm=C2=A0 %util

<= p class=3D"MsoNormal">v= da=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 32.20=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0 13.80=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.18=C2=A0= =C2=A0 =C2=A026.55=C2=A0=C2=A0=C2=A0=C2=A0 1.20=C2=A0=C2=A0 86.84=C2=A0=C2= =A0 6.93=C2=A0=C2=A0 9.56

vda1=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 0.00

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vda3=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0 32.20=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0 13.60=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.18=C2=A0=C2=A0=C2=A0 26.94=C2=A0=C2=A0=C2=A0=C2=A0 1.20=C2=A0= =C2=A0 88.10=C2=A0=C2=A0 7.01=C2=A0=C2=A0 9.54

vda4= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0 0.00=C2=A0=C2=A0 0.00

vda5=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 =C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0 0.00

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0= =C2=A0 0.00

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.60=C2= =A0 791.00=C2=A0 359.00=C2=A0=C2=A0=C2=A0 16.53=C2=A0=C2=A0=C2=A0 36.44=C2= =A0=C2=A0=C2=A0 94.34=C2=A0=C2=A0=C2=A0 25.17=C2=A0=C2=A0 21.87=C2=A0=C2=A0= 0.87 100.00

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 = 0.60=C2=A0 791.00=C2=A0 359.00=C2=A0=C2=A0=C2=A0 16.53=C2=A0=C2=A0=C2=A0 36= .44=C2=A0=C2=A0=C2=A0 94.34=C2=A0=C2=A0=C2=A0 25.17=C2=A0=C2=A0 21.87=C2=A0= =C2=A0 0.87 100.00

=C2=A0

<= p class=3D"MsoNormal">D= evice:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rrqm/s=C2=A0=C2=A0 w= rqm/s=C2=A0=C2=A0=C2=A0=C2=A0 r/s=C2=A0=C2=A0=C2=A0=C2=A0 w/s=C2=A0=C2=A0= =C2=A0 rMB/s=C2=A0=C2=A0=C2=A0 wMB/s avgrq-sz avgqu-sz=C2=A0=C2=A0 await=C2= =A0 svctm=C2=A0 %util

vda=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 16.80=C2=A0=C2=A0=C2=A0 0.80=C2=A0=C2=A0 23.00=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.15=C2=A0=C2=A0=C2=A0 13.58=C2=A0=C2= =A0=C2=A0=C2=A0 0.03=C2=A0=C2=A0=C2=A0 1.08=C2=A0=C2=A0 0.24=C2=A0=C2=A0 0.= 58

vda1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00 =C2=A0=C2=A0=C2=A0= =C2=A00.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= u>

vda2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=

vda3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 11.00=C2=A0=C2=A0=C2=A0 0.80=C2=A0=C2= =A0 17.20=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.11=C2=A0= =C2=A0=C2=A0 12.98=C2=A0=C2=A0=C2=A0=C2=A0 0.02=C2=A0=C2=A0=C2=A0 1.26=C2= =A0=C2=A0 0.31=C2=A0=C2=A0 0.56

vda4=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A00.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2= =A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.= 00=C2=A0=C2=A0 0.00

vda5=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0= =C2=A0 5.80=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 5.40=C2=A0=C2=A0=C2=A0= =C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.04=C2=A0=C2=A0=C2=A0 16.59=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.59=C2=A0=C2=A0 0.07=C2=A0=C2=A0 0.= 04

vdb=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00= =C2=A0=C2=A0=C2=A0=C2=A00.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /u>

vdb1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2= =A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0= .00=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00=C2=A0=C2=A0 0.00<= /span>

vdc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2=A0 0.00 1143.40=C2=A0=C2= =A0 12.40=C2=A0=C2=A0=C2=A0 40.78=C2=A0=C2=A0=C2=A0=C2=A0 3.05=C2=A0=C2=A0= =C2=A0 77.67=C2=A0=C2=A0=C2=A0=C2=A0 6.23=C2=A0=C2=A0=C2=A0 5.39=C2=A0=C2= =A0 0.87 100.02

vdc1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0.00=C2=A0=C2=A0=C2=A0=C2= =A0 0.00 1143.40=C2=A0=C2=A0 12.40=C2=A0=C2=A0=C2=A0 40.78=C2=A0=C2=A0=C2= =A0=C2=A0 3.05=C2=A0=C2=A0=C2=A0 77.67=C2=A0=C2=A0=C2=A0=C2=A0 6.23=C2=A0= =C2=A0=C2=A0 5.39=C2=A0=C2=A0 0.87 100.02

= =C2=A0

=C2=A0

VM# vmstat 5 1= 2

procs -----------memory---------- ---swa= p-- -----io---- --system-- -----cpu-----

r=C2=A0 = b=C2=A0=C2=A0 swpd=C2=A0=C2=A0 free=C2=A0=C2=A0 buff=C2=A0 cache=C2=A0=C2= =A0 si=C2=A0=C2=A0 so=C2=A0=C2=A0=C2=A0 bi=C2=A0=C2=A0=C2=A0 bo=C2=A0=C2=A0= in=C2=A0=C2=A0 cs us sy id wa st

6=C2=A0 3=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0 1022148=C2=A0 77808 16266636=C2=A0=C2=A0=C2=A0 0= =C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0 618=C2=A0=C2=A0 712=C2=A0=C2=A0=C2=A0 0=C2= =A0=C2=A0=C2=A0 0=C2=A0 4 10 80=C2=A0 6=C2=A0 0

4= =C2=A0 1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 1086272=C2=A0 77384 16232348=C2=A0= =C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0 24294 39514 19557 15659=C2=A0 2 24 54 20= =C2=A0 0

0=C2=A0 4=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 = 1079320=C2=A0 77324 16239100=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0=C2=A0 = 4667 25202 8772 11317=C2=A0 1=C2=A0 5 74 20=C2=A0 0

3=C2=A0 3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 1094136=C2=A0 77308 16234064=C2= =A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0=C2=A0 1102 27323 8101 12963=C2=A0 3= =C2=A0 4 79 14=C2=A0 0

5 10=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0 1178908=C2=A0 77296 16156332=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0= 0=C2=A0 1370 18625 9776 11009=C2=A0 1=C2=A0 8 64 27=C2=A0 0<= /span>

4=C2=A0 5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 1387024=C2=A0 77020 159= 91676=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0 10094=C2=A0 3260 19037 14185= =C2=A0 1 23 61 14=C2=A0 0

4=C2=A0 3=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0 1300224=C2=A0 77028 15920712=C2=A0=C2=A0=C2=A0 0=C2=A0=C2= =A0=C2=A0 0=C2=A0 3219 20062 17265 14902=C2=A0 7 18 63 12=C2=A0 0=

1 11=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 1522772=C2=A0 77064 157= 96712=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0=C2=A0 1095 23720 13740 15666= =C2=A0 7 11 50 32=C2=A0 0

6=C2=A0 1=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 0 1557288=C2=A0 77172 15810492=C2=A0=C2=A0=C2=A0 0=C2=A0=C2= =A0=C2=A0 0=C2=A0 4626 31199 16900 14040=C2=A0 6 18 53 23=C2=A0 0=

5=C2=A0 2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 1529284=C2=A0 7720= 4 15850112=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0=C2=A0 9396=C2=A0 6547 17= 183 13949=C2=A0 2 21 57 20=C2=A0 0

3=C2=A0 1=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 0 1480028=C2=A0 77212 15881516=C2=A0=C2=A0=C2=A0 0= =C2=A0=C2=A0=C2=A0 0 10033=C2=A0 3002 20339 14766=C2=A0 1 26 64=C2=A0 9=C2= =A0 0

6=C2=A0 2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0 144= 7844=C2=A0 77228 15915300=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0 0 10855=C2= =A0 4226 19170 14180=C2=A0 3 23 65=C2=A0 9=C2=A0 0

=

= =C2=A0

=C2=A0

HV# /op= t/MegaRAID/MegaCli/MegaCli64=C2=A0 -LdPdInfo -a0 <= /b>

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=

Adapter #0

=C2=A0

Number of Virtual Disks: 2

Virtual = Drive: 0 (Target Id: 0)

Name=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 :<= /u>

RAID Level=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 : Primary-6, Secondary-0, RAID Level Qualifier-3=

Size=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 45.998 GB

Parity S= ize=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 4.181 GB

State=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 : Optimal

Strip Size=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 256 KB<= /span>

Number Of Drives=C2=A0=C2=A0=C2=A0 : 24

<= p class=3D"MsoNormal">S= pan Depth=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 : 1<= u>

Default Cache Policy: WriteBack, ReadAhead, Direct, No Wri= te Cache if Bad BBU

Current Cache Policy: WriteBack= , ReadAhead, Direct, No Write Cache if Bad BBU

Defa= ult Access Policy: Read/Write

Current Access Policy= : Read/Write

Disk Cache Policy=C2=A0=C2=A0 : Disabl= ed

Encryption Type=C2=A0=C2=A0=C2=A0=C2=A0 : None

Is VD Cached: No

Number of S= pans: 1

Span: 0 - Number of PDs: 24

=C2=A0

PD: 0 Information

Enclosure Device ID: 34

Slot Number: 0

Drive's postion: DiskGroup: 0, Span: 0, Arm: 0

Enclosure position: 0

Device I= d: 35

WWN: 5000CCA01D350CC3

Sequence Number: 2

Media Error Count: 0<= /u>

Other Error Count: 0

Predictive Failu= re Count: 0

Last Predictive Failure Event Seq Numbe= r: 0

PD Type: SAS

Raw Size= : 1.090 TB [0x8bba0cb0 Sectors]

Non Coerced Size: 1= .090 TB [0x8baa0cb0 Sectors]

Coerced Size: 1.089 TB= [0x8b94f800 Sectors]

Firmware state: Online, Spun = Up

Is Commissioned Spare : NO<= /p>

Device Firmware Level: A600

Shield Counter: 0=

Successful diagnostics completion on :=C2=A0 N/A

SAS Address(0): 0x5000cca01d350cc1=

SAS Address(1): 0x0

Connected Port Number: 0(pa= th0)

Inquiry Data: HGST=C2=A0=C2=A0=C2=A0 H101212S= ESUN1.2TA6001404DY5EPE=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0

FDE Enable: Disable

Se= cured: Unsecured

Locked: Unlocked

Needs EKM Attention: No

Foreign State: None =

Device Speed: 6.0Gb/s

Lin= k Speed: 6.0Gb/s

Media Type: Hard Disk Device

Drive Temperature :26C (78.80 F)

= Drive is formatted for = PI information:=C2=A0 No

PI: No PI

Drive's write cache : Disabled

Port-0 :=

Port status: Active

Port&#= 39;s Linkspeed: 6.0Gb/s

Port-1 :

Port status: Active

<= span style=3D"font-family:"Courier New"">Port's Linkspeed: Un= known

Drive has flagged a S.M.A.R.T alert : No<= /u>

=C2=A0

= =C2=A0

KERNEL OPTIONS: Which of these kernels should I choose for th= e best XFS support for this issue?

= =C2=A0

=C2=A0=C2=A0=C2=A0=C2=A0 kernel-3.16.7-3.16.y.20141= 114.ol6.x86_64.rpm=C2=A0=C2=A0=C2=A0=C2=A0 14-Nov-2014 17:55 27.7 M<= u>

=C2=A0=C2=A0=C2=A0=C2=A0 kernel-3.17.3-3.17.y.20141114.ol6= .x86_64.rpm=C2=A0=C2=A0=C2=A0=C2=A0 14-Nov-2014 23:55 26.6 M<= /span>

=C2=A0=C2=A0=C2=A0=C2=A0 kernel-3.17.3-3.17.y.20141118.ol6.x86_64= .rpm=C2=A0=C2=A0=C2=A0=C2=A0 18-Nov-2014 09:13 26.6 M<= /p>

=C2=A0=C2=A0=C2=A0=C2=A0 kernel-3.17.8-3.17.y.20150113.ol6.x86_64.rpm=C2= =A0=C2=A0=C2=A0=C2=A0 14-Jan-2015 06:50 27.9 M

=C2= =A0=C2=A0=C2=A0=C2=A0 kernel-3.18.6-3.18.y.20150210.ol6.x86_64.rpm=C2=A0=C2= =A0=C2=A0=C2=A0 10-Feb-2015 09:52 30.9 M

=C2=A0= =C2=A0=C2=A0=C2=A0 kernel-3.18.7-3.18.y.20150217.ol6.x86_64.rpm=C2=A0=C2=A0= =C2=A0=C2=A0 17-Feb-2015 09:53 30.9 M

=C2=A0=C2=A0= =C2=A0=C2=A0 kernel-3.18.8-3.18.y.20150303.ol6.x86_64.rpm=C2=A0=C2=A0=C2=A0= =C2=A0 03-Mar-2015 09:55 30.9 M

=C2=A0=C2=A0=C2=A0= =C2=A0 kernel-3.19.5-3.19.y.20150421.ol6.x86_64.rpm=C2=A0=C2=A0=C2=A0=C2=A0= 22-Apr-2015 05:42 31.1 M

=C2=A0=C2=A0=C2=A0=C2=A0 = kernel-3.19.6-3.19.y.20150505.ol6.x86_64.rpm=C2=A0=C2=A0=C2=A0=C2=A0 06-May= -2015 05:41 29.8 M

=C2=A0=C2=A0=C2=A0=C2=A0 kernel-= 3.19.8-3.19.y.20150512.ol6.x86_64.rpm=C2=A0=C2=A0=C2=A0=C2=A0 13-May-2015 0= 5:42 29.8 M

=C2=A0


Thank you for your time and comments.


Regar= ds,


Pippin Wallace

Bozeman Montana

=C2=A0

=C2=A0

= =C2=A0


--089e01634d6a80efcf051d39cafe-- From david@fromorbit.com Thu Aug 13 18:51:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C55C37F61 for ; Thu, 13 Aug 2015 18:51:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9FD77304043 for ; Thu, 13 Aug 2015 16:51:54 -0700 (PDT) X-ASG-Debug-ID: 1439509909-04cb6c2244015e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 7rzGM6HHKYgJRY7M for ; Thu, 13 Aug 2015 16:51:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DqCADKLM1VPBkyLHldgxtUaYJWToMuo1UCAQEBAQaVQ4V7AgIBAQKBRk0BAQEBAQEHAQEBAUE/hCQBAQQjDwEjIxAIAQIYAgIFIQICDwUlAwcaE4gtnTadHZYwAQEIAgEfGYEJhH6FM4UJB4JpgUMFhxuGaocVhQSFN4IugU0Vhy+FUIMZhEaDZ4IxAxyBZSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2015 09:21:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQ2Hk-0002gp-15; Fri, 14 Aug 2015 09:51:48 +1000 Date: Fri, 14 Aug 2015 09:51:48 +1000 From: Dave Chinner To: Eric Sandeen Cc: Zirong Lang , xfs@oss.sgi.com Subject: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device Message-ID: <20150813235147.GQ3902@dastard> X-ASG-Orig-Subj: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device References: <1439478465-14072-1-git-send-email-zlang@redhat.com> <55CCC47A.5030706@sandeen.net> <510394920.8151266.1439484022770.JavaMail.zimbra@redhat.com> <55CCCBC3.6040404@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <55CCCBC3.6040404@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439509910 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 13, 2015 at 11:54:27AM -0500, Eric Sandeen wrote: > On 8/13/15 11:40 AM, Zirong Lang wrote: > > > > > > ----- 原始邮件 ----- > >> å‘件人: "Eric Sandeen" > >> 收件人: "Zorro Lang" , xfs@oss.sgi.com > >> å‘逿—¶é—´: 星期五, 2015å¹´ 8 月 14æ—¥ ä¸Šåˆ 12:23:22 > >> 主题: Re: [PATCH][RFC] xfs_copy: don't use DIRECT IO to copy 4k sector device > >> > >> On 8/13/15 10:07 AM, Zorro Lang wrote: > >>> When I run xfstests xfs/032 in ppc64le, I hit a failure: > >>> > >>> xfs_copy: read failed: Invalid argument > >>> xfs_copy: size check failed > >>> xfs_copy: /dev/sda5 filesystem failed to initialize > >>> xfs_copy: Aborting. > >>> Copy failed for Sector size 4096 Block size 4096 > >>> > >>> I try to use gdb trace xfs_copy. I find it try to open the > >>> source device with DIRECT flag, then read the device with > >>> ((1< >>> 4k sector, directly read 512 bytes will be failed. > >>> > >>> xfs_copy '-b' option only work for target file/device, to > >>> sure it will open the target without DIRECT flag. But useless > >>> for source device open. > >>> > >>> So I make DIRECT flag only be enabled when source device > >>> sector size equal BBSIZE. > >> > >> Which version of xfsprogs did you test? This is recently upstream: > > > > Sorry I didn't notice that you have fix this problem. I test on the > > newest version from git://oss.sgi.com/xfs/cmds/xfsprogs, it haven't > > fix this problem. I test this patch on it at first. Then I find > > there is another version in git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > > > > I don't know they are too different, so I didn't check if this xfsprogs-dev has > > fixed it, and just did this patch on it and send out. > > > > Sorry for this mistake, and your patch is really better:) > > No problem, thanks for looking into it! I'm not sure why the sgi git tree > is a bit behind right now. I didn't push 4.2.0-rc1 in case anyone objected to the change of version numbering I was proposing. Nobody has commented, so when I push 4.2.0-rc2 out, I'll also update the oss.sgi.com repo. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 13 19:07:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CDB9529DF6 for ; Thu, 13 Aug 2015 19:07:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B91CE304043 for ; Thu, 13 Aug 2015 17:07:37 -0700 (PDT) X-ASG-Debug-ID: 1439510854-04cbb04ee801950001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id MxZPYOkPcbQgCipE for ; Thu, 13 Aug 2015 17:07:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DnCAB3MM1VPBkyLHldgxuBPYJWToMuo1UCAQEBAQabPgICAQECgUdNAQEBAQEBBwEBAQFBP4QjAQEBAwEjDwEjIwULCAMOCgICBSECAg8FJQMHGhOIJge6S5YxASsZgQmEfoQwgQOFCQeCaYFDBZUajGmBTZRzg2eCMR8VgVAsM4JMAQEB Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2015 09:33:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQ2Sd-0002j4-Gz; Fri, 14 Aug 2015 10:03:03 +1000 Date: Fri, 14 Aug 2015 10:03:03 +1000 From: Dave Chinner To: Pippin Wallace Cc: xfs@oss.sgi.com Subject: Re: Looking to confirm issue and seek advice on fix for inode btree fragmentation Message-ID: <20150814000303.GR3902@dastard> X-ASG-Orig-Subj: Re: Looking to confirm issue and seek advice on fix for inode btree fragmentation References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439510854 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 13, 2015 at 05:35:31PM -0600, Pippin Wallace wrote: > I am writing to confirm the issue I think I have and get advice on the best > short term and long term “fixesâ€. > > > > In reading the following threads and others I am pretty sure I have inode > btree fragmentation and I have included detailed output below to help > confirm this. Make a new filesystem with a current xfsprogs 3.2.4, and it will use the new free inode btree for allocation that was designed to avoid this problem. > Long term fix is upgrade kernel to >= 3.16, xfsprogs >=3.2.1 and rebuild fs > with new finobt structure. > > # mkfs.xfs -m crc=1,finobt=1 i.e. there are the default mkfs options in xfsprogs >= 3.2.3. It's really the only viable fix, especially given that you can't use inode64. And, realistically, it's still going to cause problems unless you ensure that you have smaller-than-default AGs (e.g. 250GB AGs) so that there are multiple inode btrees in the 32-bit inode number region of the filesystem.(*) (*) which is actually the first 2TB of the filesystem with CRC enabled filesystems because the inode size is 512 bytes... > *KERNEL OPTIONS: Which of these kernels should I choose for the best XFS > support for this issue?* One your distro vendor supports; the newer the better. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 13 19:54:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD6A97F7C for ; Thu, 13 Aug 2015 19:54:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8480304051 for ; Thu, 13 Aug 2015 17:54:34 -0700 (PDT) X-ASG-Debug-ID: 1439513671-04cbb04ee8027f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4t393afPTBgjd2Jf for ; Thu, 13 Aug 2015 17:54:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DRCAAPO81VPBkyLHldgxuBPYJWg3yjVQIBAQEBBps+AgIBAQKBR00BAQEBAQEHAQEBAUE/hCQBAQQ6HCMQCAMOCgklDwUlAwcaE4gt0HsBAQgCAR8ZhgeFM4UJB4QsBZUajGmaJ4Q1LDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2015 10:24:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQ3GQ-0002n4-Ro; Fri, 14 Aug 2015 10:54:30 +1000 Date: Fri, 14 Aug 2015 10:54:30 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/11] xfsprogs: Add a way to compile without blkid Message-ID: <20150814005430.GS3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 13/11] xfsprogs: Add a way to compile without blkid References: <1439475055-5519-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439475055-5519-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439513671 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21581 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 13, 2015 at 04:10:55PM +0200, Jan Tulak wrote: > Because not all platforms have up-to-date blkid with required > functions, allow at least partial functionality by adding > --enable-blkid=yes/no optional configure argument. > > When blkid is disabled, signature detection and device geometry > detection doesn't work. > > Signed-off-by: Jan Tulak ..... > +#else /* ifdef ENABLE_BLKID */ > +/* > + * Without blkid, we can't do a good check for signatures. > + * So instead of some messy attempts, just disable any checks > + * and always return 'nothing found'. > + */ > +static int > +check_overwrite( > + char *device) > +{ > + return 0; > +} > +#endif /* ENABLE_BLKID */ I'd default the other way around, and always report that something was found. That way we don't accidentally overwrite a block device when someone fat-fingers the blockdev. It will mean you have to use the force flag on OSX until such time that blkid is made to work, but I think that's better than just overwriting the blockdev without question.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 13 20:27:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5DA797F80 for ; Thu, 13 Aug 2015 20:27:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C3F9304043 for ; Thu, 13 Aug 2015 18:27:18 -0700 (PDT) X-ASG-Debug-ID: 1439515635-04bdf02a6c03560001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id uI1nXvHJL87K2SY4 for ; Thu, 13 Aug 2015 18:27:15 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BICABOQ81VPBkyLHldgxtUaYJWp1ECAQEBAQaVS4VzBAICgUdNAQEBAQEBBwEBAQFBP4QkAQEEOhwjEAgDDgoJJQ8FJQMHGhOILQ7QbAELIBmGB4UzhDtOB4QsBZUahQSHZYFNRoNllC+ENSwzgQaBRgEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2015 10:56:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQ3lT-0002q1-8s; Fri, 14 Aug 2015 11:26:35 +1000 Date: Fri, 14 Aug 2015 11:26:35 +1000 From: Dave Chinner To: Leslie Rhorer Cc: Brian Foster , Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble Message-ID: <20150814012635.GT3902@dastard> X-ASG-Orig-Subj: Re: XFS File system in trouble References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55CC375C.10902@mygrande.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439515635 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21582 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 13, 2015 at 01:21:16AM -0500, Leslie Rhorer wrote: > The compressed tarball containing the dump file and the image are > on my web site. > > http://fletchergeek.com/images/metadump.tar.gz > > It's 22G in size. I only want the metadump image right now. Can you please put that up as a separate compressed file so i don't have to blow 25% of my monthly download quota and a day downloading that tarball just to get it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 13 20:54:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4253A7F81 for ; Thu, 13 Aug 2015 20:54:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CC5EAAC003 for ; Thu, 13 Aug 2015 18:54:11 -0700 (PDT) X-ASG-Debug-ID: 1439517247-04bdf02a6c03bc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id q5ZBpE3XP4NfaSwF for ; Thu, 13 Aug 2015 18:54:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BICABPSc1VPBkyLHldgxtUaYJWp1ECAQEBAQaVTYVxBAICgUNNAQEBAQEBBwEBAQFBP4QkAQEEOhwjEAgDDgoJJQ8FJQMHGhOILQ7QTQEBCAIgGYYHhTOFCQeELAWVGoUEh2WBTUaULYNngjQcgWUsMwEBAQGCSAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2015 11:23:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQ4BC-0002sH-04; Fri, 14 Aug 2015 11:53:10 +1000 Date: Fri, 14 Aug 2015 11:53:09 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-ID: <20150814015309.GU3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-2-git-send-email-david@fromorbit.com> <20150812072635.GA32399@infradead.org> <20150813013244.GP3902@dastard> <20150813065258.GA677@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813065258.GA677@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439517247 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21582 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 12, 2015 at 11:52:58PM -0700, Christoph Hellwig wrote: > On Thu, Aug 13, 2015 at 11:32:44AM +1000, Dave Chinner wrote: > > > http://thread.gmane.org/gmane.comp.file-systems.xfs.general/39030/focus=39009 > > > > I completely forgot you did this. I'll go back and look at it > > and see what I can pull from it. Thanks for the reminder, Christoph. > > As far as I can tell your new version is superior in all aspects > except for the patch split :) Ok, I've gone back and had a look at this now and reminded myself of the discussion we had and the problems found. The end results are remarkably similar - maybe that's why I found it easy to write this patch set. i.e. your patchset was buried somewhere in my brain, even though I'd forgotten about it at the surface... How would you like to see this patchset broken up into more sensible/reviewable chunks? It's just folding and splitting patches, so it's not a big deal to rework it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 13 20:57:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 074D57F83 for ; Thu, 13 Aug 2015 20:57:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5EB2304043 for ; Thu, 13 Aug 2015 18:57:12 -0700 (PDT) X-ASG-Debug-ID: 1439517430-04cbb04ee8037b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 61pNvxdGsdlOaedq for ; Thu, 13 Aug 2015 18:57:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DRCAB/Ss1VPBkyLHldgxuBPYJWg3yjVQIBAQEBBps+AgIBAQKBQ00BAQEBAQEHAQEBAUE/hCMBAQEDATocIwULCAMOCgklDwUlAwcaExmIDQfQVQEBCAIBHxmGB4UzhQkHhCwFlRqHcIR5gU2Uc4NnhDUsM4JMAQEB Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2015 11:27:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQ4Ez-0002sw-24; Fri, 14 Aug 2015 11:57:05 +1000 Date: Fri, 14 Aug 2015 11:57:05 +1000 From: Dave Chinner To: Jan Tulak Cc: Eric Sandeen , Brian Foster , xfs-oss Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Message-ID: <20150814015704.GV3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing References: <55C43FBA.1080408@sandeen.net> <20150807113742.GB8322@bfoster.bfoster> <55C4E007.90709@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439517430 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21582 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 13, 2015 at 01:14:25PM +0200, Jan Tulak wrote: > On Fri, Aug 7, 2015 at 6:42 PM, Eric Sandeen wrote: > > > > > > > > IIRC, I think this is one of the core problems the big mkfs option > > > parsing rework that Jan is working on is supposed to fix. > > > > Yeah, I think so - Jan, if this gets in your way, let us know - > > I didn't mean to make your life difficult by fixing little > > things while you work. :) > > Well, I would not mind if the entire codebase froze... :-D > But realistically, every time I do git fetch I get so many collisions that > one > more or less changes nothing. :-) Well, I'm hoping all the big changes getting libxfs up to date with the kernel code are now done, and things will settle down for the next few months so this will be less of a problem. Also having a stable master branch and a moving for-next branch for xfsprogs should help with this, too.... > And yes, in my tests I'm trying to cover the arguments order issue too. The structure of the table-based parsing should make the order of parsing irrelevant, as conflicts are defined in the table and so will be detected regardless of the order in which the options appear on the command line. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Aug 13 22:02:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BCA1129DFD for ; Thu, 13 Aug 2015 22:02:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B368304043 for ; Thu, 13 Aug 2015 20:02:54 -0700 (PDT) X-ASG-Debug-ID: 1439521372-04bdf02a6c04f20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id CwUAJWeIuMONltmL for ; Thu, 13 Aug 2015 20:02:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E44ED653A9B4; Thu, 13 Aug 2015 22:02:51 -0500 (CDT) Message-ID: <55CD5A5B.9080201@sandeen.net> Date: Thu, 13 Aug 2015 22:02:51 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Jan Kara , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix xfs_attr_leafblock definition References: <1439458000-28395-1-git-send-email-jack@suse.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix xfs_attr_leafblock definition In-Reply-To: <1439458000-28395-1-git-send-email-jack@suse.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439521372 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/13/15 4:26 AM, Jan Kara wrote: > struct xfs_attr_leafblock contains 'entries' array which is declared > with size 1 altough it can in fact contain much more entries. Since this > array is followed by further struct members, gcc (at least in version > 4.8.3) thinks that the array has the fixed size of 1 element and thus > may optimize away all accesses beyond the end of array resulting in > non-working code. This problem was only observed with userspace code in > xfsprogs, however it's better to be safe in kernel as well and have > matching kernel and xfsprogs definitions. > > Signed-off-by: Jan Kara > --- > fs/xfs/libxfs/xfs_da_format.h | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > This is a kernel version of the xfsprogs patch I've sent a while ago. > > diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h > index 74bcbabfa523..b14bbd6bb05f 100644 > --- a/fs/xfs/libxfs/xfs_da_format.h > +++ b/fs/xfs/libxfs/xfs_da_format.h > @@ -680,8 +680,15 @@ typedef struct xfs_attr_leaf_name_remote { > typedef struct xfs_attr_leafblock { > xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ > xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ > - xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ > - xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ > + /* > + * The rest of the block contains the following structures after the > + * leaf entries, growing from the bottom up. The variables are never > + * referenced and definining them can actually make gcc optimize away Nitpick, s/definining/defining/, maybe can be fixed on commit :) Don't we have other similar constructs elsewhere? Do they suffer the same fate? ... looks ... I guess not; the other ones have the variable length array as the last member. -Eric > + * accesses to the 'entries' array above index 0 so don't do that. > + * > + * xfs_attr_leaf_name_local_t namelist; > + * xfs_attr_leaf_name_remote_t valuelist; > + */ > } xfs_attr_leafblock_t; > > /* > From jtulak@redhat.com Fri Aug 14 01:13:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B1FF27F88 for ; Fri, 14 Aug 2015 01:13:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3675FAC002 for ; Thu, 13 Aug 2015 23:13:16 -0700 (PDT) X-ASG-Debug-ID: 1439532791-04cb6c224208430001-NocioJ Received: from mail-ig0-f179.google.com (mail-ig0-f179.google.com [209.85.213.179]) by cuda.sgi.com with ESMTP id 1U1nTlCO0xt4l1Fn (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Aug 2015 23:13:11 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igui7 with SMTP id i7so6164598igu.1 for ; Thu, 13 Aug 2015 23:13:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=p7Qn3wXkodbNaQWhPW02kAIXTd0e4tPENNa1cojyn/8=; b=XmaZt9XW4WTj+td5Kk5VuIIxwaQC91SS/jwgv8Yc5YCMzCOjbDkj0S6GG6LrxUpGxd Q04J/y357RgssOjIH2ts51Fum9oU5TpVUrydtc2NZ76/QOz7Gv+PIpntC9ZH+1akIx5e qtY3RVkqp9kAwROJlp0OVIzGtvqlRSb+WSu8NZJkn3rdvkrk5W6Onj61193oQFwQt8Uk KBdOVQ+ke7UV7Dhvqs6YZhZiLsn6t99Y3/uaUQakG5ec+9J2+UM6PMzCIfLe6WHgMk8F 8YQhI3vB5OQ6NkdSK0Djk/9WuA+i+ev1zeIpKo8bedTNM4hSenXHxwrGwdLlCwUlrsWZ vMYw== X-Gm-Message-State: ALoCoQmlw3jUxIUjarpWzFjMub2wtbbVWo6nnyDa0stPBF7dXXlbALquMzS+KNmfjzIytJ/1oZ8d X-Received: by 10.50.17.9 with SMTP id k9mr1106336igd.93.1439532790806; Thu, 13 Aug 2015 23:13:10 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Thu, 13 Aug 2015 23:12:49 -0700 (PDT) In-Reply-To: <20150814015704.GV3902@dastard> References: <55C43FBA.1080408@sandeen.net> <20150807113742.GB8322@bfoster.bfoster> <55C4E007.90709@sandeen.net> <20150814015704.GV3902@dastard> From: Jan Tulak Date: Fri, 14 Aug 2015 08:12:49 +0200 Message-ID: Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Cc: Eric Sandeen , Brian Foster , xfs-oss Content-Type: multipart/alternative; boundary=089e01182a34a3a7d2051d3f58bb X-Barracuda-Connect: mail-ig0-f179.google.com[209.85.213.179] X-Barracuda-Start-Time: 1439532791 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21586 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e01182a34a3a7d2051d3f58bb Content-Type: text/plain; charset=UTF-8 On Fri, Aug 14, 2015 at 3:57 AM, Dave Chinner wrote: > On Thu, Aug 13, 2015 at 01:14:25PM +0200, Jan Tulak wrote: > > On Fri, Aug 7, 2015 at 6:42 PM, Eric Sandeen > wrote: > > > > > > > > > > > IIRC, I think this is one of the core problems the big mkfs option > > > > parsing rework that Jan is working on is supposed to fix. > > > > > > Yeah, I think so - Jan, if this gets in your way, let us know - > > > I didn't mean to make your life difficult by fixing little > > > things while you work. :) > > > > Well, I would not mind if the entire codebase froze... :-D > > But realistically, every time I do git fetch I get so many collisions > that > > one > > more or less changes nothing. :-) > > Well, I'm hoping all the big changes getting libxfs up to date with > the kernel code are now done, and things will settle down for the > next few months so this will be less of a problem. Also having a > stable master branch and a moving for-next branch for xfsprogs > should help with this, too... > That would be nice. > > And yes, in my tests I'm trying to cover the arguments order issue too. > > The structure of the table-based parsing should make the order of > parsing irrelevant, as conflicts are defined in the table and so > will be detected regardless of the order in which the options appear > on the command line. > However it still has to be tested if it works as supposed. Of course I'm not trying all combinations for all arguments. :-) Cheers, Jan -- Jan Tulak jtulak@redhat.com --089e01182a34a3a7d2051d3f58bb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Fri, Aug 14, 2015 at 3:57 AM, Dave Chinner <david@fromorbit.com> wrote:
On = Thu, Aug 13, 2015 at 01:14:25PM +0200, Jan Tulak wrote:
> On Fri, Aug 7, 2015 at 6:42 PM, Eric Sandeen <
sandeen@sandeen.net> wrote:
> >
> > >
> > > IIRC, I think this is one of the core problems the big mkfs = option
> > > parsing rework that Jan is working on is supposed to fix. > >
> > Yeah, I think so - Jan, if this gets in your way, let us know - > > I didn't mean to make your life difficult by fixing little > > things while you work.=C2=A0 :)
>
> Well, I would not mind if the entire codebase froze... :-D
> But realistically, every time I do git fetch I get so many collisions = that
> one
> more or less changes nothing. :-)

Well, I'm hoping all the big changes getting libxfs up to date w= ith
the kernel code are now done, and things will settle down for the
next few months so this will be less of a problem. Also having a
stable master branch and a moving for-next branch for xfsprogs
should help with this, too...

That woul= d be nice.
=C2=A0
> And yes, in my tests I'm trying to cover the arguments order issue= too.

The structure of the table-based parsing should make the order of parsing irrelevant, as conflicts are defined in the table and so
will be detected regardless of the order in which the options appear
on the command line.

However it s= till has to be tested if it works as supposed. Of course I'm not
<= div>trying all combinations for all arguments. :-)

Cheers,
Jan

--
--089e01182a34a3a7d2051d3f58bb-- From eguan@redhat.com Fri Aug 14 01:19:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 334D47F8B for ; Fri, 14 Aug 2015 01:19:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A813AAC001 for ; Thu, 13 Aug 2015 23:19:44 -0700 (PDT) X-ASG-Debug-ID: 1439533182-04cbb04ee907a20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Od5ObAMRR3vSDTXi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 23:19:43 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id A7FE5A9C; Fri, 14 Aug 2015 06:19:42 +0000 (UTC) Received: from localhost (dhcp-12-142.nay.redhat.com [10.66.12.142]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7E6JeJ2023911; Fri, 14 Aug 2015 02:19:41 -0400 Date: Fri, 14 Aug 2015 14:19:39 +0800 From: Eryu Guan To: Tejun Heo Cc: Dave Chinner , xfs@oss.sgi.com, axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150814061939.GK17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813232400.GH4496@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813232400.GH4496@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439533183 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 13, 2015 at 07:24:00PM -0400, Tejun Heo wrote: > Hello, Eryu. > > Can you please do the followings? > > 1. See if the "writeback: fix syncing of I_DIRTY_TIME inodes" patch > changes anything. After applying this patch, I can no longer reproduce the failure. > > 2. If not, apply this patch. This patch *should* make the failures go > away and might print out some error messages along with stack > trace. Can you please verify that the failures go away with this > patch and report the kernel messages if any trigger? And this patch fixed the failure too, and no WARNING no kernel message triggered. All my testings are based on 4.2-rc6 kernel (I confirmed rc6 kernel failed the test first), then applied the first patch, and reverted the first patch, and applied the second patch. > > Thanks a lot. Thanks for looking into this! Eryu > > Index: work/fs/fs-writeback.c > =================================================================== > --- work.orig/fs/fs-writeback.c > +++ work/fs/fs-writeback.c > @@ -103,7 +103,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(wbc_writepa > > static bool wb_io_lists_populated(struct bdi_writeback *wb) > { > - if (wb_has_dirty_io(wb)) { > + if (test_bit(WB_has_dirty_io, &wb->state)) { > return false; > } else { > set_bit(WB_has_dirty_io, &wb->state); > @@ -844,14 +844,13 @@ static void bdi_split_work_to_wbs(struct > struct wb_iter iter; > > might_sleep(); > - > - if (!bdi_has_dirty_io(bdi)) > - return; > restart: > rcu_read_lock(); > bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { > - if (!wb_has_dirty_io(wb) || > - (skip_if_busy && writeback_in_progress(wb))) > + /* SYNC_ALL writes out I_DIRTY_TIME too */ > + if (!wb_has_dirty_io(wb) && base_work->sync_mode == WB_SYNC_NONE) > + continue; > + if (skip_if_busy && writeback_in_progress(wb)) > continue; > > base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); > @@ -899,8 +898,7 @@ static void bdi_split_work_to_wbs(struct > { > might_sleep(); > > - if (bdi_has_dirty_io(bdi) && > - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { > + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { > base_work->auto_free = 0; > base_work->single_wait = 0; > base_work->single_done = 0; > @@ -2275,8 +2273,8 @@ void sync_inodes_sb(struct super_block * > }; > struct backing_dev_info *bdi = sb->s_bdi; > > - /* Nothing to do? */ > - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) > + /* bdi_has_dirty() ignores I_DIRTY_TIME but we can't, always kick wbs */ > + if (bdi == &noop_backing_dev_info) > return; > WARN_ON(!rwsem_is_locked(&sb->s_umount)); > > Index: work/include/linux/backing-dev.h > =================================================================== > --- work.orig/include/linux/backing-dev.h > +++ work/include/linux/backing-dev.h > @@ -38,7 +38,17 @@ extern struct workqueue_struct *bdi_wq; > > static inline bool wb_has_dirty_io(struct bdi_writeback *wb) > { > - return test_bit(WB_has_dirty_io, &wb->state); > + bool ret = test_bit(WB_has_dirty_io, &wb->state); > + > + if (!ret && (!list_empty(&wb->b_dirty) || !list_empty(&wb->b_io) || > + !list_empty(&wb->b_more_io))) { > + const char *name = wb->bdi->dev ? dev_name(wb->bdi->dev) : "UNK"; > + > + pr_err("wb_has_dirty_io: ERR %s has_dirty=%d b_dirty=%d b_io=%d b_more_io=%d\n", > + name, ret, !list_empty(&wb->b_dirty), !list_empty(&wb->b_io), !list_empty(&wb->b_more_io)); > + WARN_ON(1); > + } > + return ret; > } > > static inline bool bdi_has_dirty_io(struct backing_dev_info *bdi) > @@ -47,7 +57,18 @@ static inline bool bdi_has_dirty_io(stru > * @bdi->tot_write_bandwidth is guaranteed to be > 0 if there are > * any dirty wbs. See wb_update_write_bandwidth(). > */ > - return atomic_long_read(&bdi->tot_write_bandwidth); > + bool ret = atomic_long_read(&bdi->tot_write_bandwidth); > + > + if (ret != wb_has_dirty_io(&bdi->wb)) { > + const char *name = bdi->dev ? dev_name(bdi->dev) : "UNK"; > + > + pr_err("bdi_has_dirty_io: ERR %s tot_write_bw=%ld b_dirty=%d b_io=%d b_more_io=%d\n", > + name, atomic_long_read(&bdi->tot_write_bandwidth), > + !list_empty(&bdi->wb.b_dirty), !list_empty(&bdi->wb.b_io), !list_empty(&bdi->wb.b_more_io)); > + WARN_ON(1); > + } > + > + return ret; > } > > static inline void __add_wb_stat(struct bdi_writeback *wb, From jtulak@redhat.com Fri Aug 14 01:49:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 342787F8C for ; Fri, 14 Aug 2015 01:49:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E41718F8035 for ; Thu, 13 Aug 2015 23:49:09 -0700 (PDT) X-ASG-Debug-ID: 1439534945-04bdf02a6c08c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g7bC6ciomDNRqEOL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Aug 2015 23:49:05 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 1873391D39; Fri, 14 Aug 2015 06:49:05 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7E6n33a008814; Fri, 14 Aug 2015 02:49:04 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, Jan Tulak Subject: [PATCH 13/11 v2] xfsprogs: Add a way to compile without blkid Date: Fri, 14 Aug 2015 08:48:52 +0200 X-ASG-Orig-Subj: [PATCH 13/11 v2] xfsprogs: Add a way to compile without blkid Message-Id: <1439534932-11881-1-git-send-email-jtulak@redhat.com> In-Reply-To: <20150814005430.GS3902@dastard> References: <20150814005430.GS3902@dastard> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439534945 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UPDATE: default to "signature found", so without blkid, -f is mandatory. Because not all platforms have up-to-date blkid with required functions, allow at least partial functionality by adding --enable-blkid=yes/no optional configure argument. When blkid is disabled, signature detection and device geometry detection doesn't work. Signed-off-by: Jan Tulak --- configure.ac | 10 +++++++++- include/builddefs.in | 1 + mkfs/xfs_mkfs.c | 22 +++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 9ea8b22..a734926 100644 --- a/configure.ac +++ b/configure.ac @@ -26,6 +26,11 @@ AC_ARG_ENABLE(gettext, enable_gettext=yes) AC_SUBST(enable_gettext) +AC_ARG_ENABLE(blkid, +[ --enable-blkid=[yes/no] Enable use of block device id library [default=yes]],, + enable_blkid=yes) +AC_SUBST(enable_blkid) + AC_ARG_ENABLE(readline, [ --enable-readline=[yes/no] Enable readline command editing [default=no]], test $enable_readline = yes && libreadline="-lreadline", @@ -115,11 +120,14 @@ AC_HAVE_FALLOCATE AC_HAVE_FIEMAP AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE -AC_HAVE_BLKID_TOPO AC_HAVE_READDIR AC_HAVE_MNTENT AC_HAVE_FLS +if test "$enable_blkid" = yes; then +AC_HAVE_BLKID_TOPO +fi + AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([char *]) AC_TYPE_UMODE_T diff --git a/include/builddefs.in b/include/builddefs.in index 8851956..f3f8089 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -89,6 +89,7 @@ ENABLE_SHARED = @enable_shared@ ENABLE_GETTEXT = @enable_gettext@ ENABLE_EDITLINE = @enable_editline@ ENABLE_READLINE = @enable_readline@ +ENABLE_BLKID = @enable_blkid@ HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d349b4f..56d2410 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -18,7 +18,9 @@ #include "libxfs.h" #include -#include +#ifdef ENABLE_BLKID +# include +#endif /* ENABLE_BLKID */ #include "xfs_mkfs.h" /* @@ -298,6 +300,7 @@ calc_stripe_factors( * 0 for nothing found * -1 for internal error */ +#ifdef ENABLE_BLKID static int check_overwrite( char *device) @@ -451,6 +454,19 @@ out_free_probe: _("warning: unable to probe device topology for device %s\n"), device); } +#else /* ifdef ENABLE_BLKID */ +/* + * Without blkid, we can't do a good check for signatures. + * So instead of some messy attempts, just disable any checks + * and always return 'nothing found'. + */ +static int +check_overwrite( + char *device) +{ + return 1; +} +#endif /* ENABLE_BLKID */ static void get_topology( libxfs_init_t *xi, @@ -483,16 +499,20 @@ static void get_topology( } else ft->psectorsize = ft->lsectorsize = BBSIZE; } else { +#ifdef ENABLE_BLKID blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, &ft->lsectorsize, &ft->psectorsize, force_overwrite); +#endif /* ENABLE_BLKID */ } if (xi->rtname && !xi->risfile) { int sunit, lsectorsize, psectorsize; +#ifdef ENABLE_BLKID blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth, &lsectorsize, &psectorsize, force_overwrite); +#endif /* ENABLE_BLKID */ } } -- 2.4.5 From ae@a.wandaec.net Fri Aug 14 05:45:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,FREEMAIL_FROM, UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0B5697F37 for ; Fri, 14 Aug 2015 05:45:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D71128F8033 for ; Fri, 14 Aug 2015 03:45:23 -0700 (PDT) X-ASG-Debug-ID: 1439549119-04bdf02a6a0d8b0001-NocioJ Received: from a.wandaec.net ([112.192.39.202]) by cuda.sgi.com with SMTP id BBtKDsQiEhum7GV5 for ; Fri, 14 Aug 2015 03:45:20 -0700 (PDT) X-Barracuda-Envelope-From: ae@a.wandaec.net X-Barracuda-Apparent-Source-IP: 112.192.39.202 Received: from 112.90.239.171 (HELO THBHZFQC); Fri, 14 Aug 2015 18:45:22 +0800 Date: Fri, 14 Aug 2015 18:45:31 +0800 From: "jane" <3207947485@qq.com> Reply-To: sales@shop-led.net To: "xfs" Subject: LED Tube Message-ID: <201508141845310937133@a.wandaec.net> X-ASG-Orig-Subj: LED Tube X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[112.192.39.202] X-Barracuda-Start-Time: 1439549119 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.83 X-Barracuda-Spam-Status: No, SCORE=0.83 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, RDNS_NONE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21591 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers RGVhciBzaXJzIG9yIG1hZGFtLA0KDQpUaGlzIGlzIGphbmUgZnJvbSBTaGVuemhlbiBSdWlzaGVu ZyBJbnRlcm5hdGlvbmFsIEluZHVzdHJpYWwsd2hvIHNwZWNpYWxpemUgaW4gbWFudWZhY3R1cmlu ZyBMRUQgbGlnaHQgLGJ1bGIsZG93biBsaWdodCBhbmQgc29tZSByZWxhdGVkIGl0ZW1zLA0KDQpB bGwgb2Ygb3VyIGl0ZW1zIGFyZSB3aXRoIGV4Y2VsbGVudCBxdWFsaXR5IGFuZCByZWFzb25hYmxl IHByaWNlIUhvcGUgdG8gZW50ZXIgYnVzaW5lc3Mgd2l0aCB5b3UhDQoNCg0KRW5jbG9zZWQgaXMg b3VyIGNvbXBhbnkgY2F0YWxvZ3VlLlBscyBraW5kbHkgY2hlY2sgYW5kIHJldmVydCBhdCB5b3Vy IGVhcmxpc3QhDQoNClRoYW5rcyBhbmQgYmVzdCByZWdhcmRzLA0KamFuZQ0KDQpTaGVuemhlbiBS dWlzaGVuZyBJbnRlcm5hdGlvbmFsIEluZHVzdHJpYWwgTGltaXRlZA0Kd2ViOnd3dy5zaG9wLWxl ZC5uZXQgDQptYWlsOmphbmVAc2hvcC1sZWQubmV0ICAzMjA3OTQ3NDg1QHFxLmNvbQ0KUlVJIFNI RU5HIElOVEVSTkFUSU9OQUwgSU5EVVNUUklBTCBMSU1JVEVEDQpGICsgODYtMDc1NS04MzE0Njgx MiAgICBNKyA4Ni0xMzEzODU5ODgyOQ0KU2t5cGU6amFuZUBzaG9wLWxlZC5uZXQgICAgIFFROjMy MDc5NDc0ODU= From jack@suse.cz Fri Aug 14 06:14:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CF8967F47 for ; Fri, 14 Aug 2015 06:14:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7617BAC001 for ; Fri, 14 Aug 2015 04:14:17 -0700 (PDT) X-ASG-Debug-ID: 1439550853-04bdf02a690e550001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 5u1zawlpnzbFjl3J (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 04:14:15 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B3451ACCA; Fri, 14 Aug 2015 11:14:12 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 0C13F82823; Fri, 14 Aug 2015 13:14:09 +0200 (CEST) Date: Fri, 14 Aug 2015 13:14:09 +0200 From: Jan Kara To: Tejun Heo Cc: Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150814111408.GB8710@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813224415.GG4496@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439550854 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21591 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, On Thu 13-08-15 18:44:15, Tejun Heo wrote: > e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > updated writeback path to avoid kicking writeback work items if there > are no inodes to be written out; unfortunately, the avoidance logic > was too aggressive and made sync_inodes_sb() skip I_DIRTY_TIME inodes. > This patch fixes the breakage by > > * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs(). > The callers are already testing the condition. > > * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that > it always calls into bdi_split_work_to_wbs(). > > * Making bdi_split_work_to_wbs() consider the b_dirty_time list for > WB_SYNC_ALL writebacks. > > Signed-off-by: Tejun Heo > Fixes: e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > Cc: Ted Ts'o > Cc: Jan Kara So the patch looks good to me. But the fact that is fixes Eryu's problem means there is something fishy going on. Either inodes get wrongly attached to b_dirty_time list or bdi_has_dirty_io() somehow misbehaves only temporarily and we don't catch it with the debug patch. Can we add a test to wb_has_dirty_io() to also check whether it matches bdi_has_dirty_io()? Since Eryu doesn't use lazytime (I assume, Eryu, please speak up if you do), we could also warn if b_dirty_time lists get non-empty. Hmm? Honza > --- > Hello, > > So, this fixes I_DIRTY_TIME syncing problem for ext4 but AFAICS xfs > doesn't even use the generic inode metadata writeback path, so this > most likely won't do anything for the originally reported problem. > I'll post another patch for debugging. > > Thanks. > > fs/fs-writeback.c | 18 +++++++++--------- > 1 file changed, 9 insertions(+), 9 deletions(-) > > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -844,14 +844,15 @@ static void bdi_split_work_to_wbs(struct > struct wb_iter iter; > > might_sleep(); > - > - if (!bdi_has_dirty_io(bdi)) > - return; > restart: > rcu_read_lock(); > bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { > - if (!wb_has_dirty_io(wb) || > - (skip_if_busy && writeback_in_progress(wb))) > + /* SYNC_ALL writes out I_DIRTY_TIME too */ > + if (!wb_has_dirty_io(wb) && > + (base_work->sync_mode == WB_SYNC_NONE || > + list_empty(&wb->b_dirty_time))) > + continue; > + if (skip_if_busy && writeback_in_progress(wb)) > continue; > > base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); > @@ -899,8 +900,7 @@ static void bdi_split_work_to_wbs(struct > { > might_sleep(); > > - if (bdi_has_dirty_io(bdi) && > - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { > + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { > base_work->auto_free = 0; > base_work->single_wait = 0; > base_work->single_done = 0; > @@ -2275,8 +2275,8 @@ void sync_inodes_sb(struct super_block * > }; > struct backing_dev_info *bdi = sb->s_bdi; > > - /* Nothing to do? */ > - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) > + /* bdi_has_dirty() ignores I_DIRTY_TIME but we can't, always kick wbs */ > + if (bdi == &noop_backing_dev_info) > return; > WARN_ON(!rwsem_is_locked(&sb->s_umount)); > > -- Jan Kara SUSE Labs, CR From jtulak@redhat.com Fri Aug 14 07:59:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D11B77F37 for ; Fri, 14 Aug 2015 07:59:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BB9DD304039 for ; Fri, 14 Aug 2015 05:59:43 -0700 (PDT) X-ASG-Debug-ID: 1439557181-04cb6c224111b90001-NocioJ Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id AEYHvb6f58yPZz6Q (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Aug 2015 05:59:42 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iodb91 with SMTP id b91so83228296iod.1 for ; Fri, 14 Aug 2015 05:59:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=eHsMd6FJ548muu0xReMBCMSY4no4ERb11QGRUruy49E=; b=UeSOSrhIDQwxghXQVtnM2f9vu7YzymXd2irin305GJpwZ487WQ356mXBukKpXhTqLn yjssTIgaGXscSGIuKrpcIZQgWnGmY7MOBkaFu6I9hJVZ0+LhAOsaJkOteh1AwsgZKRJr djR/dKX7nFRnqzda9SfOiToDqQQzEnqTgzWIFnPSlADnYGa3N0broimBYB6J3a1LcHBf Ut2g+cdCHYvVNn3a4XKbhLjNuHmd+TfdBh4BNs+wSqghZnLgNgZXYBJW7BJMFjkAXybS F6qPMhmVssDnqJ3b86R2yjnSpnRFkiSaJl5DBGCi7EOOVoGPOKMSW4N5TaIL07LAapiL MZ8A== X-Gm-Message-State: ALoCoQnVbzxnFvxXmanBgadSb27JbMyI5vltA4BGFdtS2Mfi2puPWiJ8yQju4jvPNuMFZk3loMBU X-Received: by 10.107.133.213 with SMTP id p82mr9520527ioi.71.1439557181737; Fri, 14 Aug 2015 05:59:41 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Fri, 14 Aug 2015 05:59:22 -0700 (PDT) In-Reply-To: <117593154.2602203.1438690346097.JavaMail.zimbra@redhat.com> References: <1438612789-17486-1-git-send-email-jtulak@redhat.com> <1438612789-17486-9-git-send-email-jtulak@redhat.com> <20150804112103.GF18906@infradead.org> <117593154.2602203.1438690346097.JavaMail.zimbra@redhat.com> From: Jan Tulak Date: Fri, 14 Aug 2015 14:59:22 +0200 Message-ID: Subject: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ece1473a780051d450639 X-Barracuda-Connect: mail-io0-f169.google.com[209.85.223.169] X-Barracuda-Start-Time: 1439557182 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21593 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a113ece1473a780051d450639 Content-Type: text/plain; charset=UTF-8 On Tue, Aug 4, 2015 at 2:12 PM, Jan Tulak wrote: > > > ----- Original Message ----- > > From: "Christoph Hellwig" > > To: "Jan Tulak" > > Cc: hch@infradead.org, xfs@oss.sgi.com > > Sent: Tuesday, August 4, 2015 1:21:03 PM > > Subject: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf > > > > Can't you just use something like: > > > > AC_CHECK_DECL([fls], > > [AC_DEFINE([HAVE_FLS_PROTOTYPE], [1], > > [Define to 1 if have fls prototype])], > > [], > > [#include ]) > > > > You mean to replace the entire autoconf part of the patch with this? > I will try it. Autoconf is still a bit of a black magic for me, so I > used the already existing checks. :-) > Hi Chris, did you want the result to be this? (I didn't get any clarification of what you mean, so I'm asking again. :-) ) # # Check if we have a flc call (Mac OS X) # AC_DEFUN([AC_HAVE_FLS], [ AC_CHECK_DECL([fls], have_fls=yes, [], [#include ] ) AC_SUBST(have_fls) ]) Cheers, Jan -- Jan Tulak jtulak@redhat.com --001a113ece1473a780051d450639 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On T= ue, Aug 4, 2015 at 2:12 PM, Jan Tulak <jtulak@redhat.com> wr= ote:


----- Original Message -----
> From: "Christoph Hellwig" <hch@infradead.org>
> To: "Jan Tulak" <jtulak@redhat.com>
> Cc: hch@infrade= ad.org, xfs@oss.sg= i.com
> Sent: Tuesday, August 4, 2015 1:21:03 PM
> Subject: Re: [PATCH v3 08/11] xfsprogs: Add fls check into autoconf >
> Can't you just use something like:
>
> AC_CHECK_DECL([fls],
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[AC_DEFINE([HAVE_FLS_PROTOTYPE], [1],=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 [Define to 1 if have fls prototype])],
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 [],
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 [#include <string.h>])
>

You mean to replace the entire autoconf part of the patch with this?=
I will try it. Autoconf is still a bit of a black magic for me, so I
used the already existing checks. :-)

H= i Chris,
did you want the result to be this? (I didn't get an= y clarification of what you mean, so I'm asking again. :-) )
=
#
# Check if we have a flc call (Mac OS X)
#
AC_DEFUN([AC_HAVE_FLS],
=C2=A0 [ AC_CHECK_DEC= L([fls],
=C2=A0 =C2=A0 =C2=A0 =C2=A0have_fls=3Dyes,
=C2= =A0 =C2=A0 =C2=A0 =C2=A0[],
=C2=A0 =C2=A0 =C2=A0 =C2=A0[#include = <string.h>]
=C2=A0 =C2=A0 =C2=A0 =C2=A0)
=C2=A0 = =C2=A0 AC_SUBST(have_fls)
=C2=A0 ])=C2=A0

Cheers,
Jan

--
--001a113ece1473a780051d450639-- From damien.wyart@gmail.com Fri Aug 14 10:14:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C8D8B7F37 for ; Fri, 14 Aug 2015 10:14:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 98EB78F804B for ; Fri, 14 Aug 2015 08:14:04 -0700 (PDT) X-ASG-Debug-ID: 1439565242-04bdf02a6c14750001-NocioJ Received: from maiev.nerim.net (smtp-155-friday.nerim.net [194.79.134.155]) by cuda.sgi.com with ESMTP id zdxOXrBd5yHJYRG1 for ; Fri, 14 Aug 2015 08:14:02 -0700 (PDT) X-Barracuda-Envelope-From: damien.wyart@gmail.com X-Barracuda-Apparent-Source-IP: 194.79.134.155 Received: from brouette (damien.wyart.pck.nerim.net [213.41.145.138]) by maiev.nerim.net (Postfix) with ESMTP id 4B7C82E012; Fri, 14 Aug 2015 17:14:01 +0200 (CEST) Received: by brouette (Postfix, from userid 1000) id 2236638000D9; Fri, 14 Aug 2015 17:14:01 +0200 (CEST) Date: Fri, 14 Aug 2015 17:14:01 +0200 From: Damien Wyart To: Jan Kara Cc: Tejun Heo , Jens Axboe , Eryu Guan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150814151401.GA6906@brouette> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814111408.GB8710@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: smtp-155-friday.nerim.net[194.79.134.155] X-Barracuda-Start-Time: 1439565242 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21595 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > On Thu 13-08-15 18:44:15, Tejun Heo wrote: > > e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > > updated writeback path to avoid kicking writeback work items if there > > are no inodes to be written out; unfortunately, the avoidance logic > > was too aggressive and made sync_inodes_sb() skip I_DIRTY_TIME inodes. > > This patch fixes the breakage by > > * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs(). > > The callers are already testing the condition. > > * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that > > it always calls into bdi_split_work_to_wbs(). > > * Making bdi_split_work_to_wbs() consider the b_dirty_time list for > > WB_SYNC_ALL writebacks. > > Signed-off-by: Tejun Heo > > Fixes: e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > > Cc: Ted Ts'o > > Cc: Jan Kara * Jan Kara [2015-08-14 13:14]: > So the patch looks good to me. But the fact that is fixes Eryu's problem > means there is something fishy going on. Either inodes get wrongly attached > to b_dirty_time list or bdi_has_dirty_io() somehow misbehaves only > temporarily and we don't catch it with the debug patch. > Can we add a test to wb_has_dirty_io() to also check whether it matches > bdi_has_dirty_io()? Since Eryu doesn't use lazytime (I assume, Eryu, please > speak up if you do), we could also warn if b_dirty_time lists get > non-empty. Hmm? Hi, I had an unstable system when running latest Linus tree with Tejun's patch applied on top. Nothing fishy in the logs after rebooting without the patch, but remote access with ssh when patch applied did not work (as if /home partition could not be read). This system has / as ext4 and other partitions (including /home) as XFS. Trying to login on tty instead of X resulted in hang of X. I could reboot with sysrq, but can't do further tests at the moment. Back to same tree without the patch resulted in normal system. So just a heads up the patch doesn't seem OK in its current state. Cheers Damien From bfoster@redhat.com Fri Aug 14 11:25:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E43D7F37 for ; Fri, 14 Aug 2015 11:25:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8ACF5AC003 for ; Fri, 14 Aug 2015 09:25:30 -0700 (PDT) X-ASG-Debug-ID: 1439569528-04cbb04eea15910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uPJaSVXWvdHCmUMo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 09:25:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 6C2A48E682 for ; Fri, 14 Aug 2015 16:25:28 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7EGPSuR026691 for ; Fri, 14 Aug 2015 12:25:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C56F012204F; Fri, 14 Aug 2015 12:25:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: flush entire file on dio read/write to cached file Date: Fri, 14 Aug 2015 12:25:26 -0400 X-ASG-Orig-Subj: [PATCH] xfs: flush entire file on dio read/write to cached file Message-Id: <1439569526-40423-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439569529 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Filesystems are responsible to manage file coherency between the page cache and direct I/O. The generic dio code flushes dirty pages over the range of a dio to ensure that the dio read or a future buffered read returns the correct data. XFS has generally followed this pattern, though traditionally has flushed and invalidated the range from the start of the I/O all the way to the end of the file. This changed after the following commit: 7d4ea3ce xfs: use ranged writeback and invalidation for direct IO ... as the full file flush was no longer necessary to deal with the strange post-eof delalloc issues that were since fixed. Unfortunately, we have since received complaints about performance degradation due to the increased exclusive iolock cycles (which locks out parallel dio submission) that occur when a file has cached pages. This does not occur on filesystems that use the generic code as it also does not incorporate locking. The exclusive iolock is acquired any time the inode mapping has cached pages, regardless of whether they reside in the range of the I/O or not. If not, the flush/inval calls do no work and the lock was cycled for no reason. Under consideration of the cost of the exclusive iolock, update the dio read and write handlers to flush and invalidate the entire mapping when cached pages exist. In most cases, this increases the cost of the initial flush sequence but eliminates the need for further lock cycles and flushes so long as the workload does not actively mix direct and buffered I/O. This also more closely matches historical behavior and performance characteristics that users have come to expect. Signed-off-by: Brian Foster --- fs/xfs/xfs_file.c | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index db4acc1..de2c237 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -317,24 +317,33 @@ xfs_file_read_iter( return -EIO; /* - * Locking is a bit tricky here. If we take an exclusive lock - * for direct IO, we effectively serialise all new concurrent - * read IO to this file and block it behind IO that is currently in - * progress because IO in progress holds the IO lock shared. We only - * need to hold the lock exclusive to blow away the page cache, so - * only take lock exclusively if the page cache needs invalidation. - * This allows the normal direct IO case of no page cache pages to - * proceeed concurrently without serialisation. + * Locking is a bit tricky here. If we take an exclusive lock for direct + * IO, we effectively serialise all new concurrent read IO to this file + * and block it behind IO that is currently in progress because IO in + * progress holds the IO lock shared. We only need to hold the lock + * exclusive to blow away the page cache, so only take lock exclusively + * if the page cache needs invalidation. This allows the normal direct + * IO case of no page cache pages to proceeed concurrently without + * serialisation. */ xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); if ((ioflags & XFS_IO_ISDIRECT) && inode->i_mapping->nrpages) { xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); + /* + * The generic dio code only flushes the range of the particular + * I/O. Because we take an exclusive lock here, this whole + * sequence is considerably more expensive for us. This has a + * noticeable performance impact for any file with cached pages, + * even when outside of the range of the particular I/O. + * + * Hence, amortize the cost of the lock against a full file + * flush and reduce the chances of repeated iolock cycles going + * forward. + */ if (inode->i_mapping->nrpages) { - ret = filemap_write_and_wait_range( - VFS_I(ip)->i_mapping, - pos, pos + size - 1); + ret = filemap_write_and_wait(VFS_I(ip)->i_mapping); if (ret) { xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; @@ -345,9 +354,7 @@ xfs_file_read_iter( * we fail to invalidate a page, but this should never * happen on XFS. Warn if it does fail. */ - ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - pos >> PAGE_CACHE_SHIFT, - (pos + size - 1) >> PAGE_CACHE_SHIFT); + ret = invalidate_inode_pages2(VFS_I(ip)->i_mapping); WARN_ON_ONCE(ret); ret = 0; } @@ -733,19 +740,19 @@ xfs_file_dio_aio_write( pos = iocb->ki_pos; end = pos + count - 1; + /* + * See xfs_file_read_iter() for why we do a full-file flush here. + */ if (mapping->nrpages) { - ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - pos, end); + ret = filemap_write_and_wait(VFS_I(ip)->i_mapping); if (ret) goto out; /* - * Invalidate whole pages. This can return an error if - * we fail to invalidate a page, but this should never - * happen on XFS. Warn if it does fail. + * Invalidate whole pages. This can return an error if we fail + * to invalidate a page, but this should never happen on XFS. + * Warn if it does fail. */ - ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - pos >> PAGE_CACHE_SHIFT, - end >> PAGE_CACHE_SHIFT); + ret = invalidate_inode_pages2(VFS_I(ip)->i_mapping); WARN_ON_ONCE(ret); ret = 0; } -- 2.1.0 From bfoster@redhat.com Fri Aug 14 14:41:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CF6977F37 for ; Fri, 14 Aug 2015 14:41:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 64B1FAC001 for ; Fri, 14 Aug 2015 12:41:30 -0700 (PDT) X-ASG-Debug-ID: 1439581288-04bdf02a691c4c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t2ThwH1xw3i3m1Gd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 12:41:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id CFF0FA37FB; Fri, 14 Aug 2015 19:41:28 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7EJfSTH031990; Fri, 14 Aug 2015 15:41:28 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B73A012204F; Fri, 14 Aug 2015 15:41:26 -0400 (EDT) Date: Fri, 14 Aug 2015 15:41:26 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz, oleg@redhat.com Subject: Re: [PATCH 1/2] xfs: clean up inode lockdep annotations Message-ID: <20150814194126.GA18522@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: clean up inode lockdep annotations References: <1439330648-1057-1-git-send-email-david@fromorbit.com> <1439330648-1057-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439330648-1057-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439581289 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 12, 2015 at 08:04:07AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Lockdep annotations are a maintenance nightmare. Locking has to be > modified to suit the limitations of the annotations, and we're > always having to fix the annotations because they are unable to > express the complexity of locking heirarchies correctly. > > So, next up, we've got more issues with lockdep annotations for > inode locking w.r.t. XFS_LOCK_PARENT: > > - lockdep classes are exclusive and can't be ORed together > to form new classes. > - IOLOCK needs multiple PARENT subclasses to express the > changes needed for the readdir locking rework needed to > stop the endless flow of lockdep false positives involving > readdir calling filldir under the ILOCK. > - there are only 8 unique lockdep subclasses available, > so we can't create a generic solution. > > IOWs we need to treat the 3-bit space available to each lock type > differently: > > - IOLOCK uses xfs_lock_two_inodes(), so needs: > - at least 2 IOLOCK subclasses > - at least 2 IOLOCK_PARENT subclasses > - MMAPLOCK uses xfs_lock_two_inodes(), so needs: > - at least 2 MMAPLOCK subclasses > - ILOCK uses xfs_lock_inodes with up to 5 inodes, so needs: > - at least 5 ILOCK subclasses > - one ILOCK_PARENT subclass > - one RTBITMAP subclass > - one RTSUM subclass > > For the IOLOCK, split the space into two sets of subclasses. > For the MMAPLOCK, just use half the space for the one subclass to > match the non-parent lock classes of the IOLOCK. > For the ILOCK, use 0-4 as the ILOCK subclasses, 5-7 for the > remaining individual subclasses. > > Because they are now all different, modify xfs_lock_inumorder() to > handle the nested subclasses, and to assert fail if passed an > invalid subclass. Further, annotate xfs_lock_inodes() to assert fail > if an invalid combination of lock primitives and inode counts are > passed that would result in a lockdep subclass annotation overflow. > > Signed-off-by: Dave Chinner > --- A few aesthetic things... > fs/xfs/xfs_inode.c | 68 ++++++++++++++++++++++++++++++++----------- > fs/xfs/xfs_inode.h | 85 +++++++++++++++++++++++++++++++++++++----------------- > 2 files changed, 110 insertions(+), 43 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8d0cbb5..793e6c9 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -164,7 +164,7 @@ xfs_ilock( > (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); > ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != > (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); > - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); > + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); > > if (lock_flags & XFS_IOLOCK_EXCL) > mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); > @@ -212,7 +212,7 @@ xfs_ilock_nowait( > (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); > ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != > (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); > - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); > + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); > > if (lock_flags & XFS_IOLOCK_EXCL) { > if (!mrtryupdate(&ip->i_iolock)) > @@ -281,7 +281,7 @@ xfs_iunlock( > (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); > ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != > (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); > - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); > + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); > ASSERT(lock_flags != 0); > > if (lock_flags & XFS_IOLOCK_EXCL) > @@ -364,30 +364,38 @@ int xfs_lock_delays; > > /* > * Bump the subclass so xfs_lock_inodes() acquires each lock with a different > - * value. This shouldn't be called for page fault locking, but we also need to > - * ensure we don't overrun the number of lockdep subclasses for the iolock or > - * mmaplock as that is limited to 12 by the mmap lock lockdep annotations. > + * value. This can be called for any type of inode lock combination, including > + * parent locking. Care must be taken to ensure we don't overrun the subclass > + * storage fields in the class mask we build. > */ > static inline int > xfs_lock_inumorder(int lock_mode, int subclass) > { > + int class = 0; > + > + ASSERT(!(lock_mode & (XFS_ILOCK_PARENT | XFS_ILOCK_RTBITMAP | > + XFS_ILOCK_RTSUM))); > + > if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { > - ASSERT(subclass + XFS_LOCK_INUMORDER < > - (1 << (XFS_MMAPLOCK_SHIFT - XFS_IOLOCK_SHIFT))); > - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_IOLOCK_SHIFT; > + ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); > + ASSERT(subclass + XFS_IOLOCK_PARENT_VAL < > + MAX_LOCKDEP_SUBCLASSES); > + class += subclass << XFS_IOLOCK_SHIFT; > + if (lock_mode & XFS_IOLOCK_PARENT) > + class += XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT; Looks like you can use XFS_IOLOCK_PARENT here. > } > > if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) { > - ASSERT(subclass + XFS_LOCK_INUMORDER < > - (1 << (XFS_ILOCK_SHIFT - XFS_MMAPLOCK_SHIFT))); > - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << > - XFS_MMAPLOCK_SHIFT; > + ASSERT(subclass <= XFS_MMAPLOCK_MAX_SUBCLASS); > + class += subclass << XFS_MMAPLOCK_SHIFT; > } > > - if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) > - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_ILOCK_SHIFT; > + if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) { > + ASSERT(subclass <= XFS_ILOCK_MAX_SUBCLASS); > + class += subclass << XFS_ILOCK_SHIFT; > + } > > - return lock_mode; > + return (lock_mode & ~XFS_LOCK_SUBCLASS_MASK) | class; > } > > /* > @@ -399,6 +407,11 @@ xfs_lock_inumorder(int lock_mode, int subclass) > * transaction (such as truncate). This can result in deadlock since the long > * running trans might need to wait for the inode we just locked in order to > * push the tail and free space in the log. > + * > + * xfs_lock_inodes() can only be used to lock one type of lock at a time - > + * the iolock, the mmaplock or the ilock, but not more than one at a time. If we > + * lock more than one at a time, lockdep will report false positives saying we > + * have violated locking orders. > */ > void > xfs_lock_inodes( > @@ -409,8 +422,29 @@ xfs_lock_inodes( > int attempts = 0, i, j, try_lock; > xfs_log_item_t *lp; > > - /* currently supports between 2 and 5 inodes */ > + /* > + * Currently supports between 2 and 5 inodes with exclusive locking. We > + * support an arbitrary depth of locking here, but absolute limits on > + * inodes depend on the the type of locking and the limits placed by > + * lockdep annotations in xfs_lock_inumorder. These are all checked by > + * the asserts. > + */ > ASSERT(ips && inodes >= 2 && inodes <= 5); > + ASSERT(lock_mode & (XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL | > + XFS_ILOCK_EXCL)); > + ASSERT(!(lock_mode & (XFS_IOLOCK_SHARED | XFS_MMAPLOCK_SHARED | > + XFS_ILOCK_SHARED))); > + ASSERT(!(lock_mode & XFS_IOLOCK_EXCL) || > + inodes <= XFS_IOLOCK_MAX_SUBCLASS + 1); > + ASSERT(!(lock_mode & XFS_MMAPLOCK_EXCL) || > + inodes <= XFS_MMAPLOCK_MAX_SUBCLASS + 1); > + ASSERT(!(lock_mode & XFS_ILOCK_EXCL) || > + inodes <= XFS_ILOCK_MAX_SUBCLASS + 1); > + > + if (lock_mode & XFS_IOLOCK_EXCL) { > + ASSERT(!(lock_mode & (XFS_MMAPLOCK_EXCL | XFS_ILOCK_EXCL))); > + } else if (lock_mode & XFS_MMAPLOCK_EXCL) > + ASSERT(!(lock_mode & XFS_ILOCK_EXCL)); > > try_lock = 0; > i = 0; > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 8f22d20..ca9e119 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -284,9 +284,9 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) > * Flags for lockdep annotations. > * > * XFS_LOCK_PARENT - for directory operations that require locking a > - * parent directory inode and a child entry inode. The parent gets locked > - * with this flag so it gets a lockdep subclass of 1 and the child entry > - * lock will have a lockdep subclass of 0. > + * parent directory inode and a child entry inode. IOLOCK requires nesting, > + * MMAPLOCK does not support this class, ILOCK requires a single subclass > + * to differentiate parent from child. > * > * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary > * inodes do not participate in the normal lock order, and thus have their > @@ -295,30 +295,63 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) > * XFS_LOCK_INUMORDER - for locking several inodes at the some time > * with xfs_lock_inodes(). This flag is used as the starting subclass > * and each subsequent lock acquired will increment the subclass by one. > - * So the first lock acquired will have a lockdep subclass of 4, the > - * second lock will have a lockdep subclass of 5, and so on. It is > - * the responsibility of the class builder to shift this to the correct > - * portion of the lock_mode lockdep mask. > + * However, MAX_LOCKDEP_SUBCLASSES == 8, which means we are greatly > + * limited to the subclasses we can represent via nesting. We need at least > + * 5 inodes nest depth for the ILOCK through rename, and we also have to support > + * XFS_ILOCK_PARENT, which gives 6 subclasses. Then we have XFS_ILOCK_RTBITMAP > + * and XFS_ILOCK_RTSUM, which are another 2 unique subclasses, so that's all > + * 8 subclasses supported by lockdep. > + * > + * This also means we have to number the sub-classes in the lowest bits of > + * the mask we keep, and we have to ensure we never exceed 3 bits of lockdep > + * mask and we can't use bit-masking to build the subclasses. What a mess. > + * > + * Bit layout: > + * > + * Bit Lock Region > + * 16-19 XFS_IOLOCK_SHIFT dependencies > + * 20-23 XFS_MMAPLOCK_SHIFT dependencies > + * 24-31 XFS_ILOCK_SHIFT dependencies > + * > + * IOLOCK values > + * > + * 0-3 subclass value > + * 4-7 PARENT subclass values > + * > + * MMAPLOCK values > + * > + * 0-3 subclass value > + * 4-7 unused > + * > + * ILOCK values > + * 0-4 subclass values > + * 5 PARENT subclass (not nestable) > + * 6 RTBITMAP subclass (not nestable) > + * 7 RTSUM subclass (not nestable) > + * Trailing whitespace on the line above. > */ > -#define XFS_LOCK_PARENT 1 > -#define XFS_LOCK_RTBITMAP 2 > -#define XFS_LOCK_RTSUM 3 > -#define XFS_LOCK_INUMORDER 4 > - > -#define XFS_IOLOCK_SHIFT 16 > -#define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) > - > -#define XFS_MMAPLOCK_SHIFT 20 > - > -#define XFS_ILOCK_SHIFT 24 > -#define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) > -#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) > -#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) > - > -#define XFS_IOLOCK_DEP_MASK 0x000f0000 > -#define XFS_MMAPLOCK_DEP_MASK 0x00f00000 > -#define XFS_ILOCK_DEP_MASK 0xff000000 > -#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | \ > +#define XFS_IOLOCK_SHIFT 16 > +#define XFS_IOLOCK_PARENT_VAL 4 > +#define XFS_IOLOCK_MAX_SUBCLASS (XFS_IOLOCK_PARENT_VAL - 1) > +#define XFS_IOLOCK_DEP_MASK 0x000f0000 > +#define XFS_IOLOCK_PARENT (XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT) > + > +#define XFS_MMAPLOCK_SHIFT 20 > +#define XFS_MMAPLOCK_NUMORDER 0 > +#define XFS_MMAPLOCK_MAX_SUBCLASS 3 > +#define XFS_MMAPLOCK_DEP_MASK 0x00f00000 > + > +#define XFS_ILOCK_SHIFT 24 > +#define XFS_ILOCK_PARENT_VAL 5 > +#define XFS_ILOCK_MAX_SUBCLASS (XFS_ILOCK_PARENT_VAL - 1) > +#define XFS_ILOCK_RTBITMAP_VAL 6 > +#define XFS_ILOCK_RTSUM_VAL 7 > +#define XFS_ILOCK_DEP_MASK 0xff000000 > +#define XFS_ILOCK_PARENT (XFS_ILOCK_PARENT_VAL << XFS_ILOCK_SHIFT) > +#define XFS_ILOCK_RTBITMAP (XFS_ILOCK_RTBITMAP_VAL << XFS_ILOCK_SHIFT) > +#define XFS_ILOCK_RTSUM (XFS_ILOCK_RTSUM_VAL << XFS_ILOCK_SHIFT) > + While we're at it, the spacing before some of the macro names looks inconsistent (as it was before). It looks like some use a space and others use a tab. With those fixes: Reviewed-by: Brian Foster > +#define XFS_LOCK_SUBCLASS_MASK (XFS_IOLOCK_DEP_MASK | \ > XFS_MMAPLOCK_DEP_MASK | \ > XFS_ILOCK_DEP_MASK) > > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 14 14:41:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9005D7F37 for ; Fri, 14 Aug 2015 14:41:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BA3E8F804B for ; Fri, 14 Aug 2015 12:41:49 -0700 (PDT) X-ASG-Debug-ID: 1439581307-04cbb04ee91ae70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BA5hkqygoF8lkFZ1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 12:41:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id A31FF8E697; Fri, 14 Aug 2015 19:41:47 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7EJflL9005257; Fri, 14 Aug 2015 15:41:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BFD9212204F; Fri, 14 Aug 2015 15:41:45 -0400 (EDT) Date: Fri, 14 Aug 2015 15:41:45 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz, oleg@redhat.com Subject: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks Message-ID: <20150814194145.GB18522@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks References: <1439330648-1057-1-git-send-email-david@fromorbit.com> <1439330648-1057-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439330648-1057-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439581308 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 12, 2015 at 08:04:08AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The recent change to the readdir locking made in 40194ec ("xfs: > reinstate the ilock in xfs_readdir") for CXFS directory sanity was > probably the wrong thing to do. Deep in the readdir code we > can take page faults in the filldir callback, and so taking a page > fault while holding an inode ilock creates a new set of locking > issues that lockdep warns all over the place about. > > The locking order for regular inodes w.r.t. page faults is io_lock > -> pagefault -> mmap_sem -> ilock. The directory readdir code now > triggers ilock -> page fault -> mmap_sem. While we cannot deadlock > at this point, it inverts all the locking patterns that lockdep > normally sees on XFS inodes, and so triggers lockdep. We worked > around this with commit 93a8614 ("xfs: fix directory inode iolock > lockdep false positive"), but that then just moved the lockdep > warning to deeper in the page fault path and triggered on security > inode locks. Fixing the shmem issue there just moved the lockdep > reports somewhere else, and now we are getting false positives from > filesystem freezing annotations getting confused. > > Further, if we enter memory reclaim in a readdir path, we now get > lockdep warning about potential deadlocks because the ilock is held > when we enter reclaim. This, again, is different to a regular file > in that we never allow memory reclaim to run while holding the ilock > for regular files. Hence lockdep now throws > ilock->kmalloc->reclaim->ilock warnings. > > Basically, the problem is that the ilock is being used to protect > the directory data and the inode metadata, whereas for a regular > file the iolock protects the data and the ilock protects the > metadata. From the VFS perspective, the i_mutex serialises all > accesses to the directory data, and so not holding the ilock for > readdir doesn't matter. The issue is that CXFS doesn't access > directory data via the VFS, so it has no "data serialisaton" > mechanism. Hence we need to hold the IOLOCK in the correct places to > provide this low level directory data access serialisation. > > The ilock can then be used just when the extent list needs to be > read, just like we do for regular files. The directory modification > code can take the iolock exclusive when the ilock is also taken, > and this then ensures that readdir is correct excluded while > modifications are in progress. > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_dir2.c | 3 +++ > fs/xfs/xfs_dir2_readdir.c | 11 ++++++++--- > fs/xfs/xfs_inode.c | 34 +++++++++++++++++++++------------- > fs/xfs/xfs_symlink.c | 7 ++++--- > 4 files changed, 36 insertions(+), 19 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index a69fb3a..42799d8 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -362,6 +362,7 @@ xfs_dir_lookup( > struct xfs_da_args *args; > int rval; > int v; /* type-checking value */ > + int lock_mode; > > ASSERT(S_ISDIR(dp->i_d.di_mode)); > XFS_STATS_INC(xs_dir_lookup); > @@ -387,6 +388,7 @@ xfs_dir_lookup( > if (ci_name) > args->op_flags |= XFS_DA_OP_CILOOKUP; > > + lock_mode = xfs_ilock_data_map_shared(dp); > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > rval = xfs_dir2_sf_lookup(args); > goto out_check_rval; > @@ -419,6 +421,7 @@ out_check_rval: > } > } > out_free: > + xfs_iunlock(dp, lock_mode); > kmem_free(args); > return rval; > } > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index 098cd78..a989a9c 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -171,6 +171,7 @@ xfs_dir2_block_getdents( > int wantoff; /* starting block offset */ > xfs_off_t cook; > struct xfs_da_geometry *geo = args->geo; > + int lock_mode; > > /* > * If the block number in the offset is out of range, we're done. > @@ -178,7 +179,9 @@ xfs_dir2_block_getdents( > if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > return 0; > > + lock_mode = xfs_ilock_data_map_shared(dp); > error = xfs_dir3_block_read(NULL, dp, &bp); > + xfs_iunlock(dp, lock_mode); Ok, so the iolock bits exclude directory reads/lookups against directory modification. The ilock around these buffer reads serves the purpose of the commit 40194ec mentioned above, to protect reading in the extent tree. The locking all looks fine, but what I'm not quite clear on is where the requirement for the iolock comes in. Is this necessary because the ilock has been pushed down? Are we just trying to mirror how i_mutex is used and/or provide a consistent locking pattern as for regular files? Brian > if (error) > return error; > > @@ -529,9 +532,12 @@ xfs_dir2_leaf_getdents( > * current buffer, need to get another one. > */ > if (!bp || ptr >= (char *)bp->b_addr + geo->blksize) { > + int lock_mode; > > + lock_mode = xfs_ilock_data_map_shared(dp); > error = xfs_dir2_leaf_readbuf(args, bufsize, map_info, > &curoff, &bp); > + xfs_iunlock(dp, lock_mode); > if (error || !map_info->map_valid) > break; > > @@ -653,7 +659,6 @@ xfs_readdir( > struct xfs_da_args args = { NULL }; > int rval; > int v; > - uint lock_mode; > > trace_xfs_readdir(dp); > > @@ -666,7 +671,7 @@ xfs_readdir( > args.dp = dp; > args.geo = dp->i_mount->m_dir_geo; > > - lock_mode = xfs_ilock_data_map_shared(dp); > + xfs_ilock(dp, XFS_IOLOCK_SHARED); > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_getdents(&args, ctx); > else if ((rval = xfs_dir2_isblock(&args, &v))) > @@ -675,7 +680,7 @@ xfs_readdir( > rval = xfs_dir2_block_getdents(&args, ctx); > else > rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); > - xfs_iunlock(dp, lock_mode); > + xfs_iunlock(dp, XFS_IOLOCK_SHARED); > > return rval; > } > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 793e6c9..83b0752 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -672,30 +672,29 @@ xfs_lookup( > { > xfs_ino_t inum; > int error; > - uint lock_mode; > > trace_xfs_lookup(dp, name); > > if (XFS_FORCED_SHUTDOWN(dp->i_mount)) > return -EIO; > > - lock_mode = xfs_ilock_data_map_shared(dp); > + xfs_ilock(dp, XFS_IOLOCK_SHARED); > error = xfs_dir_lookup(NULL, dp, name, &inum, ci_name); > - xfs_iunlock(dp, lock_mode); > - > if (error) > - goto out; > + goto out_unlock; > > error = xfs_iget(dp->i_mount, NULL, inum, 0, 0, ipp); > if (error) > goto out_free_name; > > + xfs_iunlock(dp, XFS_IOLOCK_SHARED); > return 0; > > out_free_name: > if (ci_name) > kmem_free(ci_name->name); > -out: > +out_unlock: > + xfs_iunlock(dp, XFS_IOLOCK_SHARED); > *ipp = NULL; > return error; > } > @@ -1197,7 +1196,8 @@ xfs_create( > goto out_trans_cancel; > > > - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); > + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | > + XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); > unlock_dp_on_error = true; > > xfs_bmap_init(&free_list, &first_block); > @@ -1236,7 +1236,7 @@ xfs_create( > * the transaction cancel unlocking dp so don't do it explicitly in the > * error path. > */ > - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > unlock_dp_on_error = false; > > error = xfs_dir_createname(tp, dp, name, ip->i_ino, > @@ -1309,7 +1309,7 @@ xfs_create( > xfs_qm_dqrele(pdqp); > > if (unlock_dp_on_error) > - xfs_iunlock(dp, XFS_ILOCK_EXCL); > + xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > return error; > } > > @@ -1457,10 +1457,11 @@ xfs_link( > if (error) > goto error_return; > > + xfs_ilock(tdp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); > xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); > > xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); > - xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, tdp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > > /* > * If we are using project inheritance, we only allow hard link > @@ -2563,9 +2564,10 @@ xfs_remove( > goto out_trans_cancel; > } > > + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); > xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); > > - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > /* > @@ -2946,6 +2948,12 @@ xfs_rename( > * whether the target directory is the same as the source > * directory, we can lock from 2 to 4 inodes. > */ > + if (!new_parent) > + xfs_ilock(src_dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); > + else > + xfs_lock_two_inodes(src_dp, target_dp, > + XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); > + > xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL); > > /* > @@ -2953,9 +2961,9 @@ xfs_rename( > * we can rely on either trans_commit or trans_cancel to unlock > * them. > */ > - xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, src_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > if (new_parent) > - xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, target_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); > if (target_ip) > xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 4be27b0..7a01486 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -240,7 +240,8 @@ xfs_symlink( > if (error) > goto out_trans_cancel; > > - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); > + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | > + XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); > unlock_dp_on_error = true; > > /* > @@ -288,7 +289,7 @@ xfs_symlink( > * the transaction cancel unlocking dp so don't do it explicitly in the > * error path. > */ > - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > unlock_dp_on_error = false; > > /* > @@ -421,7 +422,7 @@ out_release_inode: > xfs_qm_dqrele(pdqp); > > if (unlock_dp_on_error) > - xfs_iunlock(dp, XFS_ILOCK_EXCL); > + xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > return error; > } > > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Fri Aug 14 17:39:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C057B7F37 for ; Fri, 14 Aug 2015 17:39:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 988678F8037 for ; Fri, 14 Aug 2015 15:39:42 -0700 (PDT) X-ASG-Debug-ID: 1439591979-04cb6c594703b60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id DPyvS7FcVKu5CTHK for ; Fri, 14 Aug 2015 15:39:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BNCABkbc5VPBkyLHldgxuBPYJWg3yjYQabQgICAQECgUtNAQEBAQEBBwEBAQFBP4QjAQEBAwEnExwjBQsIAw4HAwklDwUlAwcaE4gmB9AdAQEIAgEfGYYHhTOEPksHhCwFhx6KcIMNh3CEeYFNh0SRFoIzHYFlLDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2015 08:09:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQNdR-000553-E0; Sat, 15 Aug 2015 08:39:37 +1000 Date: Sat, 15 Aug 2015 08:39:37 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, jack@suse.cz, oleg@redhat.com Subject: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks Message-ID: <20150814223937.GW3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks References: <1439330648-1057-1-git-send-email-david@fromorbit.com> <1439330648-1057-3-git-send-email-david@fromorbit.com> <20150814194145.GB18522@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814194145.GB18522@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439591979 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 14, 2015 at 03:41:45PM -0400, Brian Foster wrote: > On Wed, Aug 12, 2015 at 08:04:08AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > The recent change to the readdir locking made in 40194ec ("xfs: > > reinstate the ilock in xfs_readdir") for CXFS directory sanity was > > probably the wrong thing to do. Deep in the readdir code we > > can take page faults in the filldir callback, and so taking a page > > fault while holding an inode ilock creates a new set of locking > > issues that lockdep warns all over the place about. > > > > The locking order for regular inodes w.r.t. page faults is io_lock > > -> pagefault -> mmap_sem -> ilock. The directory readdir code now > > triggers ilock -> page fault -> mmap_sem. While we cannot deadlock > > at this point, it inverts all the locking patterns that lockdep > > normally sees on XFS inodes, and so triggers lockdep. We worked > > around this with commit 93a8614 ("xfs: fix directory inode iolock > > lockdep false positive"), but that then just moved the lockdep > > warning to deeper in the page fault path and triggered on security > > inode locks. Fixing the shmem issue there just moved the lockdep > > reports somewhere else, and now we are getting false positives from > > filesystem freezing annotations getting confused. > > > > Further, if we enter memory reclaim in a readdir path, we now get > > lockdep warning about potential deadlocks because the ilock is held > > when we enter reclaim. This, again, is different to a regular file > > in that we never allow memory reclaim to run while holding the ilock > > for regular files. Hence lockdep now throws > > ilock->kmalloc->reclaim->ilock warnings. > > > > Basically, the problem is that the ilock is being used to protect > > the directory data and the inode metadata, whereas for a regular > > file the iolock protects the data and the ilock protects the > > metadata. From the VFS perspective, the i_mutex serialises all > > accesses to the directory data, and so not holding the ilock for > > readdir doesn't matter. The issue is that CXFS doesn't access > > directory data via the VFS, so it has no "data serialisaton" > > mechanism. Hence we need to hold the IOLOCK in the correct places to > > provide this low level directory data access serialisation. > > > > The ilock can then be used just when the extent list needs to be > > read, just like we do for regular files. The directory modification > > code can take the iolock exclusive when the ilock is also taken, > > and this then ensures that readdir is correct excluded while > > modifications are in progress. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/libxfs/xfs_dir2.c | 3 +++ > > fs/xfs/xfs_dir2_readdir.c | 11 ++++++++--- > > fs/xfs/xfs_inode.c | 34 +++++++++++++++++++++------------- > > fs/xfs/xfs_symlink.c | 7 ++++--- > > 4 files changed, 36 insertions(+), 19 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > > index a69fb3a..42799d8 100644 > > --- a/fs/xfs/libxfs/xfs_dir2.c > > +++ b/fs/xfs/libxfs/xfs_dir2.c > > @@ -362,6 +362,7 @@ xfs_dir_lookup( > > struct xfs_da_args *args; > > int rval; > > int v; /* type-checking value */ > > + int lock_mode; > > > > ASSERT(S_ISDIR(dp->i_d.di_mode)); > > XFS_STATS_INC(xs_dir_lookup); > > @@ -387,6 +388,7 @@ xfs_dir_lookup( > > if (ci_name) > > args->op_flags |= XFS_DA_OP_CILOOKUP; > > > > + lock_mode = xfs_ilock_data_map_shared(dp); > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > > rval = xfs_dir2_sf_lookup(args); > > goto out_check_rval; > > @@ -419,6 +421,7 @@ out_check_rval: > > } > > } > > out_free: > > + xfs_iunlock(dp, lock_mode); > > kmem_free(args); > > return rval; > > } > > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > > index 098cd78..a989a9c 100644 > > --- a/fs/xfs/xfs_dir2_readdir.c > > +++ b/fs/xfs/xfs_dir2_readdir.c > > @@ -171,6 +171,7 @@ xfs_dir2_block_getdents( > > int wantoff; /* starting block offset */ > > xfs_off_t cook; > > struct xfs_da_geometry *geo = args->geo; > > + int lock_mode; > > > > /* > > * If the block number in the offset is out of range, we're done. > > @@ -178,7 +179,9 @@ xfs_dir2_block_getdents( > > if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > > return 0; > > > > + lock_mode = xfs_ilock_data_map_shared(dp); > > error = xfs_dir3_block_read(NULL, dp, &bp); > > + xfs_iunlock(dp, lock_mode); > > Ok, so the iolock bits exclude directory reads/lookups against directory > modification. The ilock around these buffer reads serves the purpose of > the commit 40194ec mentioned above, to protect reading in the extent > tree. Right. > The locking all looks fine, but what I'm not quite clear on is where the > requirement for the iolock comes in. Is this necessary because the ilock > has been pushed down? Yes. Basically, the ilock currently serialises access to directory data in it's entirity. Not just the inode metadata (i.e. struct xfs_inode and the BMBT in the data forks) but also everything the BMBT points to. The problem with this is that it means that when reading the directory data we have to hold the ilock to prevent racing with modification - not just inode metadata, but also the directory data blocks themselves. i.e. if we don't hold the ilock, we could read one directory data block, and when we go to read the next we could have raced with a modification that shifted dirents from one block to the next. This would result in missing or duplicate dirents in readdir, even though the BMBT had not changed.... Hence we need some form or locking against modification of the directory data, not just the directory inode structure. THis is exactly what we do with file data - the ilock protects against modification of the inode metadata, the iolock serialises access to the file data appropriately (e.g. vs truncate). So effectively this change makes the directory data access be serialised in a similar manner to the file data. Note that it's not just directory data - it's also the hash indexes and the free space blocks that are protected by the iolock. i.e. the xfs_dir_lookup() method uses the hash index to find the dirent in the directory data segment, so effectively we are moving to locking structure of "ilock protects against BMBT changes, iolock protects against directory data and internal data index changes". > Are we just trying to mirror how i_mutex is used > and/or provide a consistent locking pattern as for regular files? We're not trying to replicate i_mutex - we are trying to ensure that we have shared read access to the directory data, even though the VFS does not allow shared read access. The CXFS metadata server makes use of shared read access because it does not go throught the VFS layers, and we want to preserve this behaviour so that if we ever get shared directory access through the VFS everything just works on XFS. And, yes, we are trying to replicate the iolock/mmap_sem/ilock locking pattern used for regular files, because it doesn't through lockdep false positives as the iolock is not used underneath the mmap_sem like the ilock is during block mapping in page faults... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tfwmhfgym@vokh.com Fri Aug 14 17:42:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, LOW_PRICE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D48357F37 for ; Fri, 14 Aug 2015 17:42:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD17D8F8039 for ; Fri, 14 Aug 2015 15:42:52 -0700 (PDT) X-ASG-Debug-ID: 1439592169-04cbb078e203ad0001-NocioJ Received: from vokh.com ([223.240.25.121]) by cuda.sgi.com with ESMTP id pMFtY5y198VAsEOG for ; Fri, 14 Aug 2015 15:42:50 -0700 (PDT) X-Barracuda-Envelope-From: tfwmhfgym@vokh.com X-Barracuda-Apparent-Source-IP: 223.240.25.121 Received: from SKY-20150201SFT ([127.0.0.1]) by localhost via TCP with ESMTPA; Sat, 15 Aug 2015 06:42:31 +0800 MIME-Version: 1.0 From: Toney Sender: Toney To: xfs@oss.sgi.com Reply-To: Toney Date: 15 Aug 2015 06:42:31 +0800 Subject: =?utf-8?B?TG93ZXN0IFByaWNlIEhpZ2ggbGlmdGVyIHB1bXAsIENhc3RpbmcgaXJvbiBwdW1wLEZpcmUgcHVtcA==?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?TG93ZXN0IFByaWNlIEhpZ2ggbGlmdGVyIHB1bXAsIENhc3RpbmcgaXJvbiBwdW1wLEZpcmUgcHVtcA==?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[223.240.25.121] X-Barracuda-Start-Time: 1439592170 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.90 X-Barracuda-Spam-Status: No, SCORE=1.90 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, LOW_PRICE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.16 LOW_PRICE BODY: Lowest Price 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150814224252.85EDD106C923@cuda.sgi.com> PGh0bWw+PGJvZHk+PFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAx Ny4yNXB0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBCQUNLR1JPVU5EOiB3aGl0ZTsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWxlZnQ+PFNQ QU4gc3R5bGU9IkZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IGJs YWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZvbnQta2VybmluZzogMHB0 IiBsYW5nPUVOLVVTPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1z ZXJpZic7IENPTE9SOiBibGFjazsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZMiIGxhbmc9RU4tVVM+RGVhciw8QlI+Jm5ic3A7PEJSPldlIGFy ZSBzcGVjaWFsaXppbmcgaW4gcHVtcCxzdWNoIGFzKEhpZ2ggbGlmdGVyIHB1bXAsIENhc3Rp bmcgaXJvbiBwdW1wLEZpcmUgcHVtcCkuPC9TUEFOPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0i VEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3LjI1cHQ7IE1BUkdJTjogMGNtIDBj bSAwcHQ7IEJBQ0tHUk9VTkQ6IHdoaXRlOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFu IiBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6 ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6 ZTogMTAuNXB0OyBtc28tZm9udC1rZXJuaW5nOiAwcHQiIGxhbmc9RU4tVVM+PFNQQU4gc3R5 bGU9IkZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IGJsYWNrOyBG T05ULVNJWkU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyIgbGFu Zz1FTi1VUz5PdXIgcHJvZHVjdHMgYXJlIHdpZGVseSB1c2VkIGluIGFncmljdWx0dXJlLCBm b3Jlc3RyeSwgaXJyaWdhdGlvbiwgZmxvb2QgY29udHJvbCBhbmQgZHJvdWdodCByZWxpZWYs IGZpcmUgZmlyZSwgbGFuZHNjYXBpbmcsIGNvbnN0cnVjdGlvbiBhbmQgb3RoZXIgYXNwZWN0 cy48L1NQQU4+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5F LUhFSUdIVDogMTcuMjVwdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgQkFDS0dST1VORDogd2hp dGU7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGNsYXNzPU1zb05vcm1hbCBhbGln bj1sZWZ0PjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZic7 IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mb250LWtl cm5pbmc6IDBwdCIgbGFuZz1FTi1VUz48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6ICdBcmlh bCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMTAuNXB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIiBsYW5nPUVOLVVTPjwvU1BBTj48L1NQQU4+ Jm5ic3A7PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAx Ny4yNXB0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBCQUNLR1JPVU5EOiB3aGl0ZTsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWxlZnQ+PFNQ QU4gc3R5bGU9IkZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IGJs YWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZvbnQta2VybmluZzogMHB0 IiBsYW5nPUVOLVVTPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1z ZXJpZic7IENPTE9SOiBibGFjazsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZMiIGxhbmc9RU4tVVM+QmVsb3cgYXJlIG91ciBsYXRlc3QgcHJv ZHVjdGlvbiBmb3IgeW91ciByZWZlcmVuY2UsIGlmIHlvdSBoYXZlIGludGVyZXN0aW5nLDxC Uj5JIHdpbGwgc2VuZCB5b3Ugb3VyIGNhdGFsb2cgbGF0ZXIsIHRoYW5rIHlvdSB2ZXJ5IG11 Y2ghPC9TUEFOPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElO RS1IRUlHSFQ6IDE3LjI1cHQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEJBQ0tHUk9VTkQ6IHdo aXRlOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiBjbGFzcz1Nc29Ob3JtYWwgYWxp Z249bGVmdD48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYn OyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZm9udC1r ZXJuaW5nOiAwcHQiIGxhbmc9RU4tVVM+PFNQQU4gc3R5bGU9IkZPTlQtRkFNSUxZOiAnQXJp YWwnLCdzYW5zLXNlcmlmJzsgQ09MT1I6IGJsYWNrOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyIgbGFuZz1FTi1VUz48L1NQQU4+PC9TUEFO PiZuYnNwOzwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDog MTcuMjVwdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgQkFDS0dST1VORDogd2hpdGU7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1sZWZ0PjxT UEFOIHN0eWxlPSJGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZic7IENPTE9SOiBi bGFjazsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mb250LWtlcm5pbmc6IDBw dCIgbGFuZz1FTi1VUz48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMt c2VyaWYnOyBDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TIiBsYW5nPUVOLVVTPldlIHNpbmNlcmVseSB3ZWxjb21lIGFs bCBmcmllbmRzIHRvIHZpc2l0IHRoZSBjb21wYW55IGd1aWRhbmNlLjxCUj4mbmJzcDs8L1NQ QU4+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJp Zic7IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mb250 LWtlcm5pbmc6IDBwdCIgbGFuZz1FTi1VUz48U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6ICdB cmlhbCcsJ3NhbnMtc2VyaWYnOyBDT0xPUjogYmxhY2s7IEZPTlQtU0laRTogMTAuNXB0OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIiBsYW5nPUVOLVVTPjxCUj5CLnI8QlI+ VG9uZXkgKEdlbmVyYWwgTWFuYWdlcik8QlI+VGVsOiAwMDg2LTUxMi04NjY2Mzk3NTxCUj5G YXg6IDAwODYtNTEyLTY1NjI0NjM3PEJSPk1vYmlsZTogMDA4Ni0xMzkxMjY0NzA5NDxCUj5T dXpob3UgVHVvRmEgTWVjaGFuaWMgQ28uLCAoUHJvZHVjdHM6IFdhdGVyIHB1bXBzLCBkaWVz ZWwgZW5naW5lICxldGMuKTwvUD48L1NQQU4+PC9TUEFOPjwvYm9keT48L2h0bWw+ From lrhorer@mygrande.net Fri Aug 14 18:12:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 80E6C7F3F for ; Fri, 14 Aug 2015 18:12:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16566AC007 for ; Fri, 14 Aug 2015 16:12:29 -0700 (PDT) X-ASG-Debug-ID: 1439593943-04bdf051f904840001-NocioJ Received: from mail01.lsn.net (mail01.lsn.net [66.90.130.120]) by cuda.sgi.com with ESMTP id j8lLDH6x6hFmHnaO for ; Fri, 14 Aug 2015 16:12:23 -0700 (PDT) X-Barracuda-Envelope-From: lrhorer@mygrande.net X-Barracuda-Apparent-Source-IP: 66.90.130.120 Received: from [192.168.1.121] (66-90-232-145.dyn.grandenetworks.net [66.90.232.145]) (authenticated bits=0) by mail01.lsn.net (8.14.4/8.13.6) with ESMTP id t7ENCDhl019925 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 14 Aug 2015 18:12:14 -0500 X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.98.4 at av02.lsn.net Message-ID: <55CE75CA.5070506@mygrande.net> Date: Fri, 14 Aug 2015 18:12:10 -0500 From: Leslie Rhorer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: Brian Foster , Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <20150814012635.GT3902@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail01.lsn.net[66.90.130.120] X-Barracuda-Start-Time: 1439593943 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21606 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- OK, try http://fletchergeek.com/images/md0.metadump.gz. It's only about 18M. On 8/13/2015 8:26 PM, Dave Chinner wrote: > On Thu, Aug 13, 2015 at 01:21:16AM -0500, Leslie Rhorer wrote: >> The compressed tarball containing the dump file and the image are >> on my web site. >> >> http://fletchergeek.com/images/metadump.tar.gz >> >> It's 22G in size. > > I only want the metadump image right now. Can you please put that up > as a separate compressed file so i don't have to blow 25% of my > monthly download quota and a day downloading that tarball just to > get it? > > Cheers, > > Dave. > From darrick.wong@oracle.com Fri Aug 14 20:43:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 24A0D7F37 for ; Fri, 14 Aug 2015 20:43:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA1218F8033 for ; Fri, 14 Aug 2015 18:43:43 -0700 (PDT) X-ASG-Debug-ID: 1439603022-04cbb078e206860001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id EUz80Pe2D5s6zzNy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:43:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1heg8023335 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:43:40 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hdUI022997 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:43:40 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hdQr032120; Sat, 15 Aug 2015 01:43:39 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:43:39 -0700 Subject: [PATCH 00/10] xfsprogs August 2015 patchbomb From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 00/10] xfsprogs August 2015 patchbomb To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:43:38 -0700 Message-ID: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603022 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is a rollup of various fixes for xfsprogs 4.2.0-rc1. The first patch fixes the dir3 data block verifier to use the standard read verifiers during readahead. Just a resync with the kernel, since nothing in xfsprogs uses libxfs readahead. The second patch fixes xfs_db's inode command not to crash when the user tries to navigate to a corrupt inode. The third patch fixes a bug in xfs_repair wherein if xfs_repair fixes a broken xattr block and later decides to unmap the block, the "repaired" flag inadvertently prohibits the unmapping of that block. The fourth patch fixes sign handling mistakes when dealing with the b_error field in a xfs_buf -- error values in this field are negative, so all checks and assignments must be as well. The fifth patch forces prefetch to mark corrupt bmbt blocks UNCHECKED so that the regular bmbt examination will fix the bad CRC if it doesn't take any other action against the block. Without this, a corruption in the unused area will trigger a kernel error yet never get fixed by repair. The sixth patch fixes an obscure problem in xfs_repair -- when prefetch is enabled and there exists a directory with multiple corrupted blocks, it's possible that both corrupt blocks will be read in and marked UNCHECKED. If either the first corrupt block is so badly damaged so as to cause the directory to be erased, or if the second corrupt block is an index block (which is automatically unmapped when the directory is rebuilt), the second block's buffer will remain UNCHECKED. If the block is then allocated to something else (say lost+found), the next readbuf of the block will fail because nobody clears UNCHECKED and CRCs are only set during writebufr, which only happens when repair finishes its examination. Patch 7 implements a 'reflink' and 'dedupe' command in xfs_io. This will be used in future xfstests to test reflink and dedupe features of btrfs and xfs filesystems. Patch 8 fixes xfs_db/blocktrash to not fail write verification when corrupting a block and allows trashing of log and symlink blocks. Patch 9 enhances the blocktrash command with a '-z' option that trashes the block at the top of the cursor stack and doesn't require blockget to have been run. Patch 10 implements blockget for v5 filesystems. This is a second try at a previous patch which didn't quite catch all the new magic numbers and had some problems iterating directory index data. I've tested these xfsprogs changes against the for-next branch as of 8/03. The rmap/reflink patches will be dealt with separately. Scary rewound github repo with everything attached: https://github.com/djwong/xfsprogs Comments and questions are, as always, welcome. --D From darrick.wong@oracle.com Fri Aug 14 20:43:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 935F47F50 for ; Fri, 14 Aug 2015 20:43:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62207304051 for ; Fri, 14 Aug 2015 18:43:53 -0700 (PDT) X-ASG-Debug-ID: 1439603028-04bdf051fc06c00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id OBHY0vUIIrPvzA53 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:43:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1hlYq023370 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:43:48 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hlg9016717 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:43:47 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hkj2026510; Sat, 15 Aug 2015 01:43:46 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:43:46 -0700 Subject: [PATCH 01/10] libxfs: readahead of dir3 data blocks should use the read verifier From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/10] libxfs: readahead of dir3 data blocks should use the read verifier To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:43:44 -0700 Message-ID: <20150815014344.1839.12045.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603029 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines In the dir3 data block readahead function, use the regular read verifier to check the block's CRC and spot-check the block contents instead of calling the spot-checking routine directly. This prevents corrupted directory data blocks from being read into the kernel, which can lead to garbage ls output and directory loops (if say one of the entries contains invalid characters). Signed-off-by: Darrick J. Wong --- libxfs/xfs_dir2_data.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index c475ba8..466e096 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -250,7 +250,8 @@ xfs_dir3_data_reada_verify( return; case cpu_to_be32(XFS_DIR2_DATA_MAGIC): case cpu_to_be32(XFS_DIR3_DATA_MAGIC): - xfs_dir3_data_verify(bp); + bp->b_ops = &xfs_dir3_block_buf_ops; + bp->b_ops->verify_read(bp); return; default: xfs_buf_ioerror(bp, -EFSCORRUPTED); From darrick.wong@oracle.com Fri Aug 14 20:43:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 899F27F37 for ; Fri, 14 Aug 2015 20:43:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A13A8F8035 for ; Fri, 14 Aug 2015 18:43:58 -0700 (PDT) X-ASG-Debug-ID: 1439603036-04cb6c594706890001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Coh5llqlgvGzi0qG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:43:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1hrk0006160 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:43:54 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hrDm023104 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:43:53 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hrWY026573; Sat, 15 Aug 2015 01:43:53 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:43:52 -0700 Subject: [PATCH 02/10] xfs_db: don't crash on a corrupt inode From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/10] xfs_db: don't crash on a corrupt inode To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:43:51 -0700 Message-ID: <20150815014351.1839.81382.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603036 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the user selects a corrupt inode via the 'inode XXX' command, the read verifier will fail and the io cursor at the top of the ring will not have any data attached. When this is the case, we cannot dereference the NULL pointer or xfs_db will crash. Therefore, check the buffer pointer before using it. It's arguable that we ought to retry the read without the verifiers if the inode is corrupt or fails CRC, since this /is/ a debugging tool, and maybe you wanted the contents anyway. Signed-off-by: Darrick J. Wong --- db/inode.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/inode.c b/db/inode.c index e86dabd..64b263b 100644 --- a/db/inode.c +++ b/db/inode.c @@ -682,6 +682,8 @@ set_cur_inode( set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, cluster_agbno), numblks, DB_RING_IGN, NULL); off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); + if (!iocur_top->data) + return; dip = iocur_top->data; iocur_top->ino_buf = 1; iocur_top->ino = ino; From darrick.wong@oracle.com Fri Aug 14 20:44:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E1A9A7F37 for ; Fri, 14 Aug 2015 20:44:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C38AB304043 for ; Fri, 14 Aug 2015 18:44:08 -0700 (PDT) X-ASG-Debug-ID: 1439603047-04cbb078e306890001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id pX9uaqyNVxNDB4iK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:07 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1i6GA006496 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:06 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1i54V023585 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:06 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1i5t4012123; Sat, 15 Aug 2015 01:44:05 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:05 -0700 Subject: [PATCH 04/10] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with buffer errors From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/10] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with buffer errors To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:04 -0700 Message-ID: <20150815014404.1839.75324.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603047 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we encounter CRC or verifier errors, bp->b_error is set to -EFSBADCRC and -EFSCORRUPTED; note the negative sign. For whatever reason, repair and db use the positive versions, and therefore fail to notice the error, so fix all the broken uses. Note however that the db and repair turn the negative codes returned by libxfs into positive codes that can be used with strerror. Signed-off-by: Darrick J. Wong --- db/attr.c | 4 ++-- db/dir2.c | 4 ++-- db/io.c | 4 ++-- db/io.h | 2 +- repair/dir2.c | 2 +- repair/scan.c | 12 ++++++------ 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/db/attr.c b/db/attr.c index 897834b..5e69100 100644 --- a/db/attr.c +++ b/db/attr.c @@ -554,7 +554,7 @@ xfs_attr3_db_read_verify( break; default: dbprintf(_("Unknown attribute buffer type!\n")); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_buf_ioerror(bp, -EFSCORRUPTED); return; } verify: @@ -566,7 +566,7 @@ xfs_attr3_db_write_verify( struct xfs_buf *bp) { dbprintf(_("Writing unknown attribute buffer type!\n")); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_buf_ioerror(bp, -EFSCORRUPTED); } const struct xfs_buf_ops xfs_attr3_db_buf_ops = { diff --git a/db/dir2.c b/db/dir2.c index 7f69e6f..cc76662 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -1021,7 +1021,7 @@ xfs_dir3_db_read_verify( break; default: dbprintf(_("Unknown directory buffer type!\n")); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_buf_ioerror(bp, -EFSCORRUPTED); return; } verify: @@ -1033,7 +1033,7 @@ xfs_dir3_db_write_verify( struct xfs_buf *bp) { dbprintf(_("Writing unknown directory buffer type!\n")); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_buf_ioerror(bp, -EFSCORRUPTED); } const struct xfs_buf_ops xfs_dir3_db_buf_ops = { diff --git a/db/io.c b/db/io.c index 9fa52b8..9452e07 100644 --- a/db/io.c +++ b/db/io.c @@ -535,8 +535,8 @@ set_cur( * Keep the buffer even if the verifier says it is corrupted. * We're a diagnostic tool, after all. */ - if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED && - bp->b_error != EFSBADCRC)) + if (!bp || (bp->b_error && bp->b_error != -EFSCORRUPTED && + bp->b_error != -EFSBADCRC)) return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; diff --git a/db/io.h b/db/io.h index 31d96b4..6201d7b 100644 --- a/db/io.h +++ b/db/io.h @@ -75,6 +75,6 @@ iocur_crc_valid() return -1; if (iocur_top->bp->b_flags & LIBXFS_B_UNCHECKED) return -1; - return (iocur_top->bp->b_error != EFSBADCRC && + return (iocur_top->bp->b_error != -EFSBADCRC && (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } diff --git a/repair/dir2.c b/repair/dir2.c index 187e069..a5646f8 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -199,7 +199,7 @@ _("bad dir magic number 0x%x in inode %" PRIu64 " bno = %u\n"), goto error_out; } /* corrupt node; rebuild the dir. */ - if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) { do_warn( _("corrupt tree block %u for directory inode %" PRIu64 "\n"), bno, da_cursor->ino); diff --git a/repair/scan.c b/repair/scan.c index 58f45eb..1e7a4da 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -82,7 +82,7 @@ scan_sbtree( do_error(_("can't read btree block %d/%d\n"), agno, root); return; } - if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) { do_warn(_("btree block %d/%d is suspect, error %d\n"), agno, root, bp->b_error); suspect = 1; @@ -145,7 +145,7 @@ scan_lbtree( * is a corruption or not and whether it got corrected and so needs * writing back. CRC errors always imply we need to write the block. */ - if (bp->b_error == EFSBADCRC) { + if (bp->b_error == -EFSBADCRC) { do_warn(_("btree block %d/%d is suspect, error %d\n"), XFS_FSB_TO_AGNO(mp, root), XFS_FSB_TO_AGBNO(mp, root), bp->b_error); @@ -1432,7 +1432,7 @@ scan_freelist( do_abort(_("can't read agfl block for ag %d\n"), agno); return; } - if (agflbuf->b_error == EFSBADCRC) + if (agflbuf->b_error == -EFSBADCRC) do_warn(_("agfl has bad CRC for ag %d\n"), agno); freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); @@ -1705,9 +1705,9 @@ scan_ag( * immediately, though. */ if (!no_modify) { - agi_dirty += (agibuf->b_error == EFSBADCRC); - agf_dirty += (agfbuf->b_error == EFSBADCRC); - sb_dirty += (sbbuf->b_error == EFSBADCRC); + agi_dirty += (agibuf->b_error == -EFSBADCRC); + agf_dirty += (agfbuf->b_error == -EFSBADCRC); + sb_dirty += (sbbuf->b_error == -EFSBADCRC); } if (agi_dirty && !no_modify) From darrick.wong@oracle.com Fri Aug 14 20:44:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76F067F37 for ; Fri, 14 Aug 2015 20:44:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB59EAC003 for ; Fri, 14 Aug 2015 18:44:06 -0700 (PDT) X-ASG-Debug-ID: 1439603045-04cb6c594506890001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id oBEQJTTSz3Piuqlp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1i09W023452 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:00 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1i04I023245 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:00 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1hxb0026597; Sat, 15 Aug 2015 01:43:59 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:43:59 -0700 Subject: [PATCH 03/10] xfs_repair: ignore "repaired" flag after we decide to clear xattr block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/10] xfs_repair: ignore "repaired" flag after we decide to clear xattr block To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:43:58 -0700 Message-ID: <20150815014357.1839.68720.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603045 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If in the course of examining extended attribute block contents we first decide to repair an entry (*repair = 1) but secondly decide to clear the whole block, set *repair = 0 because the clearing action only happens if *repair == 0. Put another way, if we're nuking a block, don't pretend like we've fixed it too. Signed-off-by: Darrick J. Wong --- repair/attr_repair.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 62f80e7..2bd9334 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -1311,6 +1311,13 @@ process_leaf_attr_block( * we can add it then. */ } + /* + * If we're just going to zap the block, don't pretend like we + * repaired it, because repairing the block stops the clear + * operation. + */ + if (clearit) + *repair = 0; if (*repair) xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, leaf, &leafhdr); @@ -1524,6 +1531,7 @@ process_longform_attr( xfs_dahash_t next_hashval; int repairlinks = 0; struct xfs_attr3_icleaf_hdr leafhdr; + int error; *repair = 0; @@ -1604,12 +1612,16 @@ process_longform_attr( libxfs_writebuf(bp, 0); } else libxfs_putbuf(bp); - return (process_node_attr(mp, ino, dip, blkmap)); /* + repair */ + error = process_node_attr(mp, ino, dip, blkmap); /* + repair */ + if (error) + *repair = 0; + return error; default: do_warn( _("bad attribute leaf magic # %#x for dir ino %" PRIu64 "\n"), be16_to_cpu(leaf->hdr.info.magic), ino); libxfs_putbuf(bp); + *repair = 0; return(1); } From darrick.wong@oracle.com Fri Aug 14 20:44:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 83D567F37 for ; Fri, 14 Aug 2015 20:44:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D5CDAC006 for ; Fri, 14 Aug 2015 18:44:19 -0700 (PDT) X-ASG-Debug-ID: 1439603058-04cbb078e4068b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9hV676hCE9VtdSUs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1iCT4023797 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:12 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iCgf002668 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:12 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iBlB012181; Sat, 15 Aug 2015 01:44:12 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:11 -0700 Subject: [PATCH 05/10] xfs_repair: force not-so-bad bmbt blocks back through the verifier From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/10] xfs_repair: force not-so-bad bmbt blocks back through the verifier To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:10 -0700 Message-ID: <20150815014410.1839.33268.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603058 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If during prefetch we encounter a bmbt block that fails the CRC check due to corruption in the unused part of the block, force the buffer back through the non-prefetch verifiers later so that the CRC is updated. Otherwise, the bad checksum goes unfixed and the kernel will still flag the bmbt block as invalid. Signed-off-by: Darrick J. Wong --- repair/prefetch.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/repair/prefetch.c b/repair/prefetch.c index 8b261ae..fc7097f 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -276,6 +276,14 @@ pf_scan_lbtree( XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); + /* + * Make this bmbt buffer go back through the verifiers later so that + * we correct checksum errors stemming from bitflips in the unused + * parts of the bmbt block. + */ + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) + bp->b_flags |= LIBXFS_B_UNCHECKED; + rc = (*func)(XFS_BUF_TO_BLOCK(bp), level - 1, isadir, args); libxfs_putbuf(bp); From darrick.wong@oracle.com Fri Aug 14 20:44:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 62DD37F66 for ; Fri, 14 Aug 2015 20:44:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E7D4AAC003 for ; Fri, 14 Aug 2015 18:44:21 -0700 (PDT) X-ASG-Debug-ID: 1439603060-04bdf051fb06c20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id rM13EKGgWhOH738r (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1iIRo006632 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:19 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iIT3023919 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:18 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iImV018264; Sat, 15 Aug 2015 01:44:18 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:18 -0700 Subject: [PATCH 06/10] xfs_repair: mark unreachable prefetched metadata blocks stale From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/10] xfs_repair: mark unreachable prefetched metadata blocks stale To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:17 -0700 Message-ID: <20150815014416.1839.40518.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603060 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're running xfs_repair with prefetch enabled, it's possible that repair will decide to clear an inode without examining all metadata blocks owned by that inode. This leaves the unreferenced prefetched buffers marked UNCHECKED, which will cause a subsequent CRC error if the block is reallocated to a different structure and read more than once. Typically this happens when a large directory is corrupted and lost+found has to grow to accomodate all the disconnected inodes. Therefore, clear the UNCHECKED flag and set the STALE flag to get rid of the CRC errors and ensure that the blocks aren't written back out to disk without first being marked dirty. Signed-off-by: Darrick J. Wong --- repair/phase4.c | 5 +++++ repair/phase6.c | 4 ++++ repair/scan.c | 36 ++++++++++++++++++++++++++++++++++++ repair/scan.h | 2 ++ 4 files changed, 47 insertions(+) diff --git a/repair/phase4.c b/repair/phase4.c index e0571e8..13b2946 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -30,6 +30,7 @@ #include "versions.h" #include "dir2.h" #include "progress.h" +#include "scan.h" /* @@ -300,6 +301,10 @@ phase4(xfs_mount_t *mp) * already in phase 3. */ process_ags(mp); + + /* Mark stale anything we didn't get to. */ + mark_unchecked_buffers_stale(); + print_final_rpt(); /* diff --git a/repair/phase6.c b/repair/phase6.c index 467f119..5edaa30 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -29,6 +29,7 @@ #include "dinode.h" #include "progress.h" #include "versions.h" +#include "scan.h" static struct cred zerocr; static struct fsxattr zerofsx; @@ -3312,6 +3313,9 @@ _(" - resetting contents of realtime bitmap and summary inodes\n")); */ traverse_ags(mp); + /* Mark stale anything we didn't get to. */ + mark_unchecked_buffers_stale(); + /* * any directories that had updated ".." entries, rebuild them now */ diff --git a/repair/scan.c b/repair/scan.c index 1e7a4da..431fd24 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -29,6 +29,7 @@ #include "bmap.h" #include "progress.h" #include "threads.h" +#include "cache.h" static xfs_mount_t *mp = NULL; @@ -1804,3 +1805,38 @@ scan_ags( } } +static void +mark_buf_stale( + struct cache_node *cn) +{ + struct xfs_buf *bp = (struct xfs_buf *)cn; + + if (bp->b_flags & LIBXFS_B_UNCHECKED) { + bp->b_flags &= ~LIBXFS_B_UNCHECKED; + bp->b_flags |= LIBXFS_B_STALE; + } +} + +/* + * Find unchecked buffers and mark them checked and stale. + * + * When prefetch is enabled, buffers will be marked unchecked if they fail + * verification. Actually examining the block clears the unchecked flag, so + * any buffer still unchecked at the end of the examination represents an + * unreachable block. A block that was reachable during prefetch but isn't + * by the end of the examination was owned by something that was freed as + * part of the exam. Therefore, the buffer can be considered free. Therefore, + * set the stale flag so that getbuf and readbuf know to zero the buffer + * contents the next time the buffer is accessed. + * + * This also fixes the problem that repair reports CRC errors if the block is + * subsequently allocated to something else, reinitialized, and re-read. This + * can happen if a directory with a corrupt dir3 leaf block is erased and the + * leaf block gets reused to grow lost+found during phase 7. + */ +void +mark_unchecked_buffers_stale(void) +{ + cache_walk(libxfs_bcache, mark_buf_stale); +} + diff --git a/repair/scan.h b/repair/scan.h index ea8c0bf..d232a54 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -70,4 +70,6 @@ scan_ags( struct xfs_mount *mp, int scan_threads); +void mark_unchecked_buffers_stale(void); + #endif /* _XR_SCAN_H */ From darrick.wong@oracle.com Fri Aug 14 20:44:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BE5F27F61 for ; Fri, 14 Aug 2015 20:44:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 679B1304043 for ; Fri, 14 Aug 2015 18:44:33 -0700 (PDT) X-ASG-Debug-ID: 1439603070-04bdf051fb06c40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id F1bJ4M7KZirgJ6oS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1iPaY023857 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:25 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iOEv024388 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:25 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iOkk012236; Sat, 15 Aug 2015 01:44:24 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:24 -0700 Subject: [PATCH 07/10] xfs_io: support reflinking and deduping file ranges From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/10] xfs_io: support reflinking and deduping file ranges To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:23 -0700 Message-ID: <20150815014423.1839.45779.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603070 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Wire up xfs_io to use the XFS range clone and dedupe ioctls to make files share data blocks. Signed-off-by: Darrick J. Wong --- io/Makefile | 2 - io/dedupe.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++ io/init.c | 2 + io/io.h | 3 + io/reflink.c | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_fs.h | 36 ++++++++++ man/man8/xfs_io.8 | 67 +++++++++++++++++++ 7 files changed, 479 insertions(+), 1 deletion(-) create mode 100644 io/dedupe.c create mode 100644 io/reflink.c diff --git a/io/Makefile b/io/Makefile index a08a782..6c4810e 100644 --- a/io/Makefile +++ b/io/Makefile @@ -11,7 +11,7 @@ HFILES = init.h io.h CFILES = init.c \ attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c link.c \ mmap.c open.c parent.c pread.c prealloc.c pwrite.c seek.c shutdown.c \ - sync.c truncate.c + sync.c truncate.c reflink.c dedupe.c LLDLIBS = $(LIBXCMD) $(LIBHANDLE) LTDEPENDENCIES = $(LIBXCMD) $(LIBHANDLE) diff --git a/io/dedupe.c b/io/dedupe.c new file mode 100644 index 0000000..59c3d0f --- /dev/null +++ b/io/dedupe.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2015 Oracle, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "command.h" +#include "input.h" +#include "init.h" +#include "io.h" + +static cmdinfo_t dedupe_cmd; + +static void +dedupe_help(void) +{ + printf(_( +"\n" +" Links a range of bytes (in block size increments) from a file into a range \n" +" of bytes in the open file. The contents of both file ranges must match.\n" +"\n" +" Example:\n" +" 'dedupe some_file 0 4096 32768' - links 32768 bytes from some_file at \n" +" offset 0 to into the open file at \n" +" position 4096\n" +"\n" +" Reflink a range of blocks from a given input file to the open file. Both\n" +" files share the same range of physical disk blocks; a write to the shared\n" +" range of either file should result in the write landing in a new block and\n" +" that range of the file being remapped (i.e. copy-on-write). Both files\n" +" must reside on the same filesystem, and the contents of both ranges must\n" +" match.\n" +" -w -- call fdatasync(2) at the end (included in timing results)\n" +" -W -- call fsync(2) at the end (included in timing results)\n" +"\n")); +} + +static int +dedupe_f( + int argc, + char **argv) +{ + off64_t soffset, doffset; + long long count, total; + char s1[64], s2[64], ts[64]; + char *infile; + int Cflag, qflag, wflag, Wflag; + struct xfs_ioctl_file_extent_same_args *args = NULL; + struct xfs_ioctl_file_extent_same_info *info; + size_t fsblocksize, fssectsize; + struct timeval t1, t2; + int c, fd = -1; + + Cflag = qflag = wflag = Wflag = 0; + init_cvtnum(&fsblocksize, &fssectsize); + + while ((c = getopt(argc, argv, "CqwW")) != EOF) { + switch (c) { + case 'C': + Cflag = 1; + break; + case 'q': + qflag = 1; + break; + case 'w': + wflag = 1; + break; + case 'W': + Wflag = 1; + break; + default: + return command_usage(&dedupe_cmd); + } + } + if (optind != argc - 4) + return command_usage(&dedupe_cmd); + infile = argv[optind]; + optind++; + soffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (soffset < 0) { + printf(_("non-numeric src offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + doffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (doffset < 0) { + printf(_("non-numeric dest offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + count = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (count < 1) { + printf(_("non-positive length argument -- %s\n"), argv[optind]); + return 0; + } + + c = IO_READONLY; + fd = openfile(infile, NULL, c, 0); + if (fd < 0) + return 0; + + gettimeofday(&t1, NULL); + args = calloc(1, sizeof(struct xfs_ioctl_file_extent_same_args) + + sizeof(struct xfs_ioctl_file_extent_same_info)); + if (!args) + goto done; + info = (struct xfs_ioctl_file_extent_same_info *)(args + 1); + args->logical_offset = soffset; + args->length = count; + args->dest_count = 1; + info->fd = file->fd; + info->logical_offset = doffset; + do { + c = ioctl(fd, XFS_IOC_FILE_EXTENT_SAME, args); + if (c) + break; + args->logical_offset += info->bytes_deduped; + info->logical_offset += info->bytes_deduped; + args->length -= info->bytes_deduped; + } while (c == 0 && info->status == 0 && info->bytes_deduped > 0); + if (c) + perror(_("dedupe ioctl")); + if (info->status < 0) + printf("dedupe: %s\n", _(strerror(-info->status))); + if (info->status == XFS_SAME_DATA_DIFFERS) + printf(_("Extents did not match.\n")); + if (c != 0 || info->status != 0) + goto done; + total = info->bytes_deduped; + c = 1; + if (Wflag) + fsync(file->fd); + if (wflag) + fdatasync(file->fd); + if (qflag) + goto done; + gettimeofday(&t2, NULL); + t2 = tsub(t2, t1); + + /* Finally, report back -- -C gives a parsable format */ + timestr(&t2, ts, sizeof(ts), Cflag ? VERBOSE_FIXED_TIME : 0); + if (!Cflag) { + cvtstr((double)total, s1, sizeof(s1)); + cvtstr(tdiv((double)total, t2), s2, sizeof(s2)); + printf(_("linked %lld/%lld bytes at offset %lld\n"), + total, count, (long long)doffset); + printf(_("%s, %d ops; %s (%s/sec and %.4f ops/sec)\n"), + s1, c, ts, s2, tdiv((double)c, t2)); + } else {/* bytes,ops,time,bytes/sec,ops/sec */ + printf("%lld,%d,%s,%.3f,%.3f\n", + total, c, ts, + tdiv((double)total, t2), tdiv((double)c, t2)); + } +done: + free(args); + close(fd); + return 0; +} + +void +dedupe_init(void) +{ + dedupe_cmd.name = "dedupe"; + dedupe_cmd.altname = "dd"; + dedupe_cmd.cfunc = dedupe_f; + dedupe_cmd.argmin = 4; + dedupe_cmd.argmax = -1; + dedupe_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + dedupe_cmd.args = +_("infile src_off dst_off len"); + dedupe_cmd.oneline = + _("dedupes a number of bytes at a specified offset"); + dedupe_cmd.help = dedupe_help; + + add_command(&dedupe_cmd); +} diff --git a/io/init.c b/io/init.c index 13f35c4..739371e 100644 --- a/io/init.c +++ b/io/init.c @@ -83,6 +83,8 @@ init_commands(void) sync_init(); sync_range_init(); truncate_init(); + reflink_init(); + dedupe_init(); } static int diff --git a/io/io.h b/io/io.h index b115e4a..ec8a530 100644 --- a/io/io.h +++ b/io/io.h @@ -161,3 +161,6 @@ extern void readdir_init(void); #else #define readdir_init() do { } while (0) #endif + +extern void reflink_init(void); +extern void dedupe_init(void); diff --git a/io/reflink.c b/io/reflink.c new file mode 100644 index 0000000..fc2d2b9 --- /dev/null +++ b/io/reflink.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2015 Oracle, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "command.h" +#include "input.h" +#include "init.h" +#include "io.h" + +static cmdinfo_t reflink_cmd; + +static void +reflink_help(void) +{ + printf(_( +"\n" +" Links a range of bytes (in block size increments) from a file into a range \n" +" of bytes in the open file. The two extent ranges need not contain identical\n" +" data. \n" +"\n" +" Example:\n" +" 'reflink some_file 0 4096 32768' - links 32768 bytes from some_file at \n" +" offset 0 to into the open file at \n" +" position 4096\n" +" 'reflink some_file' - links all bytes from some_file into the open file\n" +" at position 0\n" +"\n" +" Reflink a range of blocks from a given input file to the open file. Both\n" +" files share the same range of physical disk blocks; a write to the shared\n" +" range of either file should result in the write landing in a new block and\n" +" that range of the file being remapped (i.e. copy-on-write). Both files\n" +" must reside on the same filesystem.\n" +" -w -- call fdatasync(2) at the end (included in timing results)\n" +" -W -- call fsync(2) at the end (included in timing results)\n" +"\n")); +} + +static int +reflink_f( + int argc, + char **argv) +{ + off64_t soffset, doffset; + long long count = 0, total; + char s1[64], s2[64], ts[64]; + char *infile = NULL; + int Cflag, qflag, wflag, Wflag; + struct xfs_ioctl_clone_range_args args; + size_t fsblocksize, fssectsize; + struct timeval t1, t2; + int c, fd = -1; + + Cflag = qflag = wflag = Wflag = 0; + init_cvtnum(&fsblocksize, &fssectsize); + + while ((c = getopt(argc, argv, "CqwW")) != EOF) { + switch (c) { + case 'C': + Cflag = 1; + break; + case 'q': + qflag = 1; + break; + case 'w': + wflag = 1; + break; + case 'W': + Wflag = 1; + break; + default: + return command_usage(&reflink_cmd); + } + } + if (optind != argc - 4 && optind != argc - 1) + return command_usage(&reflink_cmd); + infile = argv[optind]; + optind++; + if (optind == argc) + goto clone_all; + soffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (soffset < 0) { + printf(_("non-numeric src offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + doffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (doffset < 0) { + printf(_("non-numeric dest offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + count = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (count < 1) { + printf(_("non-positive length argument -- %s\n"), argv[optind]); + return 0; + } + +clone_all: + c = IO_READONLY; + fd = openfile(infile, NULL, c, 0); + if (fd < 0) + return 0; + + gettimeofday(&t1, NULL); + if (count) { + args.src_fd = fd; + args.src_offset = soffset; + args.src_length = count; + args.dest_offset = doffset; + c = ioctl(file->fd, XFS_IOC_CLONE_RANGE, &args); + } else { + c = ioctl(file->fd, XFS_IOC_CLONE, fd); + } + if (c < 0) { + perror(_("reflink")); + goto done; + } + total = count; + c = 1; + if (Wflag) + fsync(file->fd); + if (wflag) + fdatasync(file->fd); + if (qflag) + goto done; + gettimeofday(&t2, NULL); + t2 = tsub(t2, t1); + + /* Finally, report back -- -C gives a parsable format */ + timestr(&t2, ts, sizeof(ts), Cflag ? VERBOSE_FIXED_TIME : 0); + if (!Cflag) { + cvtstr((double)total, s1, sizeof(s1)); + cvtstr(tdiv((double)total, t2), s2, sizeof(s2)); + printf(_("linked %lld/%lld bytes at offset %lld\n"), + total, count, (long long)doffset); + printf(_("%s, %d ops; %s (%s/sec and %.4f ops/sec)\n"), + s1, c, ts, s2, tdiv((double)c, t2)); + } else {/* bytes,ops,time,bytes/sec,ops/sec */ + printf("%lld,%d,%s,%.3f,%.3f\n", + total, c, ts, + tdiv((double)total, t2), tdiv((double)c, t2)); + } +done: + close(fd); + return 0; +} + +void +reflink_init(void) +{ + reflink_cmd.name = "reflink"; + reflink_cmd.altname = "rl"; + reflink_cmd.cfunc = reflink_f; + reflink_cmd.argmin = 4; + reflink_cmd.argmax = -1; + reflink_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + reflink_cmd.args = +_("infile src_off dst_off len"); + reflink_cmd.oneline = + _("reflinks a number of bytes at a specified offset"); + reflink_cmd.help = reflink_help; + + add_command(&reflink_cmd); +} diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 89689c6..0c922ad 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -559,6 +559,42 @@ typedef struct xfs_swapext #define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ +/* reflink ioctls; these MUST match the btrfs ioctl definitions */ +struct xfs_ioctl_clone_range_args { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +#define XFS_SAME_DATA_DIFFERS 1 +/* For extent-same ioctl */ +struct xfs_ioctl_file_extent_same_info { + __s64 fd; /* in - destination file */ + __u64 logical_offset; /* in - start of extent in destination */ + __u64 bytes_deduped; /* out - total # of bytes we were able + * to dedupe from this file */ + /* status of this dedupe operation: + * 0 if dedup succeeds + * < 0 for error + * == XFS_SAME_DATA_DIFFERS if data differs + */ + __s32 status; /* out - see above description */ + __u32 reserved; +}; + +struct xfs_ioctl_file_extent_same_args { + __u64 logical_offset; /* in - start of extent in source */ + __u64 length; /* in - length of extent */ + __u16 dest_count; /* in - total elements in info array */ + __u16 reserved1; + __u32 reserved2; + struct xfs_ioctl_file_extent_same_info info[0]; +}; + +#define XFS_IOC_CLONE _IOW (0x94, 9, int) +#define XFS_IOC_CLONE_RANGE _IOW (0x94, 13, struct xfs_ioctl_clone_range_args) +#define XFS_IOC_FILE_EXTENT_SAME _IOWR(0x94, 54, struct xfs_ioctl_file_extent_same_args) #ifndef HAVE_BBMACROS /* diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 416206f..305335c 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -490,6 +490,73 @@ Recursively display all the specified segments starting at the specified .B \-s Display the starting lseek(2) offset. This offset will be a calculated value when both data and holes are displayed together or performing a recusively display. +.RE +.PD +.TP +.TP +.BI "reflink [ \-w ] [ \-W ] src_file [src_offset dst_offset length]" +On filesystems that support the +.B XFS_IOC_CLONE_RANGE +or +.B BTRFS_IOC_CLONE_RANGE +ioctls, map +.I length +bytes at offset +.I dst_offset +in the open file to the same physical blocks that are mapped at offset +.I src_offset +in the file +.I src_file +, replacing any contents that may already have been there. If a program +writes into a reflinked block range of either file, the dirty blocks will be +cloned, written to, and remapped ("copy on write") in the affected file, +leaving the other file(s) unchanged. If src_offset, dst_offset, and length +are omitted, all contents of src_file will be reflinked into the open file. +.RS 1.0i +.PD 0 +.TP 0.4i +.B \-w +Call +.BR fdatasync (2) +after executing the ioctl. +.TP +.B \-W +Call +.BR fsync (2) +after executing the command. +.RE +.PD +.TP +.TP +.BI "dedupe [ \-w ] [ \-W ] src_file src_offset dst_offset length" +On filesystems that support the +.B XFS_IOC_FILE_EXTENT_SAME +or +.B BTRFS_IOC_FILE_EXTENT_SAME +ioctls, map +.I length +bytes at offset +.I dst_offset +in the open file to the same physical blocks that are mapped at offset +.I src_offset +in the file +.I src_file +, but only if the contents of both ranges are identical. This is known as +block-based deduplication. If a program writes into a reflinked block range of +either file, the dirty blocks will be cloned, written to, and remapped ("copy +on write") in the affected file, leaving the other file(s) unchanged. +.RS 1.0i +.PD 0 +.TP 0.4i +.B \-w +Call +.BR fdatasync (2) +after executing the ioctl. +.TP +.B \-W +Call +.BR fsync (2) +after executing the command. .TP .SH MEMORY MAPPED I/O COMMANDS From darrick.wong@oracle.com Fri Aug 14 20:44:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CFAF67F62 for ; Fri, 14 Aug 2015 20:44:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41851AC006 for ; Fri, 14 Aug 2015 18:44:34 -0700 (PDT) X-ASG-Debug-ID: 1439603072-04cb6c5945068b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id fDlCO5ooZsXjmh1n (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:32 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1iV6O006709 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:31 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iV4w003218 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:31 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1iV1s032407; Sat, 15 Aug 2015 01:44:31 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:30 -0700 Subject: [PATCH 08/10] xfs_db: enable blocktrash for checksummed filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/10] xfs_db: enable blocktrash for checksummed filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:29 -0700 Message-ID: <20150815014429.1839.69933.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603072 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Disable the write verifiers when we're trashing a block. With this in place, create a xfs fuzzer script that formats, populates, corrupts, tries to use, repairs, and tries again to use a crash test xfs image. Hopefully this will shake out some v5 filesystem bugs. v2: Drop xfsfuzz, don't assume every block is an AGF when blocktrashing. Don't trash log blocks by default, because that skews the blocktrash heavily towards damaging only log blocks. Signed-off-by: Darrick J. Wong --- db/check.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/db/check.c b/db/check.c index afeea32..965d0f5 100644 --- a/db/check.c +++ b/db/check.c @@ -944,6 +944,7 @@ blocktrash_b( int mask; int newbit; int offset; + const struct xfs_buf_ops *stashed_ops; static char *modestr[] = { N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") }; @@ -952,8 +953,10 @@ blocktrash_b( offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); newbit = 0; push_cur(); - set_cur(&typtab[DBM_UNKNOWN], + set_cur(NULL, XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); + stashed_ops = iocur_top->bp->b_ops; + iocur_top->bp->b_ops = NULL; if ((buf = iocur_top->data) == NULL) { dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); pop_cur(); @@ -984,6 +987,7 @@ blocktrash_b( buf[byte] &= ~mask; } write_cur(); + iocur_top->bp->b_ops = stashed_ops; pop_cur(); printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), agno, agbno, typename[type], len, len == 1 ? "" : "s", @@ -1040,9 +1044,11 @@ blocktrash_f( (1 << DBM_BTINO) | (1 << DBM_DIR) | (1 << DBM_INODE) | + (1 << DBM_LOG) | (1 << DBM_QUOTA) | (1 << DBM_RTBITMAP) | (1 << DBM_RTSUM) | + (1 << DBM_SYMLINK) | (1 << DBM_SB); while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { switch (c) { @@ -1106,7 +1112,7 @@ blocktrash_f( return 0; } if (tmask == 0) - tmask = goodmask; + tmask = goodmask & ~((1 << DBM_LOG) | (1 << DBM_SB)); lentab = xmalloc(sizeof(ltab_t)); lentab->min = lentab->max = min; lentablen = 1; From darrick.wong@oracle.com Fri Aug 14 20:44:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C30217F3F for ; Fri, 14 Aug 2015 20:44:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 320E1AC003 for ; Fri, 14 Aug 2015 18:44:41 -0700 (PDT) X-ASG-Debug-ID: 1439603079-04cbb078e2068d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NUDjbnWiyNyiI9ME (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1icm7006776 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:38 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1ibN6018041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:38 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1ibHL018319; Sat, 15 Aug 2015 01:44:37 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:37 -0700 Subject: [PATCH 09/10] xfs_db: trash the block at the top of the cursor stack From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/10] xfs_db: trash the block at the top of the cursor stack To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:36 -0700 Message-ID: <20150815014436.1839.74362.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603079 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a new -z option to blocktrash to make it trash the block that's at the top of the stack, so that we can perform targeted fuzzing. While we're at it, prevent fuzzing off the end of the buffer and add a -o parameter so that we can specify an offset to start fuzzing from. Signed-off-by: Darrick J. Wong --- db/check.c | 81 +++++++++++++++++++++++++++++++++++++++++------------ man/man8/xfs_db.8 | 15 +++++++++- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/db/check.c b/db/check.c index 965d0f5..7c11b0b 100644 --- a/db/check.c +++ b/db/check.c @@ -930,8 +930,7 @@ typedef struct ltab { static void blocktrash_b( - xfs_agnumber_t agno, - xfs_agblock_t agbno, + int offset, dbm_t type, ltab_t *ltabp, int mode) @@ -943,23 +942,36 @@ blocktrash_b( int len; int mask; int newbit; - int offset; const struct xfs_buf_ops *stashed_ops; static char *modestr[] = { N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") }; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); + agbno = XFS_FSB_TO_AGBNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); + if (iocur_top->len == 0) { + dbprintf(_("zero-length block %u/%u buffer to trash??\n"), + agno, agbno); + return; + } len = (int)((random() % (ltabp->max - ltabp->min + 1)) + ltabp->min); - offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); + /* + * offset >= 0: start fuzzing at this exact offset. + * offset < 0: pick an offset at least as high at -(offset + 1). + */ + if (offset < 0) { + offset = -(offset + 1); + offset = offset + (int)(random() % (int)((iocur_top->len - offset) * NBBY)); + } + if (offset + len >= iocur_top->len * NBBY) + len = (iocur_top->len * NBBY) - offset; newbit = 0; - push_cur(); - set_cur(NULL, - XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); stashed_ops = iocur_top->bp->b_ops; iocur_top->bp->b_ops = NULL; if ((buf = iocur_top->data) == NULL) { dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); - pop_cur(); return; } for (bitno = 0; bitno < len; bitno++) { @@ -988,7 +1000,6 @@ blocktrash_b( } write_cur(); iocur_top->bp->b_ops = stashed_ops; - pop_cur(); printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), agno, agbno, typename[type], len, len == 1 ? "" : "s", offset / NBBY, offset % NBBY, modestr[mode]); @@ -1019,11 +1030,9 @@ blocktrash_f( uint seed; int sopt; int tmask; + bool this_block = false; + int offset = -1; - if (!dbmap) { - dbprintf(_("must run blockget first\n")); - return 0; - } optind = 0; count = 1; min = 1; @@ -1050,7 +1059,7 @@ blocktrash_f( (1 << DBM_RTSUM) | (1 << DBM_SYMLINK) | (1 << DBM_SB); - while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { + while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { switch (c) { case '0': mode = 0; @@ -1071,6 +1080,21 @@ blocktrash_f( return 0; } break; + case 'o': { + int relative = 0; + if (optarg[0] == '+') { + optarg++; + relative = 1; + } + offset = (int)strtol(optarg, &p, 0); + if (*p != '\0' || offset < 0) { + dbprintf(_("bad blocktrash offset %s\n"), optarg); + return 0; + } + if (relative) + offset = -offset - 1; + break; + } case 's': seed = (uint)strtoul(optarg, &p, 0); sopt = 1; @@ -1102,11 +1126,22 @@ blocktrash_f( return 0; } break; + case 'z': + this_block = true; + break; default: dbprintf(_("bad option for blocktrash command\n")); return 0; } } + if (!this_block && !dbmap) { + dbprintf(_("must run blockget first\n")); + return 0; + } + if (this_block && iocur_sp == 0) { + dbprintf(_("nothing on stack\n")); + return 0; + } if (min > max) { dbprintf(_("bad min/max for blocktrash command\n")); return 0; @@ -1125,6 +1160,14 @@ blocktrash_f( } else lentab[lentablen - 1].max = i; } + if (!sopt) + dbprintf(_("blocktrash: seed %u\n"), seed); + srandom(seed); + if (this_block) { + blocktrash_b(offset, DBM_UNKNOWN, &lentab[random() % lentablen], + mode); + goto out; + } for (blocks = 0, agno = 0; agno < mp->m_sb.sb_agcount; agno++) { for (agbno = 0, p = dbmap[agno]; agbno < mp->m_sb.sb_agblocks; @@ -1137,9 +1180,6 @@ blocktrash_f( dbprintf(_("blocktrash: no matching blocks\n")); goto out; } - if (!sopt) - dbprintf(_("blocktrash: seed %u\n"), seed); - srandom(seed); for (i = 0; i < count; i++) { randb = (xfs_rfsblock_t)((((__int64_t)random() << 32) | random()) % blocks); @@ -1153,8 +1193,13 @@ blocktrash_f( continue; if (bi++ < randb) continue; - blocktrash_b(agno, agbno, (dbm_t)*p, + push_cur(); + set_cur(NULL, + XFS_AGB_TO_DADDR(mp, agno, agbno), + blkbb, DB_RING_IGN, NULL); + blocktrash_b(offset, (dbm_t)*p, &lentab[random() % lentablen], mode); + pop_cur(); done = 1; break; } diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index df54bb7..681efc4 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -232,7 +232,7 @@ enables verbose output. Messages will be printed for every block and inode processed. .RE .TP -.BI "blocktrash [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." +.BI "blocktrash [-z] [\-o " offset "] [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." Trash randomly selected filesystem metadata blocks. Trashing occurs to randomly selected bits in the chosen blocks. This command is available only in debugging versions of @@ -259,6 +259,13 @@ supplies the .I count of block-trashings to perform (default 1). .TP +.B \-o +supplies the bit +.I offset +at which to start trashing the block. If the value is preceded by a '+', the +trashing will start at a randomly chosen offset that is larger than the value +supplied. The default is to randomly choose an offset anywhere in the block. +.TP .B \-s supplies a .I seed @@ -282,6 +289,12 @@ size of bit range to be trashed. The default value is 1. sets the .I maximum size of bit range to be trashed. The default value is 1024. +.TP +.B \-z +trashes the block at the top of the stack. It is not necessary to +run +.BI blockget +if this option is supplied. .RE .TP .BI "blockuse [\-n] [\-c " count ] From darrick.wong@oracle.com Fri Aug 14 20:44:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 95AB07F4E for ; Fri, 14 Aug 2015 20:44:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4AD238F8035 for ; Fri, 14 Aug 2015 18:44:47 -0700 (PDT) X-ASG-Debug-ID: 1439603084-04bdf051f906c50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1SCsz0BvWF0sQ6Nx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:44:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1iitd006846 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:44:44 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1ihNG003512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:44:44 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1ihsO032451; Sat, 15 Aug 2015 01:44:43 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:44:43 -0700 Subject: [PATCH 10/10] xfs_db: enable blockget for v5 filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/10] xfs_db: enable blockget for v5 filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:44:42 -0700 Message-ID: <20150815014442.1839.74817.stgit@birch.djwong.org> In-Reply-To: <20150815014338.1839.37405.stgit@birch.djwong.org> References: <20150815014338.1839.37405.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603085 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the necessary magic number checks and other fixups required to handle v5 filesystems. Signed-off-by: Darrick J. Wong --- db/check.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- db/type.c | 2 + 2 files changed, 214 insertions(+), 26 deletions(-) diff --git a/db/check.c b/db/check.c index 7c11b0b..edfe62d 100644 --- a/db/check.c +++ b/db/check.c @@ -44,7 +44,7 @@ typedef enum { DBM_FREE1, DBM_FREE2, DBM_FREELIST, DBM_INODE, DBM_LOG, DBM_MISSING, DBM_QUOTA, DBM_RTBITMAP, DBM_RTDATA, DBM_RTFREE, DBM_RTSUM, DBM_SB, - DBM_SYMLINK, + DBM_SYMLINK, DBM_BTFINO, DBM_NDBM } dbm_t; @@ -170,6 +170,7 @@ static const char *typename[] = { "rtsum", "sb", "symlink", + "btfino", NULL }; static int verbose; @@ -345,6 +346,9 @@ static void scanfunc_cnt(struct xfs_btree_block *block, int level, static void scanfunc_ino(struct xfs_btree_block *block, int level, xfs_agf_t *agf, xfs_agblock_t bno, int isroot); +static void scanfunc_fino(struct xfs_btree_block *block, int level, + struct xfs_agf *agf, xfs_agblock_t bno, + int isroot); static void set_dbmap(xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, dbm_t type, xfs_agnumber_t c_agno, xfs_agblock_t c_agbno); @@ -789,19 +793,6 @@ blockget_f( return 0; } - /* - * XXX: check does not support CRC enabled filesystems. Return - * immediately, silently, with success but without doing anything here - * initially so that xfstests can run without modification on metadata - * enabled filesystems. - * - * XXX: ultimately we need to dump an error message here that xfstests - * filters out, or we need to actually do the work to make check support - * crc enabled filesystems. - */ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return 0; - if (!init(argc, argv)) { if (serious_error) exitcode = 3; @@ -1058,6 +1049,7 @@ blocktrash_f( (1 << DBM_RTBITMAP) | (1 << DBM_RTSUM) | (1 << DBM_SYMLINK) | + (1 << DBM_BTFINO) | (1 << DBM_SB); while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { switch (c) { @@ -2267,7 +2259,9 @@ process_data_dir_v2( data = iocur_top->data; block = iocur_top->data; if (be32_to_cpu(block->magic) != XFS_DIR2_BLOCK_MAGIC && - be32_to_cpu(data->magic) != XFS_DIR2_DATA_MAGIC) { + be32_to_cpu(data->magic) != XFS_DIR2_DATA_MAGIC && + be32_to_cpu(block->magic) != XFS_DIR3_BLOCK_MAGIC && + be32_to_cpu(data->magic) != XFS_DIR3_DATA_MAGIC) { if (!sflag || v) dbprintf(_("bad directory data magic # %#x for dir ino " "%lld block %d\n"), @@ -2278,7 +2272,8 @@ process_data_dir_v2( db = xfs_dir2_da_to_db(mp->m_dir_geo, dabno); bf = M_DIROPS(mp)->data_bestfree_p(data); ptr = (char *)M_DIROPS(mp)->data_unused_p(data); - if (be32_to_cpu(block->magic) == XFS_DIR2_BLOCK_MAGIC) { + if (be32_to_cpu(block->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(block->magic) == XFS_DIR3_BLOCK_MAGIC) { btp = xfs_dir2_block_tail_p(mp->m_dir_geo, block); lep = xfs_dir2_block_leaf_p(btp); endptr = (char *)lep; @@ -2424,7 +2419,8 @@ process_data_dir_v2( (*dot)++; } } - if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC) { + if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(data->magic) == XFS_DIR3_BLOCK_MAGIC) { endptr = (char *)data + mp->m_dir_geo->blksize; for (i = stale = 0; lep && i < be32_to_cpu(btp->count); i++) { if ((char *)&lep[i] >= endptr) { @@ -2456,7 +2452,8 @@ process_data_dir_v2( id->ino, dabno); error++; } - if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC && + if ((be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(data->magic) == XFS_DIR3_BLOCK_MAGIC) && count != be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)) { if (!sflag || v) dbprintf(_("dir %lld block %d bad block tail count %d " @@ -2465,7 +2462,8 @@ process_data_dir_v2( be32_to_cpu(btp->stale)); error++; } - if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC && + if ((be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC) && stale != be32_to_cpu(btp->stale)) { if (!sflag || v) dbprintf(_("dir %lld block %d bad stale tail count %d\n"), @@ -3051,6 +3049,73 @@ process_leaf_node_dir_v2( } static void +process_leaf_node_dir_v3_free( + inodata_t *id, + int v, + xfs_dablk_t dabno, + freetab_t *freetab) +{ + xfs_dir2_data_off_t ent; + struct xfs_dir3_free *free; + int i; + int maxent; + int used; + + free = iocur_top->data; + maxent = M_DIROPS(mp)->free_max_bests(mp->m_dir_geo); + if (be32_to_cpu(free->hdr.firstdb) != xfs_dir2_da_to_db(mp->m_dir_geo, + dabno - mp->m_dir_geo->freeblk) * maxent) { + if (!sflag || v) + dbprintf(_("bad free block firstdb %d for dir ino %lld " + "block %d\n"), + be32_to_cpu(free->hdr.firstdb), id->ino, dabno); + error++; + return; + } + if (be32_to_cpu(free->hdr.nvalid) > maxent || + be32_to_cpu(free->hdr.nvalid) < 0 || + be32_to_cpu(free->hdr.nused) > maxent || + be32_to_cpu(free->hdr.nused) < 0 || + be32_to_cpu(free->hdr.nused) > + be32_to_cpu(free->hdr.nvalid)) { + if (!sflag || v) + dbprintf(_("bad free block nvalid/nused %d/%d for dir " + "ino %lld block %d\n"), + be32_to_cpu(free->hdr.nvalid), + be32_to_cpu(free->hdr.nused), id->ino, dabno); + error++; + return; + } + for (used = i = 0; i < be32_to_cpu(free->hdr.nvalid); i++) { + if (freetab->nents <= be32_to_cpu(free->hdr.firstdb) + i) + ent = NULLDATAOFF; + else + ent = freetab->ents[be32_to_cpu(free->hdr.firstdb) + i]; + if (ent != be16_to_cpu(free->bests[i])) { + if (!sflag || v) + dbprintf(_("bad free block ent %d is %d should " + "be %d for dir ino %lld block %d\n"), + i, be16_to_cpu(free->bests[i]), ent, + id->ino, dabno); + error++; + } + if (be16_to_cpu(free->bests[i]) != NULLDATAOFF) + used++; + if (ent != NULLDATAOFF) + freetab->ents[be32_to_cpu(free->hdr.firstdb) + i] = + NULLDATAOFF; + } + if (used != be32_to_cpu(free->hdr.nused)) { + if (!sflag || v) + dbprintf(_("bad free block nused %d should be %d for dir " + "ino %lld block %d\n"), + be32_to_cpu(free->hdr.nused), used, id->ino, + dabno); + error++; + } +} + +static void process_leaf_node_dir_v2_free( inodata_t *id, int v, @@ -3064,7 +3129,8 @@ process_leaf_node_dir_v2_free( int used; free = iocur_top->data; - if (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC) { + if (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC && + be32_to_cpu(free->hdr.magic) != XFS_DIR3_FREE_MAGIC) { if (!sflag || v) dbprintf(_("bad free block magic # %#x for dir ino %lld " "block %d\n"), @@ -3072,6 +3138,10 @@ process_leaf_node_dir_v2_free( error++; return; } + if (be32_to_cpu(free->hdr.magic) == XFS_DIR3_FREE_MAGIC) { + process_leaf_node_dir_v3_free(id, v, dabno, freetab); + return; + } maxent = M_DIROPS(mp)->free_max_bests(mp->m_dir_geo); if (be32_to_cpu(free->hdr.firstdb) != xfs_dir2_da_to_db(mp->m_dir_geo, dabno - mp->m_dir_geo->freeblk) * maxent) { @@ -3125,6 +3195,21 @@ process_leaf_node_dir_v2_free( } } +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline int +xfs_dir3_leaf_ents_count(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + + return be16_to_cpu(lp3->hdr.count); + } + return be16_to_cpu(lp->hdr.count); +} + static void process_leaf_node_dir_v2_int( inodata_t *id, @@ -3135,6 +3220,7 @@ process_leaf_node_dir_v2_int( int i; __be16 *lbp; xfs_dir2_leaf_t *leaf; + struct xfs_dir3_leaf *leaf3 = NULL; xfs_dir2_leaf_entry_t *lep; xfs_dir2_leaf_tail_t *ltp; xfs_da_intnode_t *node; @@ -3143,7 +3229,15 @@ process_leaf_node_dir_v2_int( leaf = iocur_top->data; switch (be16_to_cpu(leaf->hdr.info.magic)) { + case XFS_DIR3_LEAF1_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + case XFS_DA3_NODE_MAGIC: + leaf3 = iocur_top->data; + break; + } + switch (be16_to_cpu(leaf->hdr.info.magic)) { case XFS_DIR2_LEAF1_MAGIC: + case XFS_DIR3_LEAF1_MAGIC: if (be32_to_cpu(leaf->hdr.info.forw) || be32_to_cpu(leaf->hdr.info.back)) { if (!sflag || v) @@ -3183,10 +3277,12 @@ process_leaf_node_dir_v2_int( } break; case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: /* if it's at the root location then we can check the * pointers are null XXX */ break; case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: node = iocur_top->data; M_DIROPS(mp)->node_hdr_from_disk(&nodehdr, node); if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { @@ -3208,7 +3304,7 @@ process_leaf_node_dir_v2_int( return; } lep = M_DIROPS(mp)->leaf_ents_p(leaf); - for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { + for (i = stale = 0; i < xfs_dir3_leaf_ents_count(leaf); i++) { if (be32_to_cpu(lep[i].address) == XFS_DIR2_NULL_DATAPTR) stale++; else if (dir_hash_see(be32_to_cpu(lep[i].hashval), @@ -3221,7 +3317,14 @@ process_leaf_node_dir_v2_int( error++; } } - if (stale != be16_to_cpu(leaf->hdr.stale)) { + if (leaf3 && stale != be16_to_cpu(leaf3->hdr.stale)) { + if (!sflag || v) + dbprintf(_("dir3 %lld block %d stale mismatch " + "%d/%d\n"), + id->ino, dabno, stale, + be16_to_cpu(leaf3->hdr.stale)); + error++; + } else if (!leaf && stale != be16_to_cpu(leaf->hdr.stale)) { if (!sflag || v) dbprintf(_("dir %lld block %d stale mismatch " "%d/%d\n"), @@ -3808,6 +3911,12 @@ scan_ag( be32_to_cpu(agi->agi_root), be32_to_cpu(agi->agi_level), 1, scanfunc_ino, TYP_INOBT); + if (agi->agi_free_root) { + scan_sbtree(agf, + be32_to_cpu(agi->agi_free_root), + be32_to_cpu(agi->agi_free_level), + 1, scanfunc_fino, TYP_FINOBT); + } if (be32_to_cpu(agf->agf_freeblks) != agffreeblks) { if (!sflag) dbprintf(_("agf_freeblks %u, counted %u in ag %u\n"), @@ -4007,7 +4116,8 @@ scanfunc_bmap( agno = XFS_FSB_TO_AGNO(mp, bno); agbno = XFS_FSB_TO_AGBNO(mp, bno); - if (be32_to_cpu(block->bb_magic) != XFS_BMAP_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_BMAP_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_BMAP_CRC_MAGIC) { if (!sflag || id->ilist || CHECK_BLIST(bno)) dbprintf(_("bad magic # %#x in inode %lld bmbt block " "%u/%u\n"), @@ -4072,7 +4182,8 @@ scanfunc_bno( xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); xfs_agblock_t lastblock; - if (be32_to_cpu(block->bb_magic) != XFS_ABTB_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_ABTB_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_ABTB_CRC_MAGIC) { dbprintf(_("bad magic # %#x in btbno block %u/%u\n"), be32_to_cpu(block->bb_magic), seqno, bno); serious_error++; @@ -4145,7 +4256,8 @@ scanfunc_cnt( xfs_alloc_rec_t *rp; xfs_extlen_t lastcount; - if (be32_to_cpu(block->bb_magic) != XFS_ABTC_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_ABTC_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_ABTC_CRC_MAGIC) { dbprintf(_("bad magic # %#x in btcnt block %u/%u\n"), be32_to_cpu(block->bb_magic), seqno, bno); serious_error++; @@ -4225,7 +4337,8 @@ scanfunc_ino( xfs_inobt_ptr_t *pp; xfs_inobt_rec_t *rp; - if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_IBT_CRC_MAGIC) { dbprintf(_("bad magic # %#x in inobt block %u/%u\n"), be32_to_cpu(block->bb_magic), seqno, bno); serious_error++; @@ -4321,6 +4434,79 @@ scanfunc_ino( } static void +scanfunc_fino( + struct xfs_btree_block *block, + int level, + struct xfs_agf *agf, + xfs_agblock_t bno, + int isroot) +{ + xfs_agino_t agino; + xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + int i; + int off; + xfs_inobt_ptr_t *pp; + struct xfs_inobt_rec *rp; + + if (be32_to_cpu(block->bb_magic) != XFS_FIBT_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_FIBT_CRC_MAGIC) { + dbprintf(_("bad magic # %#x in finobt block %u/%u\n"), + be32_to_cpu(block->bb_magic), seqno, bno); + serious_error++; + return; + } + if (be16_to_cpu(block->bb_level) != level) { + if (!sflag) + dbprintf(_("expected level %d got %d in finobt block " + "%u/%u\n"), + level, be16_to_cpu(block->bb_level), seqno, bno); + error++; + } + set_dbmap(seqno, bno, 1, DBM_BTFINO, seqno, bno); + if (level == 0) { + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[0] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_inobt_mnr[0])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in " + "finobt block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_inobt_mnr[0], + mp->m_inobt_mxr[0], seqno, bno); + serious_error++; + return; + } + rp = XFS_INOBT_REC_ADDR(mp, block, 1); + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { + agino = be32_to_cpu(rp[i].ir_startino); + off = XFS_INO_TO_OFFSET(mp, agino); + if (off == 0) { + if ((sbversion & XFS_SB_VERSION_ALIGNBIT) && + mp->m_sb.sb_inoalignmt && + (XFS_INO_TO_AGBNO(mp, agino) % + mp->m_sb.sb_inoalignmt)) + sbversion &= ~XFS_SB_VERSION_ALIGNBIT; + check_set_dbmap(seqno, XFS_AGINO_TO_AGBNO(mp, agino), + (xfs_extlen_t)MAX(1, + XFS_INODES_PER_CHUNK >> + mp->m_sb.sb_inopblog), + DBM_INODE, DBM_INODE, seqno, bno); + } + } + return; + } + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[1] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_inobt_mnr[1])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in finobt block " + "%u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_inobt_mnr[1], + mp->m_inobt_mxr[1], seqno, bno); + serious_error++; + return; + } + pp = XFS_INOBT_PTR_ADDR(mp, block, 1, mp->m_inobt_mxr[1]); + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) + scan_sbtree(agf, be32_to_cpu(pp[i]), level, 0, scanfunc_fino, TYP_FINOBT); +} + +static void set_dbmap( xfs_agnumber_t agno, xfs_agblock_t agbno, diff --git a/db/type.c b/db/type.c index 5c60736..955986b 100644 --- a/db/type.c +++ b/db/type.c @@ -141,6 +141,8 @@ static const typ_t __typtab_spcrc[] = { { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld, &xfs_symlink_buf_ops }, { TYP_TEXT, "text", handle_text, NULL, NULL }, + { TYP_FINOBT, "finobt", handle_struct, inobt_crc_hfld, + &xfs_inobt_buf_ops }, { TYP_NONE, NULL } }; From darrick.wong@oracle.com Fri Aug 14 20:52:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 41DA57F50 for ; Fri, 14 Aug 2015 20:52:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B64CBAC005 for ; Fri, 14 Aug 2015 18:52:05 -0700 (PDT) X-ASG-Debug-ID: 1439603523-04cb6c594806a50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Yq7JScStFxR6bOQz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1q2xW011745 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:03 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1q24A016964 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:02 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1q2Ae001701; Sat, 15 Aug 2015 01:52:02 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:02 -0700 Subject: [PATCH 0/7] xfstests: fuzz ext4 and xfs From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 0/7] xfstests: fuzz ext4 and xfs To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:01 -0700 Message-ID: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603524 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is a pile of fuzzing tests for ext4 and XFS filesystems. Included are general fuzzers that create, populate, and fuzz a scratch filesystem; and targeted fuzzers that create specific types of metadata blocks and test the filesystem's reaction to the corruption. Each fuzzing test has roughly the same structure: First, the scratch device is formatted and populated with enough files and directories so that the targeted metadata is created. Next, the metadata block is randomly mutated to some arbitrary degree. Then, the filesystem is mounted and exercised to see if the kernel will fling error codes back to userspace without crashing. After that, the repair tool is invoked to fix all the damage. Finally, the filesystem is remounted and exercised again to ensure that the errors have gone away. The first patch provides common code that can populate ext4 and XFS filesystems containing (hopefully) every possible type of metadata block, and a few other common code bits. The second patch implements general fuzzers for ext4 and XFS. A scratch FS is created and populated with all types of metadata before fuzzing begins. The third and fourth patches implement targeted fuzzing for block group, bitmap, file, extent, and directory metadata in ext4. Patches 5-7 implement targeted fuzzing for AGs, btrees, file, extent, and directory metadata in XFS. I've tested these xfstests changes against the master branch as of 8/03. The reflink tests will be dealt with separately. The xfs fuzzers require xfsprogs with the August 2015 xfsprogs patchbomb applied. The ext4 fuzzers do not require patches if your e2fsprogs are current. Scary rewound github repo with everything attached: https://github.com/djwong/xfstests and for the xfsprogs patches: https://github.com/djwong/xfsprogs Comments and questions are, as always, welcome. --D From darrick.wong@oracle.com Fri Aug 14 20:52:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 12CC47F50 for ; Fri, 14 Aug 2015 20:52:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60392AC006 for ; Fri, 14 Aug 2015 18:52:15 -0700 (PDT) X-ASG-Debug-ID: 1439603532-04cb6c594706a60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Eq8BNHISctk8GfBq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qAwg028482 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:11 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qAQj017122 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:10 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1q9jp020177; Sat, 15 Aug 2015 01:52:09 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:08 -0700 Subject: [PATCH 1/7] common: add routines to fuzz filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/7] common: add routines to fuzz filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:07 -0700 Message-ID: <20150815015207.4333.10934.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603532 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create common/populate with routines to support the new fuzz tests. Signed-off-by: Darrick J. Wong --- common/populate | 546 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 546 insertions(+) create mode 100644 common/populate diff --git a/common/populate b/common/populate new file mode 100644 index 0000000..d166c24 --- /dev/null +++ b/common/populate @@ -0,0 +1,546 @@ +##/bin/bash +# Routines for populating a scratch fs, and helpers to exercise an FS +# once it's been fuzzed. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle. All Rights Reserved. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, +# Mountain View, CA 94043, USA, or: http://www.sgi.com +#----------------------------------------------------------------------- + +_require_xfs_io_command "falloc" +_require_xfs_io_command "fpunch" + +_require_xfs_db_blocktrash_z_command() { + test "${FSTYP}" = "xfs" || _notrun "cannot run xfs_db on ${FSTYP}" + $XFS_DB_PROG -x -f -c 'blocktrash -z' "${TEST_DEV}" | grep -q 'nothing on stack' || _notrun "blocktrash -z not supported" +} + +# Attempt to make files of "every" format for data, dirs, attrs etc. +# (with apologies to Eric Sandeen for mutating xfser.sh) + +# Create a large directory +__populate_create_dir() { + name="$1" + nr="$2" + missing="$3" + + mkdir -p "${name}" + seq 0 "${nr}" | while read d; do + creat=mkdir + test "$((d % 20))" -eq 0 && creat=touch + $creat "${name}/$(printf "%.08d" "$d")" + done + + test -z "${missing}" && return + seq 1 2 "${nr}" | while read d; do + rm -rf "${name}/$(printf "%.08d" "$d")" + done +} + +# Add a bunch of attrs to a file +__populate_create_attr() { + name="$1" + nr="$2" + missing="$3" + + touch "${name}" + seq 0 "${nr}" | while read d; do + setfattr -n "user.$(printf "%.08d" "$d")" -v "$(printf "%.08d" "$d")" "${name}" + done + + test -z "${missing}" && return + seq 1 2 "${nr}" | while read d; do + setfattr -x "user.$(printf "%.08d" "$d")" "${name}" + done +} + +# Fill up 60% of the remaining free space +__populate_fill_fs() { + dir="$1" + pct="$2" + test -z "${pct}" && pct=60 + + SRC_SZ="$(du -ks "${SRCDIR}" | cut -f 1)" + FS_SZ="$(( $(stat -f "${dir}" -c '%a * %S') / 1024 ))" + + NR="$(( (FS_SZ * ${pct} / 100) / SRC_SZ ))" + test "${NR}" -lt 1 && NR=1 + + seq 1 "${NR}" | while read nr; do + cp -pRdu "${SRCDIR}" "${dir}/test.${nr}" >> $seqres.full 2>&1 + done +} + +# Populate an XFS on the scratch device with (we hope) all known +# types of metadata block +_scratch_xfs_populate() { + _scratch_mount + blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" + leaf_lblk="$((32 * 1073741824 / blksz))" + node_lblk="$((64 * 1073741824 / blksz))" + + # Data: + + # Regular files + # - FMT_EXTENTS + echo "+ extents file" + $XFS_IO_PROG -f -c "pwrite -S 0x61 0 ${blksz}" "${SCRATCH_MNT}/S_IFREG.FMT_EXTENTS" + + # - FMT_BTREE + echo "+ btree extents file" + nr="$((blksz * 2 / 16))" + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 $((blksz * nr))" "${SCRATCH_MNT}/S_IFREG.FMT_BTREE" + for i in $(seq 1 2 ${nr}); do + $XFS_IO_PROG -f -c "fpunch $((i * blksz)) ${blksz}" "${SCRATCH_MNT}/S_IFREG.FMT_BTREE" + done + + # Directories + # - INLINE + echo "+ inline dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_INLINE" 1 + + # - BLOCK + echo "+ block dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_BLOCK" "$((dblksz / 40))" + + # - LEAF + echo "+ leaf dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_LEAF" "$((dblksz / 12))" + + # - NODE + echo "+ node dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_NODE" "$((16 * dblksz / 40))" true + + # - BTREE + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_BTREE" "$((128 * dblksz / 40))" true + + # Symlinks + # - FMT_LOCAL + echo "+ inline symlink" + ln -s target "${SCRATCH_MNT}/S_IFLNK.FMT_LOCAL" + + # - FMT_EXTENTS + echo "+ extents symlink" + ln -s "$(perl -e 'print "x" x 1023;')" "${SCRATCH_MNT}/S_IFLNK.FMT_EXTENTS" + + # Char & block + echo "+ special" + mkdir devices + mknod "${SCRATCH_MNT}/S_IFCHR" c 1 1 + mknod "${SCRATCH_MNT}/S_IFBLK" c 1 1 + + # Attribute formats + # LOCAL + echo "+ local attr" + __populate_create_attr "${SCRATCH_MNT}/ATTR.FMT_LOCAL" 1 + + # LEAF + echo "+ leaf attr" + __populate_create_attr "${SCRATCH_MNT}/ATTR.FMT_LEAF" "$((blksz / 40))" + + # NODE + echo "+ node attr" + __populate_create_attr "${SCRATCH_MNT}/ATTR.FMT_NODE" "$((8 * blksz / 40))" + + # BTREE + echo "+ btree attr" + __populate_create_attr "${SCRATCH_MNT}/ATTR.FMT_BTREE" "$((64 * blksz / 40))" true + + # FMT_EXTENTS with a remote less-than-a-block value + echo "+ attr extents with a remote less-than-a-block value" + touch "${SCRATCH_MNT}/ATTR.FMT_EXTENTS_REMOTE3K" + $XFS_IO_PROG -f -c "pwrite -S 0x43 0 3k" "${SCRATCH_MNT}/attrvalfile" > /dev/null + attr -q -s user.remotebtreeattrname "${SCRATCH_MNT}/ATTR.FMT_EXTENTS_REMOTE3K" < "${SCRATCH_MNT}/attrvalfile" + + # FMT_EXTENTS with a remote block-size value + echo "+ attr extents with a remote one-block value" + touch "${SCRATCH_MNT}/ATTR.FMT_EXTENTS_REMOTE4K" + $XFS_IO_PROG -f -c "pwrite -S 0x44 0 4k" "${SCRATCH_MNT}/attrvalfile" > /dev/null + attr -q -s user.remotebtreeattrname "${SCRATCH_MNT}/ATTR.FMT_EXTENTS_REMOTE4K" < "${SCRATCH_MNT}/attrvalfile" + rm -rf "${SCRATCH_MNT}/attrvalfile" + + # Make an unused inode + echo "+ empty file" + touch "${SCRATCH_MNT}/unused" + $XFS_IO_PROG -f -c 'fsync' "${SCRATCH_MNT}/unused" + rm -rf "${SCRATCH_MNT}/unused" + + # Copy some real files (xfs tests, I guess...) + echo "+ real files" + #__populate_fill_fs "${SCRATCH_MNT}" 40 + cp -pRdu --reflink=always "${SCRATCH_MNT}/S_IFREG.FMT_BTREE" "${SCRATCH_MNT}/S_IFREG.FMT_BTREE.REFLINK" 2> /dev/null + + umount "${SCRATCH_MNT}" +} + +# Populate an ext4 on the scratch device with (we hope) all known +# types of metadata block +_scratch_ext4_populate() { + _scratch_mount + blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + dblksz="${blksz}" + leaf_lblk="$((32 * 1073741824 / blksz))" + node_lblk="$((64 * 1073741824 / blksz))" + + # Data: + + # Regular files + # - FMT_INLINE + echo "+ inline file" + $XFS_IO_PROG -f -c "pwrite -S 0x61 0 1" "${SCRATCH_MNT}/S_IFREG.FMT_INLINE" + + # - FMT_EXTENTS + echo "+ extents file" + $XFS_IO_PROG -f -c "pwrite -S 0x61 0 ${blksz}" "${SCRATCH_MNT}/S_IFREG.FMT_EXTENTS" + + # - FMT_ETREE + echo "+ extent tree file" + nr="$((blksz * 2 / 12))" + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 $((blksz * nr))" "${SCRATCH_MNT}/S_IFREG.FMT_ETREE" + for i in $(seq 1 2 ${nr}); do + $XFS_IO_PROG -f -c "fpunch $((i * blksz)) ${blksz}" "${SCRATCH_MNT}/S_IFREG.FMT_ETREE" + done + + # Directories + # - INLINE + echo "+ inline dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_INLINE" 1 + + # - BLOCK + echo "+ block dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_BLOCK" "$((dblksz / 24))" + + # - HTREE + echo "+ htree dir" + __populate_create_dir "${SCRATCH_MNT}/S_IFDIR.FMT_HTREE" "$((4 * dblksz / 24))" + + # Symlinks + # - FMT_LOCAL + echo "+ inline symlink" + ln -s target "${SCRATCH_MNT}/S_IFLNK.FMT_LOCAL" + + # - FMT_EXTENTS + echo "+ extents symlink" + ln -s "$(perl -e 'print "x" x 1023;')" "${SCRATCH_MNT}/S_IFLNK.FMT_EXTENTS" + + # Char & block + echo "+ special" + mkdir devices + mknod "${SCRATCH_MNT}/S_IFCHR" c 1 1 + mknod "${SCRATCH_MNT}/S_IFBLK" c 1 1 + + # Attribute formats + # LOCAL + echo "+ local attr" + __populate_create_attr "${SCRATCH_MNT}/ATTR.FMT_LOCAL" 1 + + # BLOCK + echo "+ block attr" + __populate_create_attr "${SCRATCH_MNT}/ATTR.FMT_BLOCK" "$((blksz / 40))" + + # Make an unused inode + echo "+ empty file" + touch "${SCRATCH_MNT}/unused" + $XFS_IO_PROG -f -c 'fsync' "${SCRATCH_MNT}/unused" + rm -rf "${SCRATCH_MNT}/unused" + + # Copy some real files (xfs tests, I guess...) + echo "+ real files" + __populate_fill_fs "${SCRATCH_MNT}" + cp -pRdu --reflink=always "${SCRATCH_MNT}/S_IFREG.FMT_ETREE" "${SCRATCH_MNT}/S_IREG.FMT_ETREE.REFLINK" 2> /dev/null + + umount "${SCRATCH_MNT}" +} + +# Find the inode number of a file +__populate_find_inode() { + name="$1" + inode="$(stat -c '%i' "${name}")" + echo "${inode}" +} + +# Check data fork format of XFS file +__populate_check_xfs_dformat() { + dev="$1" + inode="$2" + format="$3" + + fmt="$($XFS_DB_PROG -c "inode ${inode}" -c 'p core.format' "${dev}" | sed -e 's/^.*(\([a-z]*\)).*$/\1/g')" + test "${format}" = "${fmt}" || _fail "failed to create ino ${inode} dformat expected ${format} saw ${fmt}" +} + +# Check attr fork format of XFS file +__populate_check_xfs_aformat() { + dev="$1" + inode="$2" + format="$3" + + fmt="$($XFS_DB_PROG -c "inode ${inode}" -c 'p core.aformat' "${dev}" | sed -e 's/^.*(\([a-z]*\)).*$/\1/g')" + test "${format}" = "${fmt}" || _fail "failed to create ino ${inode} aformat expected ${format} saw ${fmt}" +} + +# Check structure of XFS directory +__populate_check_xfs_dir() { + dev="$1" + inode="$2" + dtype="$3" + + (test -n "${leaf_lblk}" && test -n "${node_lblk}") || _fail "must define leaf_lblk and node_lblk before calling __populate_check_xfs_dir" + datab=0 + leafb=0 + freeb=0 + #echo "== check dir ${inode} type ${dtype}" ; $XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' || datab=1 + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${leaf_lblk}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' || leafb=1 + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${node_lblk}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' || freeb=1 + + case "${dtype}" in + "shortform"|"inline"|"local") + (test "${datab}" -eq 0 && test "${leafb}" -eq 0 && test "${freeb}" -eq 0) || _fail "failed to create ${dtype} dir ino ${inode} datab ${datab} leafb ${leafb} freeb ${freeb}" + ;; + "block") + (test "${datab}" -eq 1 && test "${leafb}" -eq 0 && test "${freeb}" -eq 0) || _fail "failed to create ${dtype} dir ino ${inode} datab ${datab} leafb ${leafb} freeb ${freeb}" + ;; + "leaf") + (test "${datab}" -eq 1 && test "${leafb}" -eq 1 && test "${freeb}" -eq 0) || _fail "failed to create ${dtype} dir ino ${inode} datab ${datab} leafb ${leafb} freeb ${freeb}" + ;; + "node"|"btree") + (test "${datab}" -eq 1 && test "${leafb}" -eq 1 && test "${freeb}" -eq 1) || _fail "failed to create ${dtype} dir ino ${inode} datab ${datab} leafb ${leafb} freeb ${freeb}" + ;; + *) + _fail "Unknown directory type ${dtype}" + esac +} + +# Check structure of XFS attr +__populate_check_xfs_attr() { + dev="$1" + inode="$2" + atype="$3" + + datab=0 + leafb=0 + #echo "== check attr ${inode} type ${dtype}" ; $XFS_DB_PROG -x -c "inode ${inode}" -c "bmap -a" "${SCRATCH_DEV}" + $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' || datab=1 + $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' || leafb=1 + + case "${atype}" in + "shortform"|"inline"|"local") + (test "${datab}" -eq 0 && test "${leafb}" -eq 0) || _fail "failed to create ${atype} attr ino ${inode} datab ${datab} leafb ${leafb}" + ;; + "leaf") + (test "${datab}" -eq 1 && test "${leafb}" -eq 0) || _fail "failed to create ${atype} attr ino ${inode} datab ${datab} leafb ${leafb}" + ;; + "node"|"btree") + (test "${datab}" -eq 1 && test "${leafb}" -eq 1) || _fail "failed to create ${atype} attr ino ${inode} datab ${datab} leafb ${leafb}" + ;; + *) + _fail "Unknown attribute type ${atype}" + esac +} + +# Check that populate created all the types of files we wanted +_scratch_xfs_populate_check() { + _scratch_mount + extents_file="$(__populate_find_inode "${SCRATCH_MNT}/S_IFREG.FMT_EXTENTS")" + btree_file="$(__populate_find_inode "${SCRATCH_MNT}/S_IFREG.FMT_BTREE")" + inline_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_INLINE")" + block_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_BLOCK")" + leaf_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_LEAF")" + node_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_NODE")" + btree_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_BTREE")" + local_slink="$(__populate_find_inode "${SCRATCH_MNT}/S_IFLNK.FMT_LOCAL")" + extents_slink="$(__populate_find_inode "${SCRATCH_MNT}/S_IFLNK.FMT_EXTENTS")" + bdev="$(__populate_find_inode "${SCRATCH_MNT}/S_IFBLK")" + cdev="$(__populate_find_inode "${SCRATCH_MNT}/S_IFCHR")" + local_attr="$(__populate_find_inode "${SCRATCH_MNT}/ATTR.FMT_LOCAL")" + leaf_attr="$(__populate_find_inode "${SCRATCH_MNT}/ATTR.FMT_LEAF")" + node_attr="$(__populate_find_inode "${SCRATCH_MNT}/ATTR.FMT_NODE")" + btree_attr="$(__populate_find_inode "${SCRATCH_MNT}/ATTR.FMT_BTREE")" + + blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" + leaf_lblk="$((32 * 1073741824 / blksz))" + node_lblk="$((64 * 1073741824 / blksz))" + umount "${SCRATCH_MNT}" + + __populate_check_xfs_dformat "${SCRATCH_DEV}" "${extents_file}" "extents" + __populate_check_xfs_dformat "${SCRATCH_DEV}" "${btree_file}" "btree" + __populate_check_xfs_dir "${SCRATCH_DEV}" "${inline_dir}" "inline" + __populate_check_xfs_dir "${SCRATCH_DEV}" "${block_dir}" "block" + __populate_check_xfs_dir "${SCRATCH_DEV}" "${leaf_dir}" "leaf" + __populate_check_xfs_dir "${SCRATCH_DEV}" "${node_dir}" "node" + __populate_check_xfs_dir "${SCRATCH_DEV}" "${btree_dir}" "btree" + __populate_check_xfs_dformat "${SCRATCH_DEV}" "${btree_dir}" "btree" + __populate_check_xfs_dformat "${SCRATCH_DEV}" "${bdev}" "dev" + __populate_check_xfs_dformat "${SCRATCH_DEV}" "${cdev}" "dev" + __populate_check_xfs_attr "${SCRATCH_DEV}" "${local_attr}" "local" + __populate_check_xfs_attr "${SCRATCH_DEV}" "${leaf_attr}" "leaf" + __populate_check_xfs_attr "${SCRATCH_DEV}" "${node_attr}" "node" + __populate_check_xfs_attr "${SCRATCH_DEV}" "${btree_attr}" "btree" + __populate_check_xfs_aformat "${SCRATCH_DEV}" "${btree_attr}" "btree" +} + +# Check data fork format of ext4 file +__populate_check_ext4_dformat() { + dev="$1" + inode="$2" + format="$3" + + extents=0 + etree=0 + debugfs -R "stat <${inode}>" "${dev}" 2> /dev/null | grep 'ETB[0-9]' -q && etree=1 + iflags="$(debugfs -R "stat <${inode}>" "${dev}" 2> /dev/null | grep 'Flags:' | sed -e 's/^.*Flags: \([0-9a-fx]*\).*$/\1/g')" + test "$(echo "${iflags}" | awk '{print and(strtonum($1), 0x80000);}')" -gt 0 && extents=1 + + case "${format}" in + "blockmap") + test "${extents}" -eq 0 || _fail "failed to create ino ${inode} with blockmap" + ;; + "extent"|"extents") + test "${extents}" -eq 1 || _fail "failed to create ino ${inode} with extents" + ;; + "etree") + (test "${extents}" -eq 1 && test "${etree}" -eq 1) || _fail "failed to create ino ${inode} with extent tree" + ;; + *) + _fail "Unknown dformat ${format}" + esac +} + +# Check attr fork format of ext4 file +__populate_check_ext4_aformat() { + dev="$1" + inode="$2" + format="$3" + + ablock=1 + debugfs -R "stat <${inode}>" "${dev}" 2> /dev/null | grep 'File ACL: 0' -q && ablock=0 + + case "${format}" in + "local"|"inline") + test "${ablock}" -eq 0 || _fail "failed to create inode ${inode} with ${format} xattr" + ;; + "block") + test "${extents}" -eq 1 || _fail "failed to create inode ${inode} with ${format} xattr" + ;; + *) + _fail "Unknown aformat ${format}" + esac +} + +# Check structure of ext4 dir +__populate_check_ext4_dir() { + dev="$1" + inode="$2" + dtype="$3" + + htree=0 + inline=0 + iflags="$(debugfs -R "stat <${inode}>" "${dev}" 2> /dev/null | grep 'Flags:' | sed -e 's/^.*Flags: \([0-9a-fx]*\).*$/\1/g')" + test "$(echo "${iflags}" | awk '{print and(strtonum($1), 0x1000);}')" -gt 0 && htree=1 + test "$(echo "${iflags}" | awk '{print and(strtonum($1), 0x10000000);}')" -gt 0 && inline=1 + + case "${dtype}" in + "inline") + (test "${inline}" -eq 1 && test "${htree}" -eq 0) || _fail "failed to create ${dtype} dir ino ${inode} htree ${htree} inline ${inline}" + ;; + "block") + (test "${inline}" -eq 0 && test "${htree}" -eq 0) || _fail "failed to create ${dtype} dir ino ${inode} htree ${htree} inline ${inline}" + ;; + "htree") + (test "${inline}" -eq 0 && test "${htree}" -eq 1) || _fail "failed to create ${dtype} dir ino ${inode} htree ${htree} inline ${inline}" + ;; + *) + _fail "Unknown directory type ${dtype}" + ;; + esac +} + +# Check that populate created all the types of files we wanted +_scratch_ext4_populate_check() { + _scratch_mount + extents_file="$(__populate_find_inode "${SCRATCH_MNT}/S_IFREG.FMT_EXTENTS")" + etree_file="$(__populate_find_inode "${SCRATCH_MNT}/S_IFREG.FMT_ETREE")" + block_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_BLOCK")" + htree_dir="$(__populate_find_inode "${SCRATCH_MNT}/S_IFDIR.FMT_HTREE")" + extents_slink="$(__populate_find_inode "${SCRATCH_MNT}/S_IFLNK.FMT_EXTENTS")" + local_attr="$(__populate_find_inode "${SCRATCH_MNT}/ATTR.FMT_LOCAL")" + block_attr="$(__populate_find_inode "${SCRATCH_MNT}/ATTR.FMT_BLOCK")" + umount "${SCRATCH_MNT}" + + __populate_check_ext4_dformat "${SCRATCH_DEV}" "${extents_file}" "extents" + __populate_check_ext4_dformat "${SCRATCH_DEV}" "${etree_file}" "etree" + __populate_check_ext4_dir "${SCRATCH_DEV}" "${block_dir}" "block" + __populate_check_ext4_dir "${SCRATCH_DEV}" "${htree_dir}" "htree" + __populate_check_ext4_dformat "${SCRATCH_DEV}" "${extents_slink}" "extents" + __populate_check_ext4_aformat "${SCRATCH_DEV}" "${local_attr}" "local" + __populate_check_ext4_aformat "${SCRATCH_DEV}" "${block_attr}" "block" +} + +# Populate a scratch FS and check the contents to make sure we got that +_scratch_populate() { + case "${FSTYP}" in + "xfs") + _scratch_xfs_populate + _scratch_xfs_populate_check + ;; + "ext4") + _scratch_ext4_populate + _scratch_ext4_populate_check + ;; + *) + _fail "Don't know how to populate a ${FSTYP} filesystem." + ;; + esac +} + +# Modify various files after a fuzzing operation +_scratch_fuzz_modify() { + nr="$1" + + test -z "${nr}" && nr=50000 + echo "+++ touch ${nr} files" + $XFS_IO_PROG -f -c "pwrite -S 0x63 0 ${BLK_SZ}" "/tmp/afile" > /dev/null + date="$(date)" + find "${SCRATCH_MNT}/" -type f 2> /dev/null | head -n "${nr}" | while read f; do + setfattr -n "user.date" -v "${date}" "$f" + cat "/tmp/afile" >> "$f" + mv "$f" "$f.longer" + done + rm -rf "/tmp/afile" + + echo "+++ create files" + cp -pRdu "${SRCDIR}" "${SCRATCH_MNT}/test.moo" + sync + + echo "+++ remove files" + rm -rf "${SCRATCH_MNT}/test.moo" + rm -rf "${SCRATCH_MNT}/test.1" +} + +# Try to access files after fuzzing +_scratch_fuzz_test() { + echo "+++ ls -laR" >> $seqres.full + ls -laR "${SCRATCH_MNT}/test.1/" >/dev/null 2>&1 + + echo "+++ cat files" >> $seqres.full + (find "${SCRATCH_MNT}/test.1/" -type f -size -1048576k -print0 | xargs -0 cat) >/dev/null 2>&1 +} + From darrick.wong@oracle.com Fri Aug 14 20:52:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 72A217F60 for ; Fri, 14 Aug 2015 20:52:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41B87304039 for ; Fri, 14 Aug 2015 18:52:22 -0700 (PDT) X-ASG-Debug-ID: 1439603539-04cbb078e406a50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id R1bb3VeW0q3B7D43 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qGwx028499 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:16 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qFUG017286 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:15 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qFob014109; Sat, 15 Aug 2015 01:52:15 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:15 -0700 Subject: [PATCH 2/7] randomly fuzz XFS and ext4 filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/7] randomly fuzz XFS and ext4 filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:14 -0700 Message-ID: <20150815015214.4333.91129.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603540 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce tests for XFS and ext4 which format a filesystem, populate it, then uses blocktrash and e2fuzz to corrupt the metadata. The FS is remounted, modified, and unmounted. Following that, xfs_repair or e2fsck are run until it no longer finds errors to correct, after which the FS is mounted yet again and exercised to see if there are any errors remaining. The XFS test requires an xfs_db that can handle blocktrash and v5 filesystems. The ext4 test requires metadata_csum support in e2fsprogs. Signed-off-by: Darrick J. Wong --- tests/ext4/700 | 161 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/700.out | 3 + tests/ext4/group | 1 tests/xfs/700 | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/700.out | 3 + tests/xfs/group | 1 6 files changed, 343 insertions(+) create mode 100755 tests/ext4/700 create mode 100644 tests/ext4/700.out create mode 100755 tests/xfs/700 create mode 100644 tests/xfs/700.out diff --git a/tests/ext4/700 b/tests/ext4/700 new file mode 100755 index 0000000..ef68d75 --- /dev/null +++ b/tests/ext4/700 @@ -0,0 +1,161 @@ +#! /bin/bash +# FS QA Test No. 700 +# +# Create and populate an ext4 filesystem, fuzz the metadata, then see how +# the kernel reacts, how e2fsck fares in fixing the mess, and then +# try more kernel accesses to see if it really fixed things. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +if [ ! -x "$(which e2fuzz)" ]; then + _notrun "Couldn't find e2fuzz" +fi + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +_require_attrs + +repair_scratch() { + fsck_pass="$1" + + FSCK_LOG="${tmp}-fuzz-${fsck_pass}.log" + echo "++ fsck pass ${fsck_pass}" > "${FSCK_LOG}" + e2fsck -f -y "${SCRATCH_DEV}" + res=$? + if [ "${res}" -eq 0 ]; then + echo "++ allegedly fixed, reverify" >> "${FSCK_LOG}" + _check_scratch_fs -n >> "${FSCK_LOG}" 2>&1 + res=$? + fi + echo "++ fsck returns ${res}" >> "${FSCK_LOG}" + if [ "${res}" -eq 0 ]; then + echo "++ fsck thinks we are done" >> "${FSCK_LOG}" + cat "${FSCK_LOG}" + return 0 + elif [ "${fsck_pass}" -eq "${FSCK_PASSES}" ]; then + echo "++ fsck did not fix in ${FSCK_PASSES} passes." >> "${FSCK_LOG}" + cat "${FSCK_LOG}" + return 0 + fi + cat "${FSCK_LOG}" + if [ "${fsck_pass}" -gt 1 ]; then + cmp -s "${tmp}-fuzz-$((fsck_pass - 1)).log" "${FSCK_LOG}" + if [ $? -eq 0 ]; then + echo "++ fsck makes no progress" + return 2 + fi + fi + return 1 +} + +rm -f $seqres.full +echo "See interesting results in $seqres.full" | sed -e "s,$RESULT_DIR,RESULT_DIR,g" +SRCDIR=`pwd` +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-b 32 -v" +test -z "${FSCK_PASSES}" && FSCK_PASSES=10 +BLK_SZ=4096 + +echo "fuzzing ext4 with FUZZ_ARGS=$FUZZ_ARGS and FSCK_PASSES=$FSCK_PASSES" > $seqres.full + +echo "+ create scratch fs" >> $seqres.full +_scratch_mkfs_ext4 >> $seqres.full 2>&1 + +echo "+ populate fs image" >> $seqres.full +_scratch_populate >> $seqres.full + +echo "+ check fs" >> $seqres.full +_check_scratch_fs >> $seqres.full 2>&1 || _fail "should pass initial fsck" + +echo "++ corrupt image" >> $seqres.full +e2fuzz ${FUZZ_ARGS} ${SCRATCH_DEV} >> $seqres.full 2>&1 + +echo "++ mount image" >> $seqres.full +_scratch_mount >> $seqres.full 2>&1 + +echo "++ test scratch" >> $seqres.full +_scratch_fuzz_test >> $seqres.full 2>&1 + +echo "++ modify scratch" >> $seqres.full +_scratch_fuzz_modify >> $seqres.full 2>&1 + +echo "++ unmount" >> $seqres.full +umount "${SCRATCH_MNT}" + +# repair in a loop... +for p in $(seq 1 "${FSCK_PASSES}"); do + repair_scratch "$p" >> $seqres.full 2>&1 && break +done +echo "+ fsck loop returns ${fsck_loop_ret}" >> $seqres.full + +echo "++ check fs for round 2" >> $seqres.full +_check_scratch_fs >> $seqres.full 2>&1 + +ROUND2_LOG="${tmp}-round2-${fsck_pass}.log" +echo "++ mount image (2)" >> $ROUND2_LOG +_scratch_mount >> $ROUND2_LOG 2>&1 + +echo "++ chattr -R -i" >> $ROUND2_LOG +chattr -R -f -i "${SCRATCH_MNT}/" > /dev/null 2>> $ROUND2_LOG + +echo "++ test scratch" >> $ROUND2_LOG +_scratch_fuzz_test >> $ROUND2_LOG 2>&1 + +echo "++ modify scratch" >> $ROUND2_LOG +_scratch_fuzz_modify >> $ROUND2_LOG 2>&1 + +echo "++ unmount" >> $ROUND2_LOG +umount "${SCRATCH_MNT}" >> $ROUND2_LOG 2>&1 + +cat "$ROUND2_LOG" >> $seqres.full + +echo "++ check fs (2)" >> $seqres.full +_check_scratch_fs >> $seqres.full 2>&1 + +egrep -q '(did not fix|makes no progress)' $seqres.full && echo "e2fsck failed" | tee -a $seqres.full +if [ "$(wc -l < "$ROUND2_LOG")" -ne 8 ]; then + echo "e2fsck did not fix everything" | tee -a $seqres.full +fi +echo "finished fuzzing" | tee -a "$seqres.full" + +status=0 +exit diff --git a/tests/ext4/700.out b/tests/ext4/700.out new file mode 100644 index 0000000..c0a16f6 --- /dev/null +++ b/tests/ext4/700.out @@ -0,0 +1,3 @@ +QA output created by 700 +See interesting results in RESULT_DIR/700.full +finished fuzzing diff --git a/tests/ext4/group b/tests/ext4/group index 96218b7..dfadd91 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -17,3 +17,4 @@ 306 auto rw resize quick 307 auto ioctl rw 308 auto ioctl rw prealloc quick +700 dangerous_fuzzers diff --git a/tests/xfs/700 b/tests/xfs/700 new file mode 100755 index 0000000..bc3f176 --- /dev/null +++ b/tests/xfs/700 @@ -0,0 +1,174 @@ +#! /bin/bash +# FS QA Test No. 700 +# +# Create and populate an XFS filesystem, fuzz the metadata, then see how +# the kernel reacts, how xfs_repair fares in fixing the mess, and then +# try more kernel accesses to see if it really fixed things. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_xfs_io_command "falloc" +_require_xfs_io_command "fpunch" +_require_scratch +#_require_xfs_crc # checksum not required, but you probably want it anyway... +#_require_xfs_mkfs_crc +_require_attrs + +scratch_repair() { + fsck_pass="$1" + + FSCK_LOG="${tmp}-fuzz-${fsck_pass}.log" + echo "++ fsck pass ${fsck_pass}" > "${FSCK_LOG}" + _scratch_xfs_repair >> "${FSCK_LOG}" 2>&1 + res=$? + if [ "${res}" -eq 0 ]; then + echo "++ allegedly fixed, reverify" >> "${FSCK_LOG}" + _scratch_xfs_repair -n >> "${FSCK_LOG}" 2>&1 + res=$? + fi + echo "++ fsck returns ${res}" >> "${FSCK_LOG}" + if [ "${res}" -eq 0 ]; then + echo "++ fsck thinks we are done" >> "${FSCK_LOG}" + cat "${FSCK_LOG}" + return 0 + elif [ "${res}" -eq 2 ]; then + # replay log? + echo "+++ replaying log" >> "${FSCK_LOG}" + _scratch_mount >> "${FSCK_LOG}" 2>&1 + res=$? + echo "+++ mount returns ${res}" >> "${FSCK_LOG}" + if [ "${res}" -gt 0 ]; then + echo "+++ zeroing log" >> "${FSCK_LOG}" + _scratch_xfs_repair -L >> "${FSCK_LOG}" 2>&1 + echo "+++ returns $?" >> "${FSCK_LOG}" + else + umount "${SCRATCH_MNT}" >> "${FSCK_LOG}" 2>&1 + fi + elif [ "${fsck_pass}" -eq "${FSCK_PASSES}" ]; then + echo "++ fsck did not fix in ${FSCK_PASSES} passes." >> "${FSCK_LOG}" + cat "${FSCK_LOG}" + return 0 + fi + cat "${FSCK_LOG}" + if [ "${fsck_pass}" -gt 1 ]; then + cmp -s "${tmp}-fuzz-$((fsck_pass - 1)).log" "${FSCK_LOG}" + if [ $? -eq 0 ]; then + echo "++ fsck makes no progress" + return 2 + fi + fi + return 1 +} + +rm -f $seqres.full +echo "See interesting results in $seqres.full" | sed -e "s,$RESULT_DIR,RESULT_DIR,g" +SRCDIR=`pwd` +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-3 -n 32" +test -z "${FSCK_PASSES}" && FSCK_PASSES=10 +BLK_SZ=4096 + +echo "fuzzing xfs with FUZZ_ARGS=$FUZZ_ARGS and FSCK_PASSES=$FSCK_PASSES" > $seqres.full + +echo "+ create scratch fs" >> $seqres.full +_scratch_mkfs_xfs >> $seqres.full 2>&1 + +echo "+ populate fs image" >> $seqres.full +_scratch_populate >> $seqres.full + +echo "+ check fs" >> $seqres.full +_scratch_xfs_repair >> $seqres.full 2>&1 || _fail "should pass initial fsck" + +echo "++ corrupt image" >> $seqres.full +xfs_db -x -c blockget -c "blocktrash ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "++ mount image" >> $seqres.full +_scratch_mount >> $seqres.full 2>&1 + +echo "+++ test scratch" >> $seqres.full +_scratch_fuzz_test >> $seqres.full 2>&1 + +echo "+++ modify scratch" >> $seqres.full +_scratch_fuzz_modify >> $seqres.full 2>&1 + +echo "++ umount" >> $seqres.full +umount "${SCRATCH_MNT}" + +# repair in a loop... +for p in $(seq 1 "${FSCK_PASSES}"); do + scratch_repair "$p" >> $seqres.full 2>&1 && break +done +echo "+ fsck loop returns ${fsck_loop_ret}" >> $seqres.full + +echo "++ check fs for round 2" >> $seqres.full +_scratch_xfs_repair >> $seqres.full 2>&1 + +ROUND2_LOG="${tmp}-round2-${fsck_pass}.log" +echo "++ mount image (2)" >> $ROUND2_LOG +_scratch_mount >> $ROUND2_LOG 2>&1 + +echo "++ chattr -R -i" >> $ROUND2_LOG +chattr -R -f -i "${SCRATCH_MNT}/" > /dev/null 2>> $ROUND2_LOG + +echo "+++ test scratch" >> $ROUND2_LOG +_scratch_fuzz_test >> $ROUND2_LOG 2>&1 + +echo "+++ modify scratch" >> $ROUND2_LOG +_scratch_fuzz_modify >> $ROUND2_LOG 2>&1 + +echo "++ umount" >> $ROUND2_LOG +umount "${SCRATCH_MNT}" >> $ROUND2_LOG 2>&1 + +cat "$ROUND2_LOG" >> $seqres.full + +echo "++ check fs (2)" >> $seqres.full +_scratch_xfs_repair >> $seqres.full 2>&1 + +egrep -q '(did not fix|makes no progress)' $seqres.full && echo "xfs_repair failed" | tee -a $seqres.full +if [ "$(wc -l < "$ROUND2_LOG")" -ne 8 ]; then + echo "xfs_repair did not fix everything" | tee -a $seqres.full +fi +echo "finished fuzzing" | tee -a "$seqres.full" + +status=0 +exit diff --git a/tests/xfs/700.out b/tests/xfs/700.out new file mode 100644 index 0000000..c0a16f6 --- /dev/null +++ b/tests/xfs/700.out @@ -0,0 +1,3 @@ +QA output created by 700 +See interesting results in RESULT_DIR/700.full +finished fuzzing diff --git a/tests/xfs/group b/tests/xfs/group index ebe8e7e..140df27 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -197,3 +197,4 @@ 303 auto quick quota 304 auto quick quota 305 auto quota +700 dangerous_fuzzers From darrick.wong@oracle.com Fri Aug 14 20:52:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 32A8F7F66 for ; Fri, 14 Aug 2015 20:52:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 059DC304039 for ; Fri, 14 Aug 2015 18:52:28 -0700 (PDT) X-ASG-Debug-ID: 1439603546-04cbb078e406a60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id igmpg5cVoOGBjh8J (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qO04011874 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:25 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qOSw006405 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:24 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qO6v020237; Sat, 15 Aug 2015 01:52:24 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:23 -0700 Subject: [PATCH 3/7] ext4: test block group metadata corruption checking and repair From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/7] ext4: test block group metadata corruption checking and repair To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:20 -0700 Message-ID: <20150815015220.4333.14758.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439603546 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Targeted fuzzing tests which destroy various pieces of filesystem or block group metadata; the tests look for (a) kernel detection of corruption, (b) e2fsck repair of said corruption, and (c) post-repair fs usability. Signed-off-by: Darrick J. Wong --- common/rc | 11 +++++ tests/ext4/701 | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/701.out | 13 ++++++ tests/ext4/702 | 103 ++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/702.out | 10 ++++ tests/ext4/703 | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/703.out | 12 +++++ tests/ext4/704 | 102 +++++++++++++++++++++++++++++++++++++++++++ tests/ext4/704.out | 12 +++++ tests/ext4/705 | 88 ++++++++++++++++++++++++++++++++++++++ tests/ext4/705.out | 10 ++++ tests/ext4/706 | 87 +++++++++++++++++++++++++++++++++++++ tests/ext4/706.out | 10 ++++ tests/ext4/group | 6 +++ 14 files changed, 699 insertions(+) create mode 100755 tests/ext4/701 create mode 100644 tests/ext4/701.out create mode 100755 tests/ext4/702 create mode 100644 tests/ext4/702.out create mode 100755 tests/ext4/703 create mode 100644 tests/ext4/703.out create mode 100755 tests/ext4/704 create mode 100644 tests/ext4/704.out create mode 100755 tests/ext4/705 create mode 100644 tests/ext4/705.out create mode 100755 tests/ext4/706 create mode 100644 tests/ext4/706.out diff --git a/common/rc b/common/rc index 70d2fa8..f889103 100644 --- a/common/rc +++ b/common/rc @@ -1398,6 +1398,17 @@ _require_xfs_crc() umount $SCRATCH_MNT } +# this test requires the ext4 kernel support crc feature on scratch device +# +_require_scratch_ext4_crc() +{ + _scratch_mkfs_ext4 >/dev/null 2>&1 + dumpe2fs -h $SCRATCH_DEV 2> /dev/null | grep -q metadata_csum || _notrun "metadata_csum not supported by this filesystem" + _scratch_mount >/dev/null 2>&1 \ + || _notrun "Kernel doesn't support metadata_csum feature" + umount $SCRATCH_MNT +} + # this test requires the bigalloc feature to be available in mkfs.ext4 # _require_ext4_mkfs_bigalloc() diff --git a/tests/ext4/701 b/tests/ext4/701 new file mode 100755 index 0000000..6833954 --- /dev/null +++ b/tests/ext4/701 @@ -0,0 +1,122 @@ +#! /bin/bash +# FS QA Test No. 701 +# +# Create and populate an ext4 filesystem, corrupt the primary superblock, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 +dumpe2fs -g "${SCRATCH_DEV}" > /dev/null 2>&1 || _notrun "dumpe2fs -g not supported" + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +nr_groups="$(dumpe2fs -g "${SCRATCH_DEV}" 2> /dev/null | tail -n 1 | cut -d : -f 1)" +test "${nr_groups}" -gt 0 || _notrun "scratch device not big enough for backup superblocks" +backup_sb="$(dumpe2fs -g "${SCRATCH_DEV}" 2> /dev/null | awk -F ':' 'BEGIN {x = 0;} {if (x == 0 && int($3) > 1) {print $3; x++;}}')" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 128`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 64 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +dumpe2fs -g "${SCRATCH_DEV}" 2>/dev/null | awk -F ':' '{if ($1 == 0) {print $3}}' | while read blk; do + debugfs -w -R "zap_block ${blk}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "primary sb fuzz failed" +done + +echo "+ mount image" +_scratch_mount 2> /dev/null && _fail "mount should not succeed" + +echo "+ repair fs" +# Have to specify backup sb and blocksize here so we don't pick up superblocks +# scattered elsewhere on the scratch device. +echo e2fsck -f -y -B "${blksz}" -b "${backup_sb}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +e2fsck -f -y -B "${blksz}" -b "${backup_sb}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + stat "${TESTFILE}.${x}" >> /dev/null 2>&1 + test $? -ne 0 && broken=1 + echo moo | dd oflag=append of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/701.out b/tests/ext4/701.out new file mode 100644 index 0000000..a44edb2 --- /dev/null +++ b/tests/ext4/701.out @@ -0,0 +1,13 @@ +QA output created by 701 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/ext4/702 b/tests/ext4/702 new file mode 100755 index 0000000..60c52f6 --- /dev/null +++ b/tests/ext4/702 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 702 +# +# Create and populate an ext4 filesystem, corrupt a group descriptor, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 +dumpe2fs -g "${SCRATCH_DEV}" > /dev/null 2>&1 || _notrun "dumpe2fs -g not supported" + +echo "+ mount fs image" +_scratch_mount + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 128`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 64 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + echo moo >> "${TESTFILE}.${x}" +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +dumpe2fs -g "${SCRATCH_DEV}" 2>/dev/null | awk -F ':' '{if (int($4) != -1) {print $4}}' | sed -e 's/-.*$//g' | awk '{if (int($1) > 0) {print $1}}' | while read blk; do + debugfs -w -R "zap_block ${blk}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "group descriptor fuzz failed" +done + +echo "+ mount image" +_scratch_mount 2> /dev/null && _fail "mount should not succeed" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/702.out b/tests/ext4/702.out new file mode 100644 index 0000000..66f3b3b --- /dev/null +++ b/tests/ext4/702.out @@ -0,0 +1,10 @@ +QA output created by 702 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ check fs (2) diff --git a/tests/ext4/703 b/tests/ext4/703 new file mode 100755 index 0000000..61fb55b --- /dev/null +++ b/tests/ext4/703 @@ -0,0 +1,113 @@ +#! /bin/bash +# FS QA Test No. 703 +# +# Create and populate an ext4 filesystem, corrupt a block bitmap, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_xfs_io_command "falloc" +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 +dumpe2fs -g "${SCRATCH_DEV}" > /dev/null 2>&1 || _notrun "dumpe2fs -g not supported" +nr_groups="$(dumpe2fs -g "${SCRATCH_DEV}" 2> /dev/null | tail -n 1 | cut -d : -f 1)" + +echo "+ mount fs image" +_scratch_mount +# abuse orlov allocator in the hopes that each bg ends up with some inodes +for i in `seq 1 $((nr_groups * 8))`; do + mkdir -p "${SCRATCH_MNT}/d_${i}" +done +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +freeblks="$(stat -f -c '%a' "${SCRATCH_MNT}")" +$XFS_IO_PROG -f -c "falloc 0 $((blksz * freeblks))" "${SCRATCH_MNT}/bigfile2" >> $seqres.full +umount "${SCRATCH_MNT}" + +echo "+ make some files" +_scratch_mount +rm -rf "${SCRATCH_MNT}/bigfile2" +touch "${SCRATCH_MNT}/bigfile" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +dumpe2fs -g "${SCRATCH_DEV}" 2>/dev/null | awk -F ':' '{if (int($5) > 0) {print $5}}' | while read blk; do + debugfs -w -n -R "zap_block -p 0xff ${blk}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "block bitmap fuzz failed" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +b_bytes="$(stat -c '%B' "${SCRATCH_MNT}/bigfile")" +$XFS_IO_PROG -f -c "falloc 0 $((blksz * freeblks))" "${SCRATCH_MNT}/bigfile" >> $seqres.full 2> /dev/null +after="$(stat -c '%b' "${SCRATCH_MNT}/bigfile")" +echo "$((after * b_bytes))" lt "$((blksz * freeblks / 4))" >> $seqres.full +test "$((after * b_bytes))" -lt "$((blksz * freeblks / 4))" || _fail "falloc should fail" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ modify files (2)" +$XFS_IO_PROG -f -c "falloc 0 $((blksz * freeblks))" "${SCRATCH_MNT}/bigfile" >> $seqres.full +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/703.out b/tests/ext4/703.out new file mode 100644 index 0000000..42ecc84 --- /dev/null +++ b/tests/ext4/703.out @@ -0,0 +1,12 @@ +QA output created by 703 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image (2) ++ modify files (2) ++ check fs (2) diff --git a/tests/ext4/704 b/tests/ext4/704 new file mode 100755 index 0000000..da94317 --- /dev/null +++ b/tests/ext4/704 @@ -0,0 +1,102 @@ +#! /bin/bash +# FS QA Test No. 704 +# +# Create and populate an ext4 filesystem, corrupt an inode bitmap, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 +dumpe2fs -g "${SCRATCH_DEV}" > /dev/null 2>&1 || _notrun "dumpe2fs -g not supported" +resize2fs -M "${SCRATCH_DEV}" >> $seqres.full 2>&1 +nr_groups="$(dumpe2fs -g "${SCRATCH_DEV}" 2> /dev/null | tail -n 1 | cut -d : -f 1)" + +echo "+ mount fs image" +_scratch_mount + +echo "+ make some files" +# abuse orlov allocator in the hopes that each bg ends up with some inodes +for i in `seq 1 $((nr_groups * 8))`; do + mkdir -p "${SCRATCH_MNT}/d_${i}" +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +dumpe2fs -g "${SCRATCH_DEV}" 2>/dev/null | awk -F ':' '{if (int($6) > 0) {print $6}}' | while read blk; do + debugfs -w -n -R "zap_block ${blk}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "inode bitmap fuzz failed" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +touch "${SCRATCH_MNT}/file0" > /dev/null 2>&1 && _fail "touch should fail" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ modify files (2)" +touch "${SCRATCH_MNT}/file1" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/704.out b/tests/ext4/704.out new file mode 100644 index 0000000..e1b0dbd --- /dev/null +++ b/tests/ext4/704.out @@ -0,0 +1,12 @@ +QA output created by 704 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image (2) ++ modify files (2) ++ check fs (2) diff --git a/tests/ext4/705 b/tests/ext4/705 new file mode 100755 index 0000000..11ff98f --- /dev/null +++ b/tests/ext4/705 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 705 +# +# Create and populate an ext4 filesystem, corrupt the MMP block, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 -O mmp -E mmp_update_interval=2 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +echo moo > "${SCRATCH_MNT}/file0" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +blk="$(dumpe2fs "${SCRATCH_DEV}" 2> /dev/null | grep 'MMP block number' | sed -e 's/^MMP block number: *\([0-9]*\)$/\1/g')" +$XFS_IO_PROG -f -c "pwrite -S 0x62 $((blk * blksz + 16)) 8" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount 2> /dev/null && _fail "mount should fail due to bad MMP" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount || _fail "mount should not fail; MMP has been fixed" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/705.out b/tests/ext4/705.out new file mode 100644 index 0000000..60c43ef --- /dev/null +++ b/tests/ext4/705.out @@ -0,0 +1,10 @@ +QA output created by 705 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ check fs (2) diff --git a/tests/ext4/706 b/tests/ext4/706 new file mode 100755 index 0000000..505be41 --- /dev/null +++ b/tests/ext4/706 @@ -0,0 +1,87 @@ +#! /bin/bash +# FS QA Test No. 706 +# +# Create and populate an ext4 filesystem, corrupt the journal, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 -O journal > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +echo moo > "${SCRATCH_MNT}/file0" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +debugfs -w -R 'zap -f <8> 0' "${SCRATCH_DEV}" 2> /dev/null + +echo "+ mount image" +_scratch_mount 2> /dev/null && _fail "mount should fail due to bad journal" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount || _fail "mount should not fail; journal has been fixed" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/706.out b/tests/ext4/706.out new file mode 100644 index 0000000..f919d45 --- /dev/null +++ b/tests/ext4/706.out @@ -0,0 +1,10 @@ +QA output created by 706 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ check fs (2) diff --git a/tests/ext4/group b/tests/ext4/group index dfadd91..d685076 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -18,3 +18,9 @@ 307 auto ioctl rw 308 auto ioctl rw prealloc quick 700 dangerous_fuzzers +701 fuzzers +702 fuzzers +703 fuzzers +704 fuzzers +705 fuzzers +706 fuzzers From darrick.wong@oracle.com Fri Aug 14 20:52:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 417A87F50 for ; Fri, 14 Aug 2015 20:52:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5BBEAC006 for ; Fri, 14 Aug 2015 18:52:35 -0700 (PDT) X-ASG-Debug-ID: 1439603552-04bdf051fc06e50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id aw4cjTDU9rkQQvG0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:32 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qVGq028540 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:31 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qUTh030446 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:30 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qUNu014181; Sat, 15 Aug 2015 01:52:30 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:30 -0700 Subject: [PATCH 4/7] ext4: test file/dir/symlink metadata corruption checking and repair From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 4/7] ext4: test file/dir/symlink metadata corruption checking and repair To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:29 -0700 Message-ID: <20150815015229.4333.87123.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603552 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Targeted fuzzing tests which destroy various pieces of file, directory, and symlink metadata; the tests look for (a) kernel detection of corruption, (b) e2fsck repair of said corruption, and (c) post-repair fs usability. Signed-off-by: Darrick J. Wong --- tests/ext4/707 | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/707.out | 15 ++++++ tests/ext4/708 | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/708.out | 15 ++++++ tests/ext4/709 | 103 +++++++++++++++++++++++++++++++++++++++++++ tests/ext4/709.out | 12 +++++ tests/ext4/710 | 96 ++++++++++++++++++++++++++++++++++++++++ tests/ext4/710.out | 12 +++++ tests/ext4/711 | 99 +++++++++++++++++++++++++++++++++++++++++ tests/ext4/711.out | 12 +++++ tests/ext4/712 | 97 ++++++++++++++++++++++++++++++++++++++++ tests/ext4/712.out | 12 +++++ tests/ext4/713 | 95 +++++++++++++++++++++++++++++++++++++++ tests/ext4/713.out | 11 +++++ tests/ext4/group | 7 +++ 15 files changed, 836 insertions(+) create mode 100755 tests/ext4/707 create mode 100644 tests/ext4/707.out create mode 100755 tests/ext4/708 create mode 100644 tests/ext4/708.out create mode 100755 tests/ext4/709 create mode 100644 tests/ext4/709.out create mode 100755 tests/ext4/710 create mode 100644 tests/ext4/710.out create mode 100755 tests/ext4/711 create mode 100644 tests/ext4/711.out create mode 100755 tests/ext4/712 create mode 100644 tests/ext4/712.out create mode 100755 tests/ext4/713 create mode 100644 tests/ext4/713.out diff --git a/tests/ext4/707 b/tests/ext4/707 new file mode 100755 index 0000000..c62b107 --- /dev/null +++ b/tests/ext4/707 @@ -0,0 +1,126 @@ +#! /bin/bash +# FS QA Test No. 707 +# +# Create and populate an ext4 filesystem, corrupt an inode, then see how +# the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +blk="$(debugfs -R "imap <$inode>" "${SCRATCH_DEV}" 2> /dev/null | grep located | sed -e 's/^.*block \([0-9]*\),.*$/\1/g')" +debugfs -w -R "zap_block ${blk}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "inode fuzz failed" + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 1 64`; do + #test -e "${TESTFILE}.${x}" || continue + stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + echo moo | dd oflag=append of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + echo moo | dd oflag=append of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/707.out b/tests/ext4/707.out new file mode 100644 index 0000000..4cbeaf9 --- /dev/null +++ b/tests/ext4/707.out @@ -0,0 +1,15 @@ +QA output created by 707 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/ext4/708 b/tests/ext4/708 new file mode 100755 index 0000000..24e259b --- /dev/null +++ b/tests/ext4/708 @@ -0,0 +1,124 @@ +#! /bin/bash +# FS QA Test No. 708 +# +# Create and populate an ext4 filesystem, corrupt root directory, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 128`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 64 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +debugfs -w -R "zap -f / 0" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 1 64`; do + #test -e "${TESTFILE}.${x}" || continue + stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + echo moo | dd oflag=append of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 && _fail "e2fsck should not succeed" + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + echo moo | dd oflag=append of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/708.out b/tests/ext4/708.out new file mode 100644 index 0000000..0eb44c0 --- /dev/null +++ b/tests/ext4/708.out @@ -0,0 +1,15 @@ +QA output created by 708 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/ext4/709 b/tests/ext4/709 new file mode 100755 index 0000000..9edfea9 --- /dev/null +++ b/tests/ext4/709 @@ -0,0 +1,103 @@ +#! /bin/bash +# FS QA Test No. 709 +# +# Create and populate an ext4 filesystem, corrupt an extent tree block, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_xfs_io_command "falloc" +_require_xfs_io_command "fpunch" +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +freeblks="$((3 * blksz / 12))" + +echo "+ make some files" +$XFS_IO_PROG -f -c "falloc 0 $((blksz * freeblks))" "${SCRATCH_MNT}/bigfile" >> $seqres.full +seq 1 2 ${freeblks} | while read lblk; do + $XFS_IO_PROG -f -c "fpunch $((lblk * blksz)) ${blksz}" "${SCRATCH_MNT}/bigfile" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +debugfs "${SCRATCH_DEV}" -R 'ex /bigfile' 2> /dev/null | grep '^ 0' | awk '{print $8}' | while read blk; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 $((blk * blksz + 8)) 8" "${SCRATCH_DEV}" >> $seqres.full +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +echo moo >> "${SCRATCH_MNT}/bigfile" 2> /dev/null && _fail "extent tree should be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ modify files (2)" +$XFS_IO_PROG -f -c "pwrite ${blksz} ${blksz}" "${SCRATCH_MNT}/bigfile" >> $seqres.full +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/709.out b/tests/ext4/709.out new file mode 100644 index 0000000..6d8a022 --- /dev/null +++ b/tests/ext4/709.out @@ -0,0 +1,12 @@ +QA output created by 709 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image (2) ++ modify files (2) ++ check fs (2) diff --git a/tests/ext4/710 b/tests/ext4/710 new file mode 100755 index 0000000..e113254 --- /dev/null +++ b/tests/ext4/710 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. 710 +# +# Create and populate an ext4 filesystem, corrupt a dirent block, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount + +echo "+ make some files" +for x in `seq 1 15`; do + mkdir -p "${SCRATCH_MNT}/test/d_${x}" +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +debugfs -w -R "zap -f /test 0" "${SCRATCH_DEV}" 2> /dev/null + +echo "+ mount image" +_scratch_mount + +echo "+ modify dirs" +mkdir -p "${SCRATCH_MNT}/test/newdir" 2> /dev/null && _fail "directory should be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ modify dirs (2)" +mkdir -p "${SCRATCH_MNT}/test/newdir" || _fail "directory should be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/710.out b/tests/ext4/710.out new file mode 100644 index 0000000..6d9b3aa --- /dev/null +++ b/tests/ext4/710.out @@ -0,0 +1,12 @@ +QA output created by 710 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify dirs ++ repair fs ++ mount image (2) ++ modify dirs (2) ++ check fs (2) diff --git a/tests/ext4/711 b/tests/ext4/711 new file mode 100755 index 0000000..06c6a39 --- /dev/null +++ b/tests/ext4/711 @@ -0,0 +1,99 @@ +#! /bin/bash +# FS QA Test No. 711 +# +# Create and populate an ext4 filesystem, corrupt a htree block, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${SCRATCH_MNT}/test/" +for x in `seq 1 $((blksz * 4 / 256))`; do + fname="$(printf "%.255s\n" "$(perl -e "print \"${x}_\" x 500;")")" + touch "${SCRATCH_MNT}/test/${fname}" +done +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +debugfs -w -R "zap -f /test 0" "${SCRATCH_DEV}" 2> /dev/null + +echo "+ mount image" +_scratch_mount + +echo "+ modify dirs" +mkdir -p "${SCRATCH_MNT}/test/newdir" 2> /dev/null && _fail "htree should be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ modify dirs (2)" +mkdir -p "${SCRATCH_MNT}/test/newdir" || _fail "htree should not be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/711.out b/tests/ext4/711.out new file mode 100644 index 0000000..ef1fc8b --- /dev/null +++ b/tests/ext4/711.out @@ -0,0 +1,12 @@ +QA output created by 711 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify dirs ++ repair fs ++ mount image (2) ++ modify dirs (2) ++ check fs (2) diff --git a/tests/ext4/712 b/tests/ext4/712 new file mode 100755 index 0000000..4bd341e --- /dev/null +++ b/tests/ext4/712 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. 712 +# +# Create and populate an ext4 filesystem, corrupt a xattr block, then +# see how the kernel and e2fsck deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +$XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${SCRATCH_MNT}/attrfile" >> $seqres.full +setfattr -n user.key -v "$(perl -e 'print "v" x 300;')" "${SCRATCH_MNT}/attrfile" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +blk="$(debugfs -R 'stat /attrfile' "${SCRATCH_DEV}" 2> /dev/null | grep 'File ACL:' | sed -e 's/^.*File ACL: \([0-9]*\).*Directory.*$/\1/g')" +$XFS_IO_PROG -f -c "pwrite -S 0x62 $((blk * blksz + 20)) 8" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount + +echo "+ modify attrs" +setfattr -n user.newkey -v "$(perl -e 'print "v" x 300;')" "${SCRATCH_MNT}/attrfile" 2> /dev/null && _fail "xattr should be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ modify attrs (2)" +setfattr -n user.newkey -v "$(perl -e 'print "v" x 300;')" "${SCRATCH_MNT}/attrfile" || _fail "xattr should not be corrupt" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/712.out b/tests/ext4/712.out new file mode 100644 index 0000000..3bafe93 --- /dev/null +++ b/tests/ext4/712.out @@ -0,0 +1,12 @@ +QA output created by 712 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify attrs ++ repair fs ++ mount image (2) ++ modify attrs (2) ++ check fs (2) diff --git a/tests/ext4/713 b/tests/ext4/713 new file mode 100755 index 0000000..cf15425 --- /dev/null +++ b/tests/ext4/713 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 713 +# +# Create and populate an ext4 filesystem, corrupt a big symlink, then +# see how the kernel and e2fsck deal with it. (They won't) +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_ext4_crc +_require_attrs + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_ext4 -O journal > /dev/null 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +test "${blksz}" -gt 4096 && blksz=4096 + +echo "+ make some files" +echo "file contents: moo" > "${SCRATCH_MNT}/x" +str="$(perl -e "print './' x $(( (blksz / 2) - 16));")x" +(cd $SCRATCH_MNT; ln -s "${str}" "long_symlink") +cat "${SCRATCH_MNT}/long_symlink" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +echo "+ corrupt image" +debugfs -w -R 'zap -f /long_symlink -p 0x62 0' "${SCRATCH_DEV}" 2> /dev/null + +echo "+ mount image" +_scratch_mount 2> /dev/null +cat "${SCRATCH_MNT}/long_symlink" 2>/dev/null && _fail "symlink should be broken" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +e2fsck -fy "${SCRATCH_DEV}" >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount +cat "${SCRATCH_MNT}/long_symlink" 2>/dev/null && _fail "symlink should be broken" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +e2fsck -fn "${SCRATCH_DEV}" >> $seqres.full 2>&1 || _fail "fsck should not fail" + +status=0 +exit diff --git a/tests/ext4/713.out b/tests/ext4/713.out new file mode 100644 index 0000000..10e7305 --- /dev/null +++ b/tests/ext4/713.out @@ -0,0 +1,11 @@ +QA output created by 713 ++ create scratch fs ++ mount fs image ++ make some files +file contents: moo ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ check fs (2) diff --git a/tests/ext4/group b/tests/ext4/group index d685076..13c8d90 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -24,3 +24,10 @@ 704 fuzzers 705 fuzzers 706 fuzzers +707 fuzzers +708 fuzzers +709 fuzzers +710 fuzzers +711 fuzzers +712 fuzzers +713 fuzzers From darrick.wong@oracle.com Fri Aug 14 20:52:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8E4407F6F for ; Fri, 14 Aug 2015 20:52:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F9198F8033 for ; Fri, 14 Aug 2015 18:52:43 -0700 (PDT) X-ASG-Debug-ID: 1439603559-04cb6c594606a80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4CRtwkEJhiAm1IDN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qbPR028582 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:38 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qbfg017847 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:37 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qbmM001854; Sat, 15 Aug 2015 01:52:37 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:37 -0700 Subject: [PATCH 5/7] xfs: test allocation group metadata corruption checking and repair From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/7] xfs: test allocation group metadata corruption checking and repair To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:35 -0700 Message-ID: <20150815015235.4333.4974.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603559 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Targeted fuzzing tests which destroy various pieces of filesystem or allocation group metadata; the tests look for (a) kernel detection of corruption, (b) xfs_repair repair of said corruption, and (c) post-repair fs usability. Signed-off-by: Darrick J. Wong --- common/rc | 11 ++++ tests/xfs/701 | 115 +++++++++++++++++++++++++++++++++++++++++ tests/xfs/701.out | 13 +++++ tests/xfs/702 | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/702.out | 20 +++++++ tests/xfs/703 | 124 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/703.out | 15 +++++ tests/xfs/704 | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/704.out | 20 +++++++ tests/xfs/705 | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/705.out | 20 +++++++ tests/xfs/706 | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/706.out | 20 +++++++ tests/xfs/707 | 124 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/707.out | 15 +++++ tests/xfs/708 | 127 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/708.out | 15 +++++ tests/xfs/709 | 118 +++++++++++++++++++++++++++++++++++++++++++ tests/xfs/709.out | 13 +++++ tests/xfs/group | 9 +++ 20 files changed, 1366 insertions(+) create mode 100755 tests/xfs/701 create mode 100644 tests/xfs/701.out create mode 100755 tests/xfs/702 create mode 100644 tests/xfs/702.out create mode 100755 tests/xfs/703 create mode 100644 tests/xfs/703.out create mode 100755 tests/xfs/704 create mode 100644 tests/xfs/704.out create mode 100755 tests/xfs/705 create mode 100644 tests/xfs/705.out create mode 100755 tests/xfs/706 create mode 100644 tests/xfs/706.out create mode 100755 tests/xfs/707 create mode 100644 tests/xfs/707.out create mode 100755 tests/xfs/708 create mode 100644 tests/xfs/708.out create mode 100755 tests/xfs/709 create mode 100644 tests/xfs/709.out diff --git a/common/rc b/common/rc index f889103..1e7e47b 100644 --- a/common/rc +++ b/common/rc @@ -1409,6 +1409,17 @@ _require_scratch_ext4_crc() umount $SCRATCH_MNT } +# this test requires the xfs kernel support crc feature on scratch device +# +_require_scratch_xfs_crc() +{ + _scratch_mkfs_xfs >/dev/null 2>&1 + _scratch_mount >/dev/null 2>&1 \ + || _notrun "Kernel doesn't support crc feature" + xfs_info $SCRATCH_MNT | grep -q 'crc=1' || _notrun "crc feature not supported by this filesystem" + umount $SCRATCH_MNT +} + # this test requires the bigalloc feature to be available in mkfs.ext4 # _require_ext4_mkfs_bigalloc() diff --git a/tests/xfs/701 b/tests/xfs/701 new file mode 100755 index 0000000..00f2a46 --- /dev/null +++ b/tests/xfs/701 @@ -0,0 +1,115 @@ +#! /bin/bash +# FS QA Test No. 701 +# +# Create and populate an XFS filesystem, corrupt a superblock, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +$XFS_IO_PROG -f -c "pwrite -S 0x62 32 4" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount 2>/dev/null && _fail "mount should not succeed" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + echo moo | dd oflag=append conv=notrunc of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/701.out b/tests/xfs/701.out new file mode 100644 index 0000000..a44edb2 --- /dev/null +++ b/tests/xfs/701.out @@ -0,0 +1,13 @@ +QA output created by 701 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/702 b/tests/xfs/702 new file mode 100755 index 0000000..1cbc3e9 --- /dev/null +++ b/tests/xfs/702 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 702 +# +# Create and populate an XFS filesystem, corrupt an AGF, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +test "${agcount}" -gt 1 || _notrun "Single-AG XFS not supported" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/702.out b/tests/xfs/702.out new file mode 100644 index 0000000..e44c454 --- /dev/null +++ b/tests/xfs/702.out @@ -0,0 +1,20 @@ +QA output created by 702 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/703 b/tests/xfs/703 new file mode 100755 index 0000000..459d80b --- /dev/null +++ b/tests/xfs/703 @@ -0,0 +1,124 @@ +#! /bin/bash +# FS QA Test No. 703 +# +# Create and populate an XFS filesystem, corrupt the AGI, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/703.out b/tests/xfs/703.out new file mode 100644 index 0000000..76ba47c --- /dev/null +++ b/tests/xfs/703.out @@ -0,0 +1,15 @@ +QA output created by 703 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/704 b/tests/xfs/704 new file mode 100755 index 0000000..9370463 --- /dev/null +++ b/tests/xfs/704 @@ -0,0 +1,146 @@ +#! /bin/bash +# FS QA Test No. 704 +# +# Create and populate an XFS filesystem, corrupt the AGFL, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agfl ${ag}" -c "agfl ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/704.out b/tests/xfs/704.out new file mode 100644 index 0000000..14871e5 --- /dev/null +++ b/tests/xfs/704.out @@ -0,0 +1,20 @@ +QA output created by 704 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/705 b/tests/xfs/705 new file mode 100755 index 0000000..b5c3eb0 --- /dev/null +++ b/tests/xfs/705 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 705 +# +# Create and populate an XFS filesystem, corrupt the bnobt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr bnoroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +ls -la "${TESTDIR}" >> $seqres.full +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/705.out b/tests/xfs/705.out new file mode 100644 index 0000000..4288234 --- /dev/null +++ b/tests/xfs/705.out @@ -0,0 +1,20 @@ +QA output created by 705 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/706 b/tests/xfs/706 new file mode 100755 index 0000000..1aa2d57 --- /dev/null +++ b/tests/xfs/706 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 706 +# +# Create and populate an XFS filesystem, corrupt the cntbt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr cntroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +ls -la "${TESTDIR}" >> $seqres.full +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/706.out b/tests/xfs/706.out new file mode 100644 index 0000000..0051a92 --- /dev/null +++ b/tests/xfs/706.out @@ -0,0 +1,20 @@ +QA output created by 706 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/707 b/tests/xfs/707 new file mode 100755 index 0000000..1107714 --- /dev/null +++ b/tests/xfs/707 @@ -0,0 +1,124 @@ +#! /bin/bash +# FS QA Test No. 707 +# +# Create and populate an XFS filesystem, corrupt the inobt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/707.out b/tests/xfs/707.out new file mode 100644 index 0000000..4cbeaf9 --- /dev/null +++ b/tests/xfs/707.out @@ -0,0 +1,15 @@ +QA output created by 707 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/708 b/tests/xfs/708 new file mode 100755 index 0000000..a9a3710 --- /dev/null +++ b/tests/xfs/708 @@ -0,0 +1,127 @@ +#! /bin/bash +# FS QA Test No. 708 +# +# Create and populate an XFS filesystem, corrupt the finobt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_xfs_mkfs_finobt +_require_xfs_finobt +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +xfs_info "${SCRATCH_MNT}" | grep -q "finobt=1" || _notrun "finobt not enabled" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr free_root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/708.out b/tests/xfs/708.out new file mode 100644 index 0000000..0eb44c0 --- /dev/null +++ b/tests/xfs/708.out @@ -0,0 +1,15 @@ +QA output created by 708 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/709 b/tests/xfs/709 new file mode 100755 index 0000000..33192f8 --- /dev/null +++ b/tests/xfs/709 @@ -0,0 +1,118 @@ +#! /bin/bash +# FS QA Test No. 709 +# +# Create and populate an XFS filesystem, corrupt the journal, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +logstart="$($XFS_DB_PROG -c 'sb 0' -c 'p' "${SCRATCH_DEV}" | grep '^logstart =' | cut -d ' ' -f 3)" +logstart="$($XFS_DB_PROG -c "convert fsblock ${logstart} byte" "${SCRATCH_DEV}" | sed -e 's/^.*(\([0-9]*\).*$/\1/g')" +logblocks="$(xfs_db -c 'sb 0' -c 'p' "${SCRATCH_DEV}" | grep '^logblocks =' | cut -d ' ' -f 3)" +$XFS_IO_PROG -f -c "pwrite -S 0x62 ${logstart} $((logblocks * blksz))" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount 2>/dev/null && _fail "mount should not succeed" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + echo moo | dd oflag=append conv=notrunc of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/709.out b/tests/xfs/709.out new file mode 100644 index 0000000..6badb94 --- /dev/null +++ b/tests/xfs/709.out @@ -0,0 +1,13 @@ +QA output created by 709 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/group b/tests/xfs/group index 140df27..bdd0bb0 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -198,3 +198,12 @@ 304 auto quick quota 305 auto quota 700 dangerous_fuzzers +701 fuzzers +702 fuzzers +703 fuzzers +704 fuzzers +705 fuzzers +706 fuzzers +707 fuzzers +708 fuzzers +709 fuzzers From darrick.wong@oracle.com Fri Aug 14 20:52:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A9D907F82 for ; Fri, 14 Aug 2015 20:52:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C3578F8039 for ; Fri, 14 Aug 2015 18:52:49 -0700 (PDT) X-ASG-Debug-ID: 1439603566-04cbb078e406a70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Xxzc8tDz9IlroNMt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:46 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qj2n028631 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:45 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qirq005552 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:45 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qiXC020273; Sat, 15 Aug 2015 01:52:44 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:43 -0700 Subject: [PATCH 6/7] xfs: test directory metadata corruption checking and repair From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 6/7] xfs: test directory metadata corruption checking and repair To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:42 -0700 Message-ID: <20150815015242.4333.10512.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603566 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Targeted fuzzing tests which destroy various pieces of directory metadata; the tests look for (a) kernel detection of corruption, (b) xfs_repair repair of said corruption, and (c) post-repair fs usability. Signed-off-by: Darrick J. Wong --- tests/xfs/710 | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/710.out | 14 ++++++ tests/xfs/711 | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/711.out | 14 ++++++ tests/xfs/712 | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/712.out | 14 ++++++ tests/xfs/713 | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/713.out | 14 ++++++ tests/xfs/714 | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/714.out | 14 ++++++ tests/xfs/715 | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/715.out | 14 ++++++ tests/xfs/716 | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/716.out | 14 ++++++ tests/xfs/group | 7 +++ 15 files changed, 911 insertions(+) create mode 100755 tests/xfs/710 create mode 100644 tests/xfs/710.out create mode 100755 tests/xfs/711 create mode 100644 tests/xfs/711.out create mode 100755 tests/xfs/712 create mode 100644 tests/xfs/712.out create mode 100755 tests/xfs/713 create mode 100644 tests/xfs/713.out create mode 100755 tests/xfs/714 create mode 100644 tests/xfs/714.out create mode 100755 tests/xfs/715 create mode 100644 tests/xfs/715.out create mode 100755 tests/xfs/716 create mode 100644 tests/xfs/716.out diff --git a/tests/xfs/710 b/tests/xfs/710 new file mode 100755 index 0000000..11c91fe --- /dev/null +++ b/tests/xfs/710 @@ -0,0 +1,111 @@ +#! /bin/bash +# FS QA Test No. 710 +# +# Create and populate an XFS filesystem, corrupt a block directory, then see +# how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((dblksz / 40))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" block + +echo "+ corrupt dir" +$XFS_DB_PROG -x -c "inode ${inode}" -c 'dblock 0' -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/710.out b/tests/xfs/710.out new file mode 100644 index 0000000..d8b5681 --- /dev/null +++ b/tests/xfs/710.out @@ -0,0 +1,14 @@ +QA output created by 710 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/711 b/tests/xfs/711 new file mode 100755 index 0000000..7efcccf --- /dev/null +++ b/tests/xfs/711 @@ -0,0 +1,116 @@ +#! /bin/bash +# FS QA Test No. 711 +# +# Create and populate an XFS filesystem, corrupt a leaf directory's data +# extent, then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((dblksz / 12))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" leaf + +echo "+ corrupt dir" +loff=0 +while true; do + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + loff="$((loff + 1))" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/711.out b/tests/xfs/711.out new file mode 100644 index 0000000..d8edca0 --- /dev/null +++ b/tests/xfs/711.out @@ -0,0 +1,14 @@ +QA output created by 711 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/712 b/tests/xfs/712 new file mode 100755 index 0000000..61b22d2 --- /dev/null +++ b/tests/xfs/712 @@ -0,0 +1,111 @@ +#! /bin/bash +# FS QA Test No. 712 +# +# Create and populate an XFS filesystem, corrupt a leaf directory's leaf +# extent, then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((dblksz / 12))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" leaf + +echo "+ corrupt dir" +$XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${leaf_lblk}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/712.out b/tests/xfs/712.out new file mode 100644 index 0000000..c1df4c8 --- /dev/null +++ b/tests/xfs/712.out @@ -0,0 +1,14 @@ +QA output created by 712 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/713 b/tests/xfs/713 new file mode 100755 index 0000000..4afeeac --- /dev/null +++ b/tests/xfs/713 @@ -0,0 +1,116 @@ +#! /bin/bash +# FS QA Test No. 713 +# +# Create and populate an XFS filesystem, corrupt a node directory's data +# extent, then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((16 * dblksz / 40))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" true +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" node + +echo "+ corrupt dir" +loff=0 +while true; do + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + loff="$((loff + 1))" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/713.out b/tests/xfs/713.out new file mode 100644 index 0000000..22f1de1 --- /dev/null +++ b/tests/xfs/713.out @@ -0,0 +1,14 @@ +QA output created by 713 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/714 b/tests/xfs/714 new file mode 100755 index 0000000..488bb7c --- /dev/null +++ b/tests/xfs/714 @@ -0,0 +1,116 @@ +#! /bin/bash +# FS QA Test No. 714 +# +# Create and populate an XFS filesystem, corrupt a node directory's leaf +# extent, then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((16 * dblksz / 40))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" true +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" node + +echo "+ corrupt dir" +loff="${leaf_lblk}" +while true; do + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + loff="$((loff + 1))" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/714.out b/tests/xfs/714.out new file mode 100644 index 0000000..c280b7b --- /dev/null +++ b/tests/xfs/714.out @@ -0,0 +1,14 @@ +QA output created by 714 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/715 b/tests/xfs/715 new file mode 100755 index 0000000..7121ca9 --- /dev/null +++ b/tests/xfs/715 @@ -0,0 +1,120 @@ +#! /bin/bash +# FS QA Test No. 715 +# +# Create and populate an XFS filesystem, corrupt a node directory's freeindex +# extent, then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((16 * dblksz / 40))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" true +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" node + +echo "+ corrupt dir" +loff="${node_lblk}" +while true; do + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + loff="$((loff + 1))" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +if [ $? -eq 2 ]; then + _scratch_mount + umount "${SCRATCH_MNT}" + _scratch_xfs_repair >> $seqres.full 2>&1 +fi + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/715.out b/tests/xfs/715.out new file mode 100644 index 0000000..c5b733a --- /dev/null +++ b/tests/xfs/715.out @@ -0,0 +1,14 @@ +QA output created by 715 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/716 b/tests/xfs/716 new file mode 100755 index 0000000..7a309c5 --- /dev/null +++ b/tests/xfs/716 @@ -0,0 +1,116 @@ +#! /bin/bash +# FS QA Test No. 716 +# +# Create and populate an XFS filesystem, corrupt a btree directory's data +# extent, then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +dblksz="$(xfs_info "${SCRATCH_MNT}" | grep naming.*bsize | sed -e 's/^.*bsize=//g' -e 's/\([0-9]*\).*$/\1/g')" +nr="$((128 * dblksz / 40))" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +__populate_create_dir "${SCRATCH_MNT}/blockdir" "${nr}" true +inode="$(stat -c '%i' "${SCRATCH_MNT}/blockdir")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check dir" +__populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" btree + +echo "+ corrupt dir" +loff=0 +while true; do + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + loff="$((loff + 1))" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify dir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" 2> /dev/null && _fail "modified corrupt directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" 2> /dev/null && _fail "add to corrupt directory" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify dir (2)" +mkdir -p "${SCRATCH_MNT}/blockdir" +rm -rf "${SCRATCH_MNT}/blockdir/00000000" || _fail "couldn't modify repaired directory" +mkdir "${SCRATCH_MNT}/blockdir/xxxxxxxx" || _fail "add to repaired directory" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/716.out b/tests/xfs/716.out new file mode 100644 index 0000000..36e3fca --- /dev/null +++ b/tests/xfs/716.out @@ -0,0 +1,14 @@ +QA output created by 716 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check dir ++ corrupt dir ++ mount image ++ modify dir ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify dir (2) ++ check fs (2) diff --git a/tests/xfs/group b/tests/xfs/group index bdd0bb0..8e4f8b7 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -207,3 +207,10 @@ 707 fuzzers 708 fuzzers 709 fuzzers +710 fuzzers +711 fuzzers +712 fuzzers +713 fuzzers +714 fuzzers +715 fuzzers +716 fuzzers From darrick.wong@oracle.com Fri Aug 14 20:52:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C31A37F51 for ; Fri, 14 Aug 2015 20:52:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5EF40304039 for ; Fri, 14 Aug 2015 18:52:57 -0700 (PDT) X-ASG-Debug-ID: 1439603574-04bdf051fb06e70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Zs22QMRL4MsMfyiE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Aug 2015 18:52:54 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7F1qqNc028664 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 Aug 2015 01:52:53 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qqBO018206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 15 Aug 2015 01:52:52 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7F1qpHS020385; Sat, 15 Aug 2015 01:52:51 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 14 Aug 2015 18:52:51 -0700 Subject: [PATCH 7/7] xfs: test file/symlink metadata corruption checking and repair From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 7/7] xfs: test file/symlink metadata corruption checking and repair To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-ext4@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Fri, 14 Aug 2015 18:52:49 -0700 Message-ID: <20150815015249.4333.56792.stgit@birch.djwong.org> In-Reply-To: <20150815015200.4333.9278.stgit@birch.djwong.org> References: <20150815015200.4333.9278.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439603574 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Targeted fuzzing tests which destroy various pieces of file and symlink metadata; the tests look for (a) kernel detection of corruption, (b) xfs_repair repair of said corruption, and (c) post-repair fs usability. Signed-off-by: Darrick J. Wong --- tests/xfs/717 | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/717.out | 15 ++++++ tests/xfs/718 | 111 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/718.out | 13 +++++ tests/xfs/719 | 96 +++++++++++++++++++++++++++++++++++++++ tests/xfs/719.out | 11 ++++ tests/xfs/720 | 114 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/720.out | 14 ++++++ tests/xfs/721 | 114 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/721.out | 14 ++++++ tests/xfs/722 | 118 +++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/722.out | 14 ++++++ tests/xfs/group | 6 ++ 13 files changed, 772 insertions(+) create mode 100755 tests/xfs/717 create mode 100644 tests/xfs/717.out create mode 100755 tests/xfs/718 create mode 100644 tests/xfs/718.out create mode 100755 tests/xfs/719 create mode 100644 tests/xfs/719.out create mode 100755 tests/xfs/720 create mode 100644 tests/xfs/720.out create mode 100755 tests/xfs/721 create mode 100644 tests/xfs/721.out create mode 100755 tests/xfs/722 create mode 100644 tests/xfs/722.out diff --git a/tests/xfs/717 b/tests/xfs/717 new file mode 100755 index 0000000..ffc0c4e --- /dev/null +++ b/tests/xfs/717 @@ -0,0 +1,132 @@ +#! /bin/bash +# FS QA Test No. 717 +# +# Create and populate an XFS filesystem, corrupt an inode, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +seq "${inode}" "$((inode + 64))" | while read ino; do + $XFS_DB_PROG -x -c "inode ${ino}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 1 64`; do + stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + touch "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + echo "test ${x}" >> $seqres.full + stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + touch "${TESTFILE}.${x}" >> $seqres.full 2>&1 + test $? -ne 0 && broken=1 + echo "${x}: broken=${broken}" >> $seqres.full +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/717.out b/tests/xfs/717.out new file mode 100644 index 0000000..6446bb7 --- /dev/null +++ b/tests/xfs/717.out @@ -0,0 +1,15 @@ +QA output created by 717 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/718 b/tests/xfs/718 new file mode 100755 index 0000000..99519d2 --- /dev/null +++ b/tests/xfs/718 @@ -0,0 +1,111 @@ +#! /bin/bash +# FS QA Test No. 718 +# +# Create and populate an XFS filesystem, corrupt the bmbt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +nr="$((blksz * 2 / 16))" + +echo "+ make some files" +$XFS_IO_PROG -f -c "pwrite -S 0x62 0 $((blksz * nr))" -c 'fsync' "${SCRATCH_MNT}/bigfile" >> $seqres.full +for i in $(seq 1 2 ${nr}); do + $XFS_IO_PROG -f -c "fpunch $((i * blksz)) ${blksz}" "${SCRATCH_MNT}/bigfile" >> $seqres.full +done +inode="$(stat -c '%i' "${SCRATCH_MNT}/bigfile")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +$XFS_DB_PROG -x -c "inode ${inode}" -c "addr u.bmbt.ptrs[1]" -c "addr u3.bmbt.ptrs[1]" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +before="$(stat -c '%b' "${SCRATCH_MNT}/bigfile")" +$XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" -c 'fsync' "${SCRATCH_MNT}/bigfile" >> $seqres.full 2> /dev/null +after="$(stat -c '%b' "${SCRATCH_MNT}/bigfile")" +test "${before}" -eq "${after}" || _fail "pwrite should fail on corrupt bmbt" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +touch "${SCRATCH_MNT}/bigfile" +before="$(stat -c '%b' "${SCRATCH_MNT}/bigfile")" +$XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" -c 'fsync' "${SCRATCH_MNT}/bigfile" >> $seqres.full 2> /dev/null +after="$(stat -c '%b' "${SCRATCH_MNT}/bigfile")" +test "${before}" -ne "${after}" || _fail "pwrite failed after fixing corrupt bmbt" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/718.out b/tests/xfs/718.out new file mode 100644 index 0000000..0b53f4d --- /dev/null +++ b/tests/xfs/718.out @@ -0,0 +1,13 @@ +QA output created by 718 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) ++ check fs (2) diff --git a/tests/xfs/719 b/tests/xfs/719 new file mode 100755 index 0000000..459889e --- /dev/null +++ b/tests/xfs/719 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. 719 +# +# Create and populate an XFS filesystem, corrupt a long symlink, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz=1000 + +echo "+ make some files" +echo "file contents: moo" > "${SCRATCH_MNT}/x" +str="$(perl -e "print './' x $(( (blksz / 2) - 16));")x" +(cd $SCRATCH_MNT; ln -s "${str}" "long_symlink") +cat "${SCRATCH_MNT}/long_symlink" +inode="$(stat -c '%i' "${SCRATCH_MNT}/long_symlink")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +$XFS_DB_PROG -x -c "inode ${inode}" -c "dblock 0" -c "stack" -c "blocktrash -x 32 -o 256 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount +cat "${SCRATCH_MNT}/long_symlink" 2>/dev/null && _fail "symlink should be broken" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount +cat "${SCRATCH_MNT}/long_symlink" 2>/dev/null && _fail "symlink should be broken" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/719.out b/tests/xfs/719.out new file mode 100644 index 0000000..bb64ddd --- /dev/null +++ b/tests/xfs/719.out @@ -0,0 +1,11 @@ +QA output created by 719 ++ create scratch fs ++ mount fs image ++ make some files +file contents: moo ++ check fs ++ corrupt image ++ mount image ++ repair fs ++ mount image (2) ++ check fs (2) diff --git a/tests/xfs/720 b/tests/xfs/720 new file mode 100755 index 0000000..ad4cad3 --- /dev/null +++ b/tests/xfs/720 @@ -0,0 +1,114 @@ +#! /bin/bash +# FS QA Test No. 720 +# +# Create and populate an XFS filesystem, corrupt a block xattr, then see +# how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +nr="$((blksz / 40))" +leaf_lblk="$((32 * 1073741824 / blksz))" +node_lblk="$((64 * 1073741824 / blksz))" + +echo "+ make some files" +touch "${SCRATCH_MNT}/attrfile" +seq 0 "${nr}" | while read d; do + setfattr -n "user.x$(printf "%.08d" "$d")" -v "0000000000000000" "${SCRATCH_MNT}/attrfile" +done +inode="$(stat -c '%i' "${SCRATCH_MNT}/attrfile")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check xattr" +$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a block xattr (data)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${leaf_lblk}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' || _fail "failed to create a block xattr (leaf)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${node_lblk}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' || _fail "failed to create a block xattr (free)" + +echo "+ corrupt xattr" +$XFS_DB_PROG -x -c "inode ${inode}" -c 'ablock 0' -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount + +echo "+ modify xattr" +setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" 2> /dev/null && _fail "modified corrupt xattr" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify xattr (2)" +getfattr "${SCRATCH_MNT}/attrfile" -n "user.x00000000" > /dev/null 2>&1 && (setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" || _fail "remove corrupt xattr") +setfattr -n "user.x00000000" -v 'x0x0x0x0' "${SCRATCH_MNT}/attrfile" || _fail "add corrupt xattr" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/720.out b/tests/xfs/720.out new file mode 100644 index 0000000..4110f66 --- /dev/null +++ b/tests/xfs/720.out @@ -0,0 +1,14 @@ +QA output created by 720 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check xattr ++ corrupt xattr ++ mount image ++ modify xattr ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify xattr (2) ++ check fs (2) diff --git a/tests/xfs/721 b/tests/xfs/721 new file mode 100755 index 0000000..ec87139 --- /dev/null +++ b/tests/xfs/721 @@ -0,0 +1,114 @@ +#! /bin/bash +# FS QA Test No. 721 +# +# Create and populate an XFS filesystem, corrupt a leaf xattr's index extent, +# then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +nr="$((8 * blksz / 40))" + +echo "+ make some files" +touch "${SCRATCH_MNT}/attrfile" +seq 0 "${nr}" | while read d; do + setfattr -n "user.x$(printf "%.08d" "$d")" -v "0000000000000000" "${SCRATCH_MNT}/attrfile" +done +seq 1 2 "${nr}" | while read d; do + setfattr -x "user.x$(printf "%.08d" "$d")" "${SCRATCH_MNT}/attrfile" +done +inode="$(stat -c '%i' "${SCRATCH_MNT}/attrfile")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check xattr" +$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)" + +echo "+ corrupt xattr" +$XFS_DB_PROG -x -c "inode ${inode}" -c 'ablock 0' -c "stack" -c "blocktrash -x 32 -o +32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount + +echo "+ modify xattr" +setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" 2> /dev/null && _fail "modified corrupt xattr" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify xattr (2)" +setfattr -n "user.x00000000" -v "1111111111111111" "${SCRATCH_MNT}/attrfile" || _fail "modified corrupt xattr" +setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" || _fail "delete corrupt xattr" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/721.out b/tests/xfs/721.out new file mode 100644 index 0000000..2098e75 --- /dev/null +++ b/tests/xfs/721.out @@ -0,0 +1,14 @@ +QA output created by 721 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check xattr ++ corrupt xattr ++ mount image ++ modify xattr ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify xattr (2) ++ check fs (2) diff --git a/tests/xfs/722 b/tests/xfs/722 new file mode 100755 index 0000000..f2d7192 --- /dev/null +++ b/tests/xfs/722 @@ -0,0 +1,118 @@ +#! /bin/bash +# FS QA Test No. 722 +# +# Create and populate an XFS filesystem, corrupt a leaf xattr's data extent, +# then see how the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" +nr="$((8 * blksz / 40))" + +echo "+ make some files" +touch "${SCRATCH_MNT}/attrfile" +seq 0 "${nr}" | while read d; do + setfattr -n "user.x$(printf "%.08d" "$d")" -v "0000000000000000" "${SCRATCH_MNT}/attrfile" +done +seq 1 2 "${nr}" | while read d; do + setfattr -x "user.x$(printf "%.08d" "$d")" "${SCRATCH_MNT}/attrfile" +done +inode="$(stat -c '%i' "${SCRATCH_MNT}/attrfile")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ check xattr" +$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)" + +echo "+ corrupt xattr" +loff=1 +while true; do + $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + loff="$((loff + 1))" +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify xattr" +setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" 2> /dev/null && _fail "modified corrupt xattr" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify xattr (2)" +getfattr "${SCRATCH_MNT}/attrfile" -n "user.x00000000" 2> /dev/null && (setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" || _fail "modified corrupt xattr") +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/722.out b/tests/xfs/722.out new file mode 100644 index 0000000..d482a60 --- /dev/null +++ b/tests/xfs/722.out @@ -0,0 +1,14 @@ +QA output created by 722 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ check xattr ++ corrupt xattr ++ mount image ++ modify xattr ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify xattr (2) ++ check fs (2) diff --git a/tests/xfs/group b/tests/xfs/group index 8e4f8b7..1510251 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -214,3 +214,9 @@ 714 fuzzers 715 fuzzers 716 fuzzers +717 fuzzers +718 fuzzers +719 fuzzers +720 fuzzers +721 fuzzers +722 fuzzers From roger@filmlight.ltd.uk Sat Aug 15 07:28:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 239A77F3F for ; Sat, 15 Aug 2015 07:28:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0BC4E304032 for ; Sat, 15 Aug 2015 05:28:36 -0700 (PDT) X-ASG-Debug-ID: 1439641704-04cbb078e3112d0001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id dMkAzq7GVE9U97w8 for ; Sat, 15 Aug 2015 05:28:25 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 2BE0F88802E; Sat, 15 Aug 2015 13:28:23 +0100 (BST) Content-Type: multipart/mixed; boundary="Apple-Mail=_BD97A2A9-D1FA-4531-8CAC-6CED9AA0264E" Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: XFS File system in trouble From: Roger Willcocks X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55CE75CA.5070506@mygrande.net> Date: Sat, 15 Aug 2015 13:28:35 +0100 Cc: Roger Willcocks , Dave Chinner , "Rhorer, Leslie" , Brian Foster , Kris Rusocki , Eric Sandeen , "xfs@oss.sgi.com" Message-Id: <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> To: Leslie Rhorer X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439641704 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21620 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Apple-Mail=_BD97A2A9-D1FA-4531-8CAC-6CED9AA0264E Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii xfs_repair 3.2.1 runs cleanly. xfs_repair 3.1.1 complains about a load of stuff, including: bad version number 0x3 on inode 124656869424 bad version number 0x3 on inode 124656869424, would reset version number and entry "Rocket 2722" in shortform directory 90328125499 references = non-existent inode 98915770424 would have junked entry "Rocket 2722" in directory inode 90328125499 --Apple-Mail=_BD97A2A9-D1FA-4531-8CAC-6CED9AA0264E Content-Disposition: attachment; filename=xfs_repair-3.1.1.txt Content-Type: text/plain; name="xfs_repair-3.1.1.txt" Content-Transfer-Encoding: quoted-printable Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... non-null user quota inode field in superblock 5 would reset bad sb for ag 5 bad uncorrected agheader 5, skipping ag... non-null user quota inode field in superblock 10 would reset bad sb for ag 10 bad uncorrected agheader 10, skipping ag... non-null user quota inode field in superblock 18 would reset bad sb for ag 18 bad uncorrected agheader 18, skipping ag... non-null user quota inode field in superblock 23 would reset bad sb for ag 23 bad uncorrected agheader 23, skipping ag... sb_icount 42368, counted 37184 sb_ifree 6598, counted 5799 sb_fdblocks 2324648299, counted 2025095064 - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - agno =3D 15 - agno =3D 16 - agno =3D 17 - agno =3D 18 - agno =3D 19 - agno =3D 20 - agno =3D 21 - agno =3D 22 - agno =3D 23 - agno =3D 24 - agno =3D 25 - agno =3D 26 - agno =3D 27 - agno =3D 28 - agno =3D 29 bad version number 0x3 on inode 124656869424 bad version number 0x3 on inode 124656869424, would reset version number - agno =3D 30 - agno =3D 31 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 29 - agno =3D 31 - agno =3D 5 entry "VIDEO_TS" in shortform directory 133143990276 references = non-existent inode 21474840587 would have junked entry "VIDEO_TS" in directory inode 133143990276 would have corrected i8 count in directory 133143990276 from 7 to 6 - agno =3D 7 - agno =3D 14 - agno =3D 15 entry "Downloads" at block 0 offset 72 in directory inode 30064775168 = references non-existent inode 43037696048 would clear inode number in entry at offset 72... entry "Plugins" at block 0 offset 360 in directory inode 30064775168 = references non-existent inode 98806263846 entry "AUDIO_TS" in shortform directory 64424513539 references = non-existent inode 77309415427 would have junked entry "AUDIO_TS" in directory inode 64424513539 - agno =3D 10 - agno =3D 27 entry "Christmas" at block 0 offset 144 in directory inode 12884905984 = references non-existent inode 98784251946 would clear inode number in entry at offset 144... - agno =3D 28 - agno =3D 23 - agno =3D 22 entry ".." at block 0 offset 32 in directory inode 120259088386 = references non-existent inode 77309415426 - agno =3D 13 entry "DOWNTON_ABBEY_D1" at block 0 offset 48 in directory inode = 94489284608 references non-existent inode 77309415426 would clear inode number in entry at offset 48... - agno =3D 24 - agno =3D 18 entry "VIDEO_TS" in shortform directory 103079219201 references = non-existent inode 21474840632 entry "The Greatest Hits" in shortform directory 133143990305 references = non-existent inode 21507739691 - agno =3D 25 would have junked entry "The Greatest Hits" in directory inode = 133143990305 entry "Photos" at block 0 offset 152 in directory inode 4096 references = non-existent inode 21474840576 - agno =3D 26 - agno =3D 21 - agno =3D 30 entry "OriginalIFOs" at block 0 offset 48 in directory inode 17179873282 = references non-existent inode 21474840578 would clear inode number in entry at offset 48... entry "Twilight Zone Vol 06" at block 0 offset 112 in directory inode = 90194317313 references non-existent inode 43006791684 would clear inode number in entry at offset 112... entry "OriginalIFOs" at block 0 offset 48 in directory inode 17179873284 = references non-existent inode 21474840580 would clear inode number in entry at offset 48... entry "VIDEO_TS" in shortform directory 8589938690 references = non-existent inode 42949677058 - agno =3D 6 - agno =3D 8 - agno =3D 12 entry "Cricket" in shortform directory 34359742464 references = non-existent inode 99184005151 would clear inode number in entry at offset 360... - agno =3D 9 - agno =3D 20 entry "Symantec" in shortform directory 124571324436 references = non-existent inode 21552037911 entry "Good & Better" at block 0 offset 328 in directory inode = 12884905984 references non-existent inode 21758378088 would have junked entry "VIDEO_TS" in directory inode 8589938690 would have corrected i8 count in directory 8589938690 from 2 to 1 - agno =3D 19 entry "Back to the Future" at block 0 offset 104 in directory inode = 25769807872 references non-existent inode 21552037922 would clear inode number in entry at offset 104... would clear inode number in entry at offset 32... - agno =3D 11 entry "Bourne, Jason" at block 0 offset 232 in directory inode = 25769807872 references non-existent inode 43037630470 would clear inode number in entry at offset 232... entry "DOWNTON_ABBEY_S2_D3" at block 0 offset 208 in directory inode = 94489284608 references non-existent inode 98784251906 - agno =3D 16 entry "Crocodile Dundee" at block 0 offset 432 in directory inode = 25769807872 references non-existent inode 77370851391 would have junked entry "VIDEO_TS" in directory inode 103079219201 entry ".." at block 0 offset 32 in directory inode 47244644354 = references non-existent inode 42949677058 would clear inode number in entry at offset 432... entry "VIDEO_TS" in shortform directory 107374186498 references = non-existent inode 42949677059 would clear inode number in entry at offset 152... entry "Connie" in shortform directory 4355010569 references non-existent = inode 21552037921 entry ".." at block 0 offset 32 in directory inode 60129546242 = references non-existent inode 77309415424 would clear inode number in entry at offset 32... entry "Ray" at block 0 offset 2152 in directory inode 30064775168 = references non-existent inode 43037630473 would have corrected i8 count in directory 64424513539 from 4 to 3 would have junked entry "Symantec" in directory inode 124571324436 entry "Disc 1" in shortform directory 38654709764 references = non-existent inode 42949677086 would have corrected i8 count in directory 124571324436 from 5 to 4 would clear inode number in entry at offset 328... entry "VIDEO_TS" in shortform directory 55834578945 references = non-existent inode 43006791683 entry ".." at block 0 offset 32 in directory inode 68727828484 = references non-existent inode 42949677060 would have junked entry "VIDEO_TS" in directory inode 55834578945 would clear inode number in entry at offset 208... would have corrected i8 count in directory 133143990305 from 4 to 3 would have corrected i8 count in directory 103079219201 from 1 to 0 entry "1 The Best of Borge - Acts 1 and 2" at block 0 offset 48 in = directory inode 94489284609 references non-existent inode 77309415448 would clear inode number in entry at offset 32... entry "Dr Phibes" at block 0 offset 560 in directory inode 25769807872 = references non-existent inode 98806263821 - agno =3D 17 would have junked entry "VIDEO_TS" in directory inode 107374186498 would have corrected i8 count in directory 107374186498 from 3 to 2 entry "home" at block 0 offset 264 in directory inode 4096 references = non-existent inode 42949677056 would have junked entry "Connie" in directory inode 4355010569 entry "VIDEO_TS" in shortform directory 73014448131 references = non-existent inode 98784251907 would have corrected i8 count in directory 4355010569 from 8 to 7 would have junked entry "VIDEO_TS" in directory inode 73014448131 would have junked entry "Disc 1" in directory inode 38654709764 would have corrected i8 count in directory 38654709764 from 9 to 8 would have corrected i8 count in directory 55834578945 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 115964121113 = references non-existent inode 98784251908 would clear inode number in entry at offset 32... would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 55834578947 = references non-existent inode 98784251904 would clear inode number in entry at offset 48... would clear inode number in entry at offset 560... would have junked entry "Cricket" in directory inode 34359742464 would clear inode number in entry at offset 2152... would clear inode number in entry at offset 264... would have corrected i8 count in directory 73014448131 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 124571324437 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "VIDEO_TS" at block 0 offset 48 in directory inode 51539611652 = references non-existent inode 77309415428 would clear inode number in entry at offset 48... would have corrected i8 count in directory 34359742464 from 6 to 5 entry "VIDEO_TS" in shortform directory 34359742465 references = non-existent inode 21474840596 would have junked entry "VIDEO_TS" in directory inode 34359742465 would have corrected i8 count in directory 34359742465 from 4 to 3 entry "Cape Fear" at block 0 offset 216 in directory inode 4099 = references non-existent inode 77309415424 would clear inode number in entry at offset 216... entry "Dreamscape" at block 0 offset 368 in directory inode 4099 = references non-existent inode 98784251904 would clear inode number in entry at offset 368... entry "Lemon Drop Kid, The" at block 0 offset 752 in directory inode = 4099 references non-existent inode 21474840577 would clear inode number in entry at offset 752... entry "My Chauffer" at block 0 offset 896 in directory inode 4099 = references non-existent inode 42949677057 would clear inode number in entry at offset 896... entry "Telefon" at block 0 offset 1136 in directory inode 4099 = references non-existent inode 77309415425 would clear inode number in entry at offset 32... entry "Disc 2" in shortform directory 30064775172 references = non-existent inode 98784251908 would clear inode number in entry at offset 1136... would have junked entry "Disc 2" in directory inode 30064775172 entry "Without a Clue" at block 0 offset 1288 in directory inode 4099 = references non-existent inode 98784251905 would have corrected i8 count in directory 30064775172 from 7 to 6 would clear inode number in entry at offset 1288... entry "American Dreamer" at block 0 offset 1528 in directory inode 4099 = references non-existent inode 43394228246 would clear inode number in entry at offset 1528... entry "IMAX" at block 0 offset 880 in directory inode 25769807872 = references non-existent inode 21552037923 entry "Noises Off" at block 0 offset 1560 in directory inode 4099 = references non-existent inode 43052523560 would clear inode number in entry at offset 1560... entry "6 Lost_Episodes of Victor Borge Vol_2" at block 0 offset 272 in = directory inode 94489284609 references non-existent inode 98784251933 would clear inode number in entry at offset 272... would clear inode number in entry at offset 880... entry "James Bond" at block 0 offset 976 in directory inode 25769807872 = references non-existent inode 43037630471 would clear inode number in entry at offset 976... entry "Man with no Name" at block 0 offset 1176 in directory inode = 25769807872 references non-existent inode 77370957824 entry "OriginalIFOs" at block 0 offset 48 in directory inode 94489284613 = references non-existent inode 98784251914 would clear inode number in entry at offset 1176... entry "Merlin Jones" at block 0 offset 1312 in directory inode = 25769807872 references non-existent inode 98806263822 would clear inode number in entry at offset 1312... would clear inode number in entry at offset 48... entry "Pink Panther" at block 0 offset 1664 in directory inode = 25769807872 references non-existent inode 21552037924 would clear inode number in entry at offset 1664... entry "Revenge of the Nerds" at block 0 offset 1792 in directory inode = 25769807872 references non-existent inode 43037630472 would clear inode number in entry at offset 1792... entry "SlideShow" at block 0 offset 1984 in directory inode 25769807872 = references non-existent inode 77370957825 would clear inode number in entry at offset 1984... entry "Star Wars" at block 0 offset 2136 in directory inode 25769807872 = references non-existent inode 98806263823 would clear inode number in entry at offset 2136... entry "Wings" at block 0 offset 2496 in directory inode 25769807872 = references non-existent inode 21552037925 would clear inode number in entry at offset 2496... entry "Q01Files" in shortform directory 4355010593 references = non-existent inode 98806083589 would have junked entry "Q01Files" in directory inode 4355010593 entry "Brave New Voices" at block 13 offset 4056 in directory inode = 25769807872 references non-existent inode 21676552218 would clear inode number in entry at offset 4056... would have corrected i8 count in directory 4355010593 from 7 to 6 entry ".." at block 0 offset 32 in directory inode 30064775184 = references non-existent inode 42949677057 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 8589938726 references = non-existent inode 21474840577 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 25769807875 = references non-existent inode 98784251906 would clear inode number in entry at offset 32... entry "Disc 1" in shortform directory 25769807876 references = non-existent inode 42949677060 would have junked entry "Disc 1" in directory inode 25769807876 would have corrected i8 count in directory 25769807876 from 9 to 8 entry ".." at block 0 offset 32 in directory inode 12884906014 = references non-existent inode 77309415425 would clear inode number in entry at offset 32... entry "VIDEO_TS" in shortform directory 51539611685 references = non-existent inode 77309415429 would have junked entry "VIDEO_TS" in directory inode 51539611685 would have corrected i8 count in directory 51539611685 from 7 to 6 entry ".." at block 0 offset 32 in directory inode 8589938734 references = non-existent inode 98784251933 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 68727828531 = references non-existent inode 42949677086 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 103079219243 = references non-existent inode 77309415448 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 64424513580 = references non-existent inode 43006791684 would clear inode number in entry at offset 32... entry "Christmas" at block 0 offset 48 in directory inode 94489284652 = references non-existent inode 21507739692 would clear inode number in entry at offset 48... entry "website" in shortform directory 73014448183 references = non-existent inode 43196874752 would have junked entry "website" in directory inode 73014448183 would have corrected i8 count in directory 73014448183 from 5 to 4 entry ".." at block 0 offset 32 in directory inode 116006125580 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "1997" at block 0 offset 176 in directory inode 128857702411 = references non-existent inode 21552037912 entry ".." at block 0 offset 32 in directory inode 111673475085 = references non-existent inode 98784251947 would clear inode number in entry at offset 176... would clear inode number in entry at offset 32... entry "Q01Files" in shortform directory 94489284668 references = non-existent inode 43006791737 would have junked entry "Q01Files" in directory inode 94489284668 entry "2006" at block 0 offset 256 in directory inode 128857702411 = references non-existent inode 43006791739 would have corrected i8 count in directory 94489284668 from 7 to 6 would clear inode number in entry at offset 256... entry "VALIDATE" at block 0 offset 440 in directory inode 128857702411 = references non-existent inode 77370843184 would clear inode number in entry at offset 440... entry ".." at block 0 offset 32 in directory inode 128857702412 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "Power" at block 0 offset 48 in directory inode 128857702412 = references non-existent inode 98802544890 would clear inode number in entry at offset 48... entry "Q01Files" in shortform directory 128857702413 references = non-existent inode 77370843181 entry ".." at block 0 offset 32 in directory inode 103124635648 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... would have junked entry "Q01Files" in directory inode 128857702413 would have corrected i8 count in directory 128857702413 from 8 to 7 entry "04 - 100 Years (Album Version).mp3" at block 0 offset 104 in = directory inode 90270486545 references non-existent inode 98915754013 would clear inode number in entry at offset 104... entry "ARJ" at block 0 offset 48 in directory inode 64471937038 = references non-existent inode 77370843142 would clear inode number in entry at offset 48... entry "Leslie" at block 0 offset 168 in directory inode 64471937038 = references non-existent inode 98784251947 would clear inode number in entry at offset 168... entry ".." at block 0 offset 32 in directory inode 120329281560 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "1993" at block 0 offset 112 in directory inode 120329281560 = references non-existent inode 98802544862 would clear inode number in entry at offset 112... entry "Quicken Downloads" at block 0 offset 376 in directory inode = 120329281560 references non-existent inode 21552037890 would clear inode number in entry at offset 376... entry ".." at block 0 offset 32 in directory inode 8644796441 references = non-existent inode 77370843143 entry "Closer" at block 0 offset 96 in directory inode 68972563 = references non-existent inode 43006791718 would clear inode number in entry at offset 32... would clear inode number in entry at offset 96... entry "EasyBoot" at block 0 offset 64 in directory inode 107374198820 = references non-existent inode 98918465573 would clear inode number in entry at offset 64... entry ".." at block 0 offset 32 in directory inode 68972565 references = non-existent inode 77370843143 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 47272431653 = references non-existent inode 43052523560 would clear inode number in entry at offset 32... entry "OriginalIFOs" at block 0 offset 48 in directory inode 17241608247 = references non-existent inode 21474840600 entry "debian" at block 0 offset 120 in directory inode 47272431662 = references non-existent inode 21676515394 would clear inode number in entry at offset 48... would clear inode number in entry at offset 120... entry ".." at block 0 offset 32 in directory inode 17241608248 = references non-existent inode 98784251905 would clear inode number in entry at offset 32... entry "modules" at block 0 offset 224 in directory inode 47272431662 = references non-existent inode 43198287918 would clear inode number in entry at offset 224... entry "drivers" at block 0 offset 144 in directory inode 51602448390 = references non-existent inode 77370851386 would clear inode number in entry at offset 144... entry "server" at block 0 offset 248 in directory inode 51602448390 = references non-existent inode 98806263841 entry ".." at block 0 offset 32 in directory inode 4360618047 references = non-existent inode 43037696049 would clear inode number in entry at offset 32... would clear inode number in entry at offset 248... entry "instantcake-tcd649-1.1-std.iso" at block 0 offset 48 in directory = inode 4360618047 references non-existent inode 43196874847 would clear inode number in entry at offset 48... entry "instantcake-tcd649-1.1-std.iso.zip" at block 0 offset 96 in = directory inode 4360618047 references non-existent inode 43196874848 would clear inode number in entry at offset 96... entry "instantcake-tcd648-1.0-9.2a-01-2-648.iso" at block 0 offset 144 = in directory inode 4360618047 references non-existent inode 43196874846 would clear inode number in entry at offset 144... entry ".." at block 0 offset 32 in directory inode 73031290880 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "Website" at block 0 offset 48 in directory inode 73031290881 = references non-existent inode 77370843180 would clear inode number in entry at offset 48... entry ".." at block 0 offset 32 in directory inode 38704078853 = references non-existent inode 43037696048 would clear inode number in entry at offset 32... entry "i386" in shortform directory 34422018084 references non-existent = inode 43196874813 entry "x86" in shortform directory 107599970322 references non-existent = inode 98915766322 would have junked entry "x86" in directory inode 107599970322 would have junked entry "i386" in directory inode 34422018084 would have corrected i8 count in directory 107599970322 from 3 to 2 would have corrected i8 count in directory 34422018084 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 30094696481 = references non-existent inode 21507739691 would clear inode number in entry at offset 32... entry "Frc" at block 0 offset 200 in directory inode 107600003166 = references non-existent inode 21676544021 would clear inode number in entry at offset 200... entry "Nor" at block 0 offset 280 in directory inode 107600003166 = references non-existent inode 43196874879 would clear inode number in entry at offset 280... entry ".." at block 0 offset 32 in directory inode 107600003167 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Fin" at block 0 offset 80 in directory inode 107600003167 = references non-existent inode 77491523634 would clear inode number in entry at offset 80... entry "Por" at block 0 offset 160 in directory inode 107600003167 = references non-existent inode 98915770394 would clear inode number in entry at offset 160... entry "My Pictures" at block 0 offset 80 in directory inode 68748406819 = references non-existent inode 43037630465 would clear inode number in entry at offset 80... entry "OriginalIFOs" at block 0 offset 960 in directory inode = 64484773928 references non-existent inode 77594005544 would clear inode number in entry at offset 960... entry ".." at block 0 offset 32 in directory inode 94536843282 = references non-existent inode 21667586090 would clear inode number in entry at offset 32... entry "2.4.4" at block 0 offset 200 in directory inode 111686406241 = references non-existent inode 21676515447 would clear inode number in entry at offset 200... entry "Old" at block 0 offset 64 in directory inode 34465357826 = references non-existent inode 43006791720 would clear inode number in entry at offset 64... entry ".." at block 0 offset 32 in directory inode 55951405125 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... entry "mfs-ftp" at block 0 offset 72 in directory inode 55951405125 = references non-existent inode 98915766334 entry "Steve" at block 0 offset 400 in directory inode 60208181291 = references non-existent inode 43055878204 would clear inode number in entry at offset 400... would clear inode number in entry at offset 72... entry "inc" in shortform directory 55951405131 references non-existent = inode 21676499003 would have junked entry "inc" in directory inode 55951405131 would have corrected i8 count in directory 55951405131 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 60208181292 = references non-existent inode 43037696048 would clear inode number in entry at offset 32... entry "inc" in shortform directory 55951405133 references non-existent = inode 43198287913 would have junked entry "inc" in directory inode 55951405133 would have corrected i8 count in directory 55951405133 from 3 to 2 entry "license" at block 0 offset 112 in directory inode 60208181292 = references non-existent inode 98915770383 would clear inode number in entry at offset 112... entry ".." at block 0 offset 32 in directory inode 47280693257 = references non-existent inode 98915766286 would clear inode number in entry at offset 32... entry "MacOS" at block 0 offset 88 in directory inode 4479877124 = references non-existent inode 98915766308 would clear inode number in entry at offset 88... entry "makemkv-bin-1.9.1" at block 0 offset 1176 in directory inode = 120362094654 references non-existent inode 43394228240 would clear inode number in entry at offset 1176... entry "ffmpeg-2.1.1" at block 0 offset 1240 in directory inode = 120362094654 references non-existent inode 43196874826 would clear inode number in entry at offset 1240... entry "makemkv-oss-1.9.0" at block 0 offset 1488 in directory inode = 120362094654 references non-existent inode 77491511347 would clear inode number in entry at offset 1488... entry "DOCS" at block 0 offset 72 in directory inode 17319272475 = references non-existent inode 43006791738 would clear inode number in entry at offset 72... entry ".." at block 0 offset 32 in directory inode 107600539659 = references non-existent inode 98915782703 would clear inode number in entry at offset 32... entry "WinNT" at block 0 offset 256 in directory inode 17319272475 = references non-existent inode 77370843182 would clear inode number in entry at offset 256... entry "Windows" at block 0 offset 136 in directory inode 94536843319 = references non-existent inode 77491511346 would clear inode number in entry at offset 136... entry "logrotate" at block 0 offset 240 in directory inode 94536843319 = references non-existent inode 98915766320 entry "src" in shortform directory 47280693277 references non-existent = inode 77491511349 would have junked entry "src" in directory inode 47280693277 would clear inode number in entry at offset 240... would have corrected i8 count in directory 47280693277 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 47280693278 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... entry ".svn" in shortform directory 4479877167 references non-existent = inode 21676515401 would have junked entry ".svn" in directory inode 4479877167 would have corrected i8 count in directory 4479877167 from 2 to 1 entry "master.zip" in shortform directory 30095568937 references = non-existent inode 77491519552 would have junked entry "master.zip" in directory inode 30095568937 would have corrected i8 count in directory 30095568937 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 73101590549 = references non-existent inode 43037630465 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 25925189647 = references non-existent inode 21507739691 would clear inode number in entry at offset 32... entry "tmp" in shortform directory 60276125765 references non-existent = inode 21676499002 would have junked entry "tmp" in directory inode 60276125765 would have corrected i8 count in directory 60276125765 from 4 to 3 entry "Flowplayer" at block 0 offset 48 in directory inode 25925189648 = references non-existent inode 43006791719 would clear inode number in entry at offset 48... entry "lgpl" in shortform directory 60276125775 references non-existent = inode 77491511357 would have junked entry "lgpl" in directory inode 60276125775 would have corrected i8 count in directory 60276125775 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 4479877246 references = non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "ChnEng" at block 0 offset 80 in directory inode 4479877246 = references non-existent inode 43198083122 would clear inode number in entry at offset 80... entry "Fre" at block 0 offset 200 in directory inode 4479877246 = references non-existent inode 77491523641 entry ".." at block 0 offset 32 in directory inode 60276125777 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... would clear inode number in entry at offset 200... entry "Pol" at block 0 offset 280 in directory inode 4479877246 = references non-existent inode 98915770398 would clear inode number in entry at offset 280... entry "AMD_Chipset_Driver_xp" in shortform directory 111886688296 = references non-existent inode 21676929031 would have junked entry "AMD_Chipset_Driver_xp" in directory inode = 111886688296 would have corrected i8 count in directory 111886688296 from 2 to 1 entry "Win" at block 0 offset 112 in directory inode 133252530210 = references non-existent inode 21667586091 would clear inode number in entry at offset 112... entry "man" at block 0 offset 216 in directory inode 133252530210 = references non-existent inode 43037696050 would clear inode number in entry at offset 216... entry ".." at block 0 offset 32 in directory inode 107600724055 = references non-existent inode 21706297361 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 85960990858 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "x86" in shortform directory 124656844832 references non-existent = inode 21676499001 would have junked entry "x86" in directory inode 124656844832 would have corrected i8 count in directory 124656844832 from 5 to 4 entry "text-base" in shortform directory 60276129815 references = non-existent inode 77491519568 would have junked entry "text-base" in directory inode 60276129815 would have corrected i8 count in directory 60276129815 from 5 to 4 entry "src" in shortform directory 73105653769 references non-existent = inode 77594005535 would have junked entry "src" in directory inode 73105653769 would have corrected i8 count in directory 73105653769 from 4 to 3 entry "Windows Vista 32bit" at block 0 offset 152 in directory inode = 55952322563 references non-existent inode 77491544085 would clear inode number in entry at offset 152... entry "English" at block 0 offset 48 in directory inode 4488884232 = references non-existent inode 98916159526 would clear inode number in entry at offset 48... entry "Windows XP" in shortform directory 55952322565 references = non-existent inode 77491544087 would have junked entry "Windows XP" in directory inode 55952322565 would have corrected i8 count in directory 55952322565 from 6 to 5 entry "jni" in shortform directory 120448295015 references non-existent = inode 77491519572 would have junked entry "jni" in directory inode 120448295015 would have corrected i8 count in directory 120448295015 from 9 to 8 entry "tmp" in shortform directory 60276129839 references non-existent = inode 77491519571 would have junked entry "tmp" in directory inode 60276129839 would have corrected i8 count in directory 60276129839 from 5 to 4 entry "props" in shortform directory 60276129840 references non-existent = inode 98915770380 entry "Cozumel 2000" at block 0 offset 104 in directory inode 4488884248 = references non-existent inode 43392253987 would clear inode number in entry at offset 104... would have junked entry "props" in directory inode 60276129840 would have corrected i8 count in directory 60276129840 from 5 to 4 entry "enst" in shortform directory 60276129841 references non-existent = inode 98915770381 would have junked entry "enst" in directory inode 60276129841 entry "os" at block 0 offset 272 in directory inode 8843165728 = references non-existent inode 21758378090 would have corrected i8 count in directory 60276129841 from 3 to 2 would clear inode number in entry at offset 272... entry "HDAudio" in shortform directory 47280783476 references = non-existent inode 43198292025 would have junked entry "HDAudio" in directory inode 47280783476 would have corrected i8 count in directory 47280783476 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 81653158051 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "out" at block 0 offset 528 in directory inode 68840685627 = references non-existent inode 77491511315 would clear inode number in entry at offset 528... entry "HDx64" in shortform directory 60276203639 references non-existent = inode 98915782711 would have junked entry "HDx64" in directory inode 60276203639 would have corrected i8 count in directory 60276203639 from 5 to 4 entry ".." at block 0 offset 32 in directory inode 111887126568 = references non-existent inode 21706297361 would clear inode number in entry at offset 32... entry "sensord" at block 0 offset 184 in directory inode 111887126568 = references non-existent inode 21706330113 entry "Sounds of the Seventies- Super 70's" in shortform directory = 4488884269 references non-existent inode 43392978949 would clear inode number in entry at offset 184... would have junked entry "Sounds of the Seventies- Super 70's" in = directory inode 4488884269 would have corrected i8 count in directory 4488884269 from 2 to 1 entry "AM Gold 1968" in shortform directory 4488884270 references = non-existent inode 98916237469 would have junked entry "AM Gold 1968" in directory inode 4488884270 would have corrected i8 count in directory 4488884270 from 2 to 1 entry "7_2" at block 0 offset 128 in directory inode 30191923231 = references non-existent inode 98915766299 entry "The Rock 'N Roll Era 1958" in shortform directory 4488884272 = references non-existent inode 43392978959 entry ".." at block 0 offset 32 in directory inode 116192387077 = references non-existent inode 98915770378 would clear inode number in entry at offset 32... would have junked entry "The Rock 'N Roll Era 1958" in directory inode = 4488884272 would clear inode number in entry at offset 128... would have corrected i8 count in directory 4488884272 from 2 to 1 entry "Equipment Manuals" at block 0 offset 184 in directory inode = 51699605523 references non-existent inode 43196874878 would clear inode number in entry at offset 184... entry "NVIDIA Graphics" at block 0 offset 368 in directory inode = 51699605523 references non-existent inode 77491523621 would clear inode number in entry at offset 368... entry "1964 Classic Rock" in shortform directory 4488884274 references = non-existent inode 21706354726 would have junked entry "1964 Classic Rock" in directory inode = 4488884274 would have corrected i8 count in directory 4488884274 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 4488884280 references = non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Very Best of - Only the beginning" in shortform directory = 111887241217 references non-existent inode 98916237470 would have junked entry "Very Best of - Only the beginning" in directory = inode 111887241217 would have corrected i8 count in directory 111887241217 from 3 to 2 entry "Sounds of the Seventies- 1973" in shortform directory = 111887241225 references non-existent inode 98918465545 would have junked entry "Sounds of the Seventies- 1973" in directory = inode 111887241225 would have corrected i8 count in directory 111887241225 from 4 to 3 entry "Groovin'" in shortform directory 111887241228 references = non-existent inode 43392979005 would have junked entry "Groovin'" in directory inode 111887241228 would have corrected i8 count in directory 111887241228 from 2 to 1 entry "utility" in shortform directory 60276822060 references = non-existent inode 77491990553 entry "src" in shortform directory 30191923251 references non-existent = inode 98915766329 would have junked entry "utility" in directory inode 60276822060 would have corrected i8 count in directory 60276822060 from 6 to 5 would have junked entry "src" in directory inode 30191923251 would have corrected i8 count in directory 30191923251 from 3 to 2 entry "text-base" in shortform directory 30191923257 references = non-existent inode 43198287920 would have junked entry "text-base" in directory inode 30191923257 would have corrected i8 count in directory 30191923257 from 4 to 3 entry "Classical" in shortform directory 202739721 references = non-existent inode 77492862991 would have junked entry "Classical" in directory inode 202739721 would have corrected i8 count in directory 202739721 from 6 to 5 entry "Photographs" at block 0 offset 176 in directory inode 8843165744 = references non-existent inode 77491511325 would clear inode number in entry at offset 176... entry "text-base" in shortform directory 30191923268 references = non-existent inode 43198287924 would have junked entry "text-base" in directory inode 30191923268 would have corrected i8 count in directory 30191923268 from 4 to 3 entry "Love Songs" in shortform directory 47332347959 references = non-existent inode 21706354724 would have junked entry "Love Songs" in directory inode 47332347959 would have corrected i8 count in directory 47332347959 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 47332347961 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "AM Gold - 1973" at block 0 offset 48 in directory inode = 47332347961 references non-existent inode 77492490251 would clear inode number in entry at offset 48... entry "Live! Live! Live!" in shortform directory 60276891651 references = non-existent inode 21706354714 would have junked entry "Live! Live! Live!" in directory inode = 60276891651 would have corrected i8 count in directory 60276891651 from 2 to 1 entry "AM Gold 1970" in shortform directory 60276891652 references = non-existent inode 43392978958 would have junked entry "AM Gold 1970" in directory inode 60276891652 entry "Gypsy Honeymoon- The Best of Kim Carnes" in shortform directory = 47332347962 references non-existent inode 21706354728 would have corrected i8 count in directory 60276891652 from 4 to 3 would have junked entry "Gypsy Honeymoon- The Best of Kim Carnes" in = directory inode 47332347962 would have corrected i8 count in directory 47332347962 from 2 to 1 entry "plugins" at block 0 offset 312 in directory inode 124656857201 = references non-existent inode 77594005540 would clear inode number in entry at offset 312... entry "St. Elmo's Fire" in shortform directory 47335895041 references = non-existent inode 21706354772 would have junked entry "St. Elmo's Fire" in directory inode 47335895041 would have corrected i8 count in directory 47335895041 from 2 to 1 entry "Greatest Hits + Five Unleashed" in shortform directory = 60276891660 references non-existent inode 77492490258 would have junked entry "Greatest Hits + Five Unleashed" in directory = inode 60276891660 entry ".." at block 0 offset 32 in directory inode 68912447582 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... would have corrected i8 count in directory 60276891660 from 2 to 1 entry "XZL USB DMX" at block 0 offset 80 in directory inode 30191923325 = references non-existent inode 77491523643 would clear inode number in entry at offset 80... entry "sounds" at block 0 offset 1368 in directory inode 30191923325 = references non-existent inode 77594005563 entry "The Rock & Roll Era- 1963" in shortform directory 60276891661 = references non-existent inode 21706354763 would clear inode number in entry at offset 1368... would have junked entry "The Rock & Roll Era- 1963" in directory inode = 60276891661 would have corrected i8 count in directory 60276891661 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 116192387114 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "src" in shortform directory 55952388115 references non-existent = inode 77491511355 would have junked entry "src" in directory inode 55952388115 would have corrected i8 count in directory 55952388115 from 5 to 4 entry "Fre" at block 0 offset 216 in directory inode 116192387114 = references non-existent inode 21676544029 would clear inode number in entry at offset 216... entry ".." at block 0 offset 32 in directory inode 60276891663 = references non-existent inode 43392413878 entry "NAIS" at block 0 offset 760 in directory inode 202739732 = references non-existent inode 21676515414 would clear inode number in entry at offset 760... would clear inode number in entry at offset 32... entry "bin" in shortform directory 73105666390 references non-existent = inode 77491511330 entry "Pol" at block 0 offset 296 in directory inode 116192387114 = references non-existent inode 43198083120 would clear inode number in entry at offset 296... would have junked entry "bin" in directory inode 73105666390 would have corrected i8 count in directory 73105666390 from 3 to 2 entry "libusb-win32" in shortform directory 30191947794 references = non-existent inode 43198083129 would have junked entry "libusb-win32" in directory inode 30191947794 would have corrected i8 count in directory 30191947794 from 2 to 1 entry "amd64" in shortform directory 73105666392 references non-existent = inode 77491511331 would have junked entry "amd64" in directory inode 73105666392 would have corrected i8 count in directory 73105666392 from 4 to 3 entry "props" in shortform directory 133252546594 references = non-existent inode 21676515400 would have junked entry "props" in directory inode 133252546594 would have corrected i8 count in directory 133252546594 from 5 to 4 entry "i386" in shortform directory 73105666394 references non-existent = inode 77491511334 entry "tmp" in shortform directory 55952388137 references non-existent = inode 77491519573 would have junked entry "i386" in directory inode 73105666394 would have corrected i8 count in directory 73105666394 from 3 to 2 would have junked entry "tmp" in directory inode 55952388137 would have corrected i8 count in directory 55952388137 from 5 to 4 entry "4_0_U6" at block 0 offset 48 in directory inode 73105666395 = references non-existent inode 77491511336 would clear inode number in entry at offset 48... entry "5_0_U2" at block 0 offset 160 in directory inode 73105666395 = references non-existent inode 98915766303 would clear inode number in entry at offset 160... entry ".." at block 0 offset 32 in directory inode 124656869394 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Cze" at block 0 offset 120 in directory inode 124656869394 = references non-existent inode 98915770396 would clear inode number in entry at offset 120... entry "Rus" at block 0 offset 344 in directory inode 124656869394 = references non-existent inode 21676544030 entry "TF-3239DL" in shortform directory 30191951881 references = non-existent inode 43198287899 would clear inode number in entry at offset 344... entry "CLI" in shortform directory 73105666398 references non-existent = inode 77491511343 would have junked entry "CLI" in directory inode 73105666398 would have junked entry "TF-3239DL" in directory inode 30191951881 would have corrected i8 count in directory 30191951881 from 8 to 7 would have corrected i8 count in directory 73105666398 from 5 to 4 entry "Nor" in shortform directory 133252555235 references non-existent = inode 21676544039 entry "2010-03-30" at block 0 offset 96 in directory inode 64551399498 = references non-existent inode 77491511326 would clear inode number in entry at offset 96... entry "2013-07-26" at block 0 offset 216 in directory inode 64551399498 = references non-existent inode 98915766291 would clear inode number in entry at offset 216... would have junked entry "Nor" in directory inode 133252555235 would have corrected i8 count in directory 133252555235 from 9 to 8 entry "libabi" at block 0 offset 72 in directory inode 64551399501 = references non-existent inode 43196874832 would clear inode number in entry at offset 72... entry "msvc" at block 0 offset 264 in directory inode 64551399501 = references non-existent inode 77491511350 would clear inode number in entry at offset 264... entry "inc" in shortform directory 64551399506 references non-existent = inode 77491511353 would have junked entry "inc" in directory inode 64551399506 entry "Vista32" in shortform directory 30191988767 references = non-existent inode 43265073158 would have corrected i8 count in directory 64551399506 from 5 to 4 would have junked entry "Vista32" in directory inode 30191988767 entry ".svn" in shortform directory 64551399519 references non-existent = inode 98915770375 would have junked entry ".svn" in directory inode 64551399519 would have corrected i8 count in directory 64551399519 from 2 to 1 would have corrected i8 count in directory 30191988767 from 5 to 4 entry "autoxxx" at block 0 offset 48 in directory inode 73105666406 = references non-existent inode 21676499006 would clear inode number in entry at offset 48... entry "libmakemkv" at block 0 offset 168 in directory inode 73105666406 = references non-existent inode 43198287914 would clear inode number in entry at offset 168... entry "nonusb" in shortform directory 73105666412 references = non-existent inode 77491523584 would have junked entry "nonusb" in directory inode 73105666412 would have corrected i8 count in directory 73105666412 from 7 to 6 entry ".." at block 0 offset 32 in directory inode 64551436290 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... entry "tivostream_v0p5" at block 0 offset 144 in directory inode = 64551436290 references non-existent inode 77491523585 would clear inode number in entry at offset 144... entry "2.4.20_Gen05" at block 0 offset 128 in directory inode 8843169875 = references non-existent inode 43196874829 would clear inode number in entry at offset 128... entry ".." at block 0 offset 32 in directory inode 120471560274 = references non-existent inode 98915770424 would clear inode number in entry at offset 32... entry "libmkv" in shortform directory 8843169882 references non-existent = inode 21676515393 would have junked entry "libmkv" in directory inode 8843169882 would have corrected i8 count in directory 8843169882 from 3 to 2 entry "hbbtvplayer" at block 0 offset 104 in directory inode 8843169883 = references non-existent inode 98915766333 would clear inode number in entry at offset 104... entry "osmozilla" at block 0 offset 448 in directory inode 8843169883 = references non-existent inode 21676515395 would clear inode number in entry at offset 448... entry "Brolink" at block 0 offset 48 in directory inode 73105719305 = references non-existent inode 77491523639 entry ".." at block 0 offset 32 in directory inode 8843169890 references = non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Frc" at block 0 offset 168 in directory inode 8843169890 = references non-existent inode 21676544040 would clear inode number in entry at offset 48... entry "prop-base" in shortform directory 73105719310 references = non-existent inode 77491519567 would have junked entry "prop-base" in directory inode 73105719310 would have corrected i8 count in directory 73105719310 from 4 to 3 would clear inode number in entry at offset 168... bad version number 0x3 on inode 124656869424, would reset version number entry "Por" at block 0 offset 248 in directory inode 8843169890 = references non-existent inode 43198083127 would clear inode number in entry at offset 248... entry "MP3" at block 0 offset 64 in directory inode 86092185615 = references non-existent inode 43392413878 entry "i386" in shortform directory 17336291384 references non-existent = inode 21676515421 would clear inode number in entry at offset 64... would have junked entry "i386" in directory inode 17336291384 would have corrected i8 count in directory 17336291384 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 86092185616 = references non-existent inode 21667586090 would clear inode number in entry at offset 32... entry "activityi_data" at block 0 offset 48 in directory inode = 86092185616 references non-existent inode 98806263847 would clear inode number in entry at offset 48... entry ".." at block 0 offset 32 in directory inode 90271576326 = references non-existent inode 98784251947 would clear inode number in entry at offset 32... entry "TiVo_Temp" at block 0 offset 224 in directory inode 81786920975 = references non-existent inode 21706354697 entry "Christmas" at block 0 offset 48 in directory inode 90271576326 = references non-existent inode 21507739693 would clear inode number in entry at offset 48... would clear inode number in entry at offset 224... entry "x86_64" in shortform directory 68912455734 references = non-existent inode 77491511341 would have junked entry "x86_64" in directory inode 68912455734 would have corrected i8 count in directory 68912455734 from 3 to 2 entry "text-base" in shortform directory 8859947015 references = non-existent inode 21676515399 entry "10_11" in shortform directory 17420197955 references non-existent = inode 21676515432 would have junked entry "text-base" in directory inode 8859947015 would have corrected i8 count in directory 8859947015 from 4 to 3 would have junked entry "10_11" in directory inode 17420197955 entry "text-base" in shortform directory 8859947019 references = non-existent inode 21676515435 would have corrected i8 count in directory 17420197955 from 2 to 1 would have junked entry "text-base" in directory inode 8859947019 would have corrected i8 count in directory 8859947019 from 4 to 3 entry "64Bit" in shortform directory 17420197956 references non-existent = inode 21676515433 would have junked entry "64Bit" in directory inode 17420197956 entry "libebml" at block 0 offset 120 in directory inode 68912455741 = references non-existent inode 43196874834 would clear inode number in entry at offset 120... entry "sstring" at block 0 offset 296 in directory inode 68912455741 = references non-existent inode 77491511352 would clear inode number in entry at offset 296... would have corrected i8 count in directory 17420197956 from 3 to 2 entry "text-base" in shortform directory 8859947020 references = non-existent inode 21676515436 would have junked entry "text-base" in directory inode 8859947020 would have corrected i8 count in directory 8859947020 from 4 to 3 entry "src" in shortform directory 17420197971 references non-existent = inode 77491511356 entry "X86" in shortform directory 64551436350 references non-existent = inode 77491511344 entry "libmmbd" in shortform directory 68912492551 references = non-existent inode 77491511351 would have junked entry "X86" in directory inode 64551436350 would have corrected i8 count in directory 64551436350 from 3 to 2 would have junked entry "libmmbd" in directory inode 68912492551 would have junked entry "src" in directory inode 17420197971 would have corrected i8 count in directory 17420197971 from 4 to 3 would have corrected i8 count in directory 68912492551 from 2 to 1 entry "props" in shortform directory 17420197976 references non-existent = inode 43198287921 entry ".." at block 0 offset 32 in directory inode 55986327559 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... would have junked entry "props" in directory inode 17420197976 would have corrected i8 count in directory 17420197976 from 5 to 4 entry "Softly With These Songs - The Best of Roberta Flack" in shortform = directory 55986327560 references non-existent inode 21706354760 entry "props" in shortform directory 68912492559 references non-existent = inode 77491511358 entry "prop-base" in shortform directory 17420197977 references = non-existent inode 21676515398 would have junked entry "props" in directory inode 68912492559 would have junked entry "Softly With These Songs - The Best of Roberta = Flack" in directory inode 55986327560 would have corrected i8 count in directory 55986327560 from 3 to 2 entry "free-x86_64-regparm0" in shortform directory 64551452696 = references non-existent inode 77491544082 entry "AlbumName" in shortform directory 30192533551 references = non-existent inode 98916237468 would have corrected i8 count in directory 68912492559 from 4 to 3 would have junked entry "prop-base" in directory inode 17420197977 would have junked entry "AlbumName" in directory inode 30192533551 entry "Dancin' and Lovin'" in shortform directory 55986327563 references = non-existent inode 98918465560 would have junked entry "free-x86_64-regparm0" in directory inode = 64551452696 would have corrected i8 count in directory 30192533551 from 2 to 1 entry "props" in shortform directory 68912492560 references non-existent = inode 77491511359 would have junked entry "props" in directory inode 68912492560 would have corrected i8 count in directory 68912492560 from 5 to 4 entry ".." at block 0 offset 32 in directory inode 30192533554 = references non-existent inode 43392413878 would have corrected i8 count in directory 64551452696 from 5 to 4 entry "props" in shortform directory 68912492561 references non-existent = inode 77491519565 would have junked entry "Dancin' and Lovin'" in directory inode = 55986327563 would have corrected i8 count in directory 17420197977 from 5 to 4 would clear inode number in entry at offset 32... entry "prop-base" in shortform directory 17420197987 references = non-existent inode 21676515438 would have corrected i8 count in directory 55986327563 from 3 to 2 would have junked entry "prop-base" in directory inode 17420197987 would have corrected i8 count in directory 17420197987 from 4 to 3 would have junked entry "props" in directory inode 68912492561 would have corrected i8 count in directory 68912492561 from 4 to 3 entry "props" in shortform directory 68912492562 references non-existent = inode 77491519566 would have junked entry "props" in directory inode 68912492562 would have corrected i8 count in directory 68912492562 from 5 to 4 entry "props" in shortform directory 68912492565 references non-existent = inode 77491519569 would have junked entry "props" in directory inode 68912492565 would have corrected i8 count in directory 68912492565 from 4 to 3 entry "MS" at block 0 offset 128 in directory inode 38704337116 = references non-existent inode 98802544891 entry ".svn" in shortform directory 68912492569 references non-existent = inode 21676515437 would clear inode number in entry at offset 128... would have junked entry ".svn" in directory inode 68912492569 would have corrected i8 count in directory 68912492569 from 2 to 1 entry "props" in shortform directory 68912492571 references non-existent = inode 77491519574 would have junked entry "props" in directory inode 68912492571 would have corrected i8 count in directory 68912492571 from 5 to 4 entry "Greatest Hits" at block 0 offset 96 in directory inode = 30192533554 references non-existent inode 77492162685 would clear inode number in entry at offset 96... entry "Sounds of the Seventies- 1974" at block 0 offset 280 in directory = inode 30192533554 references non-existent inode 98916237479 would clear inode number in entry at offset 280... entry "Sounds of the Seventies- 1974" in shortform directory 30192533555 = references non-existent inode 43392978962 would have junked entry "Sounds of the Seventies- 1974" in directory = inode 30192533555 would have corrected i8 count in directory 30192533555 from 4 to 3 entry "lock" in shortform directory 4579237926 references non-existent = inode 77492863018 would have junked entry "lock" in directory inode 4579237926 would have corrected i8 count in directory 4579237926 from 8 to 7 entry ".." at block 0 offset 32 in directory inode 30192533559 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "If Not for You" at block 0 offset 96 in directory inode = 30192533559 references non-existent inode 77492490255 would clear inode number in entry at offset 96... entry ".." at block 0 offset 32 in directory inode 81786920996 = references non-existent inode 77491511324 would clear inode number in entry at offset 32... entry "lm_sensors-3.3.3" at block 0 offset 192 in directory inode = 8879145001 references non-existent inode 21706297361 would clear inode number in entry at offset 192... entry "Core-Static" at block 0 offset 80 in directory inode 68912492670 = references non-existent inode 77491617833 would clear inode number in entry at offset 80... entry "Localization" at block 0 offset 224 in directory inode = 68912492670 references non-existent inode 98915782696 would clear inode number in entry at offset 224... entry "amd64" in shortform directory 38704337133 references non-existent = inode 43198083124 would have junked entry "amd64" in directory inode 38704337133 entry "prop-base" in shortform directory 73105747975 references = non-existent inode 77491519570 would have junked entry "prop-base" in directory inode 73105747975 entry ".." at block 0 offset 32 in directory inode 13011120171 = references non-existent inode 43037696048 would clear inode number in entry at offset 32... would have corrected i8 count in directory 73105747975 from 4 to 3 would have corrected i8 count in directory 38704337133 from 4 to 3 entry "x64" in shortform directory 68912726020 references non-existent = inode 77491617844 would have junked entry "x64" in directory inode 68912726020 would have corrected i8 count in directory 68912726020 from 2 to 1 entry "Spanish" at block 0 offset 200 in directory inode 8889970711 = references non-existent inode 21706297372 would clear inode number in entry at offset 200... entry "bin" in shortform directory 51699613855 references non-existent = inode 98915766323 would have junked entry "bin" in directory inode 51699613855 would have corrected i8 count in directory 51699613855 from 4 to 3 entry "bin.mips" in shortform directory 17420201999 references = non-existent inode 21676515446 would have junked entry "bin.mips" in directory inode 17420201999 would have corrected i8 count in directory 17420201999 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 17420202008 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Dan" at block 0 offset 104 in directory inode 17420202008 = references non-existent inode 77491523642 would clear inode number in entry at offset 104... entry "Fre" at block 0 offset 184 in directory inode 17420202008 = references non-existent inode 98915770399 would clear inode number in entry at offset 184... entry "Copy of Remote" in shortform directory 38719377419 references = non-existent inode 43196874830 would have junked entry "Copy of Remote" in directory inode 38719377419 would have corrected i8 count in directory 38719377419 from 3 to 2 entry "EZ Ridin'" in shortform directory 116343926954 references = non-existent inode 21706354762 would have junked entry "EZ Ridin'" in directory inode 116343926954 would have corrected i8 count in directory 116343926954 from 2 to 1 entry "prop-base" in shortform directory 38719377442 references = non-existent inode 43198287925 would have junked entry "prop-base" in directory inode 38719377442 entry "fr" in shortform directory 13011382273 references non-existent = inode 21676498954 would have junked entry "fr" in directory inode 13011382273 would have corrected i8 count in directory 38719377442 from 4 to 3 would have corrected i8 count in directory 13011382273 from 3 to 2 entry "prop-base" in shortform directory 38719377445 references = non-existent inode 43198287928 would have junked entry "prop-base" in directory inode 38719377445 would have corrected i8 count in directory 38719377445 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 47336734723 = references non-existent inode 21758378070 would clear inode number in entry at offset 32... entry ".imap" in shortform directory 47336734725 references non-existent = inode 43393732655 would have junked entry ".imap" in directory inode 47336734725 would have corrected i8 count in directory 47336734725 from 3 to 2 entry "Heaven on Earth" in shortform directory 68996411446 references = non-existent inode 21706354713 would have junked entry "Heaven on Earth" in directory inode 68996411446 entry "Dd57" at block 0 offset 80 in directory inode 30192885820 = references non-existent inode 43393732624 entry "Vienna Master Series - Popular Concert" in shortform directory = 8891183118 references non-existent inode 98916237496 would have corrected i8 count in directory 68996411446 from 2 to 1 entry "AM GOLD 1971" in shortform directory 68996411449 references = non-existent inode 43392978961 would clear inode number in entry at offset 80... would have junked entry "Vienna Master Series - Popular Concert" in = directory inode 8891183118 entry "The Very Best of Dusty Springfield (Mercury)" in shortform = directory 133306257434 references non-existent inode 21706354722 would have junked entry "The Very Best of Dusty Springfield (Mercury)" = in directory inode 133306257434 would have junked entry "AM GOLD 1971" in directory inode 68996411449 would have corrected i8 count in directory 8891183118 from 2 to 1 would have corrected i8 count in directory 133306257434 from 4 to 3 would have corrected i8 count in directory 68996411449 from 2 to 1 entry "Down to Earth" in shortform directory 8891183121 references = non-existent inode 98918465544 would have junked entry "Down to Earth" in directory inode 8891183121 entry "Starbox" in shortform directory 133306257442 references = non-existent inode 43392979000 would have junked entry "Starbox" in directory inode 133306257442 would have corrected i8 count in directory 133306257442 from 3 to 2 entry "Verities & Balderdash" in shortform directory 68996411450 = references non-existent inode 77492490240 would have corrected i8 count in directory 8891183121 from 3 to 2 would have junked entry "Verities & Balderdash" in directory inode = 68996411450 would have corrected i8 count in directory 68996411450 from 2 to 1 entry "Classic Rock- 1966 - The Beat Goes On" in shortform directory = 8891183123 references non-existent inode 77492490267 would have junked entry "Classic Rock- 1966 - The Beat Goes On" in = directory inode 8891183123 would have corrected i8 count in directory 8891183123 from 3 to 2 entry "Greatest Hits" in shortform directory 8891183124 references = non-existent inode 43392979003 would have junked entry "Greatest Hits" in directory inode 8891183124 would have corrected i8 count in directory 8891183124 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 68996796417 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Rock, Rhythm and Doo Wop, Vol. 1- The Greatest Songs =46rom Early = Rock 'n' Roll" at block 0 offset 144 in directory inode 68996796417 = references non-existent inode 43392979001 would clear inode number in entry at offset 144... entry "Konzerte Concertos on authentic instruments" in shortform = directory 133306257451 references non-existent inode 21706354717 would have junked entry "Konzerte Concertos on authentic instruments" in = directory inode 133306257451 would have corrected i8 count in directory 133306257451 from 2 to 1 entry "rr272x" in shortform directory 124689535045 references = non-existent inode 21676552198 would have junked entry "rr272x" in directory inode 124689535045 entry "Christmas in America" in shortform directory 8891183134 = references non-existent inode 77492162679 would have junked entry "Christmas in America" in directory inode = 8891183134 would have corrected i8 count in directory 8891183134 from 2 to 1 entry "Symphonic Poems" in shortform directory 68996796425 references = non-existent inode 21706354718 would have junked entry "Symphonic Poems" in directory inode 68996796425 would have corrected i8 count in directory 68996796425 from 2 to 1 would have corrected i8 count in directory 124689535045 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 81786929197 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... entry "fate" in shortform directory 34465358139 references non-existent = inode 43196874831 would have junked entry "fate" in directory inode 34465358139 would have corrected i8 count in directory 34465358139 from 9 to 8 entry "lgpl" in shortform directory 34465358141 references non-existent = inode 43196874833 would have junked entry "lgpl" in directory inode 34465358141 would have corrected i8 count in directory 34465358141 from 3 to 2 entry "matroska" in shortform directory 34493800449 references = non-existent inode 43198287915 would have junked entry "matroska" in directory inode 34493800449 would have corrected i8 count in directory 34493800449 from 2 to 1 entry "tms470" in shortform directory 81786929201 references = non-existent inode 21676499000 would have junked entry "tms470" in directory inode 81786929201 would have corrected i8 count in directory 81786929201 from 6 to 5 entry ".." at block 0 offset 32 in directory inode 68996796438 = references non-existent inode 77492162666 entry ".." at block 0 offset 32 in directory inode 124689535051 = references non-existent inode 43198287899 would clear inode number in entry at offset 32... entry "icons" in shortform directory 81786929207 references non-existent = inode 98915766328 entry "props" in shortform directory 34493800456 references non-existent = inode 43198287922 would have junked entry "icons" in directory inode 81786929207 would have corrected i8 count in directory 81786929207 from 2 to 1 would clear inode number in entry at offset 32... entry "32x32" in shortform directory 81786929211 references non-existent = inode 98915766332 would have junked entry "32x32" in directory inode 81786929211 would have corrected i8 count in directory 81786929211 from 6 to 5 would have junked entry "props" in directory inode 34493800456 entry "Honeywell" in shortform directory 81786929214 references = non-existent inode 43392253981 would have junked entry "Honeywell" in directory inode 81786929214 would have corrected i8 count in directory 81786929214 from 3 to 2 would have corrected i8 count in directory 34493800456 from 4 to 3 entry "Linux-2.4.x & Linux-2.6.x" at block 0 offset 48 in directory = inode 17420214285 references non-existent inode 21676552204 entry "props" in shortform directory 34493800463 references non-existent = inode 43198287929 would have junked entry "props" in directory inode 34493800463 would clear inode number in entry at offset 48... entry "Windows Vista 64bit" at block 0 offset 208 in directory inode = 17420214285 references non-existent inode 43198287912 would have corrected i8 count in directory 34493800463 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 81786929215 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... would clear inode number in entry at offset 208... entry "Swe" at block 0 offset 192 in directory inode 81786929215 = references non-existent inode 21676544026 would clear inode number in entry at offset 192... entry "X86" in shortform directory 86092197954 references non-existent = inode 98915766318 entry "en-us" at block 0 offset 112 in directory inode 38720200754 = references non-existent inode 77491617849 would clear inode number in entry at offset 112... entry "it" at block 0 offset 192 in directory inode 38720200754 = references non-existent inode 98915782704 would have junked entry "X86" in directory inode 86092197954 would have corrected i8 count in directory 86092197954 from 3 to 2 would clear inode number in entry at offset 192... entry "NDIS2" at block 0 offset 48 in directory inode 38720200760 = references non-existent inode 43265073157 would clear inode number in entry at offset 48... entry "VDeck64" in shortform directory 38720200761 references = non-existent inode 77491617855 would have junked entry "VDeck64" in directory inode 38720200761 would have corrected i8 count in directory 38720200761 from 7 to 6 entry "The Christmas Album" in shortform directory 51700580373 = references non-existent inode 98916237495 would have junked entry "The Christmas Album" in directory inode = 51700580373 would have corrected i8 count in directory 51700580373 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 47336734776 = references non-existent inode 43394228246 would clear inode number in entry at offset 32... entry "AM GOLD1969" in shortform directory 73272119303 references = non-existent inode 77492490254 would have junked entry "AM GOLD1969" in directory inode 73272119303 would have corrected i8 count in directory 73272119303 from 2 to 1 entry "Greatest Hits, Vol. 2" in shortform directory 73272119305 = references non-existent inode 43392978980 would have junked entry "Greatest Hits, Vol. 2" in directory inode = 73272119305 entry "src" in shortform directory 86092197971 references non-existent = inode 21676499004 would have corrected i8 count in directory 73272119305 from 3 to 2 would have junked entry "src" in directory inode 86092197971 entry "The Best of Styx (RCA)" in shortform directory 73272119306 = references non-existent inode 98918465546 would have corrected i8 count in directory 86092197971 from 3 to 2 would have junked entry "The Best of Styx (RCA)" in directory inode = 73272119306 would have corrected i8 count in directory 73272119306 from 5 to 4 entry "Classic Rock- 1968 - The Beat Goes On" in shortform directory = 73272119309 references non-existent inode 43392979007 would have junked entry "Classic Rock- 1968 - The Beat Goes On" in = directory inode 73272119309 would have corrected i8 count in directory 73272119309 from 2 to 1 entry "QtExt" in shortform directory 86092197972 references non-existent = inode 98915766325 would have junked entry "QtExt" in directory inode 86092197972 would have corrected i8 count in directory 86092197972 from 3 to 2 entry "lgpl" in shortform directory 86092197973 references non-existent = inode 98915766326 would have junked entry "lgpl" in directory inode 86092197973 would have corrected i8 count in directory 86092197973 from 2 to 1 entry "lgpl" in shortform directory 86092197977 references non-existent = inode 98915766331 entry "Politics" in shortform directory 13011382322 references = non-existent inode 21676515413 would have junked entry "lgpl" in directory inode 86092197977 would have junked entry "Politics" in directory inode 13011382322 would have corrected i8 count in directory 86092197977 from 3 to 2 entry "props" in shortform directory 86092197979 references non-existent = inode 43198287919 would have corrected i8 count in directory 13011382322 from 4 to 3 would have junked entry "props" in directory inode 86092197979 would have corrected i8 count in directory 86092197979 from 5 to 4 entry "text-base" in shortform directory 86092197980 references = non-existent inode 98915770369 would have junked entry "text-base" in directory inode 86092197980 would have corrected i8 count in directory 86092197980 from 4 to 3 entry "text-base" in shortform directory 86092197981 references = non-existent inode 98915770370 would have junked entry "text-base" in directory inode 86092197981 would have corrected i8 count in directory 86092197981 from 5 to 4 entry "text-base" in shortform directory 86092197982 references = non-existent inode 98915770371 would have junked entry "text-base" in directory inode 86092197982 would have corrected i8 count in directory 86092197982 from 4 to 3 entry "props" in shortform directory 86092197985 references non-existent = inode 98915770376 would have junked entry "props" in directory inode 86092197985 entry ".." at block 0 offset 32 in directory inode 90328010761 = references non-existent inode 21667586090 would clear inode number in entry at offset 32... would have corrected i8 count in directory 86092197985 from 5 to 4 entry "text-base" in shortform directory 86092197990 references = non-existent inode 98915770382 would have junked entry "text-base" in directory inode 86092197990 would have corrected i8 count in directory 86092197990 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 86092198002 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 86092201989 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Japanese" at block 0 offset 120 in directory inode 417902664 = references non-existent inode 77491990544 would clear inode number in entry at offset 120... entry "Cze" at block 0 offset 120 in directory inode 86092201989 = references non-existent inode 43198083093 would clear inode number in entry at offset 120... entry "Hun" at block 0 offset 232 in directory inode 86092201989 = references non-existent inode 77491523624 would clear inode number in entry at offset 232... entry "Por" at block 0 offset 312 in directory inode 86092201989 = references non-existent inode 98915770392 would clear inode number in entry at offset 312... entry ".." at block 0 offset 32 in directory inode 38720765985 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Suse-SLES" in shortform directory 124689539163 references = non-existent inode 21676515431 would have junked entry "Suse-SLES" in directory inode 124689539163 entry "Debian" in shortform directory 124689539163 references = non-existent inode 98915766327 entry ".." at block 0 offset 32 in directory inode 38720765989 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "i386" in shortform directory 13027205190 references non-existent = inode 21676515423 entry "Greatest Hits (Ten Years & Change 1979-1991)" at block 0 offset = 80 in directory inode 38720765989 references non-existent inode = 43392978999 would have junked entry "Debian" in directory inode 124689539163 would have junked entry "i386" in directory inode 13027205190 would have corrected i8 count in directory 13027205190 from 4 to 3 entry "Classic Rock- 1966 - Blowin' Your Mind" in shortform directory = 120472117286 references non-existent inode 77492162675 would have corrected i8 count in directory 124689539163 from 7 to 5 would clear inode number in entry at offset 80... would have junked entry "Classic Rock- 1966 - Blowin' Your Mind" in = directory inode 120472117286 would have corrected i8 count in directory 120472117286 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 120472117287 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Martina McBride" at block 0 offset 392 in directory inode = 120472117287 references non-existent inode 21706354715 would clear inode number in entry at offset 392... entry "Orchestra Manhattan" at block 0 offset 568 in directory inode = 120472117287 references non-existent inode 43392978952 entry "Japanese" at block 0 offset 120 in directory inode 17436610595 = references non-existent inode 77491990551 would clear inode number in entry at offset 120... would clear inode number in entry at offset 568... entry "Wedding Day Music" in shortform directory 120472117289 references = non-existent inode 98916237481 would have junked entry "Wedding Day Music" in directory inode = 120472117289 would have corrected i8 count in directory 120472117289 from 2 to 1 entry "AM GOLD 1971" in shortform directory 120472117291 references = non-existent inode 43392978964 would have junked entry "AM GOLD 1971" in directory inode 120472117291 entry "lgpl" in shortform directory 13027205211 references non-existent = inode 21676499005 would have junked entry "lgpl" in directory inode 13027205211 would have corrected i8 count in directory 13027205211 from 2 to 1 would have corrected i8 count in directory 120472117291 from 2 to 1 entry "props" in shortform directory 13027205218 references non-existent = inode 21676515396 would have junked entry "props" in directory inode 13027205218 would have corrected i8 count in directory 13027205218 from 5 to 4 entry "Fresh Aire Christmas 1988" in shortform directory 17436659751 = references non-existent inode 98916237471 entry "local-mail" in shortform directory 8891777032 references = non-existent inode 21758378075 would have junked entry "local-mail" in directory inode 8891777032 would have junked entry "Fresh Aire Christmas 1988" in directory inode = 17436659751 would have corrected i8 count in directory 17436659751 from 5 to 4 would have corrected i8 count in directory 8891777032 from 7 to 6 entry "Borodin String Quartets Nos. 1 & 2" in shortform directory = 17436659752 references non-existent inode 77492162681 would have junked entry "Borodin String Quartets Nos. 1 & 2" in = directory inode 17436659752 would have corrected i8 count in directory 17436659752 from 3 to 2 entry "calendar" in shortform directory 68997402671 references = non-existent inode 77492863015 would have junked entry "calendar" in directory inode 68997402671 would have corrected i8 count in directory 68997402671 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 111895687207 = references non-existent inode 43392978952 entry "Core-Static" at block 0 offset 80 in directory inode 13027512336 = references non-existent inode 21676929041 entry "Raw" in shortform directory 38720962585 references non-existent = inode 43392978965 would have junked entry "Raw" in directory inode 38720962585 would have corrected i8 count in directory 38720962585 from 3 to 2 would clear inode number in entry at offset 80... would clear inode number in entry at offset 32... entry "Localization" at block 0 offset 224 in directory inode = 13027512336 references non-existent inode 43198292030 would clear inode number in entry at offset 224... entry "Greatest HIts" in shortform directory 111895687208 references = non-existent inode 98916237475 entry "x64" in shortform directory 13027512342 references non-existent = inode 21676929047 would have junked entry "Greatest HIts" in directory inode 111895687208 would have junked entry "x64" in directory inode 13027512342 would have corrected i8 count in directory 13027512342 from 6 to 5 would have corrected i8 count in directory 111895687208 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 111895687209 = references non-existent inode 43392978953 would clear inode number in entry at offset 32... entry "X64" in shortform directory 13027512343 references non-existent = inode 21676929048 would have junked entry "X64" in directory inode 13027512343 would have corrected i8 count in directory 13027512343 from 3 to 2 entry "JP" at block 0 offset 96 in directory inode 13074718790 = references non-existent inode 43392253962 would clear inode number in entry at offset 96... entry "TVApp" at block 0 offset 88 in directory inode 82064986146 = references non-existent inode 98916159538 would clear inode number in entry at offset 88... entry "5_3" at block 0 offset 168 in directory inode 128987131937 = references non-existent inode 21676515426 would clear inode number in entry at offset 168... entry "5_8" at block 0 offset 232 in directory inode 128987131937 = references non-existent inode 43198083135 would clear inode number in entry at offset 232... entry ".." at block 0 offset 32 in directory inode 107600814352 = references non-existent inode 43392978953 would clear inode number in entry at offset 32... entry "O Holy Night Disc 1" in shortform directory 13074718840 = references non-existent inode 77492162674 would have junked entry "O Holy Night Disc 1" in directory inode = 13074718840 would have corrected i8 count in directory 13074718840 from 6 to 5 entry "O Holy Night Disc 1" in shortform directory 13091356672 = references non-existent inode 43392978978 would have junked entry "O Holy Night Disc 1" in directory inode = 13091356672 would have corrected i8 count in directory 13091356672 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 107600814365 = references non-existent inode 21706354704 would clear inode number in entry at offset 32... entry "Alfred Brendel Plays Beethoven Piano Sonatas, Vol. 2 (1 of 2)" at = block 0 offset 48 in directory inode 13091356696 references non-existent = inode 43392978954 would clear inode number in entry at offset 48... entry "patch_tool" in shortform directory 86092361747 references = non-existent inode 98915782710 would have junked entry "patch_tool" in directory inode 86092361747 would have corrected i8 count in directory 86092361747 from 6 to 5 entry "file_db_data" at block 0 offset 128 in directory inode = 17437196300 references non-existent inode 43393732657 would clear inode number in entry at offset 128... entry ".." at block 0 offset 32 in directory inode 120533618729 = references non-existent inode 42949677056 would clear inode number in entry at offset 32... entry ".config" at block 0 offset 48 in directory inode 120533618729 = references non-existent inode 77492863017 would clear inode number in entry at offset 48... entry "mail" at block 0 offset 152 in directory inode 120533618729 = references non-existent inode 99184005156 would clear inode number in entry at offset 152... entry "Templates" at block 0 offset 1232 in directory inode 120533618729 = references non-existent inode 21758378089 would clear inode number in entry at offset 1232... entry "Videos" at block 0 offset 1344 in directory inode 120533618729 = references non-existent inode 43394228287 would clear inode number in entry at offset 1344... entry "kicker" at block 0 offset 184 in directory inode 120533618733 = references non-existent inode 21758378074 would clear inode number in entry at offset 184... entry "kwallet" at block 0 offset 304 in directory inode 120533618733 = references non-existent inode 43393732656 would clear inode number in entry at offset 304... entry "Alive 'N Kickin' (Collectables)" in shortform directory = 124753793139 references non-existent inode 21706354712 would have junked entry "Alive 'N Kickin' (Collectables)" in directory = inode 124753793139 would have corrected i8 count in directory 124753793139 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 124753793147 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "The Jazz Singer" at block 0 offset 232 in directory inode = 124753793147 references non-existent inode 21706354754 would clear inode number in entry at offset 232... entry "Sounds of the Seventies- AM Nuggets" in shortform directory = 124753793148 references non-existent inode 77492490256 would have junked entry "Sounds of the Seventies- AM Nuggets" in = directory inode 124753793148 would have corrected i8 count in directory 124753793148 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 124753965056 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Seven Separate Fools" at block 0 offset 200 in directory inode = 124753965056 references non-existent inode 77492490272 entry "lgpl" in shortform directory 17437196324 references non-existent = inode 21758378085 would clear inode number in entry at offset 200... would have junked entry "lgpl" in directory inode 17437196324 would have corrected i8 count in directory 17437196324 from 3 to 2 entry "matroska" in shortform directory 17437196325 references = non-existent inode 21758378087 would have junked entry "matroska" in directory inode 17437196325 would have corrected i8 count in directory 17437196325 from 2 to 1 entry "alpha" in shortform directory 90328019070 references non-existent = inode 43196874827 would have junked entry "alpha" in directory inode 90328019070 entry "x86" in shortform directory 90328019070 references non-existent = inode 77491511348 would have junked entry "x86" in directory inode 90328019070 entry "default.mpg" in shortform directory 60277866727 references = non-existent inode 43052523580 would have corrected i8 count in directory 90328019070 from 10 to 8 would have junked entry "default.mpg" in directory inode 60277866727 would have corrected i8 count in directory 60277866727 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 90328121345 = references non-existent inode 43037696049 would clear inode number in entry at offset 32... entry "Greatest Hits (CemaAtlantic)" in shortform directory 418459710 = references non-existent inode 77492490252 would have junked entry "Greatest Hits (CemaAtlantic)" in directory = inode 418459710 entry ".deps" at block 0 offset 48 in directory inode 90328121345 = references non-existent inode 77491523620 would have corrected i8 count in directory 418459710 from 5 to 4 would clear inode number in entry at offset 48... entry "Classic Rock- 1965" in shortform directory 419037188 references = non-existent inode 21706354767 would have junked entry "Classic Rock- 1965" in directory inode = 419037188 entry "16x16" in shortform directory 90328121352 references non-existent = inode 98915766330 would have junked entry "16x16" in directory inode 90328121352 would have corrected i8 count in directory 90328121352 from 6 to 5 would have corrected i8 count in directory 419037188 from 2 to 1 entry "Super Hits of the '70s- Have a Nice Day, Vol. 7" in shortform = directory 419037189 references non-existent inode 98918465562 entry "Editor" at block 0 offset 48 in directory inode 107663573017 = references non-existent inode 21706354789 would clear inode number in entry at offset 48... would have junked entry "Super Hits of the '70s- Have a Nice Day, Vol. = 7" in directory inode 419037189 would have corrected i8 count in directory 419037189 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 90328121357 = references non-existent inode 77491519615 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 90328121367 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Por" at block 0 offset 160 in directory inode 90328121367 = references non-existent inode 21676544027 would clear inode number in entry at offset 160... entry "Sounds of the Seventies- 1972" in shortform directory 86092816396 = references non-existent inode 77492162683 would have junked entry "Sounds of the Seventies- 1972" in directory = inode 86092816396 would have corrected i8 count in directory 86092816396 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 128987152396 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Bul" at block 0 offset 48 in directory inode 128987152396 = references non-existent inode 43198083121 would clear inode number in entry at offset 48... entry ".config" at block 0 offset 48 in directory inode 133306986547 = references non-existent inode 21758378070 entry "Fin" at block 0 offset 160 in directory inode 128987152396 = references non-existent inode 77491523640 would clear inode number in entry at offset 48... entry "mail" at block 0 offset 152 in directory inode 133306986547 = references non-existent inode 43393732652 would clear inode number in entry at offset 152... would clear inode number in entry at offset 160... entry "backupsync" in shortform directory 133306986548 references = non-existent inode 43393732653 would have junked entry "backupsync" in directory inode 133306986548 would have corrected i8 count in directory 133306986548 from 3 to 2 entry "Ita" at block 0 offset 240 in directory inode 128987152396 = references non-existent inode 98915770397 would clear inode number in entry at offset 240... entry "tmp" at block 0 offset 48 in directory inode 133306986553 = references non-existent inode 77492863021 would clear inode number in entry at offset 48... entry ".." at block 0 offset 32 in directory inode 38825242678 = references non-existent inode 43393732652 would clear inode number in entry at offset 32... entry "INBOX" at block 0 offset 192 in directory inode 38825242678 = references non-existent inode 77492863016 would clear inode number in entry at offset 192... entry "NUT" at block 0 offset 296 in directory inode 38825242678 = references non-existent inode 99184005155 would clear inode number in entry at offset 296... entry "Greatest Hits (Capitol)" in shortform directory 82065092720 = references non-existent inode 98916237482 entry ".." at block 0 offset 32 in directory inode 116343980276 = references non-existent inode 21706354699 would have junked entry "Greatest Hits (Capitol)" in directory inode = 82065092720 would clear inode number in entry at offset 32... would have corrected i8 count in directory 82065092720 from 3 to 2 entry "Symphonic Poems" in shortform directory 82065092722 references = non-existent inode 77492490253 would have junked entry "Symphonic Poems" in directory inode 82065092722 would have corrected i8 count in directory 82065092722 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 116343980280 = references non-existent inode 43392978953 would clear inode number in entry at offset 32... entry "lgpl" in shortform directory 38829563910 references non-existent = inode 43394228244 would have junked entry "lgpl" in directory inode 38829563910 would have corrected i8 count in directory 38829563910 from 2 to 1 entry "lgpl" in shortform directory 38829563913 references non-existent = inode 43394228259 would have junked entry "lgpl" in directory inode 38829563913 would have corrected i8 count in directory 38829563913 from 3 to 2 entry "PowerQuest PartitionMagic 6.0" at block 0 offset 104 in directory = inode 124762431535 references non-existent inode 21706354788 would clear inode number in entry at offset 104... entry "UTILITY" at block 0 offset 232 in directory inode 124762431535 = references non-existent inode 43393732623 would clear inode number in entry at offset 232... entry ".." at block 0 offset 32 in directory inode 38829563921 = references non-existent inode 98915766286 would clear inode number in entry at offset 32... entry "VIDEO_TS" at block 0 offset 72 in directory inode 38829563921 = references non-existent inode 43055878155 would clear inode number in entry at offset 72... entry "Rocket 2722" in shortform directory 90328125499 references = non-existent inode 98915770424 would have junked entry "Rocket 2722" in directory inode 90328125499 would have corrected i8 count in directory 90328125499 from 3 to 2 entry "Gyorgy Sandor Plays Prokofiev, Vol. 1 (3 of 3)" at block 0 offset = 176 in directory inode 82065301526 references non-existent inode = 43392978956 would clear inode number in entry at offset 176... entry "valetines 001.jpg" at block 0 offset 1096 in directory inode = 38829563929 references non-existent inode 21758378098 would clear inode number in entry at offset 1096... entry "Disk 8" in shortform directory 94562865200 references = non-existent inode 21676515402 would have junked entry "Disk 8" in directory inode 94562865200 would have corrected i8 count in directory 94562865200 from 8 to 7 entry ".." at block 0 offset 32 in directory inode 82065301528 = references non-existent inode 98916237472 would clear inode number in entry at offset 32... entry "skins" at block 0 offset 592 in directory inode 38829563939 = references non-existent inode 43394228242 would clear inode number in entry at offset 592... entry ".." at block 0 offset 32 in directory inode 103166758944 = references non-existent inode 98915766285 would clear inode number in entry at offset 32... entry "lock" in shortform directory 86093082687 references non-existent = inode 21758378071 entry "prop-base" in shortform directory 90328137762 references = non-existent inode 98915770373 would have junked entry "prop-base" in directory inode 90328137762 would have corrected i8 count in directory 90328137762 from 5 to 4 would have junked entry "lock" in directory inode 86093082687 would have corrected i8 count in directory 86093082687 from 7 to 6 entry "Checking" in shortform directory 38829563965 references = non-existent inode 43196874811 would have junked entry "Checking" in directory inode 38829563965 would have corrected i8 count in directory 38829563965 from 3 to 2 entry "Email" in shortform directory 38829563966 references non-existent = inode 43196874812 would have junked entry "Email" in directory inode 38829563966 would have corrected i8 count in directory 38829563966 from 5 to 4 entry "Quiet Riot - Greatest Hits" in shortform directory 82201460747 = references non-existent inode 98918465572 would have junked entry "Quiet Riot - Greatest Hits" in directory inode = 82201460747 would have corrected i8 count in directory 82201460747 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 82201460748 = references non-existent inode 43393732623 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 86093668380 = references non-existent inode 77491511324 would clear inode number in entry at offset 32... entry "Season 5" at block 0 offset 560 in directory inode 86093668383 = references non-existent inode 98915766286 would clear inode number in entry at offset 560... entry "Season 7" at block 0 offset 656 in directory inode 86093668383 = references non-existent inode 77491511324 would clear inode number in entry at offset 656... entry "Season 8" at block 0 offset 704 in directory inode 86093668383 = references non-existent inode 98915766285 would clear inode number in entry at offset 704... entry "Photos" at block 0 offset 400 in directory inode 94587891751 = references non-existent inode 98915766287 would clear inode number in entry at offset 400... entry ".." at block 0 offset 32 in directory inode 86093668397 = references non-existent inode 77594005563 would clear inode number in entry at offset 32... entry "prop-base" in shortform directory 94587895810 references = non-existent inode 98915770379 would have junked entry "prop-base" in directory inode 94587895810 would have corrected i8 count in directory 94587895810 from 5 to 4 entry ".." at block 0 offset 32 in directory inode 103166820441 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Ita" at block 0 offset 264 in directory inode 103166820441 = references non-existent inode 21676544028 would clear inode number in entry at offset 264... entry "Rom" at block 0 offset 344 in directory inode 103166820441 = references non-existent inode 43198083119 would clear inode number in entry at offset 344... entry ".." at block 0 offset 32 in directory inode 82201460786 = references non-existent inode 77594005563 would clear inode number in entry at offset 32... entry "Cat Scream-SoundBible.com-871191563.mp3" at block 0 offset 104 in = directory inode 82201460786 references non-existent inode 77594005565 entry "Cht" in shortform directory 94587895822 references non-existent = inode 43198083118 would have junked entry "Cht" in directory inode 94587895822 entry "Q Light Controller" in shortform directory 103166820454 = references non-existent inode 77491527690 would have corrected i8 count in directory 94587895822 from 8 to 7 would have junked entry "Q Light Controller" in directory inode = 103166820454 would clear inode number in entry at offset 104... would have corrected i8 count in directory 103166820454 from 6 to 5 entry "Evil_Laugh_Male_6-Himan-1359990674.mp3" at block 0 offset 192 in = directory inode 82201460786 references non-existent inode 77594005567 would clear inode number in entry at offset 192... entry "Female_Scream_Horror-NeoPhyTe-138499973.mp3" at block 0 offset = 248 in directory inode 82201460786 references non-existent inode = 77491511309 would clear inode number in entry at offset 248... entry "Lynn Anderson" at block 0 offset 72 in directory inode = 64796069907 references non-existent inode 77492490285 would clear inode number in entry at offset 72... entry "Animals" at block 0 offset 96 in directory inode 64796069909 = references non-existent inode 77492490287 would clear inode number in entry at offset 96... entry "Bathroom" at block 0 offset 224 in directory inode 64796069909 = references non-existent inode 98918465574 would clear inode number in entry at offset 224... entry "Office Supplies" at block 0 offset 568 in directory inode = 64796069909 references non-existent inode 21706354790 would clear inode number in entry at offset 568... entry "Transitional Elements" at block 0 offset 696 in directory inode = 64796069909 references non-existent inode 43393732625 would clear inode number in entry at offset 696... entry ".." at block 0 offset 32 in directory inode 94587895836 = references non-existent inode 77491523643 would clear inode number in entry at offset 32... entry "BIOS" at block 0 offset 48 in directory inode 103166820468 = references non-existent inode 77491527723 would clear inode number in entry at offset 48... entry "rr232x-linux-src-v1.10" at block 0 offset 152 in directory inode = 103166820468 references non-existent inode 98915774487 would clear inode number in entry at offset 152... entry "x86-64" in shortform directory 90328141849 references = non-existent inode 98915766301 would have junked entry "x86-64" in directory inode 90328141849 would have corrected i8 count in directory 90328141849 from 3 to 2 entry "DOFC" at block 0 offset 48 in directory inode 90328141851 = references non-existent inode 98915782695 would clear inode number in entry at offset 48... entry "props" in shortform directory 90328141866 references non-existent = inode 98915770377 entry "TVFM" in shortform directory 128991920148 references non-existent = inode 21676552203 would have junked entry "TVFM" in directory inode 128991920148 would have junked entry "props" in directory inode 90328141866 would have corrected i8 count in directory 128991920148 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 107666485369 = references non-existent inode 98915766285 would have corrected i8 count in directory 90328141866 from 5 to 4 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 116398661643 = references non-existent inode 99184005153 would clear inode number in entry at offset 32... entry "Linux-2.4.x" at block 0 offset 48 in directory inode 94659698699 = references non-existent inode 98915774493 would clear inode number in entry at offset 48... entry "storport" in shortform directory 94659698704 references = non-existent inode 98915766311 would have junked entry "storport" in directory inode 94659698704 would have corrected i8 count in directory 94659698704 from 3 to 2 entry ".." at block 0 offset 32 in directory inode 103166828595 = references non-existent inode 77491527723 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 103166828598 = references non-existent inode 43196874878 would clear inode number in entry at offset 32... entry "ja" at block 0 offset 208 in directory inode 94659702817 = references non-existent inode 21676929032 would clear inode number in entry at offset 208... entry "pt-BR" at block 0 offset 288 in directory inode 94659702817 = references non-existent inode 43198292024 would clear inode number in entry at offset 288... entry "AMD_Chipset_Driver_xp" at block 0 offset 48 in directory inode = 94659702828 references non-existent inode 98915782703 would clear inode number in entry at offset 48... entry "The Best of Bill Medley" in shortform directory 90516987962 = references non-existent inode 43392978950 would have junked entry "The Best of Bill Medley" in directory inode = 90516987962 would have corrected i8 count in directory 90516987962 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 90516987964 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Motown Legends, Vol. 1" at block 0 offset 200 in directory inode = 90516987964 references non-existent inode 98916237477 would clear inode number in entry at offset 200... entry "Misc" in shortform directory 90517016577 references non-existent = inode 98916237498 would have junked entry "Misc" in directory inode 90517016577 would have corrected i8 count in directory 90517016577 from 3 to 2 entry "Classic Rock- 1968" in shortform directory 90517016581 references = non-existent inode 77492490268 would have junked entry "Classic Rock- 1968" in directory inode = 90517016581 would have corrected i8 count in directory 90517016581 from 2 to 1 entry "gidmigratortext" in shortform directory 73306308666 references = non-existent inode 77594005542 would have junked entry "gidmigratortext" in directory inode 73306308666 would have corrected i8 count in directory 73306308666 from 2 to 1 entry "SpryAssets" at block 0 offset 48 in directory inode 34782498868 = references non-existent inode 43392253957 would clear inode number in entry at offset 48... entry "1920 x 1080" at block 0 offset 48 in directory inode 34782539794 = references non-existent inode 77491990566 would clear inode number in entry at offset 48... entry ".." at block 0 offset 32 in directory inode 94994862126 = references non-existent inode 43392253987 would clear inode number in entry at offset 32... entry "RecentDocuments" at block 0 offset 48 in directory inode = 64796418214 references non-existent inode 77492863014 would clear inode number in entry at offset 48... entry "kfileplaces" at block 0 offset 160 in directory inode 64796418214 = references non-existent inode 99184005152 would clear inode number in entry at offset 160... entry ".." at block 0 offset 32 in directory inode 34782539822 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Ghostbusters" in shortform directory 34782539827 references = non-existent inode 98918465543 would have junked entry "Ghostbusters" in directory inode 34782539827 would have corrected i8 count in directory 34782539827 from 4 to 3 entry "TIME LIFE - AM GOLD - 1965" in shortform directory 34782539831 = references non-existent inode 77492490270 would have junked entry "TIME LIFE - AM GOLD - 1965" in directory inode = 34782539831 would have corrected i8 count in directory 34782539831 from 3 to 2 entry "Debussy for Daydreaming" in shortform directory 34782539837 = references non-existent inode 98916237473 would have junked entry "Debussy for Daydreaming" in directory inode = 34782539837 would have corrected i8 count in directory 34782539837 from 2 to 1 entry "16x16" in shortform directory 64796418238 references non-existent = inode 77491511313 would have junked entry "16x16" in directory inode 64796418238 would have corrected i8 count in directory 64796418238 from 6 to 5 entry "akonadi" in shortform directory 90549440584 references = non-existent inode 99184005153 entry ".." at block 0 offset 32 in directory inode 34847252525 = references non-existent inode 98916237462 would clear inode number in entry at offset 32... would have junked entry "akonadi" in directory inode 90549440584 would have corrected i8 count in directory 90549440584 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 90549440603 = references non-existent inode 21706330135 would clear inode number in entry at offset 32... entry "2015-02-20 Puerto Rico" at block 0 offset 88 in directory inode = 90549440603 references non-existent inode 98915754040 would clear inode number in entry at offset 88... entry "OS2DOS" at block 0 offset 48 in directory inode 34847252575 = references non-existent inode 77492490286 would clear inode number in entry at offset 48... entry "Stills" in shortform directory 129135882335 references = non-existent inode 21706330135 would have junked entry "Stills" in directory inode 129135882335 would have corrected i8 count in directory 129135882335 from 3 to 2 entry "The Best of Frank Mills- Happy Music" in shortform directory = 95118995629 references non-existent inode 77492162687 would have junked entry "The Best of Frank Mills- Happy Music" in = directory inode 95118995629 would have corrected i8 count in directory 95118995629 from 2 to 1 entry "Moving" in shortform directory 95118995634 references = non-existent inode 21706354755 would have junked entry "Moving" in directory inode 95118995634 would have corrected i8 count in directory 95118995634 from 4 to 3 entry "Masters of Classical Music, Vol. 5 Wagner" in shortform directory = 95118995644 references non-existent inode 77492162682 would have junked entry "Masters of Classical Music, Vol. 5 Wagner" in = directory inode 95118995644 would have corrected i8 count in directory 95118995644 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 129135882353 = references non-existent inode 43392413878 would clear inode number in entry at offset 32... entry "Carmen-Suite Nr. 1-no. 1" at block 0 offset 208 in directory = inode 129135882353 references non-existent inode 21706354716 would clear inode number in entry at offset 208... entry "Dvorak" at block 0 offset 384 in directory inode 129135882353 = references non-existent inode 43392978953 would clear inode number in entry at offset 384... entry "Misc" at block 0 offset 624 in directory inode 129135882353 = references non-existent inode 77492162680 would clear inode number in entry at offset 624... entry "S=C3=A1ndor, J=C3=A1nos" at block 0 offset 736 in directory inode = 129135882353 references non-existent inode 98916237472 would clear inode number in entry at offset 736... entry ".." at block 0 offset 32 in directory inode 95157329964 = references non-existent inode 99184005156 would clear inode number in entry at offset 32... entry "NewEgg" at block 0 offset 312 in directory inode 95157329964 = references non-existent inode 21758378076 would clear inode number in entry at offset 312... entry "Sent" at block 0 offset 424 in directory inode 95157329964 = references non-existent inode 43393732658 would clear inode number in entry at offset 424... entry "Sounds of the Seventies- 1972" in shortform directory = 103167189121 references non-existent inode 21706354727 would have junked entry "Sounds of the Seventies- 1972" in directory = inode 103167189121 would have corrected i8 count in directory 103167189121 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 103167189169 = references non-existent inode 98916237465 would clear inode number in entry at offset 32... entry "src" in shortform directory 95375138851 references non-existent = inode 98915754014 would have junked entry "src" in directory inode 95375138851 would have corrected i8 count in directory 95375138851 from 3 to 2 entry "lgpl" in shortform directory 95375138852 references non-existent = inode 98915754036 would have junked entry "lgpl" in directory inode 95375138852 would have corrected i8 count in directory 95375138852 from 4 to 3 entry "d01" in shortform directory 95375138856 references non-existent = inode 99189358615 would have junked entry "d01" in directory inode 95375138856 would have corrected i8 count in directory 95375138856 from 3 to 2 entry "Broadcom Wireless" in shortform directory 95375138861 references = non-existent inode 21676544020 would have junked entry "Broadcom Wireless" in directory inode = 95375138861 entry "TrendNet" in shortform directory 95375138861 references = non-existent inode 98915754007 would have junked entry "TrendNet" in directory inode 95375138861 would have corrected i8 count in directory 95375138861 from 4 to 2 entry "tmp" in shortform directory 103167508531 references non-existent = inode 21758378072 would have junked entry "tmp" in directory inode 103167508531 would have corrected i8 count in directory 103167508531 from 5 to 4 entry ".." at block 0 offset 32 in directory inode 103167508533 = references non-existent inode 77492863017 would clear inode number in entry at offset 32... entry "backupsync" in shortform directory 51736309770 references = non-existent inode 99184005157 would have junked entry "backupsync" in directory inode 51736309770 would have corrected i8 count in directory 51736309770 from 3 to 2 entry "inc" in shortform directory 26008100926 references non-existent = inode 77491511354 would have junked entry "inc" in directory inode 26008100926 would have corrected i8 count in directory 26008100926 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 26057682952 = references non-existent inode 43037696048 would clear inode number in entry at offset 32... entry "tmp" in shortform directory 26154033339 references non-existent = inode 43198287923 would have junked entry "tmp" in directory inode 26154033339 would have corrected i8 count in directory 26154033339 from 5 to 4 entry "tmp" in shortform directory 26260242761 references non-existent = inode 43198287926 would have junked entry "tmp" in directory inode 26260242761 would have corrected i8 count in directory 26260242761 from 5 to 4 entry "tmp" in shortform directory 26260242762 references non-existent = inode 43198287927 would have junked entry "tmp" in directory inode 26260242762 would have corrected i8 count in directory 26260242762 from 5 to 4 entry "mflpro_c1" in shortform directory 26260242856 references = non-existent inode 98915770389 would have junked entry "mflpro_c1" in directory inode 26260242856 would have corrected i8 count in directory 26260242856 from 5 to 4 entry ".." at block 0 offset 32 in directory inode 26260242858 = references non-existent inode 98915770389 would clear inode number in entry at offset 32... entry "Eng" at block 0 offset 136 in directory inode 26260242858 = references non-existent inode 21676544041 would clear inode number in entry at offset 136... entry "Ita" at block 0 offset 216 in directory inode 26260242858 = references non-existent inode 43198083128 would clear inode number in entry at offset 216... entry "Linux" in shortform directory 26260267045 references non-existent = inode 43198287897 would have junked entry "Linux" in directory inode 26260267045 would have corrected i8 count in directory 26260267045 from 4 to 3 entry ".." at block 0 offset 32 in directory inode 26260271146 = references non-existent inode 21676929031 would clear inode number in entry at offset 32... entry "Driver" at block 0 offset 104 in directory inode 26260271146 = references non-existent inode 43198292023 would clear inode number in entry at offset 104... entry "Dirty Dancing" in shortform directory 27415207952 references = non-existent inode 43392978963 would have junked entry "Dirty Dancing" in directory inode 27415207952 would have corrected i8 count in directory 27415207952 from 2 to 1 entry ".." at block 0 offset 32 in directory inode 27739979799 = references non-existent inode 21758378090 would clear inode number in entry at offset 32... entry ".." at block 0 offset 32 in directory inode 27739979812 = references non-existent inode 21676515402 would clear inode number in entry at offset 32... No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... entry "Photos" in directory inode 4096 points to non-existent inode = 21474840576, would junk entry entry "home" in directory inode 4096 points to non-existent inode = 42949677056, would junk entry bad hash table for directory inode 4096 (no data entry): would rebuild entry "Cape Fear" in directory inode 4099 points to non-existent inode = 77309415424, would junk entry entry "Dreamscape" in directory inode 4099 points to non-existent inode = 98784251904, would junk entry entry "Lemon Drop Kid, The" in directory inode 4099 points to = non-existent inode 21474840577, would junk entry entry "My Chauffer" in directory inode 4099 points to non-existent inode = 42949677057, would junk entry entry "Telefon" in directory inode 4099 points to non-existent inode = 77309415425, would junk entry entry "Without a Clue" in directory inode 4099 points to non-existent = inode 98784251905, would junk entry entry "American Dreamer" in directory inode 4099 points to non-existent = inode 43394228246, would junk entry entry "Noises Off" in directory inode 4099 points to non-existent inode = 43052523560, would junk entry bad hash table for directory inode 4099 (no data entry): would rebuild entry "Closer" in directory inode 68972563 points to non-existent inode = 43006791718, would junk entry bad hash table for directory inode 68972563 (no data entry): would = rebuild entry ".." in directory inode 68972565 points to non-existent inode = 77370843143, would junk entry bad hash table for directory inode 68972565 (no data entry): would = rebuild entry "Classical" in shortform directory 202739721 references = non-existent inode 77492862991would junk entry would fix i8count in inode 202739721 entry "NAIS" in directory inode 202739732 points to non-existent inode = 21676515414, would junk entry bad hash table for directory inode 202739732 (no data entry): would = rebuild entry "Japanese" in directory inode 417902664 points to non-existent = inode 77491990544, would junk entry bad hash table for directory inode 417902664 (no data entry): would = rebuild entry "Greatest Hits (CemaAtlantic)" in shortform directory 418459710 = references non-existent inode 77492490252would junk entry would fix i8count in inode 418459710 entry "Classic Rock- 1965" in shortform directory 419037188 references = non-existent inode 21706354767would junk entry would fix i8count in inode 419037188 entry "Super Hits of the '70s- Have a Nice Day, Vol. 7" in shortform = directory 419037189 references non-existent inode 98918465562would junk = entry would fix i8count in inode 419037189 entry "Connie" in shortform directory 4355010569 references non-existent = inode 21552037921would junk entry would fix i8count in inode 4355010569 entry "Q01Files" in shortform directory 4355010593 references = non-existent inode 98806083589would junk entry would fix i8count in inode 4355010593 entry ".." in directory inode 4360618047 points to non-existent inode = 43037696049, would junk entry entry "instantcake-tcd649-1.1-std.iso" in directory inode 4360618047 = points to non-existent inode 43196874847, would junk entry entry "instantcake-tcd649-1.1-std.iso.zip" in directory inode 4360618047 = points to non-existent inode 43196874848, would junk entry entry "instantcake-tcd648-1.0-9.2a-01-2-648.iso" in directory inode = 4360618047 points to non-existent inode 43196874846, would junk entry bad hash table for directory inode 4360618047 (no data entry): would = rebuild entry "MacOS" in directory inode 4479877124 points to non-existent inode = 98915766308, would junk entry bad hash table for directory inode 4479877124 (no data entry): would = rebuild entry ".svn" in shortform directory 4479877167 references non-existent = inode 21676515401would junk entry would fix i8count in inode 4479877167 entry ".." in directory inode 4479877246 points to non-existent inode = 98915770389, would junk entry entry "ChnEng" in directory inode 4479877246 points to non-existent = inode 43198083122, would junk entry entry "Fre" in directory inode 4479877246 points to non-existent inode = 77491523641, would junk entry entry "Pol" in directory inode 4479877246 points to non-existent inode = 98915770398, would junk entry bad hash table for directory inode 4479877246 (no data entry): would = rebuild entry "English" in directory inode 4488884232 points to non-existent = inode 98916159526, would junk entry bad hash table for directory inode 4488884232 (no data entry): would = rebuild entry "Cozumel 2000" in directory inode 4488884248 points to = non-existent inode 43392253987, would junk entry bad hash table for directory inode 4488884248 (no data entry): would = rebuild entry "Sounds of the Seventies- Super 70's" in shortform directory = 4488884269 references non-existent inode 43392978949would junk entry would fix i8count in inode 4488884269 entry "AM Gold 1968" in shortform directory 4488884270 references = non-existent inode 98916237469would junk entry would fix i8count in inode 4488884270 entry "The Rock 'N Roll Era 1958" in shortform directory 4488884272 = references non-existent inode 43392978959would junk entry would fix i8count in inode 4488884272 entry "1964 Classic Rock" in shortform directory 4488884274 references = non-existent inode 21706354726would junk entry would fix i8count in inode 4488884274 entry ".." in directory inode 4488884280 points to non-existent inode = 43392413878, would junk entry bad hash table for directory inode 4488884280 (no data entry): would = rebuild entry "lock" in shortform directory 4579237926 references non-existent = inode 77492863018would junk entry would fix i8count in inode 4579237926 entry "VIDEO_TS" in shortform directory 8589938690 references = non-existent inode 42949677058would junk entry would fix i8count in inode 8589938690 entry ".." in directory inode 8589938726 points to non-existent inode = 21474840577, would junk entry bad hash table for directory inode 8589938726 (no data entry): would = rebuild entry ".." in directory inode 8589938734 points to non-existent inode = 98784251933, would junk entry bad hash table for directory inode 8589938734 (no data entry): would = rebuild entry ".." in directory inode 8644796441 points to non-existent inode = 77370843143, would junk entry bad hash table for directory inode 8644796441 (no data entry): would = rebuild entry "os" in directory inode 8843165728 points to non-existent inode = 21758378090, would junk entry bad hash table for directory inode 8843165728 (no data entry): would = rebuild entry "Photographs" in directory inode 8843165744 points to non-existent = inode 77491511325, would junk entry bad hash table for directory inode 8843165744 (no data entry): would = rebuild entry "2.4.20_Gen05" in directory inode 8843169875 points to = non-existent inode 43196874829, would junk entry bad hash table for directory inode 8843169875 (no data entry): would = rebuild entry "libmkv" in shortform directory 8843169882 references non-existent = inode 21676515393would junk entry would fix i8count in inode 8843169882 entry "hbbtvplayer" in directory inode 8843169883 points to non-existent = inode 98915766333, would junk entry entry "osmozilla" in directory inode 8843169883 points to non-existent = inode 21676515395, would junk entry bad hash table for directory inode 8843169883 (no data entry): would = rebuild entry ".." in directory inode 8843169890 points to non-existent inode = 98915770389, would junk entry entry "Frc" in directory inode 8843169890 points to non-existent inode = 21676544040, would junk entry entry "Por" in directory inode 8843169890 points to non-existent inode = 43198083127, would junk entry bad hash table for directory inode 8843169890 (no data entry): would = rebuild entry "text-base" in shortform directory 8859947015 references = non-existent inode 21676515399would junk entry would fix i8count in inode 8859947015 entry "text-base" in shortform directory 8859947019 references = non-existent inode 21676515435would junk entry would fix i8count in inode 8859947019 entry "text-base" in shortform directory 8859947020 references = non-existent inode 21676515436would junk entry would fix i8count in inode 8859947020 entry "lm_sensors-3.3.3" in directory inode 8879145001 points to = non-existent inode 21706297361, would junk entry bad hash table for directory inode 8879145001 (no data entry): would = rebuild entry "Spanish" in directory inode 8889970711 points to non-existent = inode 21706297372, would junk entry bad hash table for directory inode 8889970711 (no data entry): would = rebuild entry "Vienna Master Series - Popular Concert" in shortform directory = 8891183118 references non-existent inode 98916237496would junk entry would fix i8count in inode 8891183118 entry "Down to Earth" in shortform directory 8891183121 references = non-existent inode 98918465544would junk entry would fix i8count in inode 8891183121 entry "Classic Rock- 1966 - The Beat Goes On" in shortform directory = 8891183123 references non-existent inode 77492490267would junk entry would fix i8count in inode 8891183123 entry "Greatest Hits" in shortform directory 8891183124 references = non-existent inode 43392979003would junk entry would fix i8count in inode 8891183124 entry "Christmas in America" in shortform directory 8891183134 = references non-existent inode 77492162679would junk entry would fix i8count in inode 8891183134 entry "local-mail" in shortform directory 8891777032 references = non-existent inode 21758378075would junk entry would fix i8count in inode 8891777032 entry "Christmas" in directory inode 12884905984 points to non-existent = inode 98784251946, would junk entry entry "Good & Better" in directory inode 12884905984 points to = non-existent inode 21758378088, would junk entry bad hash table for directory inode 12884905984 (no data entry): would = rebuild entry ".." in directory inode 12884906014 points to non-existent inode = 77309415425, would junk entry bad hash table for directory inode 12884906014 (no data entry): would = rebuild entry ".." in directory inode 13011120171 points to non-existent inode = 43037696048, would junk entry bad hash table for directory inode 13011120171 (no data entry): would = rebuild entry "fr" in shortform directory 13011382273 references non-existent = inode 21676498954would junk entry would fix i8count in inode 13011382273 entry "Politics" in shortform directory 13011382322 references = non-existent inode 21676515413would junk entry would fix i8count in inode 13011382322 entry "i386" in shortform directory 13027205190 references non-existent = inode 21676515423would junk entry would fix i8count in inode 13027205190 entry "lgpl" in shortform directory 13027205211 references non-existent = inode 21676499005would junk entry would fix i8count in inode 13027205211 entry "props" in shortform directory 13027205218 references non-existent = inode 21676515396would junk entry would fix i8count in inode 13027205218 entry "Core-Static" in directory inode 13027512336 points to = non-existent inode 21676929041, would junk entry entry "Localization" in directory inode 13027512336 points to = non-existent inode 43198292030, would junk entry bad hash table for directory inode 13027512336 (no data entry): would = rebuild entry "x64" in shortform directory 13027512342 references non-existent = inode 21676929047would junk entry would fix i8count in inode 13027512342 entry "X64" in shortform directory 13027512343 references non-existent = inode 21676929048would junk entry would fix i8count in inode 13027512343 entry "JP" in directory inode 13074718790 points to non-existent inode = 43392253962, would junk entry bad hash table for directory inode 13074718790 (no data entry): would = rebuild entry "O Holy Night Disc 1" in shortform directory 13074718840 = references non-existent inode 77492162674would junk entry would fix i8count in inode 13074718840 entry "O Holy Night Disc 1" in shortform directory 13091356672 = references non-existent inode 43392978978would junk entry would fix i8count in inode 13091356672 entry "Alfred Brendel Plays Beethoven Piano Sonatas, Vol. 2 (1 of 2)" in = directory inode 13091356696 points to non-existent inode 43392978954, = would junk entry bad hash table for directory inode 13091356696 (no data entry): would = rebuild entry "OriginalIFOs" in directory inode 17179873282 points to = non-existent inode 21474840578, would junk entry bad hash table for directory inode 17179873282 (no data entry): would = rebuild entry "OriginalIFOs" in directory inode 17179873284 points to = non-existent inode 21474840580, would junk entry bad hash table for directory inode 17179873284 (no data entry): would = rebuild entry "OriginalIFOs" in directory inode 17241608247 points to = non-existent inode 21474840600, would junk entry bad hash table for directory inode 17241608247 (no data entry): would = rebuild entry ".." in directory inode 17241608248 points to non-existent inode = 98784251905, would junk entry bad hash table for directory inode 17241608248 (no data entry): would = rebuild entry "DOCS" in directory inode 17319272475 points to non-existent inode = 43006791738, would junk entry entry "WinNT" in directory inode 17319272475 points to non-existent = inode 77370843182, would junk entry bad hash table for directory inode 17319272475 (no data entry): would = rebuild entry "i386" in shortform directory 17336291384 references non-existent = inode 21676515421would junk entry would fix i8count in inode 17336291384 entry "10_11" in shortform directory 17420197955 references non-existent = inode 21676515432would junk entry would fix i8count in inode 17420197955 entry "64Bit" in shortform directory 17420197956 references non-existent = inode 21676515433would junk entry would fix i8count in inode 17420197956 entry "src" in shortform directory 17420197971 references non-existent = inode 77491511356would junk entry would fix i8count in inode 17420197971 entry "props" in shortform directory 17420197976 references non-existent = inode 43198287921would junk entry would fix i8count in inode 17420197976 entry "prop-base" in shortform directory 17420197977 references = non-existent inode 21676515398would junk entry would fix i8count in inode 17420197977 entry "prop-base" in shortform directory 17420197987 references = non-existent inode 21676515438would junk entry would fix i8count in inode 17420197987 entry "bin.mips" in shortform directory 17420201999 references = non-existent inode 21676515446would junk entry would fix i8count in inode 17420201999 entry ".." in directory inode 17420202008 points to non-existent inode = 98915770389, would junk entry entry "Dan" in directory inode 17420202008 points to non-existent inode = 77491523642, would junk entry entry "Fre" in directory inode 17420202008 points to non-existent inode = 98915770399, would junk entry bad hash table for directory inode 17420202008 (no data entry): would = rebuild entry "Linux-2.4.x & Linux-2.6.x" in directory inode 17420214285 points = to non-existent inode 21676552204, would junk entry entry "Windows Vista 64bit" in directory inode 17420214285 points to = non-existent inode 43198287912, would junk entry bad hash table for directory inode 17420214285 (no data entry): would = rebuild entry "Japanese" in directory inode 17436610595 points to non-existent = inode 77491990551, would junk entry bad hash table for directory inode 17436610595 (no data entry): would = rebuild entry "Fresh Aire Christmas 1988" in shortform directory 17436659751 = references non-existent inode 98916237471would junk entry would fix i8count in inode 17436659751 entry "Borodin String Quartets Nos. 1 & 2" in shortform directory = 17436659752 references non-existent inode 77492162681would junk entry would fix i8count in inode 17436659752 entry "file_db_data" in directory inode 17437196300 points to = non-existent inode 43393732657, would junk entry bad hash table for directory inode 17437196300 (no data entry): would = rebuild entry "lgpl" in shortform directory 17437196324 references non-existent = inode 21758378085would junk entry would fix i8count in inode 17437196324 entry "matroska" in shortform directory 17437196325 references = non-existent inode 21758378087would junk entry would fix i8count in inode 17437196325 entry "Back to the Future" in directory inode 25769807872 points to = non-existent inode 21552037922, would junk entry entry "Bourne, Jason" in directory inode 25769807872 points to = non-existent inode 43037630470, would junk entry entry "Crocodile Dundee" in directory inode 25769807872 points to = non-existent inode 77370851391, would junk entry entry "Dr Phibes" in directory inode 25769807872 points to non-existent = inode 98806263821, would junk entry entry "IMAX" in directory inode 25769807872 points to non-existent inode = 21552037923, would junk entry entry "James Bond" in directory inode 25769807872 points to non-existent = inode 43037630471, would junk entry entry "Man with no Name" in directory inode 25769807872 points to = non-existent inode 77370957824, would junk entry entry "Merlin Jones" in directory inode 25769807872 points to = non-existent inode 98806263822, would junk entry entry "Pink Panther" in directory inode 25769807872 points to = non-existent inode 21552037924, would junk entry entry "Revenge of the Nerds" in directory inode 25769807872 points to = non-existent inode 43037630472, would junk entry entry "SlideShow" in directory inode 25769807872 points to non-existent = inode 77370957825, would junk entry entry "Star Wars" in directory inode 25769807872 points to non-existent = inode 98806263823, would junk entry entry "Wings" in directory inode 25769807872 points to non-existent = inode 21552037925, would junk entry entry "Brave New Voices" in directory inode 25769807872 points to = non-existent inode 21676552218, would junk entry entry ".." in directory inode 25769807875 points to non-existent inode = 98784251906, would junk entry bad hash table for directory inode 25769807875 (no data entry): would = rebuild entry "Disc 1" in shortform directory 25769807876 references = non-existent inode 42949677060would junk entry would fix i8count in inode 25769807876 entry ".." in directory inode 25925189647 points to non-existent inode = 21507739691, would junk entry bad hash table for directory inode 25925189647 (no data entry): would = rebuild entry "Flowplayer" in directory inode 25925189648 points to non-existent = inode 43006791719, would junk entry bad hash table for directory inode 25925189648 (no data entry): would = rebuild entry "inc" in shortform directory 26008100926 references non-existent = inode 77491511354would junk entry would fix i8count in inode 26008100926 entry ".." in directory inode 26057682952 points to non-existent inode = 43037696048, would junk entry bad hash table for directory inode 26057682952 (no data entry): would = rebuild entry "tmp" in shortform directory 26154033339 references non-existent = inode 43198287923would junk entry would fix i8count in inode 26154033339 entry "tmp" in shortform directory 26260242761 references non-existent = inode 43198287926would junk entry would fix i8count in inode 26260242761 entry "tmp" in shortform directory 26260242762 references non-existent = inode 43198287927would junk entry would fix i8count in inode 26260242762 entry "mflpro_c1" in shortform directory 26260242856 references = non-existent inode 98915770389would junk entry would fix i8count in inode 26260242856 entry ".." in directory inode 26260242858 points to non-existent inode = 98915770389, would junk entry entry "Eng" in directory inode 26260242858 points to non-existent inode = 21676544041, would junk entry entry "Ita" in directory inode 26260242858 points to non-existent inode = 43198083128, would junk entry bad hash table for directory inode 26260242858 (no data entry): would = rebuild entry "Linux" in shortform directory 26260267045 references non-existent = inode 43198287897would junk entry would fix i8count in inode 26260267045 entry ".." in directory inode 26260271146 points to non-existent inode = 21676929031, would junk entry entry "Driver" in directory inode 26260271146 points to non-existent = inode 43198292023, would junk entry bad hash table for directory inode 26260271146 (no data entry): would = rebuild entry "Dirty Dancing" in shortform directory 27415207952 references = non-existent inode 43392978963would junk entry would fix i8count in inode 27415207952 entry ".." in directory inode 27739979799 points to non-existent inode = 21758378090, would junk entry bad hash table for directory inode 27739979799 (no data entry): would = rebuild entry ".." in directory inode 27739979812 points to non-existent inode = 21676515402, would junk entry bad hash table for directory inode 27739979812 (no data entry): would = rebuild entry "Downloads" in directory inode 30064775168 points to non-existent = inode 43037696048, would junk entry entry "Plugins" in directory inode 30064775168 points to non-existent = inode 98806263846, would junk entry entry "Ray" in directory inode 30064775168 points to non-existent inode = 43037630473, would junk entry bad hash table for directory inode 30064775168 (no data entry): would = rebuild entry "Disc 2" in shortform directory 30064775172 references = non-existent inode 98784251908would junk entry would fix i8count in inode 30064775172 entry ".." in directory inode 30064775184 points to non-existent inode = 42949677057, would junk entry bad hash table for directory inode 30064775184 (no data entry): would = rebuild entry ".." in directory inode 30094696481 points to non-existent inode = 21507739691, would junk entry bad hash table for directory inode 30094696481 (no data entry): would = rebuild entry "master.zip" in shortform directory 30095568937 references = non-existent inode 77491519552would junk entry would fix i8count in inode 30095568937 entry "7_2" in directory inode 30191923231 points to non-existent inode = 98915766299, would junk entry bad hash table for directory inode 30191923231 (no data entry): would = rebuild entry "src" in shortform directory 30191923251 references non-existent = inode 98915766329would junk entry would fix i8count in inode 30191923251 entry "text-base" in shortform directory 30191923257 references = non-existent inode 43198287920would junk entry would fix i8count in inode 30191923257 entry "text-base" in shortform directory 30191923268 references = non-existent inode 43198287924would junk entry would fix i8count in inode 30191923268 entry "XZL USB DMX" in directory inode 30191923325 points to = non-existent inode 77491523643, would junk entry entry "sounds" in directory inode 30191923325 points to non-existent = inode 77594005563, would junk entry bad hash table for directory inode 30191923325 (no data entry): would = rebuild entry "libusb-win32" in shortform directory 30191947794 references = non-existent inode 43198083129would junk entry would fix i8count in inode 30191947794 entry "TF-3239DL" in shortform directory 30191951881 references = non-existent inode 43198287899would junk entry would fix i8count in inode 30191951881 entry "Vista32" in shortform directory 30191988767 references = non-existent inode 43265073158would junk entry would fix i8count in inode 30191988767 entry "AlbumName" in shortform directory 30192533551 references = non-existent inode 98916237468would junk entry would fix i8count in inode 30192533551 entry ".." in directory inode 30192533554 points to non-existent inode = 43392413878, would junk entry entry "Greatest Hits" in directory inode 30192533554 points to = non-existent inode 77492162685, would junk entry entry "Sounds of the Seventies- 1974" in directory inode 30192533554 = points to non-existent inode 98916237479, would junk entry bad hash table for directory inode 30192533554 (no data entry): would = rebuild entry "Sounds of the Seventies- 1974" in shortform directory 30192533555 = references non-existent inode 43392978962would junk entry would fix i8count in inode 30192533555 entry ".." in directory inode 30192533559 points to non-existent inode = 43392413878, would junk entry entry "If Not for You" in directory inode 30192533559 points to = non-existent inode 77492490255, would junk entry bad hash table for directory inode 30192533559 (no data entry): would = rebuild entry "Dd57" in directory inode 30192885820 points to non-existent inode = 43393732624, would junk entry bad hash table for directory inode 30192885820 (no data entry): would = rebuild entry "Cricket" in shortform directory 34359742464 references = non-existent inode 99184005151would junk entry would fix i8count in inode 34359742464 entry "VIDEO_TS" in shortform directory 34359742465 references = non-existent inode 21474840596would junk entry would fix i8count in inode 34359742465 entry "i386" in shortform directory 34422018084 references non-existent = inode 43196874813would junk entry would fix i8count in inode 34422018084 entry "Old" in directory inode 34465357826 points to non-existent inode = 43006791720, would junk entry bad hash table for directory inode 34465357826 (no data entry): would = rebuild entry "fate" in shortform directory 34465358139 references non-existent = inode 43196874831would junk entry would fix i8count in inode 34465358139 entry "lgpl" in shortform directory 34465358141 references non-existent = inode 43196874833would junk entry would fix i8count in inode 34465358141 entry "matroska" in shortform directory 34493800449 references = non-existent inode 43198287915would junk entry would fix i8count in inode 34493800449 entry "props" in shortform directory 34493800456 references non-existent = inode 43198287922would junk entry would fix i8count in inode 34493800456 entry "props" in shortform directory 34493800463 references non-existent = inode 43198287929would junk entry would fix i8count in inode 34493800463 entry "SpryAssets" in directory inode 34782498868 points to non-existent = inode 43392253957, would junk entry bad hash table for directory inode 34782498868 (no data entry): would = rebuild entry "1920 x 1080" in directory inode 34782539794 points to = non-existent inode 77491990566, would junk entry bad hash table for directory inode 34782539794 (no data entry): would = rebuild entry ".." in directory inode 34782539822 points to non-existent inode = 43392413878, would junk entry bad hash table for directory inode 34782539822 (no data entry): would = rebuild entry "Ghostbusters" in shortform directory 34782539827 references = non-existent inode 98918465543would junk entry would fix i8count in inode 34782539827 entry "TIME LIFE - AM GOLD - 1965" in shortform directory 34782539831 = references non-existent inode 77492490270would junk entry would fix i8count in inode 34782539831 entry "Debussy for Daydreaming" in shortform directory 34782539837 = references non-existent inode 98916237473would junk entry would fix i8count in inode 34782539837 entry ".." in directory inode 34847252525 points to non-existent inode = 98916237462, would junk entry bad hash table for directory inode 34847252525 (no data entry): would = rebuild entry "OS2DOS" in directory inode 34847252575 points to non-existent = inode 77492490286, would junk entry bad hash table for directory inode 34847252575 (no data entry): would = rebuild entry "Disc 1" in shortform directory 38654709764 references = non-existent inode 42949677086would junk entry would fix i8count in inode 38654709764 entry ".." in directory inode 38704078853 points to non-existent inode = 43037696048, would junk entry bad hash table for directory inode 38704078853 (no data entry): would = rebuild entry "MS" in directory inode 38704337116 points to non-existent inode = 98802544891, would junk entry bad hash table for directory inode 38704337116 (no data entry): would = rebuild entry "amd64" in shortform directory 38704337133 references non-existent = inode 43198083124would junk entry would fix i8count in inode 38704337133 entry "Copy of Remote" in shortform directory 38719377419 references = non-existent inode 43196874830would junk entry would fix i8count in inode 38719377419 entry "prop-base" in shortform directory 38719377442 references = non-existent inode 43198287925would junk entry would fix i8count in inode 38719377442 entry "prop-base" in shortform directory 38719377445 references = non-existent inode 43198287928would junk entry would fix i8count in inode 38719377445 entry "en-us" in directory inode 38720200754 points to non-existent = inode 77491617849, would junk entry entry "it" in directory inode 38720200754 points to non-existent inode = 98915782704, would junk entry bad hash table for directory inode 38720200754 (no data entry): would = rebuild entry "NDIS2" in directory inode 38720200760 points to non-existent = inode 43265073157, would junk entry bad hash table for directory inode 38720200760 (no data entry): would = rebuild entry "VDeck64" in shortform directory 38720200761 references = non-existent inode 77491617855would junk entry would fix i8count in inode 38720200761 entry ".." in directory inode 38720765985 points to non-existent inode = 43392413878, would junk entry bad hash table for directory inode 38720765985 (no data entry): would = rebuild entry ".." in directory inode 38720765989 points to non-existent inode = 43392413878, would junk entry entry "Greatest Hits (Ten Years & Change 1979-1991)" in directory inode = 38720765989 points to non-existent inode 43392978999, would junk entry bad hash table for directory inode 38720765989 (no data entry): would = rebuild entry "Raw" in shortform directory 38720962585 references non-existent = inode 43392978965would junk entry would fix i8count in inode 38720962585 entry ".." in directory inode 38825242678 points to non-existent inode = 43393732652, would junk entry entry "INBOX" in directory inode 38825242678 points to non-existent = inode 77492863016, would junk entry entry "NUT" in directory inode 38825242678 points to non-existent inode = 99184005155, would junk entry bad hash table for directory inode 38825242678 (no data entry): would = rebuild entry "lgpl" in shortform directory 38829563910 references non-existent = inode 43394228244would junk entry would fix i8count in inode 38829563910 entry "lgpl" in shortform directory 38829563913 references non-existent = inode 43394228259would junk entry would fix i8count in inode 38829563913 entry ".." in directory inode 38829563921 points to non-existent inode = 98915766286, would junk entry entry "VIDEO_TS" in directory inode 38829563921 points to non-existent = inode 43055878155, would junk entry bad hash table for directory inode 38829563921 (no data entry): would = rebuild entry "valetines 001.jpg" in directory inode 38829563929 points to = non-existent inode 21758378098, would junk entry bad hash table for directory inode 38829563929 (no data entry): would = rebuild entry "skins" in directory inode 38829563939 points to non-existent = inode 43394228242, would junk entry bad hash table for directory inode 38829563939 (no data entry): would = rebuild entry "Checking" in shortform directory 38829563965 references = non-existent inode 43196874811would junk entry would fix i8count in inode 38829563965 entry "Email" in shortform directory 38829563966 references non-existent = inode 43196874812would junk entry would fix i8count in inode 38829563966 entry ".." in directory inode 47244644354 points to non-existent inode = 42949677058, would junk entry bad hash table for directory inode 47244644354 (no data entry): would = rebuild entry ".." in directory inode 47272431653 points to non-existent inode = 43052523560, would junk entry bad hash table for directory inode 47272431653 (no data entry): would = rebuild entry "debian" in directory inode 47272431662 points to non-existent = inode 21676515394, would junk entry entry "modules" in directory inode 47272431662 points to non-existent = inode 43198287918, would junk entry bad hash table for directory inode 47272431662 (no data entry): would = rebuild entry ".." in directory inode 47280693257 points to non-existent inode = 98915766286, would junk entry bad hash table for directory inode 47280693257 (no data entry): would = rebuild entry "src" in shortform directory 47280693277 references non-existent = inode 77491511349would junk entry would fix i8count in inode 47280693277 entry ".." in directory inode 47280693278 points to non-existent inode = 43037696049, would junk entry bad hash table for directory inode 47280693278 (no data entry): would = rebuild entry "HDAudio" in shortform directory 47280783476 references = non-existent inode 43198292025would junk entry would fix i8count in inode 47280783476 entry "Love Songs" in shortform directory 47332347959 references = non-existent inode 21706354724would junk entry would fix i8count in inode 47332347959 entry ".." in directory inode 47332347961 points to non-existent inode = 43392413878, would junk entry entry "AM Gold - 1973" in directory inode 47332347961 points to = non-existent inode 77492490251, would junk entry bad hash table for directory inode 47332347961 (no data entry): would = rebuild entry "Gypsy Honeymoon- The Best of Kim Carnes" in shortform directory = 47332347962 references non-existent inode 21706354728would junk entry would fix i8count in inode 47332347962 entry "St. Elmo's Fire" in shortform directory 47335895041 references = non-existent inode 21706354772would junk entry would fix i8count in inode 47335895041 entry ".." in directory inode 47336734723 points to non-existent inode = 21758378070, would junk entry bad hash table for directory inode 47336734723 (no data entry): would = rebuild entry ".imap" in shortform directory 47336734725 references non-existent = inode 43393732655would junk entry would fix i8count in inode 47336734725 entry ".." in directory inode 47336734776 points to non-existent inode = 43394228246, would junk entry bad hash table for directory inode 47336734776 (no data entry): would = rebuild entry "VIDEO_TS" in directory inode 51539611652 points to non-existent = inode 77309415428, would junk entry bad hash table for directory inode 51539611652 (no data entry): would = rebuild entry "VIDEO_TS" in shortform directory 51539611685 references = non-existent inode 77309415429would junk entry would fix i8count in inode 51539611685 entry "drivers" in directory inode 51602448390 points to non-existent = inode 77370851386, would junk entry entry "server" in directory inode 51602448390 points to non-existent = inode 98806263841, would junk entry bad hash table for directory inode 51602448390 (no data entry): would = rebuild entry "Equipment Manuals" in directory inode 51699605523 points to = non-existent inode 43196874878, would junk entry entry "NVIDIA Graphics" in directory inode 51699605523 points to = non-existent inode 77491523621, would junk entry bad hash table for directory inode 51699605523 (no data entry): would = rebuild entry "bin" in shortform directory 51699613855 references non-existent = inode 98915766323would junk entry would fix i8count in inode 51699613855 entry "The Christmas Album" in shortform directory 51700580373 = references non-existent inode 98916237495would junk entry would fix i8count in inode 51700580373 entry "backupsync" in shortform directory 51736309770 references = non-existent inode 99184005157would junk entry would fix i8count in inode 51736309770 entry "VIDEO_TS" in shortform directory 55834578945 references = non-existent inode 43006791683would junk entry would fix i8count in inode 55834578945 entry ".." in directory inode 55834578947 points to non-existent inode = 98784251904, would junk entry bad hash table for directory inode 55834578947 (no data entry): would = rebuild entry ".." in directory inode 55951405125 points to non-existent inode = 43037696049, would junk entry entry "mfs-ftp" in directory inode 55951405125 points to non-existent = inode 98915766334, would junk entry bad hash table for directory inode 55951405125 (no data entry): would = rebuild entry "inc" in shortform directory 55951405131 references non-existent = inode 21676499003would junk entry would fix i8count in inode 55951405131 entry "inc" in shortform directory 55951405133 references non-existent = inode 43198287913would junk entry would fix i8count in inode 55951405133 entry "Windows Vista 32bit" in directory inode 55952322563 points to = non-existent inode 77491544085, would junk entry bad hash table for directory inode 55952322563 (no data entry): would = rebuild entry "Windows XP" in shortform directory 55952322565 references = non-existent inode 77491544087would junk entry would fix i8count in inode 55952322565 entry "src" in shortform directory 55952388115 references non-existent = inode 77491511355would junk entry would fix i8count in inode 55952388115 entry "tmp" in shortform directory 55952388137 references non-existent = inode 77491519573would junk entry would fix i8count in inode 55952388137 entry ".." in directory inode 55986327559 points to non-existent inode = 43392413878, would junk entry bad hash table for directory inode 55986327559 (no data entry): would = rebuild entry "Softly With These Songs - The Best of Roberta Flack" in shortform = directory 55986327560 references non-existent inode 21706354760would = junk entry would fix i8count in inode 55986327560 entry "Dancin' and Lovin'" in shortform directory 55986327563 references = non-existent inode 98918465560would junk entry would fix i8count in inode 55986327563 entry ".." in directory inode 60129546242 points to non-existent inode = 77309415424, would junk entry bad hash table for directory inode 60129546242 (no data entry): would = rebuild entry "Steve" in directory inode 60208181291 points to non-existent = inode 43055878204, would junk entry bad hash table for directory inode 60208181291 (no data entry): would = rebuild entry ".." in directory inode 60208181292 points to non-existent inode = 43037696048, would junk entry entry "license" in directory inode 60208181292 points to non-existent = inode 98915770383, would junk entry bad hash table for directory inode 60208181292 (no data entry): would = rebuild entry "tmp" in shortform directory 60276125765 references non-existent = inode 21676499002would junk entry would fix i8count in inode 60276125765 entry "lgpl" in shortform directory 60276125775 references non-existent = inode 77491511357would junk entry would fix i8count in inode 60276125775 entry ".." in directory inode 60276125777 points to non-existent inode = 43037696049, would junk entry bad hash table for directory inode 60276125777 (no data entry): would = rebuild entry "text-base" in shortform directory 60276129815 references = non-existent inode 77491519568would junk entry would fix i8count in inode 60276129815 entry "tmp" in shortform directory 60276129839 references non-existent = inode 77491519571would junk entry would fix i8count in inode 60276129839 entry "props" in shortform directory 60276129840 references non-existent = inode 98915770380would junk entry would fix i8count in inode 60276129840 entry "enst" in shortform directory 60276129841 references non-existent = inode 98915770381would junk entry would fix i8count in inode 60276129841 entry "HDx64" in shortform directory 60276203639 references non-existent = inode 98915782711would junk entry would fix i8count in inode 60276203639 entry "utility" in shortform directory 60276822060 references = non-existent inode 77491990553would junk entry would fix i8count in inode 60276822060 entry "Live! Live! Live!" in shortform directory 60276891651 references = non-existent inode 21706354714would junk entry would fix i8count in inode 60276891651 entry "AM Gold 1970" in shortform directory 60276891652 references = non-existent inode 43392978958would junk entry would fix i8count in inode 60276891652 entry "Greatest Hits + Five Unleashed" in shortform directory = 60276891660 references non-existent inode 77492490258would junk entry would fix i8count in inode 60276891660 entry "The Rock & Roll Era- 1963" in shortform directory 60276891661 = references non-existent inode 21706354763would junk entry would fix i8count in inode 60276891661 entry ".." in directory inode 60276891663 points to non-existent inode = 43392413878, would junk entry bad hash table for directory inode 60276891663 (no data entry): would = rebuild entry "default.mpg" in shortform directory 60277866727 references = non-existent inode 43052523580would junk entry would fix i8count in inode 60277866727 entry "AUDIO_TS" in shortform directory 64424513539 references = non-existent inode 77309415427would junk entry would fix i8count in inode 64424513539 entry ".." in directory inode 64424513580 points to non-existent inode = 43006791684, would junk entry bad hash table for directory inode 64424513580 (no data entry): would = rebuild entry "ARJ" in directory inode 64471937038 points to non-existent inode = 77370843142, would junk entry entry "Leslie" in directory inode 64471937038 points to non-existent = inode 98784251947, would junk entry bad hash table for directory inode 64471937038 (no data entry): would = rebuild entry "OriginalIFOs" in directory inode 64484773928 points to = non-existent inode 77594005544, would junk entry bad hash table for directory inode 64484773928 (no data entry): would = rebuild entry "2010-03-30" in directory inode 64551399498 points to non-existent = inode 77491511326, would junk entry entry "2013-07-26" in directory inode 64551399498 points to non-existent = inode 98915766291, would junk entry bad hash table for directory inode 64551399498 (no data entry): would = rebuild entry "libabi" in directory inode 64551399501 points to non-existent = inode 43196874832, would junk entry entry "msvc" in directory inode 64551399501 points to non-existent inode = 77491511350, would junk entry bad hash table for directory inode 64551399501 (no data entry): would = rebuild entry "inc" in shortform directory 64551399506 references non-existent = inode 77491511353would junk entry would fix i8count in inode 64551399506 entry ".svn" in shortform directory 64551399519 references non-existent = inode 98915770375would junk entry would fix i8count in inode 64551399519 entry ".." in directory inode 64551436290 points to non-existent inode = 43037696049, would junk entry entry "tivostream_v0p5" in directory inode 64551436290 points to = non-existent inode 77491523585, would junk entry bad hash table for directory inode 64551436290 (no data entry): would = rebuild entry "X86" in shortform directory 64551436350 references non-existent = inode 77491511344would junk entry would fix i8count in inode 64551436350 entry "free-x86_64-regparm0" in shortform directory 64551452696 = references non-existent inode 77491544082would junk entry would fix i8count in inode 64551452696 entry "Lynn Anderson" in directory inode 64796069907 points to = non-existent inode 77492490285, would junk entry bad hash table for directory inode 64796069907 (no data entry): would = rebuild entry "Animals" in directory inode 64796069909 points to non-existent = inode 77492490287, would junk entry entry "Bathroom" in directory inode 64796069909 points to non-existent = inode 98918465574, would junk entry entry "Office Supplies" in directory inode 64796069909 points to = non-existent inode 21706354790, would junk entry entry "Transitional Elements" in directory inode 64796069909 points to = non-existent inode 43393732625, would junk entry bad hash table for directory inode 64796069909 (no data entry): would = rebuild entry "RecentDocuments" in directory inode 64796418214 points to = non-existent inode 77492863014, would junk entry entry "kfileplaces" in directory inode 64796418214 points to = non-existent inode 99184005152, would junk entry bad hash table for directory inode 64796418214 (no data entry): would = rebuild entry "16x16" in shortform directory 64796418238 references non-existent = inode 77491511313would junk entry would fix i8count in inode 64796418238 entry ".." in directory inode 68727828484 points to non-existent inode = 42949677060, would junk entry bad hash table for directory inode 68727828484 (no data entry): would = rebuild entry ".." in directory inode 68727828531 points to non-existent inode = 42949677086, would junk entry bad hash table for directory inode 68727828531 (no data entry): would = rebuild entry "My Pictures" in directory inode 68748406819 points to = non-existent inode 43037630465, would junk entry bad hash table for directory inode 68748406819 (no data entry): would = rebuild entry "out" in directory inode 68840685627 points to non-existent inode = 77491511315, would junk entry bad hash table for directory inode 68840685627 (no data entry): would = rebuild entry ".." in directory inode 68912447582 points to non-existent inode = 43037696049, would junk entry bad hash table for directory inode 68912447582 (no data entry): would = rebuild entry "x86_64" in shortform directory 68912455734 references = non-existent inode 77491511341would junk entry would fix i8count in inode 68912455734 entry "libebml" in directory inode 68912455741 points to non-existent = inode 43196874834, would junk entry entry "sstring" in directory inode 68912455741 points to non-existent = inode 77491511352, would junk entry bad hash table for directory inode 68912455741 (no data entry): would = rebuild entry "libmmbd" in shortform directory 68912492551 references = non-existent inode 77491511351would junk entry would fix i8count in inode 68912492551 entry "props" in shortform directory 68912492559 references non-existent = inode 77491511358would junk entry would fix i8count in inode 68912492559 entry "props" in shortform directory 68912492560 references non-existent = inode 77491511359would junk entry would fix i8count in inode 68912492560 entry "props" in shortform directory 68912492561 references non-existent = inode 77491519565would junk entry would fix i8count in inode 68912492561 entry "props" in shortform directory 68912492562 references non-existent = inode 77491519566would junk entry would fix i8count in inode 68912492562 entry "props" in shortform directory 68912492565 references non-existent = inode 77491519569would junk entry would fix i8count in inode 68912492565 entry ".svn" in shortform directory 68912492569 references non-existent = inode 21676515437would junk entry would fix i8count in inode 68912492569 entry "props" in shortform directory 68912492571 references non-existent = inode 77491519574would junk entry would fix i8count in inode 68912492571 entry "Core-Static" in directory inode 68912492670 points to = non-existent inode 77491617833, would junk entry entry "Localization" in directory inode 68912492670 points to = non-existent inode 98915782696, would junk entry bad hash table for directory inode 68912492670 (no data entry): would = rebuild entry "x64" in shortform directory 68912726020 references non-existent = inode 77491617844would junk entry would fix i8count in inode 68912726020 entry "Heaven on Earth" in shortform directory 68996411446 references = non-existent inode 21706354713would junk entry would fix i8count in inode 68996411446 entry "AM GOLD 1971" in shortform directory 68996411449 references = non-existent inode 43392978961would junk entry would fix i8count in inode 68996411449 entry "Verities & Balderdash" in shortform directory 68996411450 = references non-existent inode 77492490240would junk entry would fix i8count in inode 68996411450 entry ".." in directory inode 68996796417 points to non-existent inode = 43392413878, would junk entry entry "Rock, Rhythm and Doo Wop, Vol. 1- The Greatest Songs =46rom Early = Rock 'n' Roll" in directory inode 68996796417 points to non-existent = inode 43392979001, would junk entry bad hash table for directory inode 68996796417 (no data entry): would = rebuild entry "Symphonic Poems" in shortform directory 68996796425 references = non-existent inode 21706354718would junk entry would fix i8count in inode 68996796425 entry ".." in directory inode 68996796438 points to non-existent inode = 77492162666, would junk entry bad hash table for directory inode 68996796438 (no data entry): would = rebuild entry "calendar" in shortform directory 68997402671 references = non-existent inode 77492863015would junk entry would fix i8count in inode 68997402671 entry "VIDEO_TS" in shortform directory 73014448131 references = non-existent inode 98784251907would junk entry would fix i8count in inode 73014448131 entry "website" in shortform directory 73014448183 references = non-existent inode 43196874752would junk entry would fix i8count in inode 73014448183 entry ".." in directory inode 73031290880 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 73031290880 (no data entry): would = rebuild entry "Website" in directory inode 73031290881 points to non-existent = inode 77370843180, would junk entry bad hash table for directory inode 73031290881 (no data entry): would = rebuild entry ".." in directory inode 73101590549 points to non-existent inode = 43037630465, would junk entry bad hash table for directory inode 73101590549 (no data entry): would = rebuild entry "src" in shortform directory 73105653769 references non-existent = inode 77594005535would junk entry would fix i8count in inode 73105653769 entry "bin" in shortform directory 73105666390 references non-existent = inode 77491511330would junk entry would fix i8count in inode 73105666390 entry "amd64" in shortform directory 73105666392 references non-existent = inode 77491511331would junk entry would fix i8count in inode 73105666392 entry "i386" in shortform directory 73105666394 references non-existent = inode 77491511334would junk entry would fix i8count in inode 73105666394 entry "4_0_U6" in directory inode 73105666395 points to non-existent = inode 77491511336, would junk entry entry "5_0_U2" in directory inode 73105666395 points to non-existent = inode 98915766303, would junk entry bad hash table for directory inode 73105666395 (no data entry): would = rebuild entry "CLI" in shortform directory 73105666398 references non-existent = inode 77491511343would junk entry would fix i8count in inode 73105666398 entry "autoxxx" in directory inode 73105666406 points to non-existent = inode 21676499006, would junk entry entry "libmakemkv" in directory inode 73105666406 points to non-existent = inode 43198287914, would junk entry bad hash table for directory inode 73105666406 (no data entry): would = rebuild entry "nonusb" in shortform directory 73105666412 references = non-existent inode 77491523584would junk entry would fix i8count in inode 73105666412 entry "Brolink" in directory inode 73105719305 points to non-existent = inode 77491523639, would junk entry bad hash table for directory inode 73105719305 (no data entry): would = rebuild entry "prop-base" in shortform directory 73105719310 references = non-existent inode 77491519567would junk entry would fix i8count in inode 73105719310 entry "prop-base" in shortform directory 73105747975 references = non-existent inode 77491519570would junk entry would fix i8count in inode 73105747975 entry "AM GOLD1969" in shortform directory 73272119303 references = non-existent inode 77492490254would junk entry would fix i8count in inode 73272119303 entry "Greatest Hits, Vol. 2" in shortform directory 73272119305 = references non-existent inode 43392978980would junk entry would fix i8count in inode 73272119305 entry "The Best of Styx (RCA)" in shortform directory 73272119306 = references non-existent inode 98918465546would junk entry would fix i8count in inode 73272119306 entry "Classic Rock- 1968 - The Beat Goes On" in shortform directory = 73272119309 references non-existent inode 43392979007would junk entry would fix i8count in inode 73272119309 entry "gidmigratortext" in shortform directory 73306308666 references = non-existent inode 77594005542would junk entry would fix i8count in inode 73306308666 entry ".." in directory inode 81653158051 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 81653158051 (no data entry): would = rebuild entry "TiVo_Temp" in directory inode 81786920975 points to non-existent = inode 21706354697, would junk entry bad hash table for directory inode 81786920975 (no data entry): would = rebuild entry ".." in directory inode 81786920996 points to non-existent inode = 77491511324, would junk entry bad hash table for directory inode 81786920996 (no data entry): would = rebuild entry ".." in directory inode 81786929197 points to non-existent inode = 43037696049, would junk entry bad hash table for directory inode 81786929197 (no data entry): would = rebuild entry "tms470" in shortform directory 81786929201 references = non-existent inode 21676499000would junk entry would fix i8count in inode 81786929201 entry "icons" in shortform directory 81786929207 references non-existent = inode 98915766328would junk entry would fix i8count in inode 81786929207 entry "32x32" in shortform directory 81786929211 references non-existent = inode 98915766332would junk entry would fix i8count in inode 81786929211 entry "Honeywell" in shortform directory 81786929214 references = non-existent inode 43392253981would junk entry would fix i8count in inode 81786929214 entry ".." in directory inode 81786929215 points to non-existent inode = 98915770389, would junk entry entry "Swe" in directory inode 81786929215 points to non-existent inode = 21676544026, would junk entry bad hash table for directory inode 81786929215 (no data entry): would = rebuild entry "TVApp" in directory inode 82064986146 points to non-existent = inode 98916159538, would junk entry bad hash table for directory inode 82064986146 (no data entry): would = rebuild entry "Greatest Hits (Capitol)" in shortform directory 82065092720 = references non-existent inode 98916237482would junk entry would fix i8count in inode 82065092720 entry "Symphonic Poems" in shortform directory 82065092722 references = non-existent inode 77492490253would junk entry would fix i8count in inode 82065092722 entry "Gyorgy Sandor Plays Prokofiev, Vol. 1 (3 of 3)" in directory = inode 82065301526 points to non-existent inode 43392978956, would junk = entry bad hash table for directory inode 82065301526 (no data entry): would = rebuild entry ".." in directory inode 82065301528 points to non-existent inode = 98916237472, would junk entry bad hash table for directory inode 82065301528 (no data entry): would = rebuild entry "Quiet Riot - Greatest Hits" in shortform directory 82201460747 = references non-existent inode 98918465572would junk entry would fix i8count in inode 82201460747 entry ".." in directory inode 82201460748 points to non-existent inode = 43393732623, would junk entry bad hash table for directory inode 82201460748 (no data entry): would = rebuild entry ".." in directory inode 82201460786 points to non-existent inode = 77594005563, would junk entry entry "Cat Scream-SoundBible.com-871191563.mp3" in directory inode = 82201460786 points to non-existent inode 77594005565, would junk entry entry "Evil_Laugh_Male_6-Himan-1359990674.mp3" in directory inode = 82201460786 points to non-existent inode 77594005567, would junk entry entry "Female_Scream_Horror-NeoPhyTe-138499973.mp3" in directory inode = 82201460786 points to non-existent inode 77491511309, would junk entry bad hash table for directory inode 82201460786 (no data entry): would = rebuild entry ".." in directory inode 85960990858 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 85960990858 (no data entry): would = rebuild entry "MP3" in directory inode 86092185615 points to non-existent inode = 43392413878, would junk entry bad hash table for directory inode 86092185615 (no data entry): would = rebuild entry ".." in directory inode 86092185616 points to non-existent inode = 21667586090, would junk entry entry "activityi_data" in directory inode 86092185616 points to = non-existent inode 98806263847, would junk entry bad hash table for directory inode 86092185616 (no data entry): would = rebuild entry "X86" in shortform directory 86092197954 references non-existent = inode 98915766318would junk entry would fix i8count in inode 86092197954 entry "src" in shortform directory 86092197971 references non-existent = inode 21676499004would junk entry would fix i8count in inode 86092197971 entry "QtExt" in shortform directory 86092197972 references non-existent = inode 98915766325would junk entry would fix i8count in inode 86092197972 entry "lgpl" in shortform directory 86092197973 references non-existent = inode 98915766326would junk entry would fix i8count in inode 86092197973 entry "lgpl" in shortform directory 86092197977 references non-existent = inode 98915766331would junk entry would fix i8count in inode 86092197977 entry "props" in shortform directory 86092197979 references non-existent = inode 43198287919would junk entry would fix i8count in inode 86092197979 entry "text-base" in shortform directory 86092197980 references = non-existent inode 98915770369would junk entry would fix i8count in inode 86092197980 entry "text-base" in shortform directory 86092197981 references = non-existent inode 98915770370would junk entry would fix i8count in inode 86092197981 entry "text-base" in shortform directory 86092197982 references = non-existent inode 98915770371would junk entry would fix i8count in inode 86092197982 entry "props" in shortform directory 86092197985 references non-existent = inode 98915770376would junk entry would fix i8count in inode 86092197985 entry "text-base" in shortform directory 86092197990 references = non-existent inode 98915770382would junk entry would fix i8count in inode 86092197990 entry ".." in directory inode 86092198002 points to non-existent inode = 43037696049, would junk entry bad hash table for directory inode 86092198002 (no data entry): would = rebuild entry ".." in directory inode 86092201989 points to non-existent inode = 98915770389, would junk entry entry "Cze" in directory inode 86092201989 points to non-existent inode = 43198083093, would junk entry entry "Hun" in directory inode 86092201989 points to non-existent inode = 77491523624, would junk entry entry "Por" in directory inode 86092201989 points to non-existent inode = 98915770392, would junk entry bad hash table for directory inode 86092201989 (no data entry): would = rebuild entry "patch_tool" in shortform directory 86092361747 references = non-existent inode 98915782710would junk entry would fix i8count in inode 86092361747 entry "Sounds of the Seventies- 1972" in shortform directory 86092816396 = references non-existent inode 77492162683would junk entry would fix i8count in inode 86092816396 entry "lock" in shortform directory 86093082687 references non-existent = inode 21758378071would junk entry would fix i8count in inode 86093082687 entry ".." in directory inode 86093668380 points to non-existent inode = 77491511324, would junk entry bad hash table for directory inode 86093668380 (no data entry): would = rebuild entry "Season 5" in directory inode 86093668383 points to non-existent = inode 98915766286, would junk entry entry "Season 7" in directory inode 86093668383 points to non-existent = inode 77491511324, would junk entry entry "Season 8" in directory inode 86093668383 points to non-existent = inode 98915766285, would junk entry bad hash table for directory inode 86093668383 (no data entry): would = rebuild entry ".." in directory inode 86093668397 points to non-existent inode = 77594005563, would junk entry bad hash table for directory inode 86093668397 (no data entry): would = rebuild entry "Twilight Zone Vol 06" in directory inode 90194317313 points to = non-existent inode 43006791684, would junk entry bad hash table for directory inode 90194317313 (no data entry): would = rebuild entry "04 - 100 Years (Album Version).mp3" in directory inode = 90270486545 points to non-existent inode 98915754013, would junk entry bad hash table for directory inode 90270486545 (no data entry): would = rebuild entry ".." in directory inode 90271576326 points to non-existent inode = 98784251947, would junk entry entry "Christmas" in directory inode 90271576326 points to non-existent = inode 21507739693, would junk entry bad hash table for directory inode 90271576326 (no data entry): would = rebuild entry ".." in directory inode 90328010761 points to non-existent inode = 21667586090, would junk entry bad hash table for directory inode 90328010761 (no data entry): would = rebuild entry "alpha" in shortform directory 90328019070 references non-existent = inode 43196874827would junk entry entry "x86" in shortform directory 90328019070 references non-existent = inode 77491511348would junk entry would fix i8count in inode 90328019070 entry ".." in directory inode 90328121345 points to non-existent inode = 43037696049, would junk entry entry ".deps" in directory inode 90328121345 points to non-existent = inode 77491523620, would junk entry bad hash table for directory inode 90328121345 (no data entry): would = rebuild entry "16x16" in shortform directory 90328121352 references non-existent = inode 98915766330would junk entry would fix i8count in inode 90328121352 entry ".." in directory inode 90328121357 points to non-existent inode = 77491519615, would junk entry bad hash table for directory inode 90328121357 (no data entry): would = rebuild entry ".." in directory inode 90328121367 points to non-existent inode = 98915770389, would junk entry entry "Por" in directory inode 90328121367 points to non-existent inode = 21676544027, would junk entry bad hash table for directory inode 90328121367 (no data entry): would = rebuild entry "Rocket 2722" in shortform directory 90328125499 references = non-existent inode 98915770424would junk entry would fix i8count in inode 90328125499 entry "prop-base" in shortform directory 90328137762 references = non-existent inode 98915770373would junk entry would fix i8count in inode 90328137762 entry "x86-64" in shortform directory 90328141849 references = non-existent inode 98915766301would junk entry would fix i8count in inode 90328141849 entry "DOFC" in directory inode 90328141851 points to non-existent inode = 98915782695, would junk entry bad hash table for directory inode 90328141851 (no data entry): would = rebuild entry "props" in shortform directory 90328141866 references non-existent = inode 98915770377would junk entry would fix i8count in inode 90328141866 entry "The Best of Bill Medley" in shortform directory 90516987962 = references non-existent inode 43392978950would junk entry would fix i8count in inode 90516987962 entry ".." in directory inode 90516987964 points to non-existent inode = 43392413878, would junk entry entry "Motown Legends, Vol. 1" in directory inode 90516987964 points to = non-existent inode 98916237477, would junk entry bad hash table for directory inode 90516987964 (no data entry): would = rebuild entry "Misc" in shortform directory 90517016577 references non-existent = inode 98916237498would junk entry would fix i8count in inode 90517016577 entry "Classic Rock- 1968" in shortform directory 90517016581 references = non-existent inode 77492490268would junk entry would fix i8count in inode 90517016581 entry "akonadi" in shortform directory 90549440584 references = non-existent inode 99184005153would junk entry would fix i8count in inode 90549440584 entry ".." in directory inode 90549440603 points to non-existent inode = 21706330135, would junk entry entry "2015-02-20 Puerto Rico" in directory inode 90549440603 points to = non-existent inode 98915754040, would junk entry bad hash table for directory inode 90549440603 (no data entry): would = rebuild entry "DOWNTON_ABBEY_D1" in directory inode 94489284608 points to = non-existent inode 77309415426, would junk entry entry "DOWNTON_ABBEY_S2_D3" in directory inode 94489284608 points to = non-existent inode 98784251906, would junk entry bad hash table for directory inode 94489284608 (no data entry): would = rebuild entry "1 The Best of Borge - Acts 1 and 2" in directory inode = 94489284609 points to non-existent inode 77309415448, would junk entry entry "6 Lost_Episodes of Victor Borge Vol_2" in directory inode = 94489284609 points to non-existent inode 98784251933, would junk entry bad hash table for directory inode 94489284609 (no data entry): would = rebuild entry "OriginalIFOs" in directory inode 94489284613 points to = non-existent inode 98784251914, would junk entry bad hash table for directory inode 94489284613 (no data entry): would = rebuild entry "Christmas" in directory inode 94489284652 points to non-existent = inode 21507739692, would junk entry bad hash table for directory inode 94489284652 (no data entry): would = rebuild entry "Q01Files" in shortform directory 94489284668 references = non-existent inode 43006791737would junk entry would fix i8count in inode 94489284668 entry ".." in directory inode 94536843282 points to non-existent inode = 21667586090, would junk entry bad hash table for directory inode 94536843282 (no data entry): would = rebuild entry "Windows" in directory inode 94536843319 points to non-existent = inode 77491511346, would junk entry entry "logrotate" in directory inode 94536843319 points to non-existent = inode 98915766320, would junk entry bad hash table for directory inode 94536843319 (no data entry): would = rebuild entry "Disk 8" in shortform directory 94562865200 references = non-existent inode 21676515402would junk entry would fix i8count in inode 94562865200 entry "Photos" in directory inode 94587891751 points to non-existent = inode 98915766287, would junk entry bad hash table for directory inode 94587891751 (no data entry): would = rebuild entry "prop-base" in shortform directory 94587895810 references = non-existent inode 98915770379would junk entry would fix i8count in inode 94587895810 entry "Cht" in shortform directory 94587895822 references non-existent = inode 43198083118would junk entry would fix i8count in inode 94587895822 entry ".." in directory inode 94587895836 points to non-existent inode = 77491523643, would junk entry bad hash table for directory inode 94587895836 (no data entry): would = rebuild entry "Linux-2.4.x" in directory inode 94659698699 points to = non-existent inode 98915774493, would junk entry bad hash table for directory inode 94659698699 (no data entry): would = rebuild entry "storport" in shortform directory 94659698704 references = non-existent inode 98915766311would junk entry would fix i8count in inode 94659698704 entry "ja" in directory inode 94659702817 points to non-existent inode = 21676929032, would junk entry entry "pt-BR" in directory inode 94659702817 points to non-existent = inode 43198292024, would junk entry bad hash table for directory inode 94659702817 (no data entry): would = rebuild entry "AMD_Chipset_Driver_xp" in directory inode 94659702828 points to = non-existent inode 98915782703, would junk entry bad hash table for directory inode 94659702828 (no data entry): would = rebuild entry ".." in directory inode 94994862126 points to non-existent inode = 43392253987, would junk entry bad hash table for directory inode 94994862126 (no data entry): would = rebuild entry "The Best of Frank Mills- Happy Music" in shortform directory = 95118995629 references non-existent inode 77492162687would junk entry would fix i8count in inode 95118995629 entry "Moving" in shortform directory 95118995634 references = non-existent inode 21706354755would junk entry would fix i8count in inode 95118995634 entry "Masters of Classical Music, Vol. 5 Wagner" in shortform directory = 95118995644 references non-existent inode 77492162682would junk entry would fix i8count in inode 95118995644 entry ".." in directory inode 95157329964 points to non-existent inode = 99184005156, would junk entry entry "NewEgg" in directory inode 95157329964 points to non-existent = inode 21758378076, would junk entry entry "Sent" in directory inode 95157329964 points to non-existent inode = 43393732658, would junk entry bad hash table for directory inode 95157329964 (no data entry): would = rebuild entry "src" in shortform directory 95375138851 references non-existent = inode 98915754014would junk entry would fix i8count in inode 95375138851 entry "lgpl" in shortform directory 95375138852 references non-existent = inode 98915754036would junk entry would fix i8count in inode 95375138852 entry "d01" in shortform directory 95375138856 references non-existent = inode 99189358615would junk entry would fix i8count in inode 95375138856 entry "Broadcom Wireless" in shortform directory 95375138861 references = non-existent inode 21676544020would junk entry entry "TrendNet" in shortform directory 95375138861 references = non-existent inode 98915754007would junk entry would fix i8count in inode 95375138861 entry "VIDEO_TS" in shortform directory 103079219201 references = non-existent inode 21474840632would junk entry would fix i8count in inode 103079219201 entry ".." in directory inode 103079219243 points to non-existent inode = 77309415448, would junk entry bad hash table for directory inode 103079219243 (no data entry): would = rebuild entry ".." in directory inode 103124635648 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 103124635648 (no data entry): would = rebuild entry ".." in directory inode 103166758944 points to non-existent inode = 98915766285, would junk entry bad hash table for directory inode 103166758944 (no data entry): would = rebuild entry ".." in directory inode 103166820441 points to non-existent inode = 98915770389, would junk entry entry "Ita" in directory inode 103166820441 points to non-existent inode = 21676544028, would junk entry entry "Rom" in directory inode 103166820441 points to non-existent inode = 43198083119, would junk entry bad hash table for directory inode 103166820441 (no data entry): would = rebuild entry "Q Light Controller" in shortform directory 103166820454 = references non-existent inode 77491527690would junk entry would fix i8count in inode 103166820454 entry "BIOS" in directory inode 103166820468 points to non-existent = inode 77491527723, would junk entry entry "rr232x-linux-src-v1.10" in directory inode 103166820468 points to = non-existent inode 98915774487, would junk entry bad hash table for directory inode 103166820468 (no data entry): would = rebuild entry ".." in directory inode 103166828595 points to non-existent inode = 77491527723, would junk entry bad hash table for directory inode 103166828595 (no data entry): would = rebuild entry ".." in directory inode 103166828598 points to non-existent inode = 43196874878, would junk entry bad hash table for directory inode 103166828598 (no data entry): would = rebuild entry "Sounds of the Seventies- 1972" in shortform directory = 103167189121 references non-existent inode 21706354727would junk entry would fix i8count in inode 103167189121 entry ".." in directory inode 103167189169 points to non-existent inode = 98916237465, would junk entry bad hash table for directory inode 103167189169 (no data entry): would = rebuild entry "tmp" in shortform directory 103167508531 references non-existent = inode 21758378072would junk entry would fix i8count in inode 103167508531 entry ".." in directory inode 103167508533 points to non-existent inode = 77492863017, would junk entry bad hash table for directory inode 103167508533 (no data entry): would = rebuild entry "VIDEO_TS" in shortform directory 107374186498 references = non-existent inode 42949677059would junk entry would fix i8count in inode 107374186498 entry "EasyBoot" in directory inode 107374198820 points to non-existent = inode 98918465573, would junk entry bad hash table for directory inode 107374198820 (no data entry): would = rebuild entry "x86" in shortform directory 107599970322 references non-existent = inode 98915766322would junk entry would fix i8count in inode 107599970322 entry "Frc" in directory inode 107600003166 points to non-existent inode = 21676544021, would junk entry entry "Nor" in directory inode 107600003166 points to non-existent inode = 43196874879, would junk entry bad hash table for directory inode 107600003166 (no data entry): would = rebuild entry ".." in directory inode 107600003167 points to non-existent inode = 98915770389, would junk entry entry "Fin" in directory inode 107600003167 points to non-existent inode = 77491523634, would junk entry entry "Por" in directory inode 107600003167 points to non-existent inode = 98915770394, would junk entry bad hash table for directory inode 107600003167 (no data entry): would = rebuild entry ".." in directory inode 107600539659 points to non-existent inode = 98915782703, would junk entry bad hash table for directory inode 107600539659 (no data entry): would = rebuild entry ".." in directory inode 107600724055 points to non-existent inode = 21706297361, would junk entry bad hash table for directory inode 107600724055 (no data entry): would = rebuild entry ".." in directory inode 107600814352 points to non-existent inode = 43392978953, would junk entry bad hash table for directory inode 107600814352 (no data entry): would = rebuild entry ".." in directory inode 107600814365 points to non-existent inode = 21706354704, would junk entry bad hash table for directory inode 107600814365 (no data entry): would = rebuild entry "Editor" in directory inode 107663573017 points to non-existent = inode 21706354789, would junk entry bad hash table for directory inode 107663573017 (no data entry): would = rebuild entry ".." in directory inode 107666485369 points to non-existent inode = 98915766285, would junk entry bad hash table for directory inode 107666485369 (no data entry): would = rebuild entry ".." in directory inode 111673475085 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 111673475085 (no data entry): would = rebuild entry "2.4.4" in directory inode 111686406241 points to non-existent = inode 21676515447, would junk entry bad hash table for directory inode 111686406241 (no data entry): would = rebuild entry "AMD_Chipset_Driver_xp" in shortform directory 111886688296 = references non-existent inode 21676929031would junk entry would fix i8count in inode 111886688296 entry ".." in directory inode 111887126568 points to non-existent inode = 21706297361, would junk entry entry "sensord" in directory inode 111887126568 points to non-existent = inode 21706330113, would junk entry bad hash table for directory inode 111887126568 (no data entry): would = rebuild entry "Very Best of - Only the beginning" in shortform directory = 111887241217 references non-existent inode 98916237470would junk entry would fix i8count in inode 111887241217 entry "Sounds of the Seventies- 1973" in shortform directory = 111887241225 references non-existent inode 98918465545would junk entry would fix i8count in inode 111887241225 entry "Groovin'" in shortform directory 111887241228 references = non-existent inode 43392979005would junk entry would fix i8count in inode 111887241228 entry ".." in directory inode 111895687207 points to non-existent inode = 43392978952, would junk entry bad hash table for directory inode 111895687207 (no data entry): would = rebuild entry "Greatest HIts" in shortform directory 111895687208 references = non-existent inode 98916237475would junk entry would fix i8count in inode 111895687208 entry ".." in directory inode 111895687209 points to non-existent inode = 43392978953, would junk entry bad hash table for directory inode 111895687209 (no data entry): would = rebuild entry ".." in directory inode 115964121113 points to non-existent inode = 98784251908, would junk entry bad hash table for directory inode 115964121113 (no data entry): would = rebuild entry ".." in directory inode 116006125580 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 116006125580 (no data entry): would = rebuild entry ".." in directory inode 116192387077 points to non-existent inode = 98915770378, would junk entry bad hash table for directory inode 116192387077 (no data entry): would = rebuild entry ".." in directory inode 116192387114 points to non-existent inode = 98915770389, would junk entry entry "Fre" in directory inode 116192387114 points to non-existent inode = 21676544029, would junk entry entry "Pol" in directory inode 116192387114 points to non-existent inode = 43198083120, would junk entry bad hash table for directory inode 116192387114 (no data entry): would = rebuild entry "EZ Ridin'" in shortform directory 116343926954 references = non-existent inode 21706354762would junk entry would fix i8count in inode 116343926954 entry ".." in directory inode 116343980276 points to non-existent inode = 21706354699, would junk entry bad hash table for directory inode 116343980276 (no data entry): would = rebuild entry ".." in directory inode 116343980280 points to non-existent inode = 43392978953, would junk entry bad hash table for directory inode 116343980280 (no data entry): would = rebuild entry ".." in directory inode 116398661643 points to non-existent inode = 99184005153, would junk entry bad hash table for directory inode 116398661643 (no data entry): would = rebuild entry ".." in directory inode 120259088386 points to non-existent inode = 77309415426, would junk entry bad hash table for directory inode 120259088386 (no data entry): would = rebuild entry ".." in directory inode 120329281560 points to non-existent inode = 98784251947, would junk entry entry "1993" in directory inode 120329281560 points to non-existent = inode 98802544862, would junk entry entry "Quicken Downloads" in directory inode 120329281560 points to = non-existent inode 21552037890, would junk entry bad hash table for directory inode 120329281560 (no data entry): would = rebuild entry "makemkv-bin-1.9.1" in directory inode 120362094654 points to = non-existent inode 43394228240, would junk entry entry "ffmpeg-2.1.1" in directory inode 120362094654 points to = non-existent inode 43196874826, would junk entry entry "makemkv-oss-1.9.0" in directory inode 120362094654 points to = non-existent inode 77491511347, would junk entry bad hash table for directory inode 120362094654 (no data entry): would = rebuild entry "jni" in shortform directory 120448295015 references non-existent = inode 77491519572would junk entry would fix i8count in inode 120448295015 entry ".." in directory inode 120471560274 points to non-existent inode = 98915770424, would junk entry bad hash table for directory inode 120471560274 (no data entry): would = rebuild entry "Classic Rock- 1966 - Blowin' Your Mind" in shortform directory = 120472117286 references non-existent inode 77492162675would junk entry would fix i8count in inode 120472117286 entry ".." in directory inode 120472117287 points to non-existent inode = 43392413878, would junk entry entry "Martina McBride" in directory inode 120472117287 points to = non-existent inode 21706354715, would junk entry entry "Orchestra Manhattan" in directory inode 120472117287 points to = non-existent inode 43392978952, would junk entry bad hash table for directory inode 120472117287 (no data entry): would = rebuild entry "Wedding Day Music" in shortform directory 120472117289 references = non-existent inode 98916237481would junk entry would fix i8count in inode 120472117289 entry "AM GOLD 1971" in shortform directory 120472117291 references = non-existent inode 43392978964would junk entry would fix i8count in inode 120472117291 entry ".." in directory inode 120533618729 points to non-existent inode = 42949677056, would junk entry entry ".config" in directory inode 120533618729 points to non-existent = inode 77492863017, would junk entry entry "mail" in directory inode 120533618729 points to non-existent = inode 99184005156, would junk entry entry "Templates" in directory inode 120533618729 points to non-existent = inode 21758378089, would junk entry entry "Videos" in directory inode 120533618729 points to non-existent = inode 43394228287, would junk entry bad hash table for directory inode 120533618729 (no data entry): would = rebuild entry "kicker" in directory inode 120533618733 points to non-existent = inode 21758378074, would junk entry entry "kwallet" in directory inode 120533618733 points to non-existent = inode 43393732656, would junk entry bad hash table for directory inode 120533618733 (no data entry): would = rebuild entry "Symantec" in shortform directory 124571324436 references = non-existent inode 21552037911would junk entry would fix i8count in inode 124571324436 entry ".." in directory inode 124571324437 points to non-existent inode = 98784251947, would junk entry bad hash table for directory inode 124571324437 (no data entry): would = rebuild entry "x86" in shortform directory 124656844832 references non-existent = inode 21676499001would junk entry would fix i8count in inode 124656844832 entry "plugins" in directory inode 124656857201 points to non-existent = inode 77594005540, would junk entry bad hash table for directory inode 124656857201 (no data entry): would = rebuild entry ".." in directory inode 124656869394 points to non-existent inode = 98915770389, would junk entry entry "Cze" in directory inode 124656869394 points to non-existent inode = 98915770396, would junk entry entry "Rus" in directory inode 124656869394 points to non-existent inode = 21676544030, would junk entry bad hash table for directory inode 124656869394 (no data entry): would = rebuild entry "rr272x" in shortform directory 124689535045 references = non-existent inode 21676552198would junk entry would fix i8count in inode 124689535045 entry ".." in directory inode 124689535051 points to non-existent inode = 43198287899, would junk entry bad hash table for directory inode 124689535051 (no data entry): would = rebuild entry "Suse-SLES" in shortform directory 124689539163 references = non-existent inode 21676515431would junk entry entry "Debian" in shortform directory 124689539163 references = non-existent inode 98915766327would junk entry would fix i8count in inode 124689539163 entry "Alive 'N Kickin' (Collectables)" in shortform directory = 124753793139 references non-existent inode 21706354712would junk entry would fix i8count in inode 124753793139 entry ".." in directory inode 124753793147 points to non-existent inode = 43392413878, would junk entry entry "The Jazz Singer" in directory inode 124753793147 points to = non-existent inode 21706354754, would junk entry bad hash table for directory inode 124753793147 (no data entry): would = rebuild entry "Sounds of the Seventies- AM Nuggets" in shortform directory = 124753793148 references non-existent inode 77492490256would junk entry would fix i8count in inode 124753793148 entry ".." in directory inode 124753965056 points to non-existent inode = 43392413878, would junk entry entry "Seven Separate Fools" in directory inode 124753965056 points to = non-existent inode 77492490272, would junk entry bad hash table for directory inode 124753965056 (no data entry): would = rebuild entry "PowerQuest PartitionMagic 6.0" in directory inode 124762431535 = points to non-existent inode 21706354788, would junk entry entry "UTILITY" in directory inode 124762431535 points to non-existent = inode 43393732623, would junk entry bad hash table for directory inode 124762431535 (no data entry): would = rebuild entry "1997" in directory inode 128857702411 points to non-existent = inode 21552037912, would junk entry entry "2006" in directory inode 128857702411 points to non-existent = inode 43006791739, would junk entry entry "VALIDATE" in directory inode 128857702411 points to non-existent = inode 77370843184, would junk entry bad hash table for directory inode 128857702411 (no data entry): would = rebuild entry ".." in directory inode 128857702412 points to non-existent inode = 98784251947, would junk entry entry "Power" in directory inode 128857702412 points to non-existent = inode 98802544890, would junk entry bad hash table for directory inode 128857702412 (no data entry): would = rebuild entry "Q01Files" in shortform directory 128857702413 references = non-existent inode 77370843181would junk entry would fix i8count in inode 128857702413 entry "5_3" in directory inode 128987131937 points to non-existent inode = 21676515426, would junk entry entry "5_8" in directory inode 128987131937 points to non-existent inode = 43198083135, would junk entry bad hash table for directory inode 128987131937 (no data entry): would = rebuild entry ".." in directory inode 128987152396 points to non-existent inode = 98915770389, would junk entry entry "Bul" in directory inode 128987152396 points to non-existent inode = 43198083121, would junk entry entry "Fin" in directory inode 128987152396 points to non-existent inode = 77491523640, would junk entry entry "Ita" in directory inode 128987152396 points to non-existent inode = 98915770397, would junk entry bad hash table for directory inode 128987152396 (no data entry): would = rebuild entry "TVFM" in shortform directory 128991920148 references non-existent = inode 21676552203would junk entry would fix i8count in inode 128991920148 entry "Stills" in shortform directory 129135882335 references = non-existent inode 21706330135would junk entry would fix i8count in inode 129135882335 entry ".." in directory inode 129135882353 points to non-existent inode = 43392413878, would junk entry entry "Carmen-Suite Nr. 1-no. 1" in directory inode 129135882353 points = to non-existent inode 21706354716, would junk entry entry "Dvorak" in directory inode 129135882353 points to non-existent = inode 43392978953, would junk entry entry "Misc" in directory inode 129135882353 points to non-existent = inode 77492162680, would junk entry entry "S=C3=A1ndor, J=C3=A1nos" in directory inode 129135882353 points = to non-existent inode 98916237472, would junk entry bad hash table for directory inode 129135882353 (no data entry): would = rebuild entry "VIDEO_TS" in shortform directory 133143990276 references = non-existent inode 21474840587would junk entry would fix i8count in inode 133143990276 entry "The Greatest Hits" in shortform directory 133143990305 references = non-existent inode 21507739691would junk entry would fix i8count in inode 133143990305 entry "Win" in directory inode 133252530210 points to non-existent inode = 21667586091, would junk entry entry "man" in directory inode 133252530210 points to non-existent inode = 43037696050, would junk entry bad hash table for directory inode 133252530210 (no data entry): would = rebuild entry "props" in shortform directory 133252546594 references = non-existent inode 21676515400would junk entry would fix i8count in inode 133252546594 entry "Nor" in shortform directory 133252555235 references non-existent = inode 21676544039would junk entry would fix i8count in inode 133252555235 entry "The Very Best of Dusty Springfield (Mercury)" in shortform = directory 133306257434 references non-existent inode 21706354722would = junk entry would fix i8count in inode 133306257434 entry "Starbox" in shortform directory 133306257442 references = non-existent inode 43392979000would junk entry would fix i8count in inode 133306257442 entry "Konzerte Concertos on authentic instruments" in shortform = directory 133306257451 references non-existent inode 21706354717would = junk entry would fix i8count in inode 133306257451 entry ".config" in directory inode 133306986547 points to non-existent = inode 21758378070, would junk entry entry "mail" in directory inode 133306986547 points to non-existent = inode 43393732652, would junk entry bad hash table for directory inode 133306986547 (no data entry): would = rebuild entry "backupsync" in shortform directory 133306986548 references = non-existent inode 43393732653would junk entry would fix i8count in inode 133306986548 entry "tmp" in directory inode 133306986553 points to non-existent inode = 77492863021, would junk entry bad hash table for directory inode 133306986553 (no data entry): would = rebuild - traversal finished ... - moving disconnected inodes to lost+found ... disconnected dir inode 68972565, would move to lost+found disconnected dir inode 202739755, would move to lost+found disconnected dir inode 202969156, would move to lost+found disconnected dir inode 202969176, would move to lost+found disconnected dir inode 202973213, would move to lost+found disconnected dir inode 202981377, would move to lost+found disconnected dir inode 417288195, would move to lost+found disconnected dir inode 417296423, would move to lost+found disconnected dir inode 418459704, would move to lost+found disconnected dir inode 418459705, would move to lost+found disconnected dir inode 418459706, would move to lost+found disconnected dir inode 418459707, would move to lost+found disconnected dir inode 418459708, would move to lost+found disconnected dir inode 418459709, would move to lost+found disconnected dir inode 418459710, would move to lost+found disconnected dir inode 418459711, would move to lost+found disconnected dir inode 419037184, would move to lost+found disconnected dir inode 419037185, would move to lost+found disconnected dir inode 419037186, would move to lost+found disconnected dir inode 419037187, would move to lost+found disconnected dir inode 419037188, would move to lost+found disconnected dir inode 419037189, would move to lost+found disconnected dir inode 469307446, would move to lost+found disconnected dir inode 469311510, would move to lost+found disconnected dir inode 469311521, would move to lost+found disconnected dir inode 4355010570, would move to lost+found disconnected dir inode 4360618047, would move to lost+found disconnected dir inode 4479877155, would move to lost+found disconnected dir inode 4479877246, would move to lost+found disconnected dir inode 4479889458, would move to lost+found disconnected dir inode 4480135186, would move to lost+found disconnected dir inode 4488884269, would move to lost+found disconnected dir inode 4488884270, would move to lost+found disconnected dir inode 4488884271, would move to lost+found disconnected dir inode 4488884272, would move to lost+found disconnected dir inode 4488884273, would move to lost+found disconnected dir inode 4488884274, would move to lost+found disconnected dir inode 4488884275, would move to lost+found disconnected dir inode 4488884276, would move to lost+found disconnected dir inode 4488884277, would move to lost+found disconnected dir inode 4488884278, would move to lost+found disconnected dir inode 4488884279, would move to lost+found disconnected dir inode 4488884280, would move to lost+found disconnected dir inode 4488884281, would move to lost+found disconnected dir inode 4488884282, would move to lost+found disconnected dir inode 8589938726, would move to lost+found disconnected dir inode 8589938734, would move to lost+found disconnected dir inode 8644796441, would move to lost+found disconnected dir inode 8843169879, would move to lost+found disconnected dir inode 8843169890, would move to lost+found disconnected dir inode 8859947014, would move to lost+found disconnected dir inode 8879145003, would move to lost+found disconnected dir inode 8891183112, would move to lost+found disconnected dir inode 8891183113, would move to lost+found disconnected dir inode 8891183114, would move to lost+found disconnected dir inode 8891183115, would move to lost+found disconnected dir inode 8891183116, would move to lost+found disconnected dir inode 8891183117, would move to lost+found disconnected dir inode 8891183118, would move to lost+found disconnected dir inode 8891183119, would move to lost+found disconnected dir inode 8891183120, would move to lost+found disconnected dir inode 8891183121, would move to lost+found disconnected dir inode 8891183122, would move to lost+found disconnected dir inode 8891183123, would move to lost+found disconnected dir inode 8891183124, would move to lost+found disconnected dir inode 8891183125, would move to lost+found disconnected dir inode 8891183133, would move to lost+found disconnected dir inode 8891183157, would move to lost+found disconnected dir inode 8891379716, would move to lost+found disconnected dir inode 12884906014, would move to lost+found disconnected dir inode 13011120171, would move to lost+found disconnected dir inode 13027205212, would move to lost+found disconnected dir inode 13027205214, would move to lost+found disconnected dir inode 13027205230, would move to lost+found disconnected dir inode 13027217453, would move to lost+found disconnected dir inode 13027512330, would move to lost+found disconnected dir inode 13074718840, would move to lost+found disconnected dir inode 13074718841, would move to lost+found disconnected dir inode 13074718842, would move to lost+found disconnected dir inode 13074718843, would move to lost+found disconnected dir inode 13074718844, would move to lost+found disconnected dir inode 13074718845, would move to lost+found disconnected dir inode 13074718846, would move to lost+found disconnected dir inode 13074718847, would move to lost+found disconnected dir inode 13091356672, would move to lost+found disconnected dir inode 13091356673, would move to lost+found disconnected dir inode 13091356674, would move to lost+found disconnected dir inode 13091356675, would move to lost+found disconnected dir inode 13091356676, would move to lost+found disconnected dir inode 13091356677, would move to lost+found disconnected dir inode 13091356703, would move to lost+found disconnected dir inode 13091356706, would move to lost+found disconnected dir inode 13091356729, would move to lost+found disconnected dir inode 17241608248, would move to lost+found disconnected dir inode 17336291336, would move to lost+found disconnected dir inode 17420197970, would move to lost+found disconnected dir inode 17420197971, would move to lost+found disconnected dir inode 17420197976, would move to lost+found disconnected dir inode 17420202008, would move to lost+found disconnected dir inode 17420202022, would move to lost+found disconnected dir inode 17420435478, would move to lost+found disconnected dir inode 17420435484, would move to lost+found disconnected dir inode 17436659734, would move to lost+found disconnected dir inode 17436659735, would move to lost+found disconnected dir inode 17436659736, would move to lost+found disconnected dir inode 17436659737, would move to lost+found disconnected dir inode 17436659738, would move to lost+found disconnected dir inode 17436659739, would move to lost+found disconnected dir inode 17436659740, would move to lost+found disconnected dir inode 17436659741, would move to lost+found disconnected dir inode 17436659742, would move to lost+found disconnected dir inode 17436659743, would move to lost+found disconnected dir inode 17436659744, would move to lost+found disconnected dir inode 17436659745, would move to lost+found disconnected dir inode 17436659746, would move to lost+found disconnected dir inode 17436659747, would move to lost+found disconnected dir inode 17436729349, would move to lost+found disconnected dir inode 17436729352, would move to lost+found disconnected dir inode 17436729353, would move to lost+found disconnected dir inode 17436729376, would move to lost+found disconnected dir inode 17436729377, would move to lost+found disconnected dir inode 25769807875, would move to lost+found disconnected dir inode 25925189647, would move to lost+found disconnected dir inode 26008141866, would move to lost+found disconnected dir inode 26057682952, would move to lost+found disconnected dir inode 26154033305, would move to lost+found disconnected dir inode 26260242760, would move to lost+found disconnected dir inode 26260242763, would move to lost+found disconnected dir inode 26260242848, would move to lost+found disconnected dir inode 26260242858, would move to lost+found disconnected dir inode 26260242873, would move to lost+found disconnected dir inode 26260267046, would move to lost+found disconnected dir inode 26260271146, would move to lost+found disconnected dir inode 26260271148, would move to lost+found disconnected dir inode 26260271155, would move to lost+found disconnected dir inode 27415207947, would move to lost+found disconnected dir inode 27415207948, would move to lost+found disconnected dir inode 27415207949, would move to lost+found disconnected dir inode 27415207950, would move to lost+found disconnected dir inode 27415207951, would move to lost+found disconnected dir inode 27415207952, would move to lost+found disconnected dir inode 27415207953, would move to lost+found disconnected dir inode 27415207954, would move to lost+found disconnected dir inode 27415207955, would move to lost+found disconnected dir inode 27415207956, would move to lost+found disconnected dir inode 27415207957, would move to lost+found disconnected dir inode 27415207958, would move to lost+found disconnected dir inode 27415207959, would move to lost+found disconnected dir inode 27415207960, would move to lost+found disconnected dir inode 27415265342, would move to lost+found disconnected dir inode 27739979786, would move to lost+found disconnected dir inode 27739979799, would move to lost+found disconnected dir inode 27739979812, would move to lost+found disconnected dir inode 30064775184, would move to lost+found disconnected dir inode 30094696481, would move to lost+found disconnected dir inode 30095568937, would move to lost+found disconnected dir inode 30191648788, would move to lost+found disconnected dir inode 30191923240, would move to lost+found disconnected dir inode 30191923248, would move to lost+found disconnected dir inode 30191923253, would move to lost+found disconnected dir inode 30191923258, would move to lost+found disconnected dir inode 30191923269, would move to lost+found disconnected dir inode 30191923272, would move to lost+found disconnected dir inode 30191923327, would move to lost+found disconnected dir inode 30191947794, would move to lost+found disconnected dir inode 30191988752, would move to lost+found disconnected dir inode 30191988761, would move to lost+found disconnected dir inode 30192533551, would move to lost+found disconnected dir inode 30192533552, would move to lost+found disconnected dir inode 30192533553, would move to lost+found disconnected dir inode 30192533554, would move to lost+found disconnected dir inode 30192533555, would move to lost+found disconnected dir inode 30192533556, would move to lost+found disconnected dir inode 30192533557, would move to lost+found disconnected dir inode 30192533558, would move to lost+found disconnected dir inode 30192533559, would move to lost+found disconnected dir inode 30192533560, would move to lost+found disconnected dir inode 30192533561, would move to lost+found disconnected dir inode 30192533562, would move to lost+found disconnected dir inode 30192533563, would move to lost+found disconnected dir inode 30192533564, would move to lost+found disconnected dir inode 30192533566, would move to lost+found disconnected dir inode 34465358126, would move to lost+found disconnected dir inode 34493800450, would move to lost+found disconnected dir inode 34493800455, would move to lost+found disconnected dir inode 34493800459, would move to lost+found disconnected dir inode 34493800462, would move to lost+found disconnected dir inode 34495025181, would move to lost+found disconnected dir inode 34495025194, would move to lost+found disconnected dir inode 34562310184, would move to lost+found disconnected dir inode 34782539819, would move to lost+found disconnected dir inode 34782539820, would move to lost+found disconnected dir inode 34782539821, would move to lost+found disconnected dir inode 34782539822, would move to lost+found disconnected dir inode 34782539823, would move to lost+found disconnected dir inode 34782539824, would move to lost+found disconnected dir inode 34782539825, would move to lost+found disconnected dir inode 34782539826, would move to lost+found disconnected dir inode 34782539827, would move to lost+found disconnected dir inode 34782539828, would move to lost+found disconnected dir inode 34782539829, would move to lost+found disconnected dir inode 34782539830, would move to lost+found disconnected dir inode 34782539831, would move to lost+found disconnected dir inode 34782539832, would move to lost+found disconnected dir inode 34847252487, would move to lost+found disconnected dir inode 34847252525, would move to lost+found disconnected dir inode 38704078853, would move to lost+found disconnected dir inode 38719377423, would move to lost+found disconnected dir inode 38719377433, would move to lost+found disconnected dir inode 38719377442, would move to lost+found disconnected dir inode 38719377445, would move to lost+found disconnected dir inode 38719377466, would move to lost+found disconnected dir inode 38719963141, would move to lost+found disconnected dir inode 38720200755, would move to lost+found disconnected dir inode 38720765961, would move to lost+found disconnected dir inode 38720765979, would move to lost+found disconnected dir inode 38720765980, would move to lost+found disconnected dir inode 38720765981, would move to lost+found disconnected dir inode 38720765982, would move to lost+found disconnected dir inode 38720765983, would move to lost+found disconnected dir inode 38720765984, would move to lost+found disconnected dir inode 38720765985, would move to lost+found disconnected dir inode 38720765986, would move to lost+found disconnected dir inode 38720765987, would move to lost+found disconnected dir inode 38720765988, would move to lost+found disconnected dir inode 38720765989, would move to lost+found disconnected dir inode 38720765990, would move to lost+found disconnected dir inode 38720765991, would move to lost+found disconnected dir inode 38720765992, would move to lost+found disconnected dir inode 38720962566, would move to lost+found disconnected dir inode 38720962589, would move to lost+found disconnected dir inode 38825242678, would move to lost+found disconnected inode 38829563915, would move to lost+found disconnected inode 38829563916, would move to lost+found disconnected inode 38829563917, would move to lost+found disconnected inode 38829563918, would move to lost+found disconnected inode 38829563919, would move to lost+found disconnected inode 38829563920, would move to lost+found disconnected dir inode 38829563921, would move to lost+found disconnected dir inode 47244644354, would move to lost+found disconnected dir inode 47272431634, would move to lost+found disconnected dir inode 47272431653, would move to lost+found disconnected dir inode 47280685073, would move to lost+found disconnected dir inode 47280693249, would move to lost+found disconnected dir inode 47280693257, would move to lost+found disconnected dir inode 47280693278, would move to lost+found disconnected dir inode 47280693287, would move to lost+found disconnected dir inode 47280693289, would move to lost+found disconnected dir inode 47280693290, would move to lost+found disconnected dir inode 47280693309, would move to lost+found disconnected dir inode 47280783368, would move to lost+found disconnected dir inode 47280783379, would move to lost+found disconnected dir inode 47280783382, would move to lost+found disconnected dir inode 47280783439, would move to lost+found disconnected dir inode 47280783442, would move to lost+found disconnected dir inode 47280783443, would move to lost+found disconnected dir inode 47280783478, would move to lost+found disconnected dir inode 47285768194, would move to lost+found disconnected dir inode 47332347956, would move to lost+found disconnected dir inode 47332347957, would move to lost+found disconnected dir inode 47332347958, would move to lost+found disconnected dir inode 47332347959, would move to lost+found disconnected dir inode 47332347960, would move to lost+found disconnected dir inode 47332347961, would move to lost+found disconnected dir inode 47332347962, would move to lost+found disconnected dir inode 47332347963, would move to lost+found disconnected dir inode 47332347964, would move to lost+found disconnected dir inode 47332347965, would move to lost+found disconnected dir inode 47332347966, would move to lost+found disconnected dir inode 47332347967, would move to lost+found disconnected dir inode 47335895040, would move to lost+found disconnected dir inode 47335895041, would move to lost+found disconnected dir inode 47335895044, would move to lost+found disconnected dir inode 47335895063, would move to lost+found disconnected dir inode 47335895076, would move to lost+found disconnected dir inode 47335895107, would move to lost+found disconnected dir inode 47336734723, would move to lost+found disconnected dir inode 47336734725, would move to lost+found disconnected dir inode 47336734726, would move to lost+found disconnected dir inode 47336734776, would move to lost+found disconnected dir inode 51699605524, would move to lost+found disconnected dir inode 51699605532, would move to lost+found disconnected dir inode 51699613850, would move to lost+found disconnected dir inode 51699613862, would move to lost+found disconnected dir inode 51699613865, would move to lost+found disconnected dir inode 51699613866, would move to lost+found disconnected dir inode 51699613872, would move to lost+found disconnected dir inode 51699613875, would move to lost+found disconnected dir inode 51699613876, would move to lost+found disconnected dir inode 51699839001, would move to lost+found disconnected dir inode 51699839007, would move to lost+found disconnected dir inode 51699839013, would move to lost+found disconnected dir inode 51699839026, would move to lost+found disconnected dir inode 51699957775, would move to lost+found disconnected dir inode 51699957784, would move to lost+found disconnected dir inode 51700580368, would move to lost+found disconnected dir inode 51700580369, would move to lost+found disconnected dir inode 51700580370, would move to lost+found disconnected dir inode 51700580371, would move to lost+found disconnected dir inode 51700580372, would move to lost+found disconnected dir inode 51700580373, would move to lost+found disconnected dir inode 51700580374, would move to lost+found disconnected dir inode 51700580375, would move to lost+found disconnected dir inode 51700580376, would move to lost+found disconnected dir inode 51700580377, would move to lost+found disconnected dir inode 51700580378, would move to lost+found disconnected dir inode 51700580379, would move to lost+found disconnected dir inode 51700580380, would move to lost+found disconnected dir inode 51700580381, would move to lost+found disconnected dir inode 51700580383, would move to lost+found disconnected dir inode 51700580384, would move to lost+found disconnected dir inode 51700850697, would move to lost+found disconnected dir inode 51700850698, would move to lost+found disconnected dir inode 51700850716, would move to lost+found disconnected dir inode 51700850723, would move to lost+found disconnected dir inode 51736309767, would move to lost+found disconnected dir inode 55834578947, would move to lost+found disconnected dir inode 55872958466, would move to lost+found disconnected dir inode 55951396898, would move to lost+found disconnected dir inode 55951405124, would move to lost+found disconnected dir inode 55951405125, would move to lost+found disconnected dir inode 55951405167, would move to lost+found disconnected dir inode 55952322562, would move to lost+found disconnected dir inode 55952388098, would move to lost+found disconnected dir inode 55952388121, would move to lost+found disconnected dir inode 55952388130, would move to lost+found disconnected dir inode 55952388133, would move to lost+found disconnected dir inode 55952388134, would move to lost+found disconnected dir inode 55952388143, would move to lost+found disconnected dir inode 55986180159, would move to lost+found disconnected dir inode 55986327552, would move to lost+found disconnected dir inode 55986327553, would move to lost+found disconnected dir inode 55986327554, would move to lost+found disconnected dir inode 55986327555, would move to lost+found disconnected dir inode 55986327556, would move to lost+found disconnected dir inode 55986327557, would move to lost+found disconnected dir inode 55986327558, would move to lost+found disconnected dir inode 55986327559, would move to lost+found disconnected dir inode 55986327560, would move to lost+found disconnected dir inode 55986327561, would move to lost+found disconnected dir inode 55986327562, would move to lost+found disconnected dir inode 55986327563, would move to lost+found disconnected dir inode 55986327564, would move to lost+found disconnected dir inode 55986327577, would move to lost+found disconnected dir inode 55986327578, would move to lost+found disconnected dir inode 55986327595, would move to lost+found disconnected dir inode 55986327607, would move to lost+found disconnected dir inode 55986327615, would move to lost+found disconnected dir inode 56070602793, would move to lost+found disconnected dir inode 56070602796, would move to lost+found disconnected dir inode 60129546242, would move to lost+found disconnected dir inode 60178853922, would move to lost+found disconnected dir inode 60208181292, would move to lost+found disconnected dir inode 60276113421, would move to lost+found disconnected dir inode 60276125774, would move to lost+found disconnected dir inode 60276125777, would move to lost+found disconnected dir inode 60276125787, would move to lost+found disconnected dir inode 60276125809, would move to lost+found disconnected dir inode 60276203525, would move to lost+found disconnected dir inode 60276203636, would move to lost+found disconnected dir inode 60276891650, would move to lost+found disconnected dir inode 60276891651, would move to lost+found disconnected dir inode 60276891652, would move to lost+found disconnected dir inode 60276891653, would move to lost+found disconnected dir inode 60276891654, would move to lost+found disconnected dir inode 60276891655, would move to lost+found disconnected dir inode 60276891656, would move to lost+found disconnected dir inode 60276891657, would move to lost+found disconnected dir inode 60276891658, would move to lost+found disconnected dir inode 60276891659, would move to lost+found disconnected dir inode 60276891660, would move to lost+found disconnected dir inode 60276891661, would move to lost+found disconnected dir inode 60276891662, would move to lost+found disconnected dir inode 60276891663, would move to lost+found disconnected dir inode 60276891674, would move to lost+found disconnected dir inode 60276891704, would move to lost+found disconnected dir inode 64424513580, would move to lost+found disconnected dir inode 64471937069, would move to lost+found disconnected dir inode 64551399512, would move to lost+found disconnected dir inode 64551436290, would move to lost+found disconnected dir inode 64551436296, would move to lost+found disconnected dir inode 64551436304, would move to lost+found disconnected dir inode 64551743490, would move to lost+found disconnected dir inode 64626319607, would move to lost+found disconnected dir inode 64626319608, would move to lost+found disconnected dir inode 64626319609, would move to lost+found disconnected dir inode 64626319610, would move to lost+found disconnected dir inode 64626319611, would move to lost+found disconnected dir inode 64626319612, would move to lost+found disconnected dir inode 64626319613, would move to lost+found disconnected dir inode 64626319614, would move to lost+found disconnected dir inode 64626319615, would move to lost+found disconnected dir inode 64626319616, would move to lost+found disconnected dir inode 64626319617, would move to lost+found disconnected dir inode 64626319618, would move to lost+found disconnected dir inode 64626319619, would move to lost+found disconnected dir inode 64626319620, would move to lost+found disconnected dir inode 64796418219, would move to lost+found disconnected dir inode 68727828484, would move to lost+found disconnected dir inode 68727828531, would move to lost+found disconnected dir inode 68748414985, would move to lost+found disconnected dir inode 68912447582, would move to lost+found disconnected dir inode 68912447599, would move to lost+found disconnected dir inode 68912447606, would move to lost+found disconnected dir inode 68912492562, would move to lost+found disconnected dir inode 68912492571, would move to lost+found disconnected dir inode 68912726029, would move to lost+found disconnected dir inode 68996411445, would move to lost+found disconnected dir inode 68996411446, would move to lost+found disconnected dir inode 68996411447, would move to lost+found disconnected dir inode 68996411448, would move to lost+found disconnected dir inode 68996411449, would move to lost+found disconnected dir inode 68996411450, would move to lost+found disconnected dir inode 68996411451, would move to lost+found disconnected dir inode 68996411452, would move to lost+found disconnected dir inode 68996411453, would move to lost+found disconnected dir inode 68996411454, would move to lost+found disconnected dir inode 68996411455, would move to lost+found disconnected dir inode 68996796416, would move to lost+found disconnected dir inode 68996796417, would move to lost+found disconnected dir inode 68996796418, would move to lost+found disconnected dir inode 68996796419, would move to lost+found disconnected dir inode 68996796429, would move to lost+found disconnected dir inode 68996796438, would move to lost+found disconnected dir inode 68996796452, would move to lost+found disconnected dir inode 68997796125, would move to lost+found disconnected dir inode 73031290880, would move to lost+found disconnected dir inode 73101590549, would move to lost+found disconnected dir inode 73105666411, would move to lost+found disconnected dir inode 73105666427, would move to lost+found disconnected dir inode 73105666429, would move to lost+found disconnected dir inode 73105850463, would move to lost+found disconnected dir inode 73105850470, would move to lost+found disconnected dir inode 73271562303, would move to lost+found disconnected dir inode 73272119296, would move to lost+found disconnected dir inode 73272119297, would move to lost+found disconnected dir inode 73272119298, would move to lost+found disconnected dir inode 73272119299, would move to lost+found disconnected dir inode 73272119300, would move to lost+found disconnected dir inode 73272119301, would move to lost+found disconnected dir inode 73272119302, would move to lost+found disconnected dir inode 73272119303, would move to lost+found disconnected dir inode 73272119304, would move to lost+found disconnected dir inode 73272119305, would move to lost+found disconnected dir inode 73272119306, would move to lost+found disconnected dir inode 73272119307, would move to lost+found disconnected dir inode 73272119308, would move to lost+found disconnected dir inode 73272119309, would move to lost+found disconnected dir inode 73272119402, would move to lost+found disconnected dir inode 73272119404, would move to lost+found disconnected dir inode 73272119413, would move to lost+found disconnected dir inode 73274540280, would move to lost+found disconnected dir inode 81653158051, would move to lost+found disconnected dir inode 81687068704, would move to lost+found disconnected dir inode 81786920976, would move to lost+found disconnected dir inode 81786920996, would move to lost+found disconnected inode 81786929156, would move to lost+found disconnected dir inode 81786929197, would move to lost+found disconnected dir inode 81786929201, would move to lost+found disconnected dir inode 81786929202, would move to lost+found disconnected dir inode 81786929215, would move to lost+found disconnected dir inode 81787150336, would move to lost+found disconnected dir inode 81787150338, would move to lost+found disconnected dir inode 81787150393, would move to lost+found disconnected dir inode 81787150396, would move to lost+found disconnected dir inode 81787162637, would move to lost+found disconnected dir inode 81787162640, would move to lost+found disconnected dir inode 82064572440, would move to lost+found disconnected dir inode 82064572449, would move to lost+found disconnected dir inode 82064572450, would move to lost+found disconnected dir inode 82065092715, would move to lost+found disconnected dir inode 82065092716, would move to lost+found disconnected dir inode 82065092717, would move to lost+found disconnected dir inode 82065092718, would move to lost+found disconnected dir inode 82065092719, would move to lost+found disconnected dir inode 82065092720, would move to lost+found disconnected dir inode 82065092721, would move to lost+found disconnected dir inode 82065092722, would move to lost+found disconnected dir inode 82065092723, would move to lost+found disconnected dir inode 82065092724, would move to lost+found disconnected dir inode 82065092725, would move to lost+found disconnected dir inode 82065092726, would move to lost+found disconnected dir inode 82065092727, would move to lost+found disconnected dir inode 82065092728, would move to lost+found disconnected dir inode 82065092729, would move to lost+found disconnected dir inode 82065301528, would move to lost+found disconnected dir inode 82065301534, would move to lost+found disconnected dir inode 82065301539, would move to lost+found disconnected dir inode 82201460748, would move to lost+found disconnected dir inode 82201460785, would move to lost+found disconnected dir inode 82201460786, would move to lost+found disconnected dir inode 82201460792, would move to lost+found disconnected dir inode 85960990858, would move to lost+found disconnected dir inode 86092185616, would move to lost+found disconnected dir inode 86092197968, would move to lost+found disconnected dir inode 86092197969, would move to lost+found disconnected dir inode 86092197977, would move to lost+found disconnected dir inode 86092197987, would move to lost+found disconnected dir inode 86092197989, would move to lost+found disconnected dir inode 86092198002, would move to lost+found disconnected dir inode 86092201989, would move to lost+found disconnected dir inode 86092201992, would move to lost+found disconnected dir inode 86092201994, would move to lost+found disconnected dir inode 86092206098, would move to lost+found disconnected dir inode 86092361729, would move to lost+found disconnected dir inode 86092361746, would move to lost+found disconnected dir inode 86092361747, would move to lost+found disconnected dir inode 86092734520, would move to lost+found disconnected dir inode 86092816393, would move to lost+found disconnected dir inode 86092816394, would move to lost+found disconnected dir inode 86092816395, would move to lost+found disconnected dir inode 86092816396, would move to lost+found disconnected dir inode 86092816397, would move to lost+found disconnected dir inode 86092816398, would move to lost+found disconnected dir inode 86092816399, would move to lost+found disconnected dir inode 86092816400, would move to lost+found disconnected dir inode 86092816401, would move to lost+found disconnected dir inode 86092816402, would move to lost+found disconnected dir inode 86092816403, would move to lost+found disconnected dir inode 86092816404, would move to lost+found disconnected dir inode 86092816405, would move to lost+found disconnected dir inode 86092816406, would move to lost+found disconnected dir inode 86092816420, would move to lost+found disconnected dir inode 86093082664, would move to lost+found disconnected dir inode 86093668380, would move to lost+found disconnected dir inode 86093668397, would move to lost+found disconnected dir inode 90271576326, would move to lost+found disconnected dir inode 90328010761, would move to lost+found disconnected dir inode 90328019070, would move to lost+found disconnected dir inode 90328121345, would move to lost+found disconnected dir inode 90328121346, would move to lost+found disconnected dir inode 90328121350, would move to lost+found disconnected dir inode 90328121351, would move to lost+found disconnected dir inode 90328121353, would move to lost+found disconnected dir inode 90328121357, would move to lost+found disconnected dir inode 90328121367, would move to lost+found disconnected dir inode 90328121368, would move to lost+found disconnected dir inode 90328121370, would move to lost+found disconnected dir inode 90328121383, would move to lost+found disconnected dir inode 90328141853, would move to lost+found disconnected dir inode 90328141867, would move to lost+found disconnected dir inode 90328141868, would move to lost+found disconnected dir inode 90328141870, would move to lost+found disconnected dir inode 90328141875, would move to lost+found disconnected dir inode 90516987961, would move to lost+found disconnected dir inode 90516987962, would move to lost+found disconnected dir inode 90516987963, would move to lost+found disconnected dir inode 90516987964, would move to lost+found disconnected dir inode 90516987965, would move to lost+found disconnected dir inode 90516987966, would move to lost+found disconnected dir inode 90516987967, would move to lost+found disconnected dir inode 90517016576, would move to lost+found disconnected dir inode 90517016577, would move to lost+found disconnected dir inode 90517016578, would move to lost+found disconnected dir inode 90517016579, would move to lost+found disconnected dir inode 90517016580, would move to lost+found disconnected dir inode 90517016581, would move to lost+found disconnected dir inode 90517016582, would move to lost+found disconnected dir inode 90517016584, would move to lost+found disconnected dir inode 90517016598, would move to lost+found disconnected dir inode 90549440603, would move to lost+found disconnected dir inode 90549440605, would move to lost+found disconnected dir inode 90549440638, would move to lost+found disconnected dir inode 94489284657, would move to lost+found disconnected dir inode 94536843282, would move to lost+found disconnected dir inode 94587891756, would move to lost+found disconnected dir inode 94587891758, would move to lost+found disconnected dir inode 94587891759, would move to lost+found disconnected dir inode 94587891762, would move to lost+found disconnected dir inode 94587891766, would move to lost+found disconnected dir inode 94587895809, would move to lost+found disconnected dir inode 94587895822, would move to lost+found disconnected dir inode 94587895823, would move to lost+found disconnected dir inode 94587895825, would move to lost+found disconnected dir inode 94587895836, would move to lost+found disconnected dir inode 94659702818, would move to lost+found disconnected dir inode 94659702834, would move to lost+found disconnected dir inode 94994862126, would move to lost+found disconnected dir inode 95118995625, would move to lost+found disconnected dir inode 95118995626, would move to lost+found disconnected dir inode 95118995627, would move to lost+found disconnected dir inode 95118995628, would move to lost+found disconnected dir inode 95118995629, would move to lost+found disconnected dir inode 95118995630, would move to lost+found disconnected dir inode 95118995631, would move to lost+found disconnected dir inode 95118995632, would move to lost+found disconnected dir inode 95118995633, would move to lost+found disconnected dir inode 95118995634, would move to lost+found disconnected dir inode 95118995635, would move to lost+found disconnected dir inode 95118995636, would move to lost+found disconnected dir inode 95118995637, would move to lost+found disconnected dir inode 95118995638, would move to lost+found disconnected dir inode 95118995639, would move to lost+found disconnected dir inode 95118995655, would move to lost+found disconnected dir inode 95118995691, would move to lost+found disconnected dir inode 95157329922, would move to lost+found disconnected dir inode 95157329964, would move to lost+found disconnected dir inode 103079219243, would move to lost+found disconnected dir inode 103124635648, would move to lost+found disconnected dir inode 103130472572, would move to lost+found disconnected dir inode 103130472575, would move to lost+found disconnected dir inode 103164653888, would move to lost+found disconnected dir inode 103164653950, would move to lost+found disconnected dir inode 103166758944, would move to lost+found disconnected dir inode 103166758974, would move to lost+found disconnected dir inode 103166816326, would move to lost+found disconnected dir inode 103166816329, would move to lost+found disconnected dir inode 103166816332, would move to lost+found disconnected dir inode 103166816342, would move to lost+found disconnected dir inode 103166820421, would move to lost+found disconnected dir inode 103166820441, would move to lost+found disconnected dir inode 103166820442, would move to lost+found disconnected dir inode 103166820454, would move to lost+found disconnected dir inode 103166828595, would move to lost+found disconnected dir inode 103166828598, would move to lost+found disconnected dir inode 103166832678, would move to lost+found disconnected dir inode 103166832691, would move to lost+found disconnected dir inode 103167139896, would move to lost+found disconnected dir inode 103167189115, would move to lost+found disconnected dir inode 103167189116, would move to lost+found disconnected dir inode 103167189117, would move to lost+found disconnected dir inode 103167189118, would move to lost+found disconnected dir inode 103167189119, would move to lost+found disconnected dir inode 103167189120, would move to lost+found disconnected dir inode 103167189121, would move to lost+found disconnected dir inode 103167189122, would move to lost+found disconnected dir inode 103167189123, would move to lost+found disconnected dir inode 103167189124, would move to lost+found disconnected dir inode 103167189125, would move to lost+found disconnected dir inode 103167189126, would move to lost+found disconnected dir inode 103167189127, would move to lost+found disconnected dir inode 103167189128, would move to lost+found disconnected dir inode 103167189129, would move to lost+found disconnected dir inode 103167189133, would move to lost+found disconnected dir inode 103167189169, would move to lost+found disconnected dir inode 103167508533, would move to lost+found disconnected dir inode 107374186526, would move to lost+found disconnected dir inode 107374198847, would move to lost+found disconnected dir inode 107599970322, would move to lost+found disconnected dir inode 107599970329, would move to lost+found disconnected dir inode 107599970339, would move to lost+found disconnected dir inode 107600003167, would move to lost+found disconnected dir inode 107600003168, would move to lost+found disconnected dir inode 107600060433, would move to lost+found disconnected dir inode 107600060444, would move to lost+found disconnected dir inode 107600539651, would move to lost+found disconnected dir inode 107600539659, would move to lost+found disconnected dir inode 107600724055, would move to lost+found disconnected dir inode 107600724059, would move to lost+found disconnected dir inode 107600814332, would move to lost+found disconnected dir inode 107600814333, would move to lost+found disconnected dir inode 107600814334, would move to lost+found disconnected dir inode 107600814335, would move to lost+found disconnected dir inode 107600814336, would move to lost+found disconnected dir inode 107600814337, would move to lost+found disconnected dir inode 107600814338, would move to lost+found disconnected dir inode 107600814339, would move to lost+found disconnected dir inode 107600814340, would move to lost+found disconnected dir inode 107600814341, would move to lost+found disconnected dir inode 107600814342, would move to lost+found disconnected dir inode 107600814343, would move to lost+found disconnected dir inode 107600814344, would move to lost+found disconnected dir inode 107600814345, would move to lost+found disconnected dir inode 107600814352, would move to lost+found disconnected dir inode 107600814365, would move to lost+found disconnected dir inode 107600814387, would move to lost+found disconnected dir inode 107666485324, would move to lost+found disconnected dir inode 107666485334, would move to lost+found disconnected dir inode 107666485369, would move to lost+found disconnected dir inode 111673475085, would move to lost+found disconnected dir inode 111673475125, would move to lost+found disconnected dir inode 111673516075, would move to lost+found disconnected dir inode 111673516077, would move to lost+found disconnected dir inode 111673516081, would move to lost+found disconnected dir inode 111673516082, would move to lost+found disconnected dir inode 111673516095, would move to lost+found disconnected dir inode 111686406267, would move to lost+found disconnected dir inode 111686406268, would move to lost+found disconnected dir inode 111886352447, would move to lost+found disconnected dir inode 111886520345, would move to lost+found disconnected dir inode 111886688298, would move to lost+found disconnected dir inode 111886688312, would move to lost+found disconnected dir inode 111887126568, would move to lost+found disconnected dir inode 111887126591, would move to lost+found disconnected dir inode 111887241216, would move to lost+found disconnected dir inode 111887241217, would move to lost+found disconnected dir inode 111887241218, would move to lost+found disconnected dir inode 111887241219, would move to lost+found disconnected dir inode 111887241220, would move to lost+found disconnected dir inode 111887241221, would move to lost+found disconnected dir inode 111887241222, would move to lost+found disconnected dir inode 111887241223, would move to lost+found disconnected dir inode 111887241224, would move to lost+found disconnected dir inode 111887241225, would move to lost+found disconnected dir inode 111887241226, would move to lost+found disconnected dir inode 111887241227, would move to lost+found disconnected dir inode 111887241228, would move to lost+found disconnected dir inode 111895687207, would move to lost+found disconnected dir inode 111895687209, would move to lost+found disconnected dir inode 111895687216, would move to lost+found disconnected dir inode 111910309907, would move to lost+found disconnected dir inode 111918694446, would move to lost+found disconnected dir inode 111939428362, would move to lost+found disconnected dir inode 115964121090, would move to lost+found disconnected dir inode 115964121113, would move to lost+found disconnected dir inode 116006125580, would move to lost+found disconnected dir inode 116006129669, would move to lost+found disconnected dir inode 116006129696, would move to lost+found disconnected dir inode 116192383165, would move to lost+found disconnected dir inode 116192383167, would move to lost+found disconnected dir inode 116192387077, would move to lost+found disconnected dir inode 116192387078, would move to lost+found disconnected dir inode 116192387080, would move to lost+found disconnected dir inode 116192387114, would move to lost+found disconnected dir inode 116192387115, would move to lost+found disconnected dir inode 116192391195, would move to lost+found disconnected dir inode 116192399368, would move to lost+found disconnected dir inode 116192399372, would move to lost+found disconnected dir inode 116192456725, would move to lost+found disconnected dir inode 116343926922, would move to lost+found disconnected dir inode 116343926943, would move to lost+found disconnected dir inode 116343926944, would move to lost+found disconnected dir inode 116343926945, would move to lost+found disconnected dir inode 116343926946, would move to lost+found disconnected dir inode 116343926947, would move to lost+found disconnected dir inode 116343926948, would move to lost+found disconnected dir inode 116343926949, would move to lost+found disconnected dir inode 116343926950, would move to lost+found disconnected dir inode 116343926951, would move to lost+found disconnected dir inode 116343926952, would move to lost+found disconnected dir inode 116343926953, would move to lost+found disconnected dir inode 116343926954, would move to lost+found disconnected dir inode 116343926955, would move to lost+found disconnected dir inode 116343926956, would move to lost+found disconnected dir inode 116343980276, would move to lost+found disconnected dir inode 116343980280, would move to lost+found disconnected dir inode 116352086020, would move to lost+found disconnected dir inode 116352086039, would move to lost+found disconnected dir inode 116352086049, would move to lost+found disconnected dir inode 116398080018, would move to lost+found disconnected dir inode 116398661641, would move to lost+found disconnected dir inode 116398661643, would move to lost+found disconnected dir inode 120259088386, would move to lost+found disconnected dir inode 120329281560, would move to lost+found disconnected dir inode 120329281563, would move to lost+found disconnected dir inode 120448295002, would move to lost+found disconnected dir inode 120448295010, would move to lost+found disconnected dir inode 120471560237, would move to lost+found disconnected dir inode 120471560274, would move to lost+found disconnected dir inode 120471564434, would move to lost+found disconnected dir inode 120471572527, would move to lost+found disconnected dir inode 120472088603, would move to lost+found disconnected dir inode 120472117285, would move to lost+found disconnected dir inode 120472117286, would move to lost+found disconnected dir inode 120472117287, would move to lost+found disconnected dir inode 120472117288, would move to lost+found disconnected dir inode 120472117289, would move to lost+found disconnected dir inode 120472117290, would move to lost+found disconnected dir inode 120472117291, would move to lost+found disconnected dir inode 120472117292, would move to lost+found disconnected dir inode 120472117293, would move to lost+found disconnected dir inode 120472117294, would move to lost+found disconnected dir inode 120472117295, would move to lost+found disconnected dir inode 120472117296, would move to lost+found disconnected dir inode 120472117297, would move to lost+found disconnected dir inode 120472117298, would move to lost+found disconnected dir inode 120472662030, would move to lost+found disconnected dir inode 120472662031, would move to lost+found disconnected dir inode 120472662039, would move to lost+found disconnected dir inode 120472662053, would move to lost+found disconnected dir inode 120533618695, would move to lost+found disconnected dir inode 120533618699, would move to lost+found disconnected dir inode 120533618715, would move to lost+found disconnected dir inode 120533618729, would move to lost+found disconnected dir inode 120533618731, would move to lost+found disconnected dir inode 120534142997, would move to lost+found disconnected dir inode 124571324437, would move to lost+found disconnected dir inode 124656844832, would move to lost+found disconnected dir inode 124656844837, would move to lost+found disconnected dir inode 124656869394, would move to lost+found disconnected dir inode 124689535050, would move to lost+found disconnected dir inode 124689535051, would move to lost+found disconnected dir inode 124689539170, would move to lost+found disconnected inode 124753653783, would move to lost+found disconnected dir inode 124753793139, would move to lost+found disconnected dir inode 124753793140, would move to lost+found disconnected dir inode 124753793141, would move to lost+found disconnected dir inode 124753793142, would move to lost+found disconnected dir inode 124753793143, would move to lost+found disconnected dir inode 124753793144, would move to lost+found disconnected dir inode 124753793145, would move to lost+found disconnected dir inode 124753793146, would move to lost+found disconnected dir inode 124753793147, would move to lost+found disconnected dir inode 124753793148, would move to lost+found disconnected dir inode 124753793149, would move to lost+found disconnected dir inode 124753793150, would move to lost+found disconnected dir inode 124753793151, would move to lost+found disconnected dir inode 124753965056, would move to lost+found disconnected dir inode 124762431510, would move to lost+found disconnected dir inode 124762443832, would move to lost+found disconnected dir inode 124762443834, would move to lost+found disconnected dir inode 128857702412, would move to lost+found disconnected dir inode 128987127852, would move to lost+found disconnected dir inode 128987131958, would move to lost+found disconnected dir inode 128987131963, would move to lost+found disconnected dir inode 128987152396, would move to lost+found disconnected dir inode 128991920148, would move to lost+found disconnected dir inode 129035956270, would move to lost+found disconnected dir inode 129135882351, would move to lost+found disconnected dir inode 129135882352, would move to lost+found disconnected dir inode 129135882353, would move to lost+found disconnected dir inode 129135882354, would move to lost+found disconnected dir inode 129135882355, would move to lost+found disconnected dir inode 129135882356, would move to lost+found disconnected dir inode 129135882357, would move to lost+found disconnected dir inode 129135882358, would move to lost+found disconnected dir inode 129135882359, would move to lost+found disconnected dir inode 129135882360, would move to lost+found disconnected dir inode 129135882361, would move to lost+found disconnected dir inode 129135882362, would move to lost+found disconnected dir inode 129135882363, would move to lost+found disconnected dir inode 129135882364, would move to lost+found disconnected dir inode 129135882365, would move to lost+found disconnected dir inode 129199108156, would move to lost+found disconnected dir inode 133143990307, would move to lost+found disconnected dir inode 133252542636, would move to lost+found disconnected dir inode 133252546605, would move to lost+found disconnected dir inode 133252555235, would move to lost+found disconnected dir inode 133252555251, would move to lost+found disconnected dir inode 133305405443, would move to lost+found disconnected dir inode 133305425942, would move to lost+found disconnected dir inode 133306257431, would move to lost+found disconnected dir inode 133306257432, would move to lost+found disconnected dir inode 133306257433, would move to lost+found disconnected dir inode 133306257434, would move to lost+found disconnected dir inode 133306257435, would move to lost+found disconnected dir inode 133306257436, would move to lost+found disconnected dir inode 133306257437, would move to lost+found disconnected dir inode 133306257438, would move to lost+found disconnected dir inode 133306257439, would move to lost+found disconnected dir inode 133306257440, would move to lost+found disconnected dir inode 133306257441, would move to lost+found disconnected dir inode 133306257442, would move to lost+found disconnected dir inode 133306257443, would move to lost+found disconnected dir inode 133306257444, would move to lost+found disconnected dir inode 133306376194, would move to lost+found disconnected dir inode 133306376211, would move to lost+found disconnected dir inode 133306376217, would move to lost+found Phase 7 - verify link counts... would have reset inode 4096 nlinks from 13 to 11 would have reset inode 4099 nlinks from 61 to 53 would have reset inode 68972563 nlinks from 9 to 8 would have reset inode 202739721 nlinks from 7 to 6 would have reset inode 202739732 nlinks from 7 to 6 would have reset inode 417902664 nlinks from 10 to 9 would have reset inode 418459710 nlinks from 6 to 5 would have reset inode 419037188 nlinks from 3 to 2 would have reset inode 419037189 nlinks from 3 to 2 would have reset inode 4355010569 nlinks from 8 to 7 would have reset inode 4355010593 nlinks from 3 to 2 would have reset inode 4479877124 nlinks from 10 to 9 would have reset inode 4479877167 nlinks from 3 to 2 would have reset inode 4479877246 nlinks from 23 to 20 would have reset inode 4488884232 nlinks from 10 to 9 would have reset inode 4488884248 nlinks from 12 to 11 would have reset inode 4488884269 nlinks from 3 to 2 would have reset inode 4488884270 nlinks from 3 to 2 would have reset inode 4488884272 nlinks from 3 to 2 would have reset inode 4488884274 nlinks from 3 to 2 would have reset inode 4579237926 nlinks from 3 to 2 would have reset inode 8589938690 nlinks from 3 to 2 would have reset inode 8843165728 nlinks from 4 to 3 would have reset inode 8843165744 nlinks from 14 to 13 would have reset inode 8843169875 nlinks from 12 to 11 would have reset inode 8843169882 nlinks from 4 to 3 would have reset inode 8843169883 nlinks from 23 to 21 would have reset inode 8843169890 nlinks from 17 to 15 would have reset inode 8859947015 nlinks from 5 to 4 would have reset inode 8859947019 nlinks from 5 to 4 would have reset inode 8859947020 nlinks from 5 to 4 would have reset inode 8879145001 nlinks from 9 to 8 would have reset inode 8889970711 nlinks from 10 to 9 would have reset inode 8891183118 nlinks from 3 to 2 would have reset inode 8891183121 nlinks from 4 to 3 would have reset inode 8891183123 nlinks from 4 to 3 would have reset inode 8891183124 nlinks from 5 to 4 would have reset inode 8891183134 nlinks from 3 to 2 would have reset inode 8891777032 nlinks from 8 to 7 would have reset inode 12884905984 nlinks from 15 to 13 would have reset inode 13011382273 nlinks from 4 to 3 would have reset inode 13011382322 nlinks from 5 to 4 would have reset inode 13027205190 nlinks from 4 to 3 would have reset inode 13027205211 nlinks from 3 to 2 would have reset inode 13027205218 nlinks from 6 to 5 would have reset inode 13027512336 nlinks from 12 to 10 would have reset inode 13027512342 nlinks from 3 to 2 would have reset inode 13027512343 nlinks from 4 to 3 would have reset inode 13074718790 nlinks from 10 to 9 would have reset inode 13074718840 nlinks from 7 to 6 would have reset inode 13091356672 nlinks from 4 to 3 would have reset inode 13091356696 nlinks from 10 to 9 would have reset inode 17179873282 nlinks from 3 to 2 would have reset inode 17179873284 nlinks from 3 to 2 would have reset inode 17241608247 nlinks from 3 to 2 would have reset inode 17319272475 nlinks from 12 to 10 would have reset inode 17336291384 nlinks from 4 to 3 would have reset inode 17420197955 nlinks from 3 to 2 would have reset inode 17420197956 nlinks from 4 to 3 would have reset inode 17420197971 nlinks from 5 to 4 would have reset inode 17420197976 nlinks from 6 to 5 would have reset inode 17420197977 nlinks from 6 to 5 would have reset inode 17420197987 nlinks from 5 to 4 would have reset inode 17420201999 nlinks from 3 to 2 would have reset inode 17420202008 nlinks from 18 to 16 would have reset inode 17420214285 nlinks from 9 to 7 would have reset inode 17436610595 nlinks from 10 to 9 would have reset inode 17436659751 nlinks from 6 to 5 would have reset inode 17436659752 nlinks from 4 to 3 would have reset inode 17437196300 nlinks from 5 to 4 would have reset inode 17437196324 nlinks from 4 to 3 would have reset inode 17437196325 nlinks from 3 to 2 would have reset inode 25769807872 nlinks from 107 to 93 would have reset inode 25769807876 nlinks from 8 to 7 would have reset inode 25925189648 nlinks from 5 to 4 would have reset inode 26008100926 nlinks from 5 to 4 would have reset inode 26154033339 nlinks from 6 to 5 would have reset inode 26260242761 nlinks from 6 to 5 would have reset inode 26260242762 nlinks from 6 to 5 would have reset inode 26260242856 nlinks from 4 to 3 would have reset inode 26260242858 nlinks from 18 to 16 would have reset inode 26260267045 nlinks from 4 to 3 would have reset inode 26260271146 nlinks from 11 to 10 would have reset inode 27415207952 nlinks from 3 to 2 would have reset inode 30064775168 nlinks from 31 to 28 would have reset inode 30064775172 nlinks from 6 to 5 would have reset inode 30191923231 nlinks from 15 to 14 would have reset inode 30191923251 nlinks from 4 to 3 would have reset inode 30191923257 nlinks from 5 to 4 would have reset inode 30191923268 nlinks from 5 to 4 would have reset inode 30191923325 nlinks from 9 to 7 would have reset inode 30191947794 nlinks from 3 to 2 would have reset inode 30191951881 nlinks from 7 to 6 would have reset inode 30191988767 nlinks from 6 to 5 would have reset inode 30192533551 nlinks from 3 to 2 would have reset inode 30192533554 nlinks from 11 to 9 would have reset inode 30192533555 nlinks from 5 to 4 would have reset inode 30192533559 nlinks from 8 to 7 would have reset inode 30192885820 nlinks from 5 to 4 would have reset inode 34359742464 nlinks from 8 to 7 would have reset inode 34359742465 nlinks from 3 to 2 would have reset inode 34422018084 nlinks from 3 to 2 would have reset inode 34465357826 nlinks from 5 to 4 would have reset inode 34465358139 nlinks from 10 to 9 would have reset inode 34465358141 nlinks from 4 to 3 would have reset inode 34493800449 nlinks from 3 to 2 would have reset inode 34493800456 nlinks from 5 to 4 would have reset inode 34493800463 nlinks from 6 to 5 would have reset inode 34782498868 nlinks from 7 to 6 would have reset inode 34782539794 nlinks from 4 to 3 would have reset inode 34782539827 nlinks from 5 to 4 would have reset inode 34782539831 nlinks from 4 to 3 would have reset inode 34782539837 nlinks from 3 to 2 would have reset inode 34847252575 nlinks from 3 to 2 would have reset inode 38654709764 nlinks from 8 to 7 would have reset inode 38704337116 nlinks from 8 to 7 would have reset inode 38704337133 nlinks from 4 to 3 would have reset inode 38719377419 nlinks from 4 to 3 would have reset inode 38719377442 nlinks from 5 to 4 would have reset inode 38719377445 nlinks from 5 to 4 would have reset inode 38720200754 nlinks from 24 to 22 would have reset inode 38720200760 nlinks from 10 to 9 would have reset inode 38720200761 nlinks from 8 to 7 would have reset inode 38720765989 nlinks from 6 to 5 would have reset inode 38720962585 nlinks from 3 to 2 would have reset inode 38825242678 nlinks from 27 to 25 would have reset inode 38829563910 nlinks from 3 to 2 would have reset inode 38829563913 nlinks from 4 to 3 would have reset inode 38829563921 nlinks from 3 to 2 would have reset inode 38829563939 nlinks from 3 to 2 would have reset inode 38829563965 nlinks from 4 to 3 would have reset inode 38829563966 nlinks from 6 to 5 would have reset inode 47272431662 nlinks from 14 to 12 would have reset inode 47280693277 nlinks from 5 to 4 would have reset inode 47280783476 nlinks from 3 to 2 would have reset inode 47332347959 nlinks from 3 to 2 would have reset inode 47332347961 nlinks from 7 to 6 would have reset inode 47332347962 nlinks from 3 to 2 would have reset inode 47335895041 nlinks from 3 to 2 would have reset inode 47336734725 nlinks from 3 to 2 would have reset inode 51539611652 nlinks from 3 to 2 would have reset inode 51539611685 nlinks from 3 to 2 would have reset inode 51602448390 nlinks from 15 to 13 would have reset inode 51699605523 nlinks from 22 to 20 would have reset inode 51699613855 nlinks from 5 to 4 would have reset inode 51700580373 nlinks from 3 to 2 would have reset inode 51736309770 nlinks from 4 to 3 would have reset inode 55834578945 nlinks from 3 to 2 would have reset inode 55951405125 nlinks from 7 to 6 would have reset inode 55951405131 nlinks from 4 to 3 would have reset inode 55951405133 nlinks from 4 to 3 would have reset inode 55952322563 nlinks from 10 to 9 would have reset inode 55952322565 nlinks from 7 to 6 would have reset inode 55952388115 nlinks from 6 to 5 would have reset inode 55952388137 nlinks from 6 to 5 would have reset inode 55986327560 nlinks from 4 to 3 would have reset inode 55986327563 nlinks from 4 to 3 would have reset inode 60208181291 nlinks from 13 to 12 would have reset inode 60208181292 nlinks from 6 to 5 would have reset inode 60276125765 nlinks from 5 to 4 would have reset inode 60276125775 nlinks from 4 to 3 would have reset inode 60276129815 nlinks from 6 to 5 would have reset inode 60276129839 nlinks from 6 to 5 would have reset inode 60276129840 nlinks from 6 to 5 would have reset inode 60276129841 nlinks from 4 to 3 would have reset inode 60276203639 nlinks from 6 to 5 would have reset inode 60276822060 nlinks from 5 to 4 would have reset inode 60276891651 nlinks from 3 to 2 would have reset inode 60276891652 nlinks from 5 to 4 would have reset inode 60276891660 nlinks from 3 to 2 would have reset inode 60276891661 nlinks from 5 to 4 would have reset inode 64424513539 nlinks from 4 to 3 would have reset inode 64471937038 nlinks from 19 to 17 would have reset inode 64484773928 nlinks from 3 to 2 would have reset inode 64551399498 nlinks from 14 to 12 would have reset inode 64551399501 nlinks from 15 to 13 would have reset inode 64551399506 nlinks from 6 to 5 would have reset inode 64551399519 nlinks from 3 to 2 would have reset inode 64551436290 nlinks from 7 to 6 would have reset inode 64551436350 nlinks from 4 to 3 would have reset inode 64551452696 nlinks from 6 to 5 would have reset inode 64796069907 nlinks from 6 to 5 would have reset inode 64796069909 nlinks from 30 to 26 would have reset inode 64796418214 nlinks from 17 to 15 would have reset inode 64796418238 nlinks from 7 to 6 would have reset inode 68748406819 nlinks from 8 to 7 would have reset inode 68840685627 nlinks from 15 to 14 would have reset inode 68912455734 nlinks from 4 to 3 would have reset inode 68912455741 nlinks from 15 to 13 would have reset inode 68912492551 nlinks from 3 to 2 would have reset inode 68912492559 nlinks from 5 to 4 would have reset inode 68912492560 nlinks from 6 to 5 would have reset inode 68912492561 nlinks from 5 to 4 would have reset inode 68912492562 nlinks from 6 to 5 would have reset inode 68912492565 nlinks from 5 to 4 would have reset inode 68912492569 nlinks from 3 to 2 would have reset inode 68912492571 nlinks from 6 to 5 would have reset inode 68912492670 nlinks from 12 to 10 would have reset inode 68912726020 nlinks from 3 to 2 would have reset inode 68996411446 nlinks from 3 to 2 would have reset inode 68996411449 nlinks from 3 to 2 would have reset inode 68996411450 nlinks from 3 to 2 would have reset inode 68996796417 nlinks from 5 to 4 would have reset inode 68996796425 nlinks from 3 to 2 would have reset inode 68997402671 nlinks from 4 to 3 would have reset inode 73014448131 nlinks from 4 to 3 would have reset inode 73014448183 nlinks from 6 to 5 would have reset inode 73031290881 nlinks from 3 to 2 would have reset inode 73105653769 nlinks from 5 to 4 would have reset inode 73105666390 nlinks from 3 to 2 would have reset inode 73105666392 nlinks from 4 to 3 would have reset inode 73105666394 nlinks from 4 to 3 would have reset inode 73105666395 nlinks from 20 to 18 would have reset inode 73105666398 nlinks from 7 to 6 would have reset inode 73105666406 nlinks from 15 to 13 would have reset inode 73105666412 nlinks from 5 to 4 would have reset inode 73105719305 nlinks from 3 to 2 would have reset inode 73105719310 nlinks from 5 to 4 would have reset inode 73105747975 nlinks from 5 to 4 would have reset inode 73272119303 nlinks from 3 to 2 would have reset inode 73272119305 nlinks from 4 to 3 would have reset inode 73272119306 nlinks from 6 to 5 would have reset inode 73272119309 nlinks from 3 to 2 would have reset inode 73306308666 nlinks from 3 to 2 would have reset inode 81786920975 nlinks from 11 to 10 would have reset inode 81786929201 nlinks from 7 to 6 would have reset inode 81786929207 nlinks from 3 to 2 would have reset inode 81786929211 nlinks from 7 to 6 would have reset inode 81786929214 nlinks from 4 to 3 would have reset inode 81786929215 nlinks from 12 to 11 would have reset inode 82064986146 nlinks from 6 to 5 would have reset inode 82065092720 nlinks from 4 to 3 would have reset inode 82065092722 nlinks from 3 to 2 would have reset inode 82065301526 nlinks from 9 to 8 would have reset inode 82201460747 nlinks from 3 to 2 would have reset inode 86092185615 nlinks from 9 to 8 would have reset inode 86092185616 nlinks from 3 to 2 would have reset inode 86092197954 nlinks from 4 to 3 would have reset inode 86092197971 nlinks from 4 to 3 would have reset inode 86092197972 nlinks from 4 to 3 would have reset inode 86092197973 nlinks from 3 to 2 would have reset inode 86092197977 nlinks from 4 to 3 would have reset inode 86092197979 nlinks from 6 to 5 would have reset inode 86092197980 nlinks from 5 to 4 would have reset inode 86092197981 nlinks from 6 to 5 would have reset inode 86092197982 nlinks from 5 to 4 would have reset inode 86092197985 nlinks from 6 to 5 would have reset inode 86092197990 nlinks from 5 to 4 would have reset inode 86092201989 nlinks from 25 to 22 would have reset inode 86092361747 nlinks from 3 to 2 would have reset inode 86092816396 nlinks from 3 to 2 would have reset inode 86093082687 nlinks from 3 to 2 would have reset inode 86093668383 nlinks from 8 to 5 would have reset inode 90194317313 nlinks from 7 to 6 would have reset inode 90271576326 nlinks from 6 to 5 would have reset inode 90328019070 nlinks from 11 to 9 would have reset inode 90328121345 nlinks from 4 to 3 would have reset inode 90328121352 nlinks from 7 to 6 would have reset inode 90328121367 nlinks from 12 to 11 would have reset inode 90328125499 nlinks from 4 to 3 would have reset inode 90328137762 nlinks from 6 to 5 would have reset inode 90328141849 nlinks from 4 to 3 would have reset inode 90328141851 nlinks from 5 to 4 would have reset inode 90328141866 nlinks from 6 to 5 would have reset inode 90516987962 nlinks from 3 to 2 would have reset inode 90516987964 nlinks from 7 to 6 would have reset inode 90517016577 nlinks from 4 to 3 would have reset inode 90517016581 nlinks from 3 to 2 would have reset inode 90549440584 nlinks from 5 to 4 would have reset inode 90549440603 nlinks from 13 to 12 would have reset inode 94489284608 nlinks from 11 to 9 would have reset inode 94489284609 nlinks from 8 to 6 would have reset inode 94489284613 nlinks from 3 to 2 would have reset inode 94489284652 nlinks from 7 to 6 would have reset inode 94489284668 nlinks from 3 to 2 would have reset inode 94536843319 nlinks from 20 to 18 would have reset inode 94562865200 nlinks from 7 to 6 would have reset inode 94587891751 nlinks from 3 to 2 would have reset inode 94587895810 nlinks from 6 to 5 would have reset inode 94587895822 nlinks from 7 to 6 would have reset inode 94659698699 nlinks from 8 to 7 would have reset inode 94659698704 nlinks from 3 to 2 would have reset inode 94659702817 nlinks from 24 to 22 would have reset inode 94659702828 nlinks from 4 to 3 would have reset inode 95118995629 nlinks from 3 to 2 would have reset inode 95118995634 nlinks from 5 to 4 would have reset inode 95118995644 nlinks from 3 to 2 would have reset inode 95157329964 nlinks from 28 to 26 would have reset inode 95375138851 nlinks from 4 to 3 would have reset inode 95375138852 nlinks from 4 to 3 would have reset inode 95375138856 nlinks from 4 to 3 would have reset inode 95375138861 nlinks from 5 to 3 would have reset inode 103079219201 nlinks from 3 to 2 would have reset inode 103166758935 nlinks from 36 to 31 would have reset inode 103166820441 nlinks from 25 to 23 would have reset inode 103166820454 nlinks from 6 to 5 would have reset inode 103166820468 nlinks from 8 to 6 would have reset inode 103167189121 nlinks from 3 to 2 would have reset inode 103167508531 nlinks from 6 to 5 would have reset inode 107374186498 nlinks from 4 to 3 would have reset inode 107374198820 nlinks from 7 to 6 would have reset inode 107599970322 nlinks from 4 to 3 would have reset inode 107600003166 nlinks from 23 to 21 would have reset inode 107600003167 nlinks from 12 to 10 would have reset inode 107663573017 nlinks from 3 to 2 would have reset inode 111686406241 nlinks from 9 to 8 would have reset inode 111886688296 nlinks from 3 to 2 would have reset inode 111887126568 nlinks from 12 to 11 would have reset inode 111887241217 nlinks from 4 to 3 would have reset inode 111887241225 nlinks from 5 to 4 would have reset inode 111887241228 nlinks from 3 to 2 would have reset inode 111895687208 nlinks from 3 to 2 would have reset inode 116192387114 nlinks from 23 to 21 would have reset inode 116343926954 nlinks from 3 to 2 would have reset inode 120329281560 nlinks from 22 to 20 would have reset inode 120362094654 nlinks from 13 to 10 would have reset inode 120448295015 nlinks from 10 to 9 would have reset inode 120472117286 nlinks from 3 to 2 would have reset inode 120472117287 nlinks from 22 to 20 would have reset inode 120472117289 nlinks from 3 to 2 would have reset inode 120472117291 nlinks from 3 to 2 would have reset inode 120533618729 nlinks from 17 to 13 would have reset inode 120533618733 nlinks from 21 to 19 would have reset inode 124571324436 nlinks from 6 to 5 would have reset inode 124656844832 nlinks from 6 to 5 would have reset inode 124656857201 nlinks from 8 to 7 would have reset inode 124656869394 nlinks from 25 to 23 would have reset inode 124689535045 nlinks from 3 to 2 would have reset inode 124689539163 nlinks from 7 to 5 would have reset inode 124753793139 nlinks from 3 to 2 would have reset inode 124753793147 nlinks from 8 to 7 would have reset inode 124753793148 nlinks from 3 to 2 would have reset inode 124753965056 nlinks from 9 to 8 would have reset inode 124762431535 nlinks from 12 to 10 would have reset inode 128857702411 nlinks from 24 to 21 would have reset inode 128857702412 nlinks from 3 to 2 would have reset inode 128857702413 nlinks from 3 to 2 would have reset inode 128987131937 nlinks from 19 to 17 would have reset inode 128987152396 nlinks from 23 to 20 would have reset inode 128991920148 nlinks from 3 to 2 would have reset inode 129135882335 nlinks from 4 to 3 would have reset inode 129135882353 nlinks from 31 to 27 would have reset inode 133143990276 nlinks from 3 to 2 would have reset inode 133143990305 nlinks from 5 to 4 would have reset inode 133252530210 nlinks from 17 to 15 would have reset inode 133252546594 nlinks from 6 to 5 would have reset inode 133252555235 nlinks from 9 to 8 would have reset inode 133306257434 nlinks from 5 to 4 would have reset inode 133306257442 nlinks from 4 to 3 would have reset inode 133306257451 nlinks from 3 to 2 would have reset inode 133306986547 nlinks from 8 to 6 would have reset inode 133306986548 nlinks from 4 to 3 would have reset inode 133306986553 nlinks from 3 to 2 No modify flag set, skipping filesystem flush and exiting. --Apple-Mail=_BD97A2A9-D1FA-4531-8CAC-6CED9AA0264E Content-Disposition: attachment; filename=xfs_repair-3.2.1.txt Content-Type: text/plain; name="xfs_repair-3.2.1.txt" Content-Transfer-Encoding: quoted-printable Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - 13:15:50: scanning filesystem freespace - 32 of 32 allocation = groups done - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - 13:15:50: scanning agi unlinked lists - 32 of 32 allocation = groups done - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 15 - agno =3D 30 - agno =3D 16 - agno =3D 17 - agno =3D 31 - agno =3D 18 - agno =3D 1 - agno =3D 19 - agno =3D 2 - agno =3D 20 - agno =3D 3 - agno =3D 4 - agno =3D 21 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 22 - agno =3D 8 - agno =3D 23 - agno =3D 24 - agno =3D 9 - agno =3D 10 - agno =3D 25 - agno =3D 26 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - agno =3D 27 - agno =3D 28 - agno =3D 29 - 13:15:50: process known inodes and inode discovery - 42368 of = 42368 inodes done - process newly discovered inodes... - 13:15:50: process newly discovered inodes - 32 of 32 = allocation groups done Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - 13:15:50: setting up duplicate extent list - 32 of 32 = allocation groups done - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 16 - agno =3D 17 - agno =3D 18 - agno =3D 20 - agno =3D 19 - agno =3D 22 - agno =3D 14 - agno =3D 24 - agno =3D 25 - agno =3D 26 - agno =3D 27 - agno =3D 28 - agno =3D 29 - agno =3D 23 - agno =3D 30 - agno =3D 31 - agno =3D 21 - agno =3D 15 - 13:15:50: check for inodes claiming duplicate blocks - 42368 = of 42368 inodes done Phase 5 - rebuild AG headers and trees... - 13:15:50: rebuild AG headers and trees - 32 of 32 allocation = groups done - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done --Apple-Mail=_BD97A2A9-D1FA-4531-8CAC-6CED9AA0264E Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii On 15 Aug 2015, at 00:12, Leslie Rhorer wrote: > http://fletchergeek.com/images/md0.metadump.gz --Apple-Mail=_BD97A2A9-D1FA-4531-8CAC-6CED9AA0264E-- From bfoster@redhat.com Sat Aug 15 08:01:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C850F7F3F for ; Sat, 15 Aug 2015 08:01:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42F30AC00C for ; Sat, 15 Aug 2015 06:01:09 -0700 (PDT) X-ASG-Debug-ID: 1439643667-04cbb078e111f50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sMxqQyG8xCax2MFZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Aug 2015 06:01:07 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 159EC8EB26; Sat, 15 Aug 2015 13:01:07 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7FD155U010076; Sat, 15 Aug 2015 09:01:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 84F0E12204F; Sat, 15 Aug 2015 09:01:04 -0400 (EDT) Date: Sat, 15 Aug 2015 09:01:04 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz, oleg@redhat.com Subject: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks Message-ID: <20150815130104.GA56219@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks References: <1439330648-1057-1-git-send-email-david@fromorbit.com> <1439330648-1057-3-git-send-email-david@fromorbit.com> <20150814194145.GB18522@bfoster.bfoster> <20150814223937.GW3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814223937.GW3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439643667 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 15, 2015 at 08:39:37AM +1000, Dave Chinner wrote: > On Fri, Aug 14, 2015 at 03:41:45PM -0400, Brian Foster wrote: > > On Wed, Aug 12, 2015 at 08:04:08AM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > The recent change to the readdir locking made in 40194ec ("xfs: > > > reinstate the ilock in xfs_readdir") for CXFS directory sanity was > > > probably the wrong thing to do. Deep in the readdir code we > > > can take page faults in the filldir callback, and so taking a page > > > fault while holding an inode ilock creates a new set of locking > > > issues that lockdep warns all over the place about. > > > > > > The locking order for regular inodes w.r.t. page faults is io_lock > > > -> pagefault -> mmap_sem -> ilock. The directory readdir code now > > > triggers ilock -> page fault -> mmap_sem. While we cannot deadlock > > > at this point, it inverts all the locking patterns that lockdep > > > normally sees on XFS inodes, and so triggers lockdep. We worked > > > around this with commit 93a8614 ("xfs: fix directory inode iolock > > > lockdep false positive"), but that then just moved the lockdep > > > warning to deeper in the page fault path and triggered on security > > > inode locks. Fixing the shmem issue there just moved the lockdep > > > reports somewhere else, and now we are getting false positives from > > > filesystem freezing annotations getting confused. > > > > > > Further, if we enter memory reclaim in a readdir path, we now get > > > lockdep warning about potential deadlocks because the ilock is held > > > when we enter reclaim. This, again, is different to a regular file > > > in that we never allow memory reclaim to run while holding the ilock > > > for regular files. Hence lockdep now throws > > > ilock->kmalloc->reclaim->ilock warnings. > > > > > > Basically, the problem is that the ilock is being used to protect > > > the directory data and the inode metadata, whereas for a regular > > > file the iolock protects the data and the ilock protects the > > > metadata. From the VFS perspective, the i_mutex serialises all > > > accesses to the directory data, and so not holding the ilock for > > > readdir doesn't matter. The issue is that CXFS doesn't access > > > directory data via the VFS, so it has no "data serialisaton" > > > mechanism. Hence we need to hold the IOLOCK in the correct places to > > > provide this low level directory data access serialisation. > > > > > > The ilock can then be used just when the extent list needs to be > > > read, just like we do for regular files. The directory modification > > > code can take the iolock exclusive when the ilock is also taken, > > > and this then ensures that readdir is correct excluded while > > > modifications are in progress. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > fs/xfs/libxfs/xfs_dir2.c | 3 +++ > > > fs/xfs/xfs_dir2_readdir.c | 11 ++++++++--- > > > fs/xfs/xfs_inode.c | 34 +++++++++++++++++++++------------- > > > fs/xfs/xfs_symlink.c | 7 ++++--- > > > 4 files changed, 36 insertions(+), 19 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > > > index a69fb3a..42799d8 100644 > > > --- a/fs/xfs/libxfs/xfs_dir2.c > > > +++ b/fs/xfs/libxfs/xfs_dir2.c > > > @@ -362,6 +362,7 @@ xfs_dir_lookup( > > > struct xfs_da_args *args; > > > int rval; > > > int v; /* type-checking value */ > > > + int lock_mode; > > > > > > ASSERT(S_ISDIR(dp->i_d.di_mode)); > > > XFS_STATS_INC(xs_dir_lookup); > > > @@ -387,6 +388,7 @@ xfs_dir_lookup( > > > if (ci_name) > > > args->op_flags |= XFS_DA_OP_CILOOKUP; > > > > > > + lock_mode = xfs_ilock_data_map_shared(dp); > > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > > > rval = xfs_dir2_sf_lookup(args); > > > goto out_check_rval; > > > @@ -419,6 +421,7 @@ out_check_rval: > > > } > > > } > > > out_free: > > > + xfs_iunlock(dp, lock_mode); > > > kmem_free(args); > > > return rval; > > > } > > > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > > > index 098cd78..a989a9c 100644 > > > --- a/fs/xfs/xfs_dir2_readdir.c > > > +++ b/fs/xfs/xfs_dir2_readdir.c > > > @@ -171,6 +171,7 @@ xfs_dir2_block_getdents( > > > int wantoff; /* starting block offset */ > > > xfs_off_t cook; > > > struct xfs_da_geometry *geo = args->geo; > > > + int lock_mode; > > > > > > /* > > > * If the block number in the offset is out of range, we're done. > > > @@ -178,7 +179,9 @@ xfs_dir2_block_getdents( > > > if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > > > return 0; > > > > > > + lock_mode = xfs_ilock_data_map_shared(dp); > > > error = xfs_dir3_block_read(NULL, dp, &bp); > > > + xfs_iunlock(dp, lock_mode); > > > > Ok, so the iolock bits exclude directory reads/lookups against directory > > modification. The ilock around these buffer reads serves the purpose of > > the commit 40194ec mentioned above, to protect reading in the extent > > tree. > > Right. > > > The locking all looks fine, but what I'm not quite clear on is where the > > requirement for the iolock comes in. Is this necessary because the ilock > > has been pushed down? > > Yes. > > Basically, the ilock currently serialises access to directory data > in it's entirity. Not just the inode metadata (i.e. struct xfs_inode > and the BMBT in the data forks) but also everything the BMBT points > to. > Indeed. According to the commit referenced above, this was introduced to protect reading in the extent list. Therefore, the exclusive lock is only taken when it hasn't yet been read (and only in readdir). > The problem with this is that it means that when reading the > directory data we have to hold the ilock to prevent racing with > modification - not just inode metadata, but also the directory data > blocks themselves. i.e. if we don't hold the ilock, we could read > one directory data block, and when we go to read the next we could > have raced with a modification that shifted dirents from one block > to the next. This would result in missing or duplicate dirents in > readdir, even though the BMBT had not changed.... > Makes sense, though I wonder what protected this before if i_mutex is not in the mix. This is sort of what I'm more curious about... identifying whether we are purely fixing the original problem referenced above or stepping back and establishing a proper general locking scheme for directories as we do for regular files. It just sounds more like the latter. > Hence we need some form or locking against modification of the > directory data, not just the directory inode structure. THis is > exactly what we do with file data - the ilock protects against > modification of the inode metadata, the iolock serialises access to > the file data appropriately (e.g. vs truncate). > > So effectively this change makes the directory data access be > serialised in a similar manner to the file data. Note that it's not > just directory data - it's also the hash indexes and the free space > blocks that are protected by the iolock. i.e. the xfs_dir_lookup() > method uses the hash index to find the dirent in the directory data > segment, so effectively we are moving to locking structure of "ilock > protects against BMBT changes, iolock protects against directory > data and internal data index changes". > Right, so anything within the bmbt blocks is technically considered file data. Directories just happen to use data at certain magic offsets and whatnot as internal metadata. > > Are we just trying to mirror how i_mutex is used > > and/or provide a consistent locking pattern as for regular files? > > We're not trying to replicate i_mutex - we are trying to ensure that > we have shared read access to the directory data, even though the > VFS does not allow shared read access. The CXFS metadata server > makes use of shared read access because it does not go throught the > VFS layers, and we want to preserve this behaviour so that if we > ever get shared directory access through the VFS everything just > works on XFS. > > And, yes, we are trying to replicate the iolock/mmap_sem/ilock > locking pattern used for regular files, because it doesn't through > lockdep false positives as the iolock is not used underneath the > mmap_sem like the ilock is during block mapping in page faults... > Sounds good, thanks for the explanation. I haven't had a chance to test this yet, but the locking looks fine to me: Reviewed-by: Brian Foster I'll pull it into the continued testing I've been running next week and let you know if anything fires. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From BATV+f8d1820213adf0958867+4374+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 15 08:23:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B0F5C7F3F for ; Sat, 15 Aug 2015 08:23:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 90F0E8F807A for ; Sat, 15 Aug 2015 06:23:39 -0700 (PDT) X-ASG-Debug-ID: 1439645017-04bdf051fb12c60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ABgQWU9dxwQaAkn5 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 15 Aug 2015 06:23:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f8d1820213adf0958867+4374+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZQbQu-0001xV-CF; Sat, 15 Aug 2015 13:23:36 +0000 Date: Sat, 15 Aug 2015 06:23:36 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-ID: <20150815132336.GA7385@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-2-git-send-email-david@fromorbit.com> <20150812072635.GA32399@infradead.org> <20150813013244.GP3902@dastard> <20150813065258.GA677@infradead.org> <20150814015309.GU3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814015309.GU3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439645017 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21621 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 14, 2015 at 11:53:09AM +1000, Dave Chinner wrote: > Ok, I've gone back and had a look at this now and reminded myself of > the discussion we had and the problems found. The end results are > remarkably similar - maybe that's why I found it easy to write this > patch set. i.e. your patchset was buried somewhere in my brain, even > though I'd forgotten about it at the surface... > > How would you like to see this patchset broken up into more > sensible/reviewable chunks? It's just folding and splitting patches, > so it's not a big deal to rework it... I think it should be less. Patch 3 should go first, and then 1,2,4 & 5 as a single one. From sandeen@sandeen.net Sat Aug 15 13:48:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D1C047CBE for ; Sat, 15 Aug 2015 13:48:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4ABD5AC060 for ; Sat, 15 Aug 2015 11:48:51 -0700 (PDT) X-ASG-Debug-ID: 1439664529-04bdf051fb1a930001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 7Ft1Y2AjxgG5iRf1 for ; Sat, 15 Aug 2015 11:48:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9765263CBFE7; Sat, 15 Aug 2015 13:48:18 -0500 (CDT) Message-ID: <55CF8972.8020306@sandeen.net> Date: Sat, 15 Aug 2015 13:48:18 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Roger Willcocks , Leslie Rhorer CC: Brian Foster , Kris Rusocki , "xfs@oss.sgi.com" , "Rhorer, Leslie" Subject: Re: XFS File system in trouble References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439664529 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/15/15 7:28 AM, Roger Willcocks wrote: > xfs_repair 3.2.1 runs cleanly. > > xfs_repair 3.1.1 complains about a load of stuff, including: I wouldn't expect v3.1.1 to work at all, because: # db/xfs_db -V xfs_db version 4.2.0-rc1 # db/xfs_db /mnt/test2/leslie/md0.img -c version versionnum [0xbdb4+0x8a] = V4,NLINK,DIRV2,ATTR,ALIGN,DALIGN,LOGV2,EXTFLG,SECTOR,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT the filesystem has 32-bit project IDs, and: # git log --oneline | grep -i "projid32bit" dd536e1 xfsprogs: Note projid32bit default change in mkfs.xfs manpage 22bc10e xfsprogs: projid32bit handling # git describe --contains 22bc10e v3.1.4~2 that feature support didn't show up until v3.1.4. Were you running a stock v3.1.1? Anyway, in my testing, up to v3.2.0, repair finds a lot of errors (and spends some time looking for a proper superblock) v3.2.1 finds no errors. The errors stopped showing up as of: commit d085fb486f8b33304f2fdf704411313ffc8bcc0c Author: Dave Chinner Date: Tue Jul 8 10:36:39 2014 +1000 repair: fix quota inode handling in secondary superblocks Changes to support separate project quota inodes changed the way quota inodes got written to the superblock. The current code is tailored for the needs to the kernel, where the inodes should only be written if certain falgs are set saying a quota type is enabled. Unfortunately, when recovering a corrupt secondary superblock, we need to unconditionally write the quota inode fields after we unconditionally zero the quota flags field. The result of this bug is that the bad quota inode fields cannot be cleared and hence always are reported by bad by repair in subsequent runs. Fix this by directly clearing the quota inodes in the superblock buffers so that we do need to set special flags to get xfs_sb_to_disk() to do the right thing as setting flags leave bad flag values in the superblock instead of bad inode numbers.... Also, when clearing the inode numbers, write them as NULLFSINO rather than 0 as this is what the kernel will write them as if quota is turned off. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner I'll have to look into that commit, and the errors found prior. -Eric From roger@filmlight.ltd.uk Sat Aug 15 13:56:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 84D8B7CBE for ; Sat, 15 Aug 2015 13:56:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC5C0AC062 for ; Sat, 15 Aug 2015 11:56:56 -0700 (PDT) X-ASG-Debug-ID: 1439665012-04cbb078e31a510001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id HvgbfRfD0YOFA76M for ; Sat, 15 Aug 2015 11:56:53 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id B7D108671E8; Sat, 15 Aug 2015 19:56:51 +0100 (BST) Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: XFS File system in trouble From: Roger Willcocks X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55CF8972.8020306@sandeen.net> Date: Sat, 15 Aug 2015 19:57:04 +0100 Cc: Roger Willcocks , Leslie Rhorer , Brian Foster , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Content-Transfer-Encoding: quoted-printable Message-Id: <03EB8070-A6DA-4E55-ACF9-6E0153E84DA0@filmlight.ltd.uk> References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> <55CF8972.8020306@sandeen.net> To: Eric Sandeen X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439665012 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 15 Aug 2015, at 19:48, Eric Sandeen wrote: > On 8/15/15 7:28 AM, Roger Willcocks wrote: >> xfs_repair 3.2.1 runs cleanly. >>=20 >> xfs_repair 3.1.1 complains about a load of stuff, including: >=20 > I wouldn't expect v3.1.1 to work at all, because: >=20 > # db/xfs_db -V > xfs_db version 4.2.0-rc1 > # db/xfs_db /mnt/test2/leslie/md0.img -c version > versionnum [0xbdb4+0x8a] =3D = V4,NLINK,DIRV2,ATTR,ALIGN,DALIGN,LOGV2,EXTFLG,SECTOR,MOREBITS,ATTR2,LAZYSB= COUNT,PROJID32BIT >=20 > the filesystem has 32-bit project IDs, and: >=20 > # git log --oneline | grep -i "projid32bit" > dd536e1 xfsprogs: Note projid32bit default change in mkfs.xfs manpage > 22bc10e xfsprogs: projid32bit handling >=20 > # git describe --contains 22bc10e > v3.1.4~2 >=20 > that feature support didn't show up until v3.1.4. Were you running a = stock v3.1.1? >=20 > Anyway, in my testing, up to v3.2.0, repair finds a lot of errors (and = spends some > time looking for a proper superblock) >=20 > v3.2.1 finds no errors. >=20 And there=92s the problem, (since XFS_SB_VERSION2_CRCBIT is not set) xfs-repair-3.2.1 should spot and fix the v3 inode. repair/dinode.c (tip) only checks for (line 2335 or so): (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) not a non-crc filesystem with version >=3D 3. Adding the missing check: || (! xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version >=3D 3)=20 allows 3.2.1 to spot and fix the broken inode. =97 Roger From sandeen@sandeen.net Sat Aug 15 14:00:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C730E7F3F for ; Sat, 15 Aug 2015 14:00:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A41B13041B0 for ; Sat, 15 Aug 2015 12:00:34 -0700 (PDT) X-ASG-Debug-ID: 1439665232-04cbb078e41a630001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id RbvIdEs4IlnAxVz3 for ; Sat, 15 Aug 2015 12:00:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7B9AD6125ECF; Sat, 15 Aug 2015 14:00:32 -0500 (CDT) Message-ID: <55CF8C4F.1080906@sandeen.net> Date: Sat, 15 Aug 2015 14:00:31 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Roger Willcocks , Leslie Rhorer CC: Brian Foster , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> <55CF8972.8020306@sandeen.net> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55CF8972.8020306@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439665232 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/15/15 1:48 PM, Eric Sandeen wrote: > On 8/15/15 7:28 AM, Roger Willcocks wrote: >> xfs_repair 3.2.1 runs cleanly. >> >> xfs_repair 3.1.1 complains about a load of stuff, including: > > I wouldn't expect v3.1.1 to work at all, because: > > # db/xfs_db -V > xfs_db version 4.2.0-rc1 > # db/xfs_db /mnt/test2/leslie/md0.img -c version > versionnum [0xbdb4+0x8a] = V4,NLINK,DIRV2,ATTR,ALIGN,DALIGN,LOGV2,EXTFLG,SECTOR,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT > > the filesystem has 32-bit project IDs, and: > > # git log --oneline | grep -i "projid32bit" > dd536e1 xfsprogs: Note projid32bit default change in mkfs.xfs manpage > 22bc10e xfsprogs: projid32bit handling > > # git describe --contains 22bc10e > v3.1.4~2 > > that feature support didn't show up until v3.1.4. Were you running a stock v3.1.1? > > Anyway, in my testing, up to v3.2.0, repair finds a lot of errors (and spends some > time looking for a proper superblock) > > v3.2.1 finds no errors. > > The errors stopped showing up as of: > > commit d085fb486f8b33304f2fdf704411313ffc8bcc0c > Author: Dave Chinner > Date: Tue Jul 8 10:36:39 2014 +1000 > > repair: fix quota inode handling in secondary superblocks I take that back, a bit: "errors vs. no errors" was for xfs_repair -n. a "full" repair with v3.1.4 shows only: # repair/xfs_repair /mnt/test2/leslie/md0.img Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... non-null user quota inode field in superblock 5 reset bad sb for ag 5 non-null user quota inode field in superblock 10 reset bad sb for ag 10 non-null user quota inode field in superblock 18 reset bad sb for ag 18 non-null user quota inode field in superblock 23 reset bad sb for ag 23 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 ... - agno = 29 bad version number 0x3 on inode 124656869424 bad version number 0x3 on inode 124656869424, resetting version number latest git does indeed find no errors; I'll re-check with full repairs to see when the detection stopped, and see if it's a false positive or not. -Eric From roger@filmlight.ltd.uk Sat Aug 15 14:13:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D5CBD7CBE for ; Sat, 15 Aug 2015 14:13:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 898FF8F8166 for ; Sat, 15 Aug 2015 12:13:42 -0700 (PDT) X-ASG-Debug-ID: 1439666019-04bdf051fa1b170001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id O8CrrbXRITkRiXEY for ; Sat, 15 Aug 2015 12:13:39 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 7112688802E; Sat, 15 Aug 2015 20:13:08 +0100 (BST) Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: XFS File system in trouble From: Roger Willcocks X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55CF8C4F.1080906@sandeen.net> Date: Sat, 15 Aug 2015 20:13:22 +0100 Cc: Roger Willcocks , Leslie Rhorer , Brian Foster , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Content-Transfer-Encoding: quoted-printable Message-Id: <9C6B4EAF-42A1-4952-AB4E-2FFCA35D0973@filmlight.ltd.uk> References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> <55CF8972.8020306@sandeen.net> <55CF8C4F.1080906@sandeen.net> To: Eric Sandeen X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439666019 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 15 Aug 2015, at 20:00, Eric Sandeen wrote: > On 8/15/15 1:48 PM, Eric Sandeen wrote: >> On 8/15/15 7:28 AM, Roger Willcocks wrote: >>> xfs_repair 3.2.1 runs cleanly. >>>=20 >>> xfs_repair 3.1.1 complains about a load of stuff, including: >>=20 >> I wouldn't expect v3.1.1 to work at all, because: >> ... >=20 > I take that back, a bit: "errors vs. no errors" was for xfs_repair = -n. >=20 > a "full" repair with v3.1.4 shows only: >=20 > # repair/xfs_repair /mnt/test2/leslie/md0.img=20 > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > non-null user quota inode field in superblock 5 > reset bad sb for ag 5 > non-null user quota inode field in superblock 10 > reset bad sb for ag 10 > non-null user quota inode field in superblock 18 > reset bad sb for ag 18 > non-null user quota inode field in superblock 23 > reset bad sb for ag 23 > - found root inode chunk > Phase 3 - for each AG... > - scan and clear agi unlinked lists... > - process known inodes and perform inode discovery... > - agno =3D 0 > ... > - agno =3D 29 > bad version number 0x3 on inode 124656869424 > bad version number 0x3 on inode 124656869424, resetting version number >=20 Yes, 3.1.1 without =91-n=92 reports fewer errors; I should have = mentioned that.=20 > latest git does indeed find no errors; I'll re-check with full repairs = to see when the detection stopped, and see if it's a false positive or = not. >=20 > -Eric >=20 From david@fromorbit.com Sat Aug 15 17:49:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B1A6C7CBE for ; Sat, 15 Aug 2015 17:49:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2F8CAAC003 for ; Sat, 15 Aug 2015 15:48:56 -0700 (PDT) X-ASG-Debug-ID: 1439678933-04cbb078e31e4d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BHVJlsjtAk6EPUSW for ; Sat, 15 Aug 2015 15:48:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BsCQBCwc9VPBkyLHldgxuBPYMkgy6jZQEBAQEBBptHAgIBAQKBLU0BAQEBAQEHAQEBAUE/hCQBAQQjBAsBIyMQCAMYAgIFIQICDwUlAwcaE4gtuQKVYwEBCAIBHxmBCYR+hTKFCQeCaYFDBZUdjGmaKoQ1LDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Aug 2015 08:18:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQkFk-0006uJ-FQ; Sun, 16 Aug 2015 08:48:40 +1000 Date: Sun, 16 Aug 2015 08:48:40 +1000 From: Dave Chinner To: Roger Willcocks Cc: Eric Sandeen , Brian Foster , Kris Rusocki , "xfs@oss.sgi.com" , "Rhorer, Leslie" , Leslie Rhorer Subject: Re: XFS File system in trouble Message-ID: <20150815224840.GX3902@dastard> X-ASG-Orig-Subj: Re: XFS File system in trouble References: <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> <55CF8972.8020306@sandeen.net> <03EB8070-A6DA-4E55-ACF9-6E0153E84DA0@filmlight.ltd.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <03EB8070-A6DA-4E55-ACF9-6E0153E84DA0@filmlight.ltd.uk> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439678934 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 15, 2015 at 07:57:04PM +0100, Roger Willcocks wrote: > > On 15 Aug 2015, at 19:48, Eric Sandeen wrote: > > > On 8/15/15 7:28 AM, Roger Willcocks wrote: > >> xfs_repair 3.2.1 runs cleanly. > >> > >> xfs_repair 3.1.1 complains about a load of stuff, including: > > > > I wouldn't expect v3.1.1 to work at all, because: > > > > # db/xfs_db -V > > xfs_db version 4.2.0-rc1 > > # db/xfs_db /mnt/test2/leslie/md0.img -c version > > versionnum [0xbdb4+0x8a] = V4,NLINK,DIRV2,ATTR,ALIGN,DALIGN,LOGV2,EXTFLG,SECTOR,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT > > > > the filesystem has 32-bit project IDs, and: > > > > # git log --oneline | grep -i "projid32bit" > > dd536e1 xfsprogs: Note projid32bit default change in mkfs.xfs manpage > > 22bc10e xfsprogs: projid32bit handling > > > > # git describe --contains 22bc10e > > v3.1.4~2 > > > > that feature support didn't show up until v3.1.4. Were you running a stock v3.1.1? > > > > Anyway, in my testing, up to v3.2.0, repair finds a lot of errors (and spends some > > time looking for a proper superblock) > > > > v3.2.1 finds no errors. > > > > And there’s the problem, (since XFS_SB_VERSION2_CRCBIT is not set) > xfs-repair-3.2.1 should spot and fix the v3 inode. > > repair/dinode.c (tip) only checks for (line 2335 or so): > > (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) > > not a non-crc filesystem with version >= 3. > > Adding the missing check: > > || (! xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version >= 3) Yup, that looks like the issue. Good spotting, Roger! Can you send a patch w/ signoff that I can commit? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Aug 15 17:56:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B6DD7CBE for ; Sat, 15 Aug 2015 17:56:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA3158F8033 for ; Sat, 15 Aug 2015 15:56:36 -0700 (PDT) X-ASG-Debug-ID: 1439679393-04bdf051fa1f750001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id lhyTh3XcGDP6EoFF for ; Sat, 15 Aug 2015 15:56:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2COCAClws9VPBkyLHldgxuBPYZSo2UBAQEBAQabRwICAQECgS1NAQEBAQEBBwEBAQFBP4QjAQEBAwEnExwjBQsIAw4HAwklDwUlAwcaE4gmB85kAQEIAgEfGYYHhTKEPksHhCwFkhGDDIdwhHmBTYdFkRiENSwzgkwBAQE Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Aug 2015 08:26:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQkNM-0006v1-0c; Sun, 16 Aug 2015 08:56:32 +1000 Date: Sun, 16 Aug 2015 08:56:31 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, jack@suse.cz, oleg@redhat.com Subject: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks Message-ID: <20150815225631.GY3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: stop holding ILOCK over filldir callbacks References: <1439330648-1057-1-git-send-email-david@fromorbit.com> <1439330648-1057-3-git-send-email-david@fromorbit.com> <20150814194145.GB18522@bfoster.bfoster> <20150814223937.GW3902@dastard> <20150815130104.GA56219@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150815130104.GA56219@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439679393 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 15, 2015 at 09:01:04AM -0400, Brian Foster wrote: > On Sat, Aug 15, 2015 at 08:39:37AM +1000, Dave Chinner wrote: > > On Fri, Aug 14, 2015 at 03:41:45PM -0400, Brian Foster wrote: > > > On Wed, Aug 12, 2015 at 08:04:08AM +1000, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > The recent change to the readdir locking made in 40194ec ("xfs: > > > > reinstate the ilock in xfs_readdir") for CXFS directory sanity was > > > > probably the wrong thing to do. Deep in the readdir code we > > > > can take page faults in the filldir callback, and so taking a page > > > > fault while holding an inode ilock creates a new set of locking > > > > issues that lockdep warns all over the place about. > > > > > > > > The locking order for regular inodes w.r.t. page faults is io_lock > > > > -> pagefault -> mmap_sem -> ilock. The directory readdir code now > > > > triggers ilock -> page fault -> mmap_sem. While we cannot deadlock > > > > at this point, it inverts all the locking patterns that lockdep > > > > normally sees on XFS inodes, and so triggers lockdep. We worked > > > > around this with commit 93a8614 ("xfs: fix directory inode iolock > > > > lockdep false positive"), but that then just moved the lockdep > > > > warning to deeper in the page fault path and triggered on security > > > > inode locks. Fixing the shmem issue there just moved the lockdep > > > > reports somewhere else, and now we are getting false positives from > > > > filesystem freezing annotations getting confused. > > > > > > > > Further, if we enter memory reclaim in a readdir path, we now get > > > > lockdep warning about potential deadlocks because the ilock is held > > > > when we enter reclaim. This, again, is different to a regular file > > > > in that we never allow memory reclaim to run while holding the ilock > > > > for regular files. Hence lockdep now throws > > > > ilock->kmalloc->reclaim->ilock warnings. > > > > > > > > Basically, the problem is that the ilock is being used to protect > > > > the directory data and the inode metadata, whereas for a regular > > > > file the iolock protects the data and the ilock protects the > > > > metadata. From the VFS perspective, the i_mutex serialises all > > > > accesses to the directory data, and so not holding the ilock for > > > > readdir doesn't matter. The issue is that CXFS doesn't access > > > > directory data via the VFS, so it has no "data serialisaton" > > > > mechanism. Hence we need to hold the IOLOCK in the correct places to > > > > provide this low level directory data access serialisation. > > > > > > > > The ilock can then be used just when the extent list needs to be > > > > read, just like we do for regular files. The directory modification > > > > code can take the iolock exclusive when the ilock is also taken, > > > > and this then ensures that readdir is correct excluded while > > > > modifications are in progress. > > > > > > > > Signed-off-by: Dave Chinner ..... > > > > @@ -178,7 +179,9 @@ xfs_dir2_block_getdents( > > > > if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk) > > > > return 0; > > > > > > > > + lock_mode = xfs_ilock_data_map_shared(dp); > > > > error = xfs_dir3_block_read(NULL, dp, &bp); > > > > + xfs_iunlock(dp, lock_mode); > > > > > > Ok, so the iolock bits exclude directory reads/lookups against directory > > > modification. The ilock around these buffer reads serves the purpose of > > > the commit 40194ec mentioned above, to protect reading in the extent > > > tree. > > > > Right. > > > > > The locking all looks fine, but what I'm not quite clear on is where the > > > requirement for the iolock comes in. Is this necessary because the ilock > > > has been pushed down? > > > > Yes. > > > > Basically, the ilock currently serialises access to directory data > > in it's entirity. Not just the inode metadata (i.e. struct xfs_inode > > and the BMBT in the data forks) but also everything the BMBT points > > to. > > > > Indeed. According to the commit referenced above, this was introduced to > protect reading in the extent list. Therefore, the exclusive lock is > only taken when it hasn't yet been read (and only in readdir). Correct. That's exactly what we do with regular file inodes, too. having multiple readers trying to populate the in-core extent list concurrently results in a corrupt extent list. Hence we do that exclusively so that we block other readers until the extent list is fully populated. > > The problem with this is that it means that when reading the > > directory data we have to hold the ilock to prevent racing with > > modification - not just inode metadata, but also the directory > > data blocks themselves. i.e. if we don't hold the ilock, we > > could read one directory data block, and when we go to read the > > next we could have raced with a modification that shifted > > dirents from one block to the next. This would result in missing > > or duplicate dirents in readdir, even though the BMBT had not > > changed.... > > Makes sense, though I wonder what protected this before if i_mutex > is not in the mix. This is sort of what I'm more curious about... On Irix, it was the IOLOCK (i.e. the VFS didn't have it's own inode locks - it called into the filesystem to get the filesysetm to lock the inode appropriately). On linux, the IOLOCK was dropped because the i_mutex serialised all access to the directory data. But for the CXFS server on linux, it does't have i_mutex serialisation.... > identifying whether we are purely fixing the original problem referenced > above or stepping back and establishing a proper general locking scheme > for directories as we do for regular files. It just sounds more like the > latter. Both, really. We're going back to how it used to be done, and hopefully solving all the outstanding problems at the same time. [....] > Sounds good, thanks for the explanation. I haven't had a chance to test > this yet, but the locking looks fine to me: > > Reviewed-by: Brian Foster > > I'll pull it into the continued testing I've been running next week and > let you know if anything fires. Thanks Brian! Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Aug 15 17:57:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1B3297CBE for ; Sat, 15 Aug 2015 17:57:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5ED0AC006 for ; Sat, 15 Aug 2015 15:57:37 -0700 (PDT) X-ASG-Debug-ID: 1439679455-04bdf051f91f7c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JzSON2wy6m4lu1xA for ; Sat, 15 Aug 2015 15:57:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A5CAClws9VPBkyLHldgxuBPYZSo2UBAQEBAQabRwQCAoEtTQEBAQEBAQcBAQEBQT+EJAEBBDocIxAIAw4KCSUPBSUDBxoTiC3OZAEBCAIgGYYHhTKFCQeELAWVHYxpgU2UdoNnhDUsM4JMAQEB Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Aug 2015 08:27:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQkOM-0006vK-IH; Sun, 16 Aug 2015 08:57:34 +1000 Date: Sun, 16 Aug 2015 08:57:34 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages Message-ID: <20150815225734.GZ3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/8] xfs: Introduce writeback context for writepages References: <1439333388-16452-1-git-send-email-david@fromorbit.com> <1439333388-16452-2-git-send-email-david@fromorbit.com> <20150812072635.GA32399@infradead.org> <20150813013244.GP3902@dastard> <20150813065258.GA677@infradead.org> <20150814015309.GU3902@dastard> <20150815132336.GA7385@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150815132336.GA7385@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439679455 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 15, 2015 at 06:23:36AM -0700, Christoph Hellwig wrote: > On Fri, Aug 14, 2015 at 11:53:09AM +1000, Dave Chinner wrote: > > Ok, I've gone back and had a look at this now and reminded myself of > > the discussion we had and the problems found. The end results are > > remarkably similar - maybe that's why I found it easy to write this > > patch set. i.e. your patchset was buried somewhere in my brain, even > > though I'd forgotten about it at the surface... > > > > How would you like to see this patchset broken up into more > > sensible/reviewable chunks? It's just folding and splitting patches, > > so it's not a big deal to rework it... > > I think it should be less. Patch 3 should go first, and then 1,2,4 & 5 > as a single one. No worries, I'll reorder and fold them, retest and repost. Thanks Christoph! -Dave. -- Dave Chinner david@fromorbit.com From roger@filmlight.ltd.uk Sat Aug 15 19:14:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6FF9E7CBE for ; Sat, 15 Aug 2015 19:14:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1298BAC003 for ; Sat, 15 Aug 2015 17:14:48 -0700 (PDT) X-ASG-Debug-ID: 1439684082-04bdf051fb207e0001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id 7vC7uEccruipaIMl for ; Sat, 15 Aug 2015 17:14:43 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 440228671E8; Sun, 16 Aug 2015 01:14:42 +0100 (BST) From: Roger Willcocks Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Subject: [PATCH] v3 inodes are only valid on crc-enabled filesystems. Date: Sun, 16 Aug 2015 01:14:55 +0100 X-ASG-Orig-Subj: [PATCH] v3 inodes are only valid on crc-enabled filesystems. Message-Id: Cc: Dave Chinner To: xfs@oss.sgi.com Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439684082 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix an xfs_repair regression reported by Leslie Rhorer where a bad (v3) inode version number was not reset. Signed-off-by: Roger Willcocks --- db/check.c | 2 +- include/xfs_dinode.h | 3 ++- libxfs/xfs_inode_buf.c | 2 +- repair/dinode.c | 7 +++---- repair/prefetch.c | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/db/check.c b/db/check.c index c4c972f..810fa55 100644 --- a/db/check.c +++ b/db/check.c @@ -2637,7 +2637,7 @@ process_inode( error++; return; } - if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, idic.di_version)) { if (isfree || v) dbprintf(_("bad version number %#x for inode = %lld\n"), idic.di_version, ino); diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 623bbe8..40700e6 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -19,7 +19,8 @@ #define __XFS_DINODE_H__ #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) ((v) >=3D 1 && (v) <=3D 3) +#define XFS_DINODE_GOOD_VERSION(sb, v) \ + (xfs_sb_version_hascrc(sb) ? ((v) =3D=3D 3) : ((v) =3D=3D 1 || = (v) =3D=3D 2)) typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index de16ed9..e9cc74c 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -78,7 +78,7 @@ xfs_inode_buf_verify( dip =3D (struct xfs_dinode *)xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); di_ok =3D dip->di_magic =3D=3D = cpu_to_be16(XFS_DINODE_MAGIC) && - XFS_DINODE_GOOD_VERSION(dip->di_version); + XFS_DINODE_GOOD_VERSION(&mp->m_sb, = dip->di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, = XFS_ERRTAG_ITOBP_INOTOBP, = XFS_RANDOM_ITOBP_INOTOBP))) { diff --git a/repair/dinode.c b/repair/dinode.c index 035212c..29a7a19 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -129,7 +129,7 @@ clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t = *dinoc, xfs_ino_t ino_num) dinoc->di_magic =3D cpu_to_be16(XFS_DINODE_MAGIC); } - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dinoc->di_version) || (!fs_inode_nlink && dinoc->di_version > 1)) { __dirty_no_modify_ret(dirty); if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -2331,9 +2331,8 @@ process_dinode_int(xfs_mount_t *mp, } } - if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || - (!fs_inode_nlink && dino->di_version > 1) || - (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) ) = { + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dino->di_version) || + (!fs_inode_nlink && dino->di_version > 1) ) { retval =3D 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %" = PRIu64 "%c"), diff --git a/repair/prefetch.c b/repair/prefetch.c index 7ea0d36..ad7082c 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -419,7 +419,7 @@ pf_read_inode_dirs( if (be16_to_cpu(dino->di_magic) !=3D XFS_DINODE_MAGIC) continue; - if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, = dino->di_version) || (!fs_inode_nlink && dino->di_version > = 1)) continue; --=20 2.5.0.rc0 From roger@filmlight.ltd.uk Sat Aug 15 19:20:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5BD6F7F47 for ; Sat, 15 Aug 2015 19:20:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DFDA2AC003 for ; Sat, 15 Aug 2015 17:20:23 -0700 (PDT) X-ASG-Debug-ID: 1439684421-04cbb078e31f9b0001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id 32ogQXyk7XJp6Mk1 for ; Sat, 15 Aug 2015 17:20:21 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 02B8088802E; Sun, 16 Aug 2015 01:20:20 +0100 (BST) Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems. From: Roger Willcocks X-ASG-Orig-Subj: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems. In-Reply-To: Date: Sun, 16 Aug 2015 01:20:34 +0100 Cc: Roger Willcocks Content-Transfer-Encoding: quoted-printable Message-Id: References: To: xfs@oss.sgi.com X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439684421 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- With this patch, Leslie=92s filesystem now reports a Metadata corruption = as well as an invalid inode: Phase 3 - for each AG... - scan and clear agi unlinked lists... - 00:41:25: scanning agi unlinked lists - 32 of 32 allocation = groups done - process known inodes and perform inode discovery... - agno =3D 0 ... - agno =3D 29 Metadata corruption detected at block 0x9e7833810/0x2000 - agno =3D 11 bad version number 0x3 on inode 124656869424 bad version number 0x3 on inode 124656869424, resetting version number - agno =3D 12 - agno =3D 13 - agno =3D 14 - 00:41:26: process known inodes and inode discovery - 42368 of = 42368 inodes done =97 Roger On 16 Aug 2015, at 01:14, Roger Willcocks = wrote: > Fix an xfs_repair regression reported by Leslie Rhorer where a bad > (v3) inode version number was not reset. >=20 > Signed-off-by: Roger Willcocks > --- > db/check.c | 2 +- > include/xfs_dinode.h | 3 ++- > libxfs/xfs_inode_buf.c | 2 +- > repair/dinode.c | 7 +++---- > repair/prefetch.c | 2 +- > 5 files changed, 8 insertions(+), 8 deletions(-) >=20 > diff --git a/db/check.c b/db/check.c > index c4c972f..810fa55 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -2637,7 +2637,7 @@ process_inode( > error++; > return; > } > - if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { > + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, idic.di_version)) { > if (isfree || v) > dbprintf(_("bad version number %#x for inode = %lld\n"), > idic.di_version, ino); > diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h > index 623bbe8..40700e6 100644 > --- a/include/xfs_dinode.h > +++ b/include/xfs_dinode.h > @@ -19,7 +19,8 @@ > #define __XFS_DINODE_H__ >=20 > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > -#define XFS_DINODE_GOOD_VERSION(v) ((v) >=3D 1 && (v) <=3D 3) > +#define XFS_DINODE_GOOD_VERSION(sb, v) \ > + (xfs_sb_version_hascrc(sb) ? ((v) =3D=3D 3) : ((v) =3D=3D 1 || = (v) =3D=3D 2)) >=20 > typedef struct xfs_timestamp { > __be32 t_sec; /* timestamp seconds */ > diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c > index de16ed9..e9cc74c 100644 > --- a/libxfs/xfs_inode_buf.c > +++ b/libxfs/xfs_inode_buf.c > @@ -78,7 +78,7 @@ xfs_inode_buf_verify( > dip =3D (struct xfs_dinode *)xfs_buf_offset(bp, > (i << mp->m_sb.sb_inodelog)); > di_ok =3D dip->di_magic =3D=3D = cpu_to_be16(XFS_DINODE_MAGIC) && > - XFS_DINODE_GOOD_VERSION(dip->di_version); > + XFS_DINODE_GOOD_VERSION(&mp->m_sb, = dip->di_version); > if (unlikely(XFS_TEST_ERROR(!di_ok, mp, > = XFS_ERRTAG_ITOBP_INOTOBP, > = XFS_RANDOM_ITOBP_INOTOBP))) { > diff --git a/repair/dinode.c b/repair/dinode.c > index 035212c..29a7a19 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -129,7 +129,7 @@ clear_dinode_core(struct xfs_mount *mp, = xfs_dinode_t *dinoc, xfs_ino_t ino_num) > dinoc->di_magic =3D cpu_to_be16(XFS_DINODE_MAGIC); > } >=20 > - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || > + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dinoc->di_version) || > (!fs_inode_nlink && dinoc->di_version > 1)) { > __dirty_no_modify_ret(dirty); > if (xfs_sb_version_hascrc(&mp->m_sb)) > @@ -2331,9 +2331,8 @@ process_dinode_int(xfs_mount_t *mp, > } > } >=20 > - if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || > - (!fs_inode_nlink && dino->di_version > 1) || > - (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) ) = { > + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, dino->di_version) || > + (!fs_inode_nlink && dino->di_version > 1) ) { > retval =3D 1; > if (!uncertain) > do_warn(_("bad version number 0x%x on inode %" = PRIu64 "%c"), > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 7ea0d36..ad7082c 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -419,7 +419,7 @@ pf_read_inode_dirs( > if (be16_to_cpu(dino->di_magic) !=3D XFS_DINODE_MAGIC) > continue; >=20 > - if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || > + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, = dino->di_version) || > (!fs_inode_nlink && dino->di_version > = 1)) > continue; >=20 > --=20 > 2.5.0.rc0 >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 From sandeen@sandeen.net Sat Aug 15 19:32:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D46B7F50 for ; Sat, 15 Aug 2015 19:32:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 562918F8035 for ; Sat, 15 Aug 2015 17:32:57 -0700 (PDT) X-ASG-Debug-ID: 1439685175-04cbb078e21fc90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id t604S7ZKE0CKjLyl for ; Sat, 15 Aug 2015 17:32:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1FA93602D83E; Sat, 15 Aug 2015 19:32:55 -0500 (CDT) Message-ID: <55CFDA36.1030700@sandeen.net> Date: Sat, 15 Aug 2015 19:32:54 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Roger Willcocks , Leslie Rhorer CC: Brian Foster , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble References: <20150720111747.GA53450@bfoster.bfoster> <55B73365.1050908@mygrande.net> <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> <74DC7EBF-0029-4E5E-9D96-DF193E2BE83F@filmlight.ltd.uk> <55CF8972.8020306@sandeen.net> <55CF8C4F.1080906@sandeen.net> X-ASG-Orig-Subj: Re: XFS File system in trouble In-Reply-To: <55CF8C4F.1080906@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439685175 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/15/15 2:00 PM, Eric Sandeen wrote: > On 8/15/15 1:48 PM, Eric Sandeen wrote: >> On 8/15/15 7:28 AM, Roger Willcocks wrote: >>> xfs_repair 3.2.1 runs cleanly. >>> >>> xfs_repair 3.1.1 complains about a load of stuff, including: >> >> I wouldn't expect v3.1.1 to work at all, because: >> >> # db/xfs_db -V >> xfs_db version 4.2.0-rc1 >> # db/xfs_db /mnt/test2/leslie/md0.img -c version >> versionnum [0xbdb4+0x8a] = V4,NLINK,DIRV2,ATTR,ALIGN,DALIGN,LOGV2,EXTFLG,SECTOR,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT >> >> the filesystem has 32-bit project IDs, and: >> >> # git log --oneline | grep -i "projid32bit" >> dd536e1 xfsprogs: Note projid32bit default change in mkfs.xfs manpage >> 22bc10e xfsprogs: projid32bit handling >> >> # git describe --contains 22bc10e >> v3.1.4~2 >> >> that feature support didn't show up until v3.1.4. Were you running a stock v3.1.1? >> >> Anyway, in my testing, up to v3.2.0, repair finds a lot of errors (and spends some >> time looking for a proper superblock) >> >> v3.2.1 finds no errors. >> >> The errors stopped showing up as of: >> >> commit d085fb486f8b33304f2fdf704411313ffc8bcc0c >> Author: Dave Chinner >> Date: Tue Jul 8 10:36:39 2014 +1000 >> >> repair: fix quota inode handling in secondary superblocks > > I take that back, a bit: "errors vs. no errors" was for xfs_repair -n. > > a "full" repair with v3.1.4 shows only: > > # repair/xfs_repair /mnt/test2/leslie/md0.img > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > non-null user quota inode field in superblock 5 > reset bad sb for ag 5 > non-null user quota inode field in superblock 10 > reset bad sb for ag 10 > non-null user quota inode field in superblock 18 > reset bad sb for ag 18 > non-null user quota inode field in superblock 23 > reset bad sb for ag 23 > - found root inode chunk > Phase 3 - for each AG... > - scan and clear agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > ... > - agno = 29 > bad version number 0x3 on inode 124656869424 > bad version number 0x3 on inode 124656869424, resetting version number And that does match the runtime error he was hitting: It works for a while, because some of the directories already exist, but when it started to try to create directories, it started getting FS errors and I had to wind up rebooting. After reboot, I get the following when I try to run the command from the directory again: [ 380.556635] XFS (md0): xfs_iread: validation failed for inode 124656869424 failed FWIW, this inode is unused; when he hit it runtime, we were attempting to allocate it. I suppose the bad version could be chalked up to a bit-flip from the bad memory that was in the box. -Eric From david@fromorbit.com Sat Aug 15 19:42:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BE777F50 for ; Sat, 15 Aug 2015 19:42:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8C1AF304039 for ; Sat, 15 Aug 2015 17:42:46 -0700 (PDT) X-ASG-Debug-ID: 1439685763-04cbb078e41fee0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id P69U792XHmaCPd4Y for ; Sat, 15 Aug 2015 17:42:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B6CQBL289VPBkyLHldgxuBPYJWg3yjaQabRwICAQECgS1NAQEBAQEBBwEBAQFBP4QkAQEEJxMcIxAIAxgJJQ8FJQMHGhOILc5ZAQEBAQYBAQEBHhmGB4UyhQkHgxiBFAWSEYMMjGmaKoQ1LDOCTAEBAQ Received: from ppp121-44-50-25.lns20.syd4.internode.on.net (HELO dastard) ([121.44.50.25]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Aug 2015 10:12:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZQm26-00072R-5f; Sun, 16 Aug 2015 10:42:42 +1000 Date: Sun, 16 Aug 2015 10:42:42 +1000 From: Dave Chinner To: Roger Willcocks Cc: xfs@oss.sgi.com Subject: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems. Message-ID: <20150816004242.GA3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems. References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439685763 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 16, 2015 at 01:14:55AM +0100, Roger Willcocks wrote: > Fix an xfs_repair regression reported by Leslie Rhorer where a bad > (v3) inode version number was not reset. > > Signed-off-by: Roger Willcocks > --- > db/check.c | 2 +- > include/xfs_dinode.h | 3 ++- > libxfs/xfs_inode_buf.c | 2 +- > repair/dinode.c | 7 +++---- > repair/prefetch.c | 2 +- > 5 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/db/check.c b/db/check.c > index c4c972f..810fa55 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -2637,7 +2637,7 @@ process_inode( > error++; > return; > } > - if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { > + if (!XFS_DINODE_GOOD_VERSION(&mp->m_sb, idic.di_version)) { > if (isfree || v) > dbprintf(_("bad version number %#x for inode %lld\n"), > idic.di_version, ino); > diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h > index 623bbe8..40700e6 100644 > --- a/include/xfs_dinode.h > +++ b/include/xfs_dinode.h > @@ -19,7 +19,8 @@ > #define __XFS_DINODE_H__ > > #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ > -#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) > +#define XFS_DINODE_GOOD_VERSION(sb, v) \ > + (xfs_sb_version_hascrc(sb) ? ((v) == 3) : ((v) == 1 || (v) == 2)) I'd make this a static inline function so it gets type checking and it is easier to understand the logic at a glance. i.e. something like: static inline bool xfs_dinode_good_version(struct xfs_mount *mp, __uint8_t version) { if (version < 1 || version > 3) return false; if (xfs_sb_version_hascrc(&mp->m_sb)) { if (version != 3) return false; } else if (version > 2) return false; return true; } Otherwise looks fine. Cheers, Dave. -- Dave Chinner david@fromorbit.com From roger@filmlight.ltd.uk Sun Aug 16 06:34:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E82787F56 for ; Sun, 16 Aug 2015 06:34:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D951F8F8040 for ; Sun, 16 Aug 2015 04:34:01 -0700 (PDT) X-ASG-Debug-ID: 1439724840-04cb6c10d50b830001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id eoF1PUg1iLRRkxvq for ; Sun, 16 Aug 2015 04:34:00 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 6030D8671E8; Sun, 16 Aug 2015 12:33:59 +0100 (BST) Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems. From: Roger Willcocks X-ASG-Orig-Subj: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems. In-Reply-To: <20150816004242.GA3902@dastard> Date: Sun, 16 Aug 2015 12:34:10 +0100 Cc: Roger Willcocks , xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <8E58B8D8-39A6-486E-89E7-417A58C28BB4@filmlight.ltd.uk> References: <20150816004242.GA3902@dastard> To: Dave Chinner X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439724840 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21643 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 16 Aug 2015, at 01:42, Dave Chinner wrote: > On Sun, Aug 16, 2015 at 01:14:55AM +0100, Roger Willcocks wrote: >> Fix an xfs_repair regression reported by Leslie Rhorer where a bad >> (v3) inode version number was not reset. >>=20 >> Signed-off-by: Roger Willcocks >>=20 >> -#define XFS_DINODE_GOOD_VERSION(v) ((v) >=3D 1 && (v) <=3D 3) >> +#define XFS_DINODE_GOOD_VERSION(sb, v) \ >> + (xfs_sb_version_hascrc(sb) ? ((v) =3D=3D 3) : ((v) =3D=3D 1 || = (v) =3D=3D 2)) >=20 > I'd make this a static inline function so it gets type checking and > it is easier to understand the logic at a glance. i.e. something > like: >=20 > static inline bool > xfs_dinode_good_version(struct xfs_mount *mp, __uint8_t version) > { > if (version < 1 || version > 3) > return false; > if (xfs_sb_version_hascrc(&mp->m_sb)) { > if (version !=3D 3) > return false; > } else if (version > 2) > return false; >=20 > return true; > } >=20 include of xfs_dinode.h has to be moved to after the definition of xfs_mount in libxfs.h, but that=92s okay following the pattern set by xfs_da_format.h. Updated patch follows. =97 Roger From roger@filmlight.ltd.uk Sun Aug 16 06:34:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5522E7F56 for ; Sun, 16 Aug 2015 06:34:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49754304059 for ; Sun, 16 Aug 2015 04:34:13 -0700 (PDT) X-ASG-Debug-ID: 1439724851-04cb6c10d30b850001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id lVbsHPfOclmpgvuO for ; Sun, 16 Aug 2015 04:34:11 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from [192.168.0.220] (cpc2-stev6-2-0-cust318.9-2.cable.virginm.net [213.107.89.63]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 415508671E8 for ; Sun, 16 Aug 2015 12:34:11 +0100 (BST) From: Roger Willcocks Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Subject: [PATCH] v3 inodes are only valid on crc-enabled filesystems Message-Id: X-ASG-Orig-Subj: [PATCH] v3 inodes are only valid on crc-enabled filesystems Date: Sun, 16 Aug 2015 12:34:24 +0100 To: xfs@oss.sgi.com Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1439724851 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21643 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix an xfs_repair regression reported by Leslie Rhorer where a bad (v3) inode version number was not reset. Signed-off-by: Roger Willcocks --- db/check.c | 2 +- include/libxfs.h | 2 +- include/xfs_dinode.h | 10 +++++++++- libxfs/xfs_inode_buf.c | 2 +- repair/dinode.c | 7 +++---- repair/prefetch.c | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/db/check.c b/db/check.c index c4c972f..b5c3b8e 100644 --- a/db/check.c +++ b/db/check.c @@ -2637,7 +2637,7 @@ process_inode( error++; return; } - if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { + if (!xfs_dinode_good_version(mp, idic.di_version)) { if (isfree || v) dbprintf(_("bad version number %#x for inode = %lld\n"), idic.di_version, ino); diff --git a/include/libxfs.h b/include/libxfs.h index 962e319..450a38f 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -51,7 +51,6 @@ #include #include #include -#include #include #include #include @@ -279,6 +278,7 @@ extern void libxfs_rtmount_destroy (xfs_mount_t *); */ #include #include +#include #include /* diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 623bbe8..2079061 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -19,7 +19,15 @@ #define __XFS_DINODE_H__ #define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) ((v) >=3D 1 && (v) <=3D 3) + +static inline bool +xfs_dinode_good_version(struct xfs_mount *mp, __u8 version) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return version =3D=3D 3; + + return version =3D=3D 1 || version =3D=3D 2; +} typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index de16ed9..c79b90b 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -78,7 +78,7 @@ xfs_inode_buf_verify( dip =3D (struct xfs_dinode *)xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); di_ok =3D dip->di_magic =3D=3D = cpu_to_be16(XFS_DINODE_MAGIC) && - XFS_DINODE_GOOD_VERSION(dip->di_version); + xfs_dinode_good_version(mp, dip->di_version); if (unlikely(XFS_TEST_ERROR(!di_ok, mp, = XFS_ERRTAG_ITOBP_INOTOBP, = XFS_RANDOM_ITOBP_INOTOBP))) { diff --git a/repair/dinode.c b/repair/dinode.c index 035212c..b76066b 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -129,7 +129,7 @@ clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t = *dinoc, xfs_ino_t ino_num) dinoc->di_magic =3D cpu_to_be16(XFS_DINODE_MAGIC); } - if (!XFS_DINODE_GOOD_VERSION(dinoc->di_version) || + if (!xfs_dinode_good_version(mp, dinoc->di_version) || (!fs_inode_nlink && dinoc->di_version > 1)) { __dirty_no_modify_ret(dirty); if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -2331,9 +2331,8 @@ process_dinode_int(xfs_mount_t *mp, } } - if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || - (!fs_inode_nlink && dino->di_version > 1) || - (xfs_sb_version_hascrc(&mp->m_sb) && dino->di_version < 3) ) = { + if (!xfs_dinode_good_version(mp, dino->di_version) || + (!fs_inode_nlink && dino->di_version > 1)) { retval =3D 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %" = PRIu64 "%c"), diff --git a/repair/prefetch.c b/repair/prefetch.c index 7ea0d36..3631ff5 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -419,7 +419,7 @@ pf_read_inode_dirs( if (be16_to_cpu(dino->di_magic) !=3D XFS_DINODE_MAGIC) continue; - if (!XFS_DINODE_GOOD_VERSION(dino->di_version) || + if (!xfs_dinode_good_version(mp, dino->di_version) || (!fs_inode_nlink && dino->di_version > = 1)) continue; --=20 2.5.0.rc0 From jtulak@redhat.com Mon Aug 17 10:01:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 70CE87F47 for ; Mon, 17 Aug 2015 10:01:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62419304051 for ; Mon, 17 Aug 2015 08:01:35 -0700 (PDT) X-ASG-Debug-ID: 1439823693-04cb6c10d3272f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pmlkhLZvH6bnaFZA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 08:01:34 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id B61F191FF1; Mon, 17 Aug 2015 15:01:33 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HF1WZ6008034; Mon, 17 Aug 2015 11:01:32 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH v4 09/11] xfsprogs: Add mntent.h check into autoconf Date: Mon, 17 Aug 2015 17:01:27 +0200 X-ASG-Orig-Subj: [PATCH v4 09/11] xfsprogs: Add mntent.h check into autoconf Message-Id: <1439823687-7279-1-git-send-email-jtulak@redhat.com> In-Reply-To: <20150804112153.GG18906@infradead.org> References: <20150804112153.GG18906@infradead.org> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439823694 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UPDATE: Autoconf change. Hopefully this is what Chris meant. Signed-off-by: Jan Tulak --- configure.ac | 1 + fsr/xfs_fsr.c | 6 +++--- include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 8 ++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 530650b..0aba90c 100644 --- a/configure.ac +++ b/configure.ac @@ -115,6 +115,7 @@ AC_HAVE_FALLOCATE AC_HAVE_FIEMAP AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE +AC_HAVE_MNTENT AC_HAVE_BLKID_TOPO AC_HAVE_READDIR diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index b4ff136..4912b73 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -25,16 +25,16 @@ #include #include -#include -#include #include #include #include #include -#include #include #include +#ifdef HAVE_MNTENT +# include +#endif #ifndef XFS_XFLAG_NODEFRAG #define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ diff --git a/include/builddefs.in b/include/builddefs.in index c644a17..e522243 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -103,6 +103,7 @@ HAVE_FIEMAP = @have_fiemap@ HAVE_PREADV = @have_preadv@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ +HAVE_MNTENT = @have_mntent@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -130,6 +131,9 @@ PLDLIBS = -L/usr/local/lib -lintl PCFLAGS = -I/usr/local/include $(GCCFLAGS) DEPENDFLAGS = -D__FreeBSD__ endif +ifeq ($(HAVE_MNTENT),yes) +PCFLAGS+= -DHAVE_MNTENT +endif GCFLAGS = $(OPTIMIZER) $(DEBUG) \ -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 919ae0a..75aa61e 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -202,3 +202,11 @@ AC_DEFUN([AC_HAVE_READDIR], AC_SUBST(have_readdir) ]) +# +# Check if there is mntent.h +# +AC_DEFUN([AC_HAVE_MNTENT], + [ AC_CHECK_HEADERS(mntent.h, + have_mntent=yes) + AC_SUBST(have_mntent) + ]) -- 2.4.3 From jtulak@redhat.com Mon Aug 17 10:02:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B14C87F47 for ; Mon, 17 Aug 2015 10:02:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92BEB304066 for ; Mon, 17 Aug 2015 08:02:35 -0700 (PDT) X-ASG-Debug-ID: 1439823754-04bdf051fa48510001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2N0C2AMCCbc4cHFA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 08:02:34 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 34AE54D; Mon, 17 Aug 2015 15:02:34 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HF2WCd020607; Mon, 17 Aug 2015 11:02:33 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH v4 03/11] xfsprogs: Add fls check into autoconf Date: Mon, 17 Aug 2015 17:02:31 +0200 X-ASG-Orig-Subj: [PATCH v4 03/11] xfsprogs: Add fls check into autoconf Message-Id: <1439823751-7335-1-git-send-email-jtulak@redhat.com> In-Reply-To: <117593154.2602203.1438690346097.JavaMail.zimbra@redhat.com> References: <117593154.2602203.1438690346097.JavaMail.zimbra@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439823754 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UPDATE: Autoconf change. Hopefully this is what Chris meant. Signed-off-by: Jan Tulak --- configure.ac | 1 + include/bitops.h | 2 ++ include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 12 ++++++++++++ 4 files changed, 19 insertions(+) diff --git a/configure.ac b/configure.ac index 0aba90c..abb7904 100644 --- a/configure.ac +++ b/configure.ac @@ -116,6 +116,7 @@ AC_HAVE_FIEMAP AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_MNTENT +AC_HAVE_FLS AC_HAVE_BLKID_TOPO AC_HAVE_READDIR diff --git a/include/bitops.h b/include/bitops.h index 930f64a..44599a7 100644 --- a/include/bitops.h +++ b/include/bitops.h @@ -5,6 +5,7 @@ * fls: find last bit set. */ +#ifndef HAVE_FLS static inline int fls(int x) { int r = 32; @@ -32,6 +33,7 @@ static inline int fls(int x) } return r; } +#endif /* HAVE_FLS */ static inline int fls64(__u64 x) { diff --git a/include/builddefs.in b/include/builddefs.in index e522243..8851956 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -104,6 +104,7 @@ HAVE_PREADV = @have_preadv@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ HAVE_MNTENT = @have_mntent@ +HAVE_FLS = @have_fls@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -131,6 +132,9 @@ PLDLIBS = -L/usr/local/lib -lintl PCFLAGS = -I/usr/local/include $(GCCFLAGS) DEPENDFLAGS = -D__FreeBSD__ endif +ifeq ($(HAVE_FLS),yes) +LCFLAGS+= -DHAVE_FLS +endif ifeq ($(HAVE_MNTENT),yes) PCFLAGS+= -DHAVE_MNTENT endif diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 75aa61e..4a96374 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -203,6 +203,18 @@ AC_DEFUN([AC_HAVE_READDIR], ]) # +# Check if we have a flc call (Mac OS X) +# +AC_DEFUN([AC_HAVE_FLS], + [ AC_CHECK_DECL([fls], + have_fls=yes, + [], + [#include ] + ) + AC_SUBST(have_fls) + ]) + +# # Check if there is mntent.h # AC_DEFUN([AC_HAVE_MNTENT], -- 2.4.3 From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 10:04:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6AE377F47 for ; Mon, 17 Aug 2015 10:04:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E9188F804B for ; Mon, 17 Aug 2015 08:04:05 -0700 (PDT) X-ASG-Debug-ID: 1439823842-04bdf051fb485f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id j6kiau1s9JO8yAze (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 08:04:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRLxC-00085N-0g; Mon, 17 Aug 2015 15:04:02 +0000 Date: Mon, 17 Aug 2015 08:04:02 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 09/11] xfsprogs: Add mntent.h check into autoconf Message-ID: <20150817150401.GA29056@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v4 09/11] xfsprogs: Add mntent.h check into autoconf References: <20150804112153.GG18906@infradead.org> <1439823687-7279-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439823687-7279-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439823842 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This looks mostly fine. I think you could just add the AC_CHECK_HEADERS directly to configure.ac, but otherwise it's exactly what I though. Can you please resend all your pending patches in a single series, and move the UPDATES: lines and other internal changelogs to the cover letter instead of the patch descriptions? Thanks for doing this work! From jtulak@redhat.com Mon Aug 17 10:15:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA15C7F47 for ; Mon, 17 Aug 2015 10:15:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48670AC004 for ; Mon, 17 Aug 2015 08:15:34 -0700 (PDT) X-ASG-Debug-ID: 1439824532-04cbb078e247ed0001-NocioJ Received: from mail-io0-f172.google.com (mail-io0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id Lb22EUZP9wvOexkB (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 08:15:32 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iods203 with SMTP id s203so154930532iod.0 for ; Mon, 17 Aug 2015 08:15:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=h14bBXdP53clcgL1smiT9UmiLPEpKaxZ58/JqyWyBOk=; b=fb+4pigEOrl+jUqud4u+fp5TaRjwcmIZtt244+wL6eOI0s8njpHoDmU+nUvX4jko9i 7IvPWGvSd7GEKeO06BVf84RIssYY5BRx2X1pVP7uEMbPVGTU0o40ODZ57HhfmdetXnLe DkDya5w3y3hin98to+XYquOnclvkjUXfKWMSNQLqN4Q+WyjlblH9QiCMFF+LyJAYsPLq OANO6xr3rbcWnQoNXRzDP35WXDVIqvO2V8mqHNn2qV4CtOwIIT6R2KRbVFFfozmTfoHv qAv5dnnjRJPggU7HJOG9JUw8a/GWOpPgEzFgVVtKNHyu8q1cjFySgDreHaYDTjvGUjg2 oZVw== X-Gm-Message-State: ALoCoQlw72FvXtVrF/ynsKNQ6BaNJcnB2U6D06AHkKUAg+juKgF9T4vilfKD/J+eX6bO/xhsgyYx X-Received: by 10.107.158.16 with SMTP id h16mr2150870ioe.52.1439824532014; Mon, 17 Aug 2015 08:15:32 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Mon, 17 Aug 2015 08:15:12 -0700 (PDT) In-Reply-To: <20150817150401.GA29056@infradead.org> References: <20150804112153.GG18906@infradead.org> <1439823687-7279-1-git-send-email-jtulak@redhat.com> <20150817150401.GA29056@infradead.org> From: Jan Tulak Date: Mon, 17 Aug 2015 17:15:12 +0200 Message-ID: Subject: Re: [PATCH v4 09/11] xfsprogs: Add mntent.h check into autoconf To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH v4 09/11] xfsprogs: Add mntent.h check into autoconf Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a11402b3ac522b5051d83456f X-Barracuda-Connect: mail-io0-f172.google.com[209.85.223.172] X-Barracuda-Start-Time: 1439824532 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11402b3ac522b5051d83456f Content-Type: text/plain; charset=UTF-8 On Mon, Aug 17, 2015 at 5:04 PM, Christoph Hellwig wrote: > This looks mostly fine. I think you could just add the > AC_CHECK_HEADERS directly to configure.ac, but otherwise it's exactly > what I though. > In configure.ac, there are no direct checks for headers, just calls of all the various AC_HAVE_*. I'm not sure it is a good idea to mix now. Unless you think that all the functions should be moved into configure.ac from the m4/ directory. > Can you please resend all your pending patches in a single series, > and move the UPDATES: lines and other internal changelogs to the > cover letter instead of the patch descriptions? > > Thanks for doing this work! > Sure, I'll send it again as a whole. And np. :-) -- Jan Tulak jtulak@redhat.com --001a11402b3ac522b5051d83456f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On M= on, Aug 17, 2015 at 5:04 PM, Christoph Hellwig <hch@infradead.org><= /span> wrote:
This looks mostly fine.=C2= =A0 I think you could just add the
AC_CHECK_HEADERS directly to configure.ac, but otherwise it's exactly
what I though.
=C2=A0
In configure.ac, there are no direct checks for headers, just= calls of all the various
AC_HAVE_*. I'm not sure it is a goo= d idea to mix now. Unless you think that all
the functions should= be moved into configure.ac from the m4= / directory.

=C2=A0
Can you please resend all your pending patches in a single series,
and move the UPDATES: lines and other internal changelogs to the
cover letter instead of the patch descriptions?

Thanks for doing this work!

Sure, I'll send it again as a wh= ole. And np. :-)

--
--001a11402b3ac522b5051d83456f-- From jtulak@redhat.com Mon Aug 17 11:23:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AB4357F47 for ; Mon, 17 Aug 2015 11:23:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E01930406B for ; Mon, 17 Aug 2015 09:23:36 -0700 (PDT) X-ASG-Debug-ID: 1439828614-04cbb078e149bd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id npQ5js5SOYRRVfuB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:35 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 61B3A8F24A; Mon, 17 Aug 2015 16:23:34 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmY008978; Mon, 17 Aug 2015 12:23:33 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 00/11] xfsprogs: Partial OS X support Date: Mon, 17 Aug 2015 18:23:15 +0200 X-ASG-Orig-Subj: [PATCH 00/11] xfsprogs: Partial OS X support Message-Id: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828615 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a third iteration of OS X support patches. Notes with information about changes in every patch since the last bulk submittation (or at least the last iteration of that patch) follows. BTW: for the patches which already got "Reviewed-by", I added the line to these patches. If this is not a good thing and I should let the reviewer to submit his reviewed-by email again, tell me. :-) undefined variable fix - better explanation in commit Add ifdef dirent checks where it was missing - added approximation of d_reclen - text width fix Change OS X-specific CFLAGS/LDFLAGS - Nothing, already reviewed Add includes required for OS X builds - updated for libdisk gone missing and dummy calls for OS X support - new patch (no review yet) Add mntent.h check into autoconf - new patch - autoconf change Add fls check into autoconf - new patch - autoconf change replace obsolete memalign with posix_memalign - new patch - remove strange code formatted prevent LIST_ macros conflicts - already reviewed - new patch Update doc for OS X - new patch (no review yet) Add a way to compile without blkid - new patch - changed default behaviour if BLKID is disabled such that mkfs -f is required Jan Tulak (11): xfsprogs: undefined variable fix xfsprogs: Add ifdef dirent checks where it was missing xfsprogs: Change OS X-specific CFLAGS/LDFLAGS xfsprogs: Add includes required for OS X builds xfsprogs: missing and dummy calls for OS X support xfsprogs: Add mntent.h check into autoconf xfsprogs: Add fls check into autoconf xfsprogs: replace obsolete memalign with posix_memalign xfsprogs: prevent LIST_ macros conflicts xfsprogs: Update doc for OS X xfsprogs: Add a way to compile without blkid configure.ac | 12 +++- copy/xfs_copy.c | 2 +- db/attrset.c | 2 +- doc/INSTALL | 11 +++- fsr/xfs_fsr.c | 17 ++++-- include/bitops.h | 2 + include/builddefs.in | 11 +++- include/darwin.h | 162 ++++++++++++++++++++++++++++++++++++++++++++------ include/freebsd.h | 1 - include/gnukfreebsd.h | 1 - include/linux.h | 1 - include/list.h | 14 +++++ io/pread.c | 4 +- io/readdir.c | 12 ++++ libhandle/Makefile | 4 ++ libxcmd/paths.c | 2 +- libxfs/rdwr.c | 12 ++-- m4/package_libcdev.m4 | 20 +++++++ mkfs/xfs_mkfs.c | 25 +++++++- repair/incore.c | 2 +- repair/incore_ino.c | 7 ++- repair/phase1.c | 2 +- repair/prefetch.c | 7 +-- repair/sb.c | 10 ++-- rtcp/xfs_rtcp.c | 7 ++- 25 files changed, 295 insertions(+), 55 deletions(-) -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 418B77F47 for ; Mon, 17 Aug 2015 11:23:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32FB530406B for ; Mon, 17 Aug 2015 09:23:50 -0700 (PDT) X-ASG-Debug-ID: 1439828629-04cbb078e249bf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lJItMZZWZd7iLj08 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:49 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 00177A2C30; Mon, 17 Aug 2015 16:23:48 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWma008978; Mon, 17 Aug 2015 12:23:48 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 02/11] xfsprogs: Add ifdef dirent checks where it was missing Date: Mon, 17 Aug 2015 18:23:17 +0200 X-ASG-Orig-Subj: [PATCH 02/11] xfsprogs: Add ifdef dirent checks where it was missing Message-Id: <1439828606-7886-3-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828629 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add check for _DIRENT_HAVED_RECLEN/_OFF to read_directory(). In dump_dirent() these checks already are used, but they were missing in read_directory. Signed-off-by: Jan Tulak --- io/readdir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/io/readdir.c b/io/readdir.c index 7b0edbc..151b72e 100644 --- a/io/readdir.c +++ b/io/readdir.c @@ -103,12 +103,24 @@ read_directory( if (!dirent) break; +#ifdef _DIRENT_HAVE_D_RECLEN *total += dirent->d_reclen; +#else + *total += dirent->d_namlen + sizeof(*dirent); +#endif count++; if (dump) { dump_dirent(offset, dirent); +#ifdef _DIRENT_HAVE_D_OFF offset = dirent->d_off; +#else + /* Some platforms don't have dirent->d_off, but because + * it is used only for dumping the value, it should be + * safe to only set it to zero in such case. + */ + offset = 0; +#endif } } -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 920AD29E03 for ; Mon, 17 Aug 2015 11:23:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 747378F8033 for ; Mon, 17 Aug 2015 09:23:51 -0700 (PDT) X-ASG-Debug-ID: 1439828630-04cbb078e449c00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OqAVLS4sVlC5q5Xk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:50 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 37FCB8F230; Mon, 17 Aug 2015 16:23:50 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmb008978; Mon, 17 Aug 2015 12:23:49 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 03/11] xfsprogs: Change OS X-specific CFLAGS/LDFLAGS Date: Mon, 17 Aug 2015 18:23:18 +0200 X-ASG-Orig-Subj: [PATCH 03/11] xfsprogs: Change OS X-specific CFLAGS/LDFLAGS Message-Id: <1439828606-7886-4-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828630 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 OS X uses clang as a default compiler. So remove incompatible options. Signed-off-by: Jan Tulak Reviewed-by: Christoph Hellwig --- include/builddefs.in | 2 +- libhandle/Makefile | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/builddefs.in b/include/builddefs.in index cdf2d41..c644a17 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -118,7 +118,7 @@ ifeq ($(PKG_PLATFORM),gnukfreebsd) PCFLAGS = -D_GNU_SOURCE $(GCCFLAGS) endif ifeq ($(PKG_PLATFORM),darwin) -PCFLAGS = -traditional-cpp $(GCCFLAGS) +PCFLAGS = $(GCCFLAGS) DEPENDFLAGS = -D__APPLE__ endif ifeq ($(PKG_PLATFORM),irix) diff --git a/libhandle/Makefile b/libhandle/Makefile index cc4ad1d..fe1a2af 100644 --- a/libhandle/Makefile +++ b/libhandle/Makefile @@ -10,7 +10,11 @@ LT_CURRENT = 1 LT_REVISION = 3 LT_AGE = 0 +ifeq ($(PKG_PLATFORM),darwin) +LTLDFLAGS += -Wl,libhandle.sym +else LTLDFLAGS += -Wl,--version-script,libhandle.sym +endif CFILES = handle.c jdm.c LSRCFILES = libhandle.sym -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F0E0929E03 for ; Mon, 17 Aug 2015 11:23:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2CEF8F8033 for ; Mon, 17 Aug 2015 09:23:48 -0700 (PDT) X-ASG-Debug-ID: 1439828627-04cbb078e349bf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PvexGJ7DlcLhcVyN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id C26008F26B; Mon, 17 Aug 2015 16:23:47 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmZ008978; Mon, 17 Aug 2015 12:23:46 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 01/11] xfsprogs: undefined variable fix Date: Mon, 17 Aug 2015 18:23:16 +0200 X-ASG-Orig-Subj: [PATCH 01/11] xfsprogs: undefined variable fix Message-Id: <1439828606-7886-2-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828628 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Typo fix, which wasn't caught earlier due to #ifdef branching. The 'rmnttomname' does not exists anywhere and looks like a hybrid between rmntfromname and rmntonname. And because the previous 'if' has 'fromname' on both arguments of realpath, I choosed the same approach when fixing it. Signed-off-by: Jan Tulak --- libxcmd/paths.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxcmd/paths.c b/libxcmd/paths.c index c56b06b..5c65737 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -364,7 +364,7 @@ fs_table_initialise_mounts( continue; if (!realpath(stats[i].f_mntfromname, rmntfromname)) continue; - if (!realpath(stats[i].f_mntonname, rmnttomname))) + if (!realpath(stats[i].f_mntonname, rmntonname)) continue; if (path && -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0AE4529E0A for ; Mon, 17 Aug 2015 11:23:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4397304051 for ; Mon, 17 Aug 2015 09:23:53 -0700 (PDT) X-ASG-Debug-ID: 1439828632-04bdf051fb4a630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id l03lHRWmy1mQl6KE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:52 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 98339461DC; Mon, 17 Aug 2015 16:23:52 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmd008978; Mon, 17 Aug 2015 12:23:51 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Date: Mon, 17 Aug 2015 18:23:20 +0200 X-ASG-Orig-Subj: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-Id: <1439828606-7886-6-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828632 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add and update various API, macros and types where is some change in OS X or xfsprogs. Most changes are in darwin.h. Add dummy implementations where native support is nonexistent and the tools are not expected to work anyway, so all tools can be at least compiled. Signed-off-by: Jan Tulak Reviewed-by: Christoph Hellwig --- fsr/xfs_fsr.c | 8 +++ include/darwin.h | 153 +++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 145 insertions(+), 16 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 7c1d776..b4ff136 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -43,6 +43,14 @@ #define _PATH_FSRLAST "/var/tmp/.fsrlast_xfs" #define _PATH_PROC_MOUNTS "/proc/mounts" +#ifdef USE_DUMMY_XATTR + /* OS X has fsetxattr with different number of arguments. + * Because it won't work anyway (no fstab/mtab and so on), + * hijack the call to a dummy function so it can at least + * compile. + */ +# define fsetxattr(a,b,c,d,e) dummy_fsetxattr(a,b,c,d,e) +#endif char *progname; diff --git a/include/darwin.h b/include/darwin.h index 8b5a661..775dfc8 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -76,45 +76,37 @@ static __inline__ void platform_getoptreset(void) static __inline__ int platform_uuid_compare(uuid_t *uu1, uuid_t *uu2) { - return uuid_compare(uu1, uu2, NULL); + return uuid_compare((const unsigned char *) uu1, (const unsigned char*) uu2); } static __inline__ void platform_uuid_unparse(uuid_t *uu, char *buffer) { - uint32_t status; - char *s; - uuid_to_string(uu, &s, &status); - if (status == uuid_s_ok) - strcpy(buffer, s); - else buffer[0] = '\0'; - free(s); + uuid_unparse(*uu, buffer); } static __inline__ int platform_uuid_parse(char *buffer, uuid_t *uu) { - uint32_t status; - uuid_from_string(buffer, uu, &status); - return (status == uuid_s_ok); + return uuid_parse(buffer, *uu); } static __inline__ int platform_uuid_is_null(uuid_t *uu) { - return uuid_is_nil(uu, NULL); + return uuid_is_null(*uu); } static __inline__ void platform_uuid_generate(uuid_t *uu) { - uuid_create(uu, NULL); + uuid_generate(*uu); } static __inline__ void platform_uuid_clear(uuid_t *uu) { - uuid_create_nil(uu, NULL); + uuid_clear(*uu); } static __inline__ void platform_uuid_copy(uuid_t *dst, uuid_t *src) { - memcpy(dst, src, sizeof(uuid_t)); + uuid_copy(*dst, *src); } typedef unsigned char __u8; @@ -159,11 +151,13 @@ typedef int64_t xfs_daddr_t; #define O_SYNC 0 #endif -#define ENOATTR 989 /* Attribute not found */ #define EFSCORRUPTED 990 /* Filesystem is corrupted */ #define EFSBADCRC 991 /* Bad CRC detected */ #define constpp char * const * +#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ +#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ + #define HAVE_FID 1 static __inline__ int @@ -172,4 +166,131 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) return 0; } + +/* + * Dummy POSIX timer replacement + */ +#define CLOCK_REALTIME 1 +typedef uint64_t timer_t; +typedef double timer_c; +typedef clock_id_t clockid_t; +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +static inline int timer_create (clockid_t __clock_id, + struct sigevent *__restrict __evp, + timer_t *__restrict __timerid) +{ + return 0; +} + +static inline int timer_settime (timer_t __timerid, int __flags, + const struct itimerspec *__restrict __value, + struct itimerspec *__restrict __ovalue) +{ + return 0; +} + +static inline int timer_delete (timer_t __timerid) +{ + return 0; +} + +static inline int timer_gettime (timer_t __timerid, struct itimerspec *__value) +{ + return 0; +} + +static inline int nftw64(const char *path, int (*fn)(const char *, const struct stat *ptr, int flag, struct FTW *), int depth, + int flags) +{ + return nftw(path, fn, depth, flags); +} + +#define MREMAP_FIXED 1 +#define MREMAP_MAYMOVE 2 +static inline void *mremap(void *old_address, size_t old_size, + size_t new_size, int flags, ... /* void *new_address */) +{ + return NULL; +} + +/* FSR */ + +#define _PATH_MOUNTED "/etc/mtab" +#define USE_DUMMY_XATTR + +typedef int __fsblkcnt_t; +typedef int __fsfilcnt_t; +typedef long long int __fsblkcnt64_t; +typedef long long int __fsfilcnt64_t; + +struct statvfs64 +{ + unsigned long int f_bsize; + unsigned long int f_frsize; + __fsblkcnt64_t f_blocks; + __fsblkcnt64_t f_bfree; + __fsblkcnt64_t f_bavail; + __fsfilcnt64_t f_files; + __fsfilcnt64_t f_ffree; + __fsfilcnt64_t f_favail; + unsigned long int f_fsid; + int __f_unused; + unsigned long int f_flag; + unsigned long int f_namemax; + int __f_spare[6]; +}; + +struct mntent +{ + char *mnt_fsname; /* Device or server for filesystem. */ + char *mnt_dir; /* Directory mounted on. */ + char *mnt_type; /* Type of filesystem: ufs, nfs, etc. */ + char *mnt_opts; /* Comma-separated options for fs. */ + int mnt_freq; /* Dump frequency (in days). */ + int mnt_passno; /* Pass number for `fsck'. */ +}; + +static inline FILE *setmntent(const char *filename, const char *type) +{ + return NULL; +} + +static inline int endmntent(FILE *fp) +{ + return 0; +} + +static inline struct mntent *getmntent(FILE *fp) +{ + return NULL; +} + +static inline int addmntent(FILE *fp, const struct mntent *mnt) +{ + return 0; +} + +static inline char *hasmntopt(const struct mntent *mnt, const char *opt) +{ + return NULL; +} + +static inline int statvfs64 (const char *__restrict __file, + struct statvfs64 *__restrict __buf) +{ + return 0; +} + +static inline int dummy_fsetxattr (int filedes, const char *name, + const void *value, size_t size, int flags) +{ + return 0; +} + + #endif /* __XFS_DARWIN_H__ */ -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA6FD7F47 for ; Mon, 17 Aug 2015 11:23:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D948304075 for ; Mon, 17 Aug 2015 09:23:55 -0700 (PDT) X-ASG-Debug-ID: 1439828633-04cb6c10cd294a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3dHa1LQqhiBSbs5I (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:54 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id B233A9177F; Mon, 17 Aug 2015 16:23:53 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWme008978; Mon, 17 Aug 2015 12:23:52 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 06/11] xfsprogs: Add mntent.h check into autoconf Date: Mon, 17 Aug 2015 18:23:21 +0200 X-ASG-Orig-Subj: [PATCH 06/11] xfsprogs: Add mntent.h check into autoconf Message-Id: <1439828606-7886-7-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828634 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- configure.ac | 1 + fsr/xfs_fsr.c | 6 +++--- include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 8 ++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 530650b..0aba90c 100644 --- a/configure.ac +++ b/configure.ac @@ -115,6 +115,7 @@ AC_HAVE_FALLOCATE AC_HAVE_FIEMAP AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE +AC_HAVE_MNTENT AC_HAVE_BLKID_TOPO AC_HAVE_READDIR diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index b4ff136..4912b73 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -25,16 +25,16 @@ #include #include -#include -#include #include #include #include #include -#include #include #include +#ifdef HAVE_MNTENT +# include +#endif #ifndef XFS_XFLAG_NODEFRAG #define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ diff --git a/include/builddefs.in b/include/builddefs.in index c644a17..e522243 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -103,6 +103,7 @@ HAVE_FIEMAP = @have_fiemap@ HAVE_PREADV = @have_preadv@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ +HAVE_MNTENT = @have_mntent@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -130,6 +131,9 @@ PLDLIBS = -L/usr/local/lib -lintl PCFLAGS = -I/usr/local/include $(GCCFLAGS) DEPENDFLAGS = -D__FreeBSD__ endif +ifeq ($(HAVE_MNTENT),yes) +PCFLAGS+= -DHAVE_MNTENT +endif GCFLAGS = $(OPTIMIZER) $(DEBUG) \ -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 919ae0a..75aa61e 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -202,3 +202,11 @@ AC_DEFUN([AC_HAVE_READDIR], AC_SUBST(have_readdir) ]) +# +# Check if there is mntent.h +# +AC_DEFUN([AC_HAVE_MNTENT], + [ AC_CHECK_HEADERS(mntent.h, + have_mntent=yes) + AC_SUBST(have_mntent) + ]) -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C90EF7F4E for ; Mon, 17 Aug 2015 11:23:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A92A28F8040 for ; Mon, 17 Aug 2015 09:23:55 -0700 (PDT) X-ASG-Debug-ID: 1439828631-04bdf051fa4a620001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Nog1WKu4npE3N2PT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:51 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 53F5C91596; Mon, 17 Aug 2015 16:23:51 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmc008978; Mon, 17 Aug 2015 12:23:50 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 04/11] xfsprogs: Add includes required for OS X builds Date: Mon, 17 Aug 2015 18:23:19 +0200 X-ASG-Orig-Subj: [PATCH 04/11] xfsprogs: Add includes required for OS X builds Message-Id: <1439828606-7886-5-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828631 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- include/darwin.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index abdf4e3..8b5a661 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -18,12 +18,20 @@ #ifndef __XFS_DARWIN_H__ #define __XFS_DARWIN_H__ +#include +#include +#include #include #include #include #include #include #include +#include +#include +#include +#include +#include #include #define __BYTE_ORDER BYTE_ORDER -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3A9707F47 for ; Mon, 17 Aug 2015 11:23:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CBB18AC00A for ; Mon, 17 Aug 2015 09:23:56 -0700 (PDT) X-ASG-Debug-ID: 1439828635-04bdf051f94a630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IOjyWAXG4cmfD5Hl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:56 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id D1A91461D4; Mon, 17 Aug 2015 16:23:54 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmf008978; Mon, 17 Aug 2015 12:23:54 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 07/11] xfsprogs: Add fls check into autoconf Date: Mon, 17 Aug 2015 18:23:22 +0200 X-ASG-Orig-Subj: [PATCH 07/11] xfsprogs: Add fls check into autoconf Message-Id: <1439828606-7886-8-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828636 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- configure.ac | 1 + include/bitops.h | 2 ++ include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 12 ++++++++++++ 4 files changed, 19 insertions(+) diff --git a/configure.ac b/configure.ac index 0aba90c..abb7904 100644 --- a/configure.ac +++ b/configure.ac @@ -116,6 +116,7 @@ AC_HAVE_FIEMAP AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_MNTENT +AC_HAVE_FLS AC_HAVE_BLKID_TOPO AC_HAVE_READDIR diff --git a/include/bitops.h b/include/bitops.h index 930f64a..44599a7 100644 --- a/include/bitops.h +++ b/include/bitops.h @@ -5,6 +5,7 @@ * fls: find last bit set. */ +#ifndef HAVE_FLS static inline int fls(int x) { int r = 32; @@ -32,6 +33,7 @@ static inline int fls(int x) } return r; } +#endif /* HAVE_FLS */ static inline int fls64(__u64 x) { diff --git a/include/builddefs.in b/include/builddefs.in index e522243..8851956 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -104,6 +104,7 @@ HAVE_PREADV = @have_preadv@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ HAVE_MNTENT = @have_mntent@ +HAVE_FLS = @have_fls@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -131,6 +132,9 @@ PLDLIBS = -L/usr/local/lib -lintl PCFLAGS = -I/usr/local/include $(GCCFLAGS) DEPENDFLAGS = -D__FreeBSD__ endif +ifeq ($(HAVE_FLS),yes) +LCFLAGS+= -DHAVE_FLS +endif ifeq ($(HAVE_MNTENT),yes) PCFLAGS+= -DHAVE_MNTENT endif diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 75aa61e..4a96374 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -203,6 +203,18 @@ AC_DEFUN([AC_HAVE_READDIR], ]) # +# Check if we have a flc call (Mac OS X) +# +AC_DEFUN([AC_HAVE_FLS], + [ AC_CHECK_DECL([fls], + have_fls=yes, + [], + [#include ] + ) + AC_SUBST(have_fls) + ]) + +# # Check if there is mntent.h # AC_DEFUN([AC_HAVE_MNTENT], -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFEDB7F47 for ; Mon, 17 Aug 2015 11:23:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2CC930406B for ; Mon, 17 Aug 2015 09:23:57 -0700 (PDT) X-ASG-Debug-ID: 1439828636-04cbb078e249c00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WNVXuDRmdncTIET1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:56 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 211E83FE68; Mon, 17 Aug 2015 16:23:56 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmg008978; Mon, 17 Aug 2015 12:23:55 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Date: Mon, 17 Aug 2015 18:23:23 +0200 X-ASG-Orig-Subj: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Message-Id: <1439828606-7886-9-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828636 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Memalign from was marked obsolete in favor of a posix variant from . So replace all calls and remove includes. This also enhances support on other posix platforms, which doesn't have . Because posix_memalign returns any error as a return code, not in errno, change relevant checks in code (and add a missing one). Signed-off-by: Jan Tulak --- copy/xfs_copy.c | 2 +- db/attrset.c | 2 +- fsr/xfs_fsr.c | 3 ++- include/darwin.h | 1 - include/freebsd.h | 1 - include/gnukfreebsd.h | 1 - include/linux.h | 1 - io/pread.c | 4 ++-- libxfs/rdwr.c | 12 ++++++++---- mkfs/xfs_mkfs.c | 3 ++- repair/incore.c | 2 +- repair/incore_ino.c | 7 ++++--- repair/phase1.c | 2 +- repair/prefetch.c | 7 +++---- repair/sb.c | 10 +++++----- rtcp/xfs_rtcp.c | 7 ++++++- 16 files changed, 36 insertions(+), 29 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index e13f468..8109ac5 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -333,7 +333,7 @@ wbuf * wbuf_init(wbuf *buf, int data_size, int data_align, int min_io_size, int id) { ASSERT(data_size % BBSIZE == 0); - while ((buf->data = memalign(data_align, data_size)) == NULL) { + while (posix_memalign((void**)&(buf->data), data_align, data_size)) { data_size >>= 1; if (data_size < min_io_size) return NULL; diff --git a/db/attrset.c b/db/attrset.c index ec9da5a..539765f 100644 --- a/db/attrset.c +++ b/db/attrset.c @@ -141,7 +141,7 @@ attr_set_f( name = argv[optind]; if (valuelen) { - value = (char *)memalign(getpagesize(), valuelen); + posix_memalign((void**)&value, getpagesize(), valuelen); if (!value) { dbprintf(_("cannot allocate buffer (%d)\n"), valuelen); goto out; diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 4912b73..ad52990 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1306,7 +1306,8 @@ packfile(char *fname, char *tname, int fd, dio.d_maxiosz, pagesize); } - if (!(fbuf = (char *)memalign(dio.d_mem, blksz_dio))) { + posix_memalign((void **)&fbuf, dio.d_mem, blksz_dio); + if (!fbuf) { fsrprintf(_("could not allocate buf: %s\n"), tname); goto out; } diff --git a/include/darwin.h b/include/darwin.h index 775dfc8..e3ec863 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef int64_t xfs_daddr_t; #define pwrite64 pwrite #define ftruncate64 ftruncate #define fdatasync fsync -#define memalign(a,sz) valloc(sz) #define O_LARGEFILE 0 #ifndef O_DIRECT diff --git a/include/freebsd.h b/include/freebsd.h index 902b940..7289159 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -40,7 +40,6 @@ #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync -#define memalign(a,sz) valloc(sz) #define constpp char * const * diff --git a/include/gnukfreebsd.h b/include/gnukfreebsd.h index 95c4c13..4605234 100644 --- a/include/gnukfreebsd.h +++ b/include/gnukfreebsd.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include diff --git a/include/linux.h b/include/linux.h index 8804c2d..7493b76 100644 --- a/include/linux.h +++ b/include/linux.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include diff --git a/io/pread.c b/io/pread.c index 1c77c41..74ba47e 100644 --- a/io/pread.c +++ b/io/pread.c @@ -77,7 +77,7 @@ alloc_iovec( buffersize = 0; for (i = 0; i < vectors; i++) { - iov[i].iov_base = memalign(pagesize, bsize); + posix_memalign((void**)&(iov[i].iov_base), pagesize, bsize); if (!iov[i].iov_base) { perror("memalign"); goto unwind; @@ -108,7 +108,7 @@ alloc_buffer( if (bsize > highwater) { if (buffer) free(buffer); - buffer = memalign(pagesize, bsize); + posix_memalign((void**)&buffer, pagesize, bsize); if (!buffer) { perror("memalign"); highwater = buffersize = 0; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 4f8212f..7884cf8 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -74,12 +74,14 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len) ssize_t zsize, bytes; char *z; int fd; + int ret; zsize = min(BDSTRAT_SIZE, BBTOB(len)); - if ((z = memalign(libxfs_device_alignment(), zsize)) == NULL) { + ret = posix_memalign((void **)&z, libxfs_device_alignment(), zsize); + if (!z) { fprintf(stderr, _("%s: %s can't memalign %d bytes: %s\n"), - progname, __FUNCTION__, (int)zsize, strerror(errno)); + progname, __FUNCTION__, (int)zsize, strerror(ret)); exit(1); } memset(z, 0, zsize); @@ -409,6 +411,7 @@ static void __initbuf(xfs_buf_t *bp, struct xfs_buftarg *btp, xfs_daddr_t bno, unsigned int bytes) { + int ret; bp->b_flags = 0; bp->b_bn = bno; bp->b_bcount = bytes; @@ -416,12 +419,13 @@ __initbuf(xfs_buf_t *bp, struct xfs_buftarg *btp, xfs_daddr_t bno, bp->b_target = btp; bp->b_error = 0; if (!bp->b_addr) - bp->b_addr = memalign(libxfs_device_alignment(), bytes); + ret = posix_memalign((void**)&(bp->b_addr), + libxfs_device_alignment(), bytes); if (!bp->b_addr) { fprintf(stderr, _("%s: %s can't memalign %u bytes: %s\n"), progname, __FUNCTION__, bytes, - strerror(errno)); + strerror(ret)); exit(1); } memset(bp->b_addr, 0, bytes); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 69d61c7..d349b4f 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -770,7 +770,8 @@ zero_old_xfs_structures( * read in existing filesystem superblock, use its geometry * settings and zero the existing secondary superblocks. */ - buf = memalign(libxfs_device_alignment(), new_sb->sb_sectsize); + posix_memalign((void**)&buf, libxfs_device_alignment(), + new_sb->sb_sectsize); if (!buf) { fprintf(stderr, _("error reading existing superblock -- failed to memalign buffer\n")); diff --git a/repair/incore.c b/repair/incore.c index cb57316..81d3b8c 100644 --- a/repair/incore.c +++ b/repair/incore.c @@ -224,7 +224,7 @@ init_rt_bmap( rt_bmap_size = roundup(mp->m_sb.sb_rextents / (NBBY / XR_BB), sizeof(__uint64_t)); - rt_bmap = memalign(sizeof(__uint64_t), rt_bmap_size); + posix_memalign((void**)&rt_bmap, sizeof(__uint64_t), rt_bmap_size); if (!rt_bmap) { do_error( _("couldn't allocate realtime block map, size = %" PRIu64 "\n"), diff --git a/repair/incore_ino.c b/repair/incore_ino.c index 32d7678..dd95996 100644 --- a/repair/incore_ino.c +++ b/repair/incore_ino.c @@ -626,8 +626,8 @@ set_inode_parent( irec->ino_un.plist = ptbl; ptbl->pmask = 1LL << offset; - ptbl->pentries = (xfs_ino_t*)memalign(sizeof(xfs_ino_t), - sizeof(xfs_ino_t)); + posix_memalign((void**)&(ptbl->pentries),sizeof(xfs_ino_t), + sizeof(xfs_ino_t)); if (!ptbl->pentries) do_error(_("couldn't memalign pentries table\n")); #ifdef DEBUG @@ -673,7 +673,8 @@ set_inode_parent( #endif ASSERT(cnt >= target); - tmp = (xfs_ino_t*)memalign(sizeof(xfs_ino_t), (cnt + 1) * sizeof(xfs_ino_t)); + posix_memalign((void**)&tmp, sizeof(xfs_ino_t), + (cnt + 1) * sizeof(xfs_ino_t)); if (!tmp) do_error(_("couldn't memalign pentries table\n")); diff --git a/repair/phase1.c b/repair/phase1.c index 126d0b3..7a1fc7d 100644 --- a/repair/phase1.c +++ b/repair/phase1.c @@ -35,7 +35,7 @@ alloc_ag_buf(int size) { char *bp; - bp = (char *)memalign(libxfs_device_alignment(), size); + posix_memalign((void**)&bp, libxfs_device_alignment(), size); if (!bp) do_error(_("could not allocate ag header buffer (%d bytes)\n"), size); diff --git a/repair/prefetch.c b/repair/prefetch.c index 8b261ae..c6c9450 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -631,10 +631,9 @@ pf_io_worker( void *param) { prefetch_args_t *args = param; - void *buf = memalign(libxfs_device_alignment(), - pf_max_bytes); - - if (buf == NULL) + void *buf; + posix_memalign((void**)&buf, libxfs_device_alignment(), pf_max_bytes); + if (!buf) return NULL; pthread_mutex_lock(&args->lock); diff --git a/repair/sb.c b/repair/sb.c index 4eef14a..cf1ea8b 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -102,7 +102,7 @@ find_secondary_sb(xfs_sb_t *rsb) do_warn(_("\nattempting to find secondary superblock...\n")); - sb = (xfs_sb_t *)memalign(libxfs_device_alignment(), BSIZE); + posix_memalign((void**)&sb, libxfs_device_alignment(), BSIZE); if (!sb) { do_error( _("error finding secondary superblock -- failed to memalign buffer\n")); @@ -438,8 +438,8 @@ write_primary_sb(xfs_sb_t *sbp, int size) if (no_modify) return; - buf = memalign(libxfs_device_alignment(), size); - if (buf == NULL) { + posix_memalign((void**)&buf, libxfs_device_alignment(), size); + if (!buf) { do_error(_("failed to memalign superblock buffer\n")); return; } @@ -472,8 +472,8 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) int error, rval; xfs_dsb_t *buf; - buf = memalign(libxfs_device_alignment(), size); - if (buf == NULL) { + posix_memalign((void**)&buf, libxfs_device_alignment(), size); + if (!buf) { do_error( _("error reading superblock %u -- failed to memalign buffer\n"), agno); diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index f604b46..e2e3ece 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -327,7 +327,12 @@ rtcp( char *source, char *target, int fextsize) } iosz = dioattr.d_miniosz; - fbuf = memalign( dioattr.d_mem, iosz); + posix_memalign((void**)&fbuf, dioattr.d_mem, iosz); + if (!fbuf) { + perror( + _("error finding secondary superblock -- failed to memalign buffer\n")); + exit(1); + } memset(fbuf, 0, iosz); /* -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4972129E17 for ; Mon, 17 Aug 2015 11:23:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C4C930406B for ; Mon, 17 Aug 2015 09:23:58 -0700 (PDT) X-ASG-Debug-ID: 1439828637-04bdf051f94a640001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lMwNjwcmHe2jjUdz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:57 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 2B8DF91E87; Mon, 17 Aug 2015 16:23:57 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmh008978; Mon, 17 Aug 2015 12:23:56 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 09/11] xfsprogs: prevent LIST_ macros conflicts Date: Mon, 17 Aug 2015 18:23:24 +0200 X-ASG-Orig-Subj: [PATCH 09/11] xfsprogs: prevent LIST_ macros conflicts Message-Id: <1439828606-7886-10-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828637 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 BSD 4.4 added some LIST_ macros into system header files, which causes "macro redefined" warnings. To ensure we use our own macros, undefine the system ones at first. The conflicting macros are LIST_HEAD and LIST_HEAD_INIT Signed-off-by: Jan Tulak Reviewed-by: Christoph Hellwig --- include/list.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/list.h b/include/list.h index 3f087a4..f92faed 100644 --- a/include/list.h +++ b/include/list.h @@ -19,6 +19,20 @@ #define __LIST_H__ /* + * This undef is here because BSD 4.4 added some LIST_ macros into system + * header file sys/queue.h. This header is included in many other system + * headers and thus causes "macro redefined" warnings. + * + * As OS X is kind of a derivate of BSD, this affects OS X too. + * + * To use our own LIST_ macros (copied from kernel code), we have to + * at first undefine the conflicting system macros. + * + */ +#undef LIST_HEAD +#undef LIST_HEAD_INIT + +/* * Simple, generic doubly-linked list implementation. */ -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:23:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8D6329E1D for ; Mon, 17 Aug 2015 11:23:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BC828F8033 for ; Mon, 17 Aug 2015 09:23:59 -0700 (PDT) X-ASG-Debug-ID: 1439828638-04bdf051fc4a650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iYACBi6sQyarnNhG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 390628F245; Mon, 17 Aug 2015 16:23:58 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmi008978; Mon, 17 Aug 2015 12:23:57 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 10/11] xfsprogs: Update doc for OS X Date: Mon, 17 Aug 2015 18:23:25 +0200 X-ASG-Orig-Subj: [PATCH 10/11] xfsprogs: Update doc for OS X Message-Id: <1439828606-7886-11-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828638 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Update build info and limitations. Signed-off-by: Jan Tulak --- doc/INSTALL | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index ba3472b..b0443a3 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -52,12 +52,16 @@ Mac OS X Instructions ===================== 0. Note: since there is no XFS implementation on Mac OS X, you are - severely limited in what you can do. mkfs.xfs(8), xfs_db(8) and + severely limited in what you can do. mkfs.xfs(8), xfs_db(8) and xfs_repair(8) are the only functional tools on this platform, as they do not interact with the XFS kernel code at all. Still, it can be useful to have access to these utilities from Mac OS X in a dual boot configuration, for example. + However, keep on mind that mkfs.xfs on Mac OS X has disabled + device access, although you can create a filesystem in a file. + Also note that existing filesystem detection is disabled. + 1. Configure, build and install the package The xfsprogs package uses autoconf/configure and expects a GNU build @@ -65,7 +69,8 @@ Mac OS X Instructions and glibtool). You will also need to have built and installed the UUID library which - is provided by the e2fsprogs source package. + is provided by the e2fsprogs source package. (Or use Homebrew, Macports + or any other 3rd party package manager.) Building libuuid: @@ -84,7 +89,7 @@ Mac OS X Instructions TAR=/usr/bin/gnutar LIBTOOL=/usr/bin/glibtool INSTALL_GROUP=wheel - LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no" + LOCAL_CONFIGURE_OPTIONS="--enable-gettext=no --enable-blkid=no" $ make $ su root -- 2.4.5 From jtulak@redhat.com Mon Aug 17 11:24:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 87A0129E07 for ; Mon, 17 Aug 2015 11:24:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3112EAC008 for ; Mon, 17 Aug 2015 09:24:00 -0700 (PDT) X-ASG-Debug-ID: 1439828639-04bdf051fb4a650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZdoFbXkie4gdoNuT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:23:59 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 4DE2D83F61; Mon, 17 Aug 2015 16:23:59 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGNWmj008978; Mon, 17 Aug 2015 12:23:58 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH 11/11] xfsprogs: Add a way to compile without blkid Date: Mon, 17 Aug 2015 18:23:26 +0200 X-ASG-Orig-Subj: [PATCH 11/11] xfsprogs: Add a way to compile without blkid Message-Id: <1439828606-7886-12-git-send-email-jtulak@redhat.com> In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439828639 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UPDATE: default to "signature found", so without blkid is -f mandatory. Because not all platforms have up-to-date blkid with required functions, allow at least partial functionality by adding --enable-blkid=yes/no optional configure argument. When blkid is disabled, signature detection and device geometry detection doesn't work. Signed-off-by: Jan Tulak --- configure.ac | 10 +++++++++- include/builddefs.in | 1 + mkfs/xfs_mkfs.c | 22 +++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index abb7904..eeba20d 100644 --- a/configure.ac +++ b/configure.ac @@ -26,6 +26,11 @@ AC_ARG_ENABLE(gettext, enable_gettext=yes) AC_SUBST(enable_gettext) +AC_ARG_ENABLE(blkid, +[ --enable-blkid=[yes/no] Enable use of block device id library [default=yes]],, + enable_blkid=yes) +AC_SUBST(enable_blkid) + AC_ARG_ENABLE(readline, [ --enable-readline=[yes/no] Enable readline command editing [default=no]], test $enable_readline = yes && libreadline="-lreadline", @@ -117,9 +122,12 @@ AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_MNTENT AC_HAVE_FLS -AC_HAVE_BLKID_TOPO AC_HAVE_READDIR +if test "$enable_blkid" = yes; then +AC_HAVE_BLKID_TOPO +fi + AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([char *]) AC_TYPE_UMODE_T diff --git a/include/builddefs.in b/include/builddefs.in index 8851956..f3f8089 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -89,6 +89,7 @@ ENABLE_SHARED = @enable_shared@ ENABLE_GETTEXT = @enable_gettext@ ENABLE_EDITLINE = @enable_editline@ ENABLE_READLINE = @enable_readline@ +ENABLE_BLKID = @enable_blkid@ HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d349b4f..56d2410 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -18,7 +18,9 @@ #include "libxfs.h" #include -#include +#ifdef ENABLE_BLKID +# include +#endif /* ENABLE_BLKID */ #include "xfs_mkfs.h" /* @@ -298,6 +300,7 @@ calc_stripe_factors( * 0 for nothing found * -1 for internal error */ +#ifdef ENABLE_BLKID static int check_overwrite( char *device) @@ -451,6 +454,19 @@ out_free_probe: _("warning: unable to probe device topology for device %s\n"), device); } +#else /* ifdef ENABLE_BLKID */ +/* + * Without blkid, we can't do a good check for signatures. + * So instead of some messy attempts, just disable any checks + * and always return 'nothing found'. + */ +static int +check_overwrite( + char *device) +{ + return 1; +} +#endif /* ENABLE_BLKID */ static void get_topology( libxfs_init_t *xi, @@ -483,16 +499,20 @@ static void get_topology( } else ft->psectorsize = ft->lsectorsize = BBSIZE; } else { +#ifdef ENABLE_BLKID blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, &ft->lsectorsize, &ft->psectorsize, force_overwrite); +#endif /* ENABLE_BLKID */ } if (xi->rtname && !xi->risfile) { int sunit, lsectorsize, psectorsize; +#ifdef ENABLE_BLKID blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth, &lsectorsize, &psectorsize, force_overwrite); +#endif /* ENABLE_BLKID */ } } -- 2.4.5 From noreply@release.debian.org Mon Aug 17 11:39:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D01457F51 for ; Mon, 17 Aug 2015 11:39:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B09988F8033 for ; Mon, 17 Aug 2015 09:39:23 -0700 (PDT) X-ASG-Debug-ID: 1439829561-04cbb078e34a260001-NocioJ Received: from picconi.debian.org (picconi.debian.org [5.153.231.3]) by cuda.sgi.com with ESMTP id NCLs1LRKasfMiy4d (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 09:39:22 -0700 (PDT) X-Barracuda-Envelope-From: noreply@release.debian.org X-Barracuda-Apparent-Source-IP: 5.153.231.3 Received: from mailly.debian.org ([2001:41b8:202:deb:6564:a62:52c3:4b72]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=mailly.debian.org,EMAIL=hostmaster@mailly.debian.org (verified) by picconi.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84) (envelope-from ) id 1ZRNRQ-0002m0-1T for xfsprogs@packages.debian.org; Mon, 17 Aug 2015 16:39:20 +0000 Received: from franck.debian.org ([138.16.160.12]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=franck.debian.org,EMAIL=hostmaster@franck.debian.org (verified) by mailly.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84) (envelope-from ) id 1ZRNRP-0001zV-DO; Mon, 17 Aug 2015 16:39:19 +0000 Received: from release by franck.debian.org with local (Exim 4.84) (envelope-from ) id 1ZRNRO-0006TS-5M; Mon, 17 Aug 2015 16:39:18 +0000 From: Debian testing watch Precedence: bulk X-Trille: 0.120315.1711 Subject: xfsprogs 3.2.4-1 MIGRATED to testing X-Testing-Watch-Package: xfsprogs X-ASG-Orig-Subj: xfsprogs 3.2.4-1 MIGRATED to testing X-Testing-Watch-Version: 3.2.4-1 To: xfsprogs@packages.debian.org Message-Id: Date: Mon, 17 Aug 2015 16:39:18 +0000 Delivered-To: xfsprogs@packages.debian.org X-Barracuda-Connect: picconi.debian.org[5.153.231.3] X-Barracuda-Start-Time: 1439829562 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header FYI: The status of the xfsprogs source package in Debian's testing distribution has changed. Previous version: 3.2.1 Current version: 3.2.4-1 -- This email is automatically generated once a day. As the installation of new packages into testing happens multiple times a day you will receive later changes on the next day. See https://release.debian.org/testing-watch/ for more information. From bfoster@redhat.com Mon Aug 17 11:47:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A3F47F47 for ; Mon, 17 Aug 2015 11:47:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A5E68F8040 for ; Mon, 17 Aug 2015 09:47:55 -0700 (PDT) X-ASG-Debug-ID: 1439830073-04cbb078e34a5a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id l0zkMWplSZAYT6Kk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 09:47:54 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id A602D461EB for ; Mon, 17 Aug 2015 16:47:53 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HGlr0F018657 for ; Mon, 17 Aug 2015 12:47:53 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1D9E712204F; Mon, 17 Aug 2015 12:47:52 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 14/13] xfs: swap leaf buffer into path struct atomically during path shift Date: Mon, 17 Aug 2015 12:47:52 -0400 X-ASG-Orig-Subj: [PATCH 14/13] xfs: swap leaf buffer into path struct atomically during path shift Message-Id: <1439830072-61117-1-git-send-email-bfoster@redhat.com> In-Reply-To: <1439233309-19959-1-git-send-email-bfoster@redhat.com> References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439830074 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The node directory lookup code uses a state structure that tracks the path of buffers used to search for the hash of a filename through the leaf blocks. When the lookup encounters a block that ends with the requested hash, but the entry has not yet been found, it must shift over to the next block and continue looking for the entry (i.e., duplicate hashes could continue over into the next block). This shift mechanism involves walking back up and down the state structure, replacing buffers at the appropriate btree levels as necessary. When a buffer is replaced, the old buffer is released and the new buffer read into the active slot in the path structure. Because the buffer is read directly into the path slot, a buffer read failure can result in setting a NULL buffer pointer in an active slot. This throws off the state cleanup code in xfs_dir2_node_lookup(), which expects to release a buffer from each active slot. Instead, a BUG occurs due to a NULL pointer dereference: BUG: unable to handle kernel NULL pointer dereference at 00000000000001e8 IP: [] xfs_trans_brelse+0x2a3/0x3c0 [xfs] ... RIP: 0010:[] [] xfs_trans_brelse+0x2a3/0x3c0 [xfs] ... Call Trace: [] xfs_dir2_node_lookup+0xa6/0x2c0 [xfs] [] xfs_dir_lookup+0x1ac/0x1c0 [xfs] [] xfs_lookup+0x91/0x290 [xfs] [] xfs_vn_lookup+0x73/0xb0 [xfs] [] lookup_real+0x1d/0x50 [] path_openat+0x91e/0x1490 [] do_filp_open+0x89/0x100 ... This has been reproduced via a parallel fsstress and filesystem shutdown workload in a loop. The shutdown triggers the read error in the aforementioned codepath and causes the BUG in xfs_dir2_node_lookup(). Update xfs_da3_path_shift() to update the active path slot atomically with respect to the caller when a buffer is replaced. This ensures that the caller always sees the old or new buffer in the slot and prevents the NULL pointer dereference. Signed-off-by: Brian Foster --- This is just another shutdown/error handling issue I've run into with the same testing associated with all of the other fixes. I'm tacking it on to the end of this series... Brian fs/xfs/libxfs/xfs_da_btree.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index 3264d81..04a3765 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -1822,6 +1822,7 @@ xfs_da3_path_shift( struct xfs_da_args *args; struct xfs_da_node_entry *btree; struct xfs_da3_icnode_hdr nodehdr; + struct xfs_buf *bp; xfs_dablk_t blkno = 0; int level; int error; @@ -1865,21 +1866,27 @@ xfs_da3_path_shift( * same depth we were at originally. */ for (blk++, level++; level < path->active; blk++, level++) { + struct xfs_buf **bpp = &blk->bp; + /* - * Release the old block. - * (if it's dirty, trans won't actually let go) + * Read the next child block into a local buffer. */ - if (release) - xfs_trans_brelse(args->trans, blk->bp); + error = xfs_da3_node_read(args->trans, dp, blkno, -1, &bp, + args->whichfork); + if (error) + return error; /* - * Read the next child block. + * Release the old block (if it's dirty, the trans doesn't + * actually let go) and swap the local buffer into the path + * structure. This ensures failure of the above read doesn't set + * a NULL buffer in an active slot in the path. */ + if (release) + xfs_trans_brelse(args->trans, blk->bp); blk->blkno = blkno; - error = xfs_da3_node_read(args->trans, dp, blkno, -1, - &blk->bp, args->whichfork); - if (error) - return error; + *bpp = bp; + info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || -- 2.1.0 From sandeen@sandeen.net Mon Aug 17 13:31:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CA22929DF5 for ; Mon, 17 Aug 2015 13:31:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C71168F8054 for ; Mon, 17 Aug 2015 11:31:26 -0700 (PDT) X-ASG-Debug-ID: 1439836284-04cb6c10cd2c5f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id xTXYgIDqvUeO94BK for ; Mon, 17 Aug 2015 11:31:24 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1418E661D56B; Mon, 17 Aug 2015 13:31:24 -0500 (CDT) Message-ID: <55D2287B.9060900@sandeen.net> Date: Mon, 17 Aug 2015 13:31:23 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 01/10] libxfs: readahead of dir3 data blocks should use the read verifier References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014344.1839.12045.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 01/10] libxfs: readahead of dir3 data blocks should use the read verifier In-Reply-To: <20150815014344.1839.12045.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439836284 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21681 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:43 PM, Darrick J. Wong wrote: > In the dir3 data block readahead function, use the regular read > verifier to check the block's CRC and spot-check the block contents > instead of calling the spot-checking routine directly. This prevents > corrupted directory data blocks from being read into the kernel, which > can lead to garbage ls output and directory loops (if say one of the > entries contains invalid characters). > > Signed-off-by: Darrick J. Wong > --- > libxfs/xfs_dir2_data.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > > diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c > index c475ba8..466e096 100644 > --- a/libxfs/xfs_dir2_data.c > +++ b/libxfs/xfs_dir2_data.c > @@ -250,7 +250,8 @@ xfs_dir3_data_reada_verify( > return; > case cpu_to_be32(XFS_DIR2_DATA_MAGIC): > case cpu_to_be32(XFS_DIR3_DATA_MAGIC): > - xfs_dir3_data_verify(bp); > + bp->b_ops = &xfs_dir3_block_buf_ops; > + bp->b_ops->verify_read(bp); Shouldn't that be xfs_dir3_data_buf_ops ? -Eric From sandeen@sandeen.net Mon Aug 17 13:52:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E628E29DF5 for ; Mon, 17 Aug 2015 13:52:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D2E2D8F804C for ; Mon, 17 Aug 2015 11:52:27 -0700 (PDT) X-ASG-Debug-ID: 1439837542-04bdf051f94e730001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id lHdHj0PWcPYaof1G for ; Mon, 17 Aug 2015 11:52:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D615D661D56B; Mon, 17 Aug 2015 13:52:20 -0500 (CDT) Message-ID: <55D22D62.9060806@sandeen.net> Date: Mon, 17 Aug 2015 13:52:18 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com, darrick.wong@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 02/10] xfs_db: don't crash on a corrupt inode References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014351.1839.81382.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 02/10] xfs_db: don't crash on a corrupt inode In-Reply-To: <20150815014351.1839.81382.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439837542 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:43 PM, Darrick J. Wong wrote: > If the user selects a corrupt inode via the 'inode XXX' command, the > read verifier will fail and the io cursor at the top of the ring will > not have any data attached. When this is the case, we cannot > dereference the NULL pointer or xfs_db will crash. Therefore, check > the buffer pointer before using it. > > It's arguable that we ought to retry the read without the verifiers > if the inode is corrupt or fails CRC, since this /is/ a debugging > tool, and maybe you wanted the contents anyway. I agree. It seems like we should do that, though it probably needs to be done across the board for all metadata types if it's going to be done. Maybe something to add to the TODO? > Signed-off-by: Darrick J. Wong > --- > db/inode.c | 2 ++ > 1 file changed, 2 insertions(+) > > > diff --git a/db/inode.c b/db/inode.c > index e86dabd..64b263b 100644 > --- a/db/inode.c > +++ b/db/inode.c > @@ -682,6 +682,8 @@ set_cur_inode( > set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, cluster_agbno), > numblks, DB_RING_IGN, NULL); > off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); off_cur checks for iocur_top == NULL, and warns if it is, so that's good. The user should have a clue about what's gone wrong, at least. But, callers of set_cur_inode() are still going to crash often as not: ablock_f: set_cur_inode(iocur_top->ino); haveattr = XFS_DFORK_Q((xfs_dinode_t *)iocur_top->data); bmap: set_cur_inode(iocur_top->ino); nex = *nexp; *nexp = 0; ASSERT(nex > 0); dip = iocur_top->data; bmap_f: set_cur_inode(iocur_top->ino); dip = iocur_top->data; and a few more :( Perhaps set_cur_inode() should return failure, so the caller knows to bail, pop_cur if it needs to, etc? -Eric > + if (!iocur_top->data) > + return; > dip = iocur_top->data; > iocur_top->ino_buf = 1; > iocur_top->ino = ino; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Mon Aug 17 14:20:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6955F29DF5 for ; Mon, 17 Aug 2015 14:20:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 657888F8037 for ; Mon, 17 Aug 2015 12:20:34 -0700 (PDT) X-ASG-Debug-ID: 1439839233-04cbb078e34e810001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EGGXk1w5va7E8FdB for ; Mon, 17 Aug 2015 12:20:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id EDF97661D56C; Mon, 17 Aug 2015 14:20:32 -0500 (CDT) Message-ID: <55D23400.7020106@sandeen.net> Date: Mon, 17 Aug 2015 14:20:32 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com, darrick.wong@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 03/10] xfs_repair: ignore "repaired" flag after we decide to clear xattr block References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014357.1839.68720.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 03/10] xfs_repair: ignore "repaired" flag after we decide to clear xattr block In-Reply-To: <20150815014357.1839.68720.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439839233 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:43 PM, Darrick J. Wong wrote: > If in the course of examining extended attribute block contents we > first decide to repair an entry (*repair = 1) but secondly decide to > clear the whole block, set *repair = 0 because the clearing action > only happens if *repair == 0. Put another way, if we're nuking a > block, don't pretend like we've fixed it too. Hm, or what happens otherwise? TBH this is making my brain hurt, chasing it all the way back up the callchain. It's *repair not *repaired; it's not saying we fixed it, but that we should fix it, right? It'll take me a while to work out what all the callers do with the "clearit" return from process_attr_leaf_block and with *repair. Did you have a specific example of something going wrong? thanks, -Eric > Signed-off-by: Darrick J. Wong > --- > repair/attr_repair.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > > diff --git a/repair/attr_repair.c b/repair/attr_repair.c > index 62f80e7..2bd9334 100644 > --- a/repair/attr_repair.c > +++ b/repair/attr_repair.c > @@ -1311,6 +1311,13 @@ process_leaf_attr_block( > * we can add it then. > */ > } > + /* > + * If we're just going to zap the block, don't pretend like we > + * repaired it, because repairing the block stops the clear > + * operation. > + */ > + if (clearit) > + *repair = 0; > if (*repair) > xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, leaf, &leafhdr); > > @@ -1524,6 +1531,7 @@ process_longform_attr( > xfs_dahash_t next_hashval; > int repairlinks = 0; > struct xfs_attr3_icleaf_hdr leafhdr; > + int error; > > *repair = 0; > > @@ -1604,12 +1612,16 @@ process_longform_attr( > libxfs_writebuf(bp, 0); > } else > libxfs_putbuf(bp); > - return (process_node_attr(mp, ino, dip, blkmap)); /* + repair */ > + error = process_node_attr(mp, ino, dip, blkmap); /* + repair */ > + if (error) > + *repair = 0; > + return error; > default: > do_warn( > _("bad attribute leaf magic # %#x for dir ino %" PRIu64 "\n"), > be16_to_cpu(leaf->hdr.info.magic), ino); > libxfs_putbuf(bp); > + *repair = 0; > return(1); > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:22:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 178B829DF5 for ; Mon, 17 Aug 2015 14:22:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8A6F30405F for ; Mon, 17 Aug 2015 12:22:10 -0700 (PDT) X-ASG-Debug-ID: 1439839328-04bdf051f94f230001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 9BdJXZtoTRbFrtKI (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:22:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRPyy-0006td-BC; Mon, 17 Aug 2015 19:22:08 +0000 Date: Mon, 17 Aug 2015 12:22:08 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: flush entire file on dio read/write to cached file Message-ID: <20150817192208.GA26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: flush entire file on dio read/write to cached file References: <1439569526-40423-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439569526-40423-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839328 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hi Brian, this looks fine to me, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:22:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB32429DF5 for ; Mon, 17 Aug 2015 14:22:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 57478AC007 for ; Mon, 17 Aug 2015 12:22:30 -0700 (PDT) X-ASG-Debug-ID: 1439839349-04cbb078e44e8e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DSqQaKc4h8RXykvr (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:22:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRPzI-0006vN-Sy; Mon, 17 Aug 2015 19:22:28 +0000 Date: Mon, 17 Aug 2015 12:22:28 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 01/11] xfsprogs: undefined variable fix Message-ID: <20150817192228.GB26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfsprogs: undefined variable fix References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-2-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-2-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839349 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 17, 2015 at 06:23:16PM +0200, Jan Tulak wrote: > Typo fix, which wasn't caught earlier due to #ifdef branching. The > 'rmnttomname' does not exists anywhere and looks like a hybrid between > rmntfromname and rmntonname. And because the previous 'if' has > 'fromname' on both arguments of realpath, I choosed the same approach > when fixing it. > > Signed-off-by: Jan Tulak Looks good, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:23:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD5D429DF5 for ; Mon, 17 Aug 2015 14:23:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A94D930405F for ; Mon, 17 Aug 2015 12:23:01 -0700 (PDT) X-ASG-Debug-ID: 1439839380-04bdf051f94f290001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id zf5AiDr8p6qSC4n9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:23:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRPzo-0006yF-AN; Mon, 17 Aug 2015 19:23:00 +0000 Date: Mon, 17 Aug 2015 12:23:00 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 02/11] xfsprogs: Add ifdef dirent checks where it was missing Message-ID: <20150817192300.GC26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/11] xfsprogs: Add ifdef dirent checks where it was missing References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-3-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-3-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839380 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 17, 2015 at 06:23:17PM +0200, Jan Tulak wrote: > Add check for _DIRENT_HAVED_RECLEN/_OFF to read_directory(). > In dump_dirent() these checks already are used, but they were > missing in read_directory. > > Signed-off-by: Jan Tulak Looks fine, Reviewed-by: Christoph Hellwig (and didn't I review this one previously?) From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:23:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 49FD729DF5 for ; Mon, 17 Aug 2015 14:23:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3456530405F for ; Mon, 17 Aug 2015 12:23:21 -0700 (PDT) X-ASG-Debug-ID: 1439839400-04bdf051fb4f2d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id mG1WmZr9kVEyLqzG (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:23:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQ08-00071j-9x; Mon, 17 Aug 2015 19:23:20 +0000 Date: Mon, 17 Aug 2015 12:23:20 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 04/11] xfsprogs: Add includes required for OS X builds Message-ID: <20150817192320.GD26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/11] xfsprogs: Add includes required for OS X builds References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-5-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-5-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839400 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 17, 2015 at 06:23:19PM +0200, Jan Tulak wrote: > Signed-off-by: Jan Tulak Looks fine, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:32:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3BEBA7F37 for ; Mon, 17 Aug 2015 14:32:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3216730405F for ; Mon, 17 Aug 2015 12:32:25 -0700 (PDT) X-ASG-Debug-ID: 1439839943-04cbb078e44ec90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HpA5xCvxfaWyP25s (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:32:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQ8t-00027i-1u; Mon, 17 Aug 2015 19:32:23 +0000 Date: Mon, 17 Aug 2015 12:32:23 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150817193223.GE26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-6-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839943 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 17, 2015 at 06:23:20PM +0200, Jan Tulak wrote: > Add and update various API, macros and types where is some change > in OS X or xfsprogs. Most changes are in darwin.h. > > Add dummy implementations where native support is nonexistent > and the tools are not expected to work anyway, so all tools can be > at least compiled. > > Signed-off-by: Jan Tulak > Reviewed-by: Christoph Hellwig > --- > fsr/xfs_fsr.c | 8 +++ > include/darwin.h | 153 +++++++++++++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 145 insertions(+), 16 deletions(-) > > diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c > index 7c1d776..b4ff136 100644 > --- a/fsr/xfs_fsr.c > +++ b/fsr/xfs_fsr.c > @@ -43,6 +43,14 @@ > #define _PATH_FSRLAST "/var/tmp/.fsrlast_xfs" > #define _PATH_PROC_MOUNTS "/proc/mounts" > > +#ifdef USE_DUMMY_XATTR > + /* OS X has fsetxattr with different number of arguments. > + * Because it won't work anyway (no fstab/mtab and so on), > + * hijack the call to a dummy function so it can at least > + * compile. > + */ > +# define fsetxattr(a,b,c,d,e) dummy_fsetxattr(a,b,c,d,e) > +#endif I don't think this is the right way to do it. I'd rather: a) check for fsetxattr using autoconf, and b) stub out the whole code calling it. c) make this a patch on it's own > > char *progname; > > diff --git a/include/darwin.h b/include/darwin.h > index 8b5a661..775dfc8 100644 > --- a/include/darwin.h > +++ b/include/darwin.h > @@ -76,45 +76,37 @@ static __inline__ void platform_getoptreset(void) > > static __inline__ int platform_uuid_compare(uuid_t *uu1, uuid_t *uu2) > { > - return uuid_compare(uu1, uu2, NULL); > + return uuid_compare((const unsigned char *) uu1, (const unsigned char*) uu2); Do you have any idea why MacOS defines a uuid_t, but wants unsigned char arguments to uuid_compare? Or given that the others work with pointer dereferences why doesn't: return uuid_compare(*uu1, *uu2); work? Also please make the uuid changes a patch on it's own. > -#define ENOATTR 989 /* Attribute not found */ > #define EFSCORRUPTED 990 /* Filesystem is corrupted */ > #define EFSBADCRC 991 /* Bad CRC detected */ > #define constpp char * const * > +#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ > +#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ Eww, looks like we depend on these Linux values in the on disk defintion. I think we need to add new XFS_XATTR_SIZE_MAX and XFS_XATTR_LIST_MAX defintions to xfs_format.h and use them where we currently use these. > +/* > + * Dummy POSIX timer replacement > + */ > +#define CLOCK_REALTIME 1 > +typedef uint64_t timer_t; > +typedef double timer_c; > +typedef clock_id_t clockid_t; > +struct itimerspec > + { > + struct timespec it_interval; > + struct timespec it_value; > + }; > + > +static inline int timer_create (clockid_t __clock_id, > + struct sigevent *__restrict __evp, > + timer_t *__restrict __timerid) > +{ > + return 0; > +} > + > +static inline int timer_settime (timer_t __timerid, int __flags, > + const struct itimerspec *__restrict __value, > + struct itimerspec *__restrict __ovalue) > +{ > + return 0; > +} > + > +static inline int timer_delete (timer_t __timerid) > +{ > + return 0; > +} > + > +static inline int timer_gettime (timer_t __timerid, struct itimerspec *__value) > +{ > + return 0; > +} I don't think these stubs will work. It might be worth to figure out what people use as replacement for realtime clocks on MacOS by searching various programming resoures on the internet. > +static inline int nftw64(const char *path, int (*fn)(const char *, const struct stat *ptr, int flag, struct FTW *), int depth, > + int flags) > +{ > + return nftw(path, fn, depth, flags); > +} > + > +#define MREMAP_FIXED 1 > +#define MREMAP_MAYMOVE 2 > +static inline void *mremap(void *old_address, size_t old_size, > + size_t new_size, int flags, ... /* void *new_address */) > +{ > + return NULL; > +} > + > +/* FSR */ Please just build the mremap file in xfs_io conditional. > +typedef int __fsblkcnt_t; > +typedef int __fsfilcnt_t; > +typedef long long int __fsblkcnt64_t; > +typedef long long int __fsfilcnt64_t; > + > +struct statvfs64 > +{ > + unsigned long int f_bsize; > + unsigned long int f_frsize; > + __fsblkcnt64_t f_blocks; > + __fsblkcnt64_t f_bfree; > + __fsblkcnt64_t f_bavail; > + __fsfilcnt64_t f_files; > + __fsfilcnt64_t f_ffree; > + __fsfilcnt64_t f_favail; > + unsigned long int f_fsid; > + int __f_unused; > + unsigned long int f_flag; > + unsigned long int f_namemax; > + int __f_spare[6]; > +}; Does MacOS support statvfs? or statfs? We should use the proper API here instead of a dummy. Or maybe just not build fsr on OSX for now, as that would solve the fsetxattr issue as well. > +struct mntent > +{ Another fsr issue, right? Seems like it would need similar getmntinfo based code. As a stopgap I'd suggest we stop building fsr on OSX for now. From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:32:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5D30F7F37 for ; Mon, 17 Aug 2015 14:32:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 559AB8F804C for ; Mon, 17 Aug 2015 12:32:38 -0700 (PDT) X-ASG-Debug-ID: 1439839956-04cb6c10d32dab0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 7yr02bMlm3QutBME (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:32:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQ96-00029a-F1; Mon, 17 Aug 2015 19:32:36 +0000 Date: Mon, 17 Aug 2015 12:32:36 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 06/11] xfsprogs: Add mntent.h check into autoconf Message-ID: <20150817193236.GF26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfsprogs: Add mntent.h check into autoconf References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-7-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-7-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839956 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:32:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DFEA77F37 for ; Mon, 17 Aug 2015 14:32:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5BB17AC006 for ; Mon, 17 Aug 2015 12:32:58 -0700 (PDT) X-ASG-Debug-ID: 1439839976-04cb6c10d52dae0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 9CzQGAWaFZfbqbfg (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:32:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQ9Q-0002Ax-Ns; Mon, 17 Aug 2015 19:32:56 +0000 Date: Mon, 17 Aug 2015 12:32:56 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 07/11] xfsprogs: Add fls check into autoconf Message-ID: <20150817193256.GG26222@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfsprogs: Add fls check into autoconf References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-8-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-8-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439839977 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:36:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D55727F37 for ; Mon, 17 Aug 2015 14:36:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD5878F8052 for ; Mon, 17 Aug 2015 12:36:25 -0700 (PDT) X-ASG-Debug-ID: 1439840184-04bdf051fa4f700001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id sGrKjU54CmKUxcIL (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:36:24 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQCm-000403-60; Mon, 17 Aug 2015 19:36:24 +0000 Date: Mon, 17 Aug 2015 12:36:24 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Message-ID: <20150817193624.GA8444@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-9-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-9-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439840184 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 17, 2015 at 06:23:23PM +0200, Jan Tulak wrote: > Memalign from was marked obsolete in favor of a posix > variant from . So replace all calls and remove > includes. This also enhances support on other posix platforms, > which doesn't have . > > Because posix_memalign returns any error as a return code, not in > errno, change relevant checks in code (and add a missing one). I have to say I hate the posix_memalign calling convention. Any chance you could just provide a memalign impementation using posix_memalign for MacOS? Something like: static inline void *memalign(size_t alignment, size_t size) { int error; void *buf; error = posix_memalign(&buf, alignment, size); if (error) errno = error; buf = NULL; } return buf; } From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:36:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 838587F37 for ; Mon, 17 Aug 2015 14:36:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D6E830405F for ; Mon, 17 Aug 2015 12:36:39 -0700 (PDT) X-ASG-Debug-ID: 1439840197-04cbb078e14ede0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AybGdrxvR5T2QnlE (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:36:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQCz-00040p-Qr; Mon, 17 Aug 2015 19:36:37 +0000 Date: Mon, 17 Aug 2015 12:36:37 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 09/11] xfsprogs: prevent LIST_ macros conflicts Message-ID: <20150817193637.GB8444@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 09/11] xfsprogs: prevent LIST_ macros conflicts References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-10-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-10-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439840198 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:36:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6A427F37 for ; Mon, 17 Aug 2015 14:36:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51593AC006 for ; Mon, 17 Aug 2015 12:36:54 -0700 (PDT) X-ASG-Debug-ID: 1439840212-04cb6c10d32dc20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id S89pcrSknTH8phrC (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:36:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQDE-00042D-PB; Mon, 17 Aug 2015 19:36:52 +0000 Date: Mon, 17 Aug 2015 12:36:52 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 10/11] xfsprogs: Update doc for OS X Message-ID: <20150817193652.GC8444@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/11] xfsprogs: Update doc for OS X References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-11-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-11-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439840213 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 17 14:39:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F0C9D7F37 for ; Mon, 17 Aug 2015 14:39:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6B84304067 for ; Mon, 17 Aug 2015 12:39:14 -0700 (PDT) X-ASG-Debug-ID: 1439840353-04cb6c10d52dcc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ErvLrLFfpGwOTFs3 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 12:39:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d9386a2b82e844863ec9+4376+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRQFV-0004Kb-DA; Mon, 17 Aug 2015 19:39:13 +0000 Date: Mon, 17 Aug 2015 12:39:13 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 11/11] xfsprogs: Add a way to compile without blkid Message-ID: <20150817193913.GD8444@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/11] xfsprogs: Add a way to compile without blkid References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-12-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-12-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439840353 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 17, 2015 at 06:23:26PM +0200, Jan Tulak wrote: > UPDATE: default to "signature found", so without blkid is > -f mandatory. Belongs in the cover letter, not this patch. > } else > ft->psectorsize = ft->lsectorsize = BBSIZE; > } else { > +#ifdef ENABLE_BLKID > blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, > &ft->lsectorsize, &ft->psectorsize, > force_overwrite); > +#endif /* ENABLE_BLKID */ > } > > if (xi->rtname && !xi->risfile) { > int sunit, lsectorsize, psectorsize; > > +#ifdef ENABLE_BLKID > blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth, > &lsectorsize, &psectorsize, force_overwrite); > +#endif /* ENABLE_BLKID */ I think you need to proide a dummy blkid_get_topology which at least sets the two sector sizes to 512. From sandeen@sandeen.net Mon Aug 17 14:51:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B68277F37 for ; Mon, 17 Aug 2015 14:51:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A80D30405F for ; Mon, 17 Aug 2015 12:51:27 -0700 (PDT) X-ASG-Debug-ID: 1439841085-04cb6c10cd2e0a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id uThTI3RJWh6SIcGk for ; Mon, 17 Aug 2015 12:51:25 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F07986372A65; Mon, 17 Aug 2015 14:51:24 -0500 (CDT) Message-ID: <55D23B3B.6060803@sandeen.net> Date: Mon, 17 Aug 2015 14:51:23 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com, darrick.wong@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 04/10] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with buffer errors References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014404.1839.75324.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 04/10] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with buffer errors In-Reply-To: <20150815014404.1839.75324.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439841085 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:44 PM, Darrick J. Wong wrote: > When we encounter CRC or verifier errors, bp->b_error is set to > -EFSBADCRC and -EFSCORRUPTED; note the negative sign. For whatever > reason, repair and db use the positive versions, and therefore fail to > notice the error, so fix all the broken uses. > > Note however that the db and repair turn the negative codes returned > by libxfs into positive codes that can be used with strerror. > > Signed-off-by: Darrick J. Wong This looks right, but I think there's more; see: XFS_WANT_CORRUPTED_GOTO XFS_WANT_CORRUPTED_RETURN (these return negative errors in kernelspace) and a bunch of stuff in libxlog/xfs_log_recover.c... FWIW, I guess it's expected that non-libxfs xfsprogs might carry around positive error numbers, but of course it has to be consistent... commit 12b5319796439c9442414f82049201d3c740e059 Author: Dave Chinner Date: Fri Jul 31 08:33:21 2015 +1000 libxfs: error negation rework The libxfs core in the kernel now returns negative error numbers one failure rather than positive numbers. This commit switches the libxfs core to use negative error numbers and converts all the libxfs function callers to negate the returned error so that none of the other codeneeds tobe changed at this time. This allows us to drive negative errors through the xfsprogs code base at our leisure rather than having to do it all right now. Signed-off-by: Dave Chinner So this is fine; Reviewed-by: Eric Sandeen but there are a few more libxfs/ bits to fix, I guess. -Eric > --- > db/attr.c | 4 ++-- > db/dir2.c | 4 ++-- > db/io.c | 4 ++-- > db/io.h | 2 +- > repair/dir2.c | 2 +- > repair/scan.c | 12 ++++++------ > 6 files changed, 14 insertions(+), 14 deletions(-) > > > diff --git a/db/attr.c b/db/attr.c > index 897834b..5e69100 100644 > --- a/db/attr.c > +++ b/db/attr.c > @@ -554,7 +554,7 @@ xfs_attr3_db_read_verify( > break; > default: > dbprintf(_("Unknown attribute buffer type!\n")); > - xfs_buf_ioerror(bp, EFSCORRUPTED); > + xfs_buf_ioerror(bp, -EFSCORRUPTED); > return; > } > verify: > @@ -566,7 +566,7 @@ xfs_attr3_db_write_verify( > struct xfs_buf *bp) > { > dbprintf(_("Writing unknown attribute buffer type!\n")); > - xfs_buf_ioerror(bp, EFSCORRUPTED); > + xfs_buf_ioerror(bp, -EFSCORRUPTED); > } > > const struct xfs_buf_ops xfs_attr3_db_buf_ops = { > diff --git a/db/dir2.c b/db/dir2.c > index 7f69e6f..cc76662 100644 > --- a/db/dir2.c > +++ b/db/dir2.c > @@ -1021,7 +1021,7 @@ xfs_dir3_db_read_verify( > break; > default: > dbprintf(_("Unknown directory buffer type!\n")); > - xfs_buf_ioerror(bp, EFSCORRUPTED); > + xfs_buf_ioerror(bp, -EFSCORRUPTED); > return; > } > verify: > @@ -1033,7 +1033,7 @@ xfs_dir3_db_write_verify( > struct xfs_buf *bp) > { > dbprintf(_("Writing unknown directory buffer type!\n")); > - xfs_buf_ioerror(bp, EFSCORRUPTED); > + xfs_buf_ioerror(bp, -EFSCORRUPTED); > } > > const struct xfs_buf_ops xfs_dir3_db_buf_ops = { > diff --git a/db/io.c b/db/io.c > index 9fa52b8..9452e07 100644 > --- a/db/io.c > +++ b/db/io.c > @@ -535,8 +535,8 @@ set_cur( > * Keep the buffer even if the verifier says it is corrupted. > * We're a diagnostic tool, after all. > */ > - if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED && > - bp->b_error != EFSBADCRC)) > + if (!bp || (bp->b_error && bp->b_error != -EFSCORRUPTED && > + bp->b_error != -EFSBADCRC)) > return; > iocur_top->buf = bp->b_addr; > iocur_top->bp = bp; > diff --git a/db/io.h b/db/io.h > index 31d96b4..6201d7b 100644 > --- a/db/io.h > +++ b/db/io.h > @@ -75,6 +75,6 @@ iocur_crc_valid() > return -1; > if (iocur_top->bp->b_flags & LIBXFS_B_UNCHECKED) > return -1; > - return (iocur_top->bp->b_error != EFSBADCRC && > + return (iocur_top->bp->b_error != -EFSBADCRC && > (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); > } > diff --git a/repair/dir2.c b/repair/dir2.c > index 187e069..a5646f8 100644 > --- a/repair/dir2.c > +++ b/repair/dir2.c > @@ -199,7 +199,7 @@ _("bad dir magic number 0x%x in inode %" PRIu64 " bno = %u\n"), > goto error_out; > } > /* corrupt node; rebuild the dir. */ > - if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { > + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) { > do_warn( > _("corrupt tree block %u for directory inode %" PRIu64 "\n"), > bno, da_cursor->ino); > diff --git a/repair/scan.c b/repair/scan.c > index 58f45eb..1e7a4da 100644 > --- a/repair/scan.c > +++ b/repair/scan.c > @@ -82,7 +82,7 @@ scan_sbtree( > do_error(_("can't read btree block %d/%d\n"), agno, root); > return; > } > - if (bp->b_error == EFSBADCRC || bp->b_error == EFSCORRUPTED) { > + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) { > do_warn(_("btree block %d/%d is suspect, error %d\n"), > agno, root, bp->b_error); > suspect = 1; > @@ -145,7 +145,7 @@ scan_lbtree( > * is a corruption or not and whether it got corrected and so needs > * writing back. CRC errors always imply we need to write the block. > */ > - if (bp->b_error == EFSBADCRC) { > + if (bp->b_error == -EFSBADCRC) { > do_warn(_("btree block %d/%d is suspect, error %d\n"), > XFS_FSB_TO_AGNO(mp, root), > XFS_FSB_TO_AGBNO(mp, root), bp->b_error); > @@ -1432,7 +1432,7 @@ scan_freelist( > do_abort(_("can't read agfl block for ag %d\n"), agno); > return; > } > - if (agflbuf->b_error == EFSBADCRC) > + if (agflbuf->b_error == -EFSBADCRC) > do_warn(_("agfl has bad CRC for ag %d\n"), agno); > > freelist = XFS_BUF_TO_AGFL_BNO(mp, agflbuf); > @@ -1705,9 +1705,9 @@ scan_ag( > * immediately, though. > */ > if (!no_modify) { > - agi_dirty += (agibuf->b_error == EFSBADCRC); > - agf_dirty += (agfbuf->b_error == EFSBADCRC); > - sb_dirty += (sbbuf->b_error == EFSBADCRC); > + agi_dirty += (agibuf->b_error == -EFSBADCRC); > + agf_dirty += (agfbuf->b_error == -EFSBADCRC); > + sb_dirty += (sbbuf->b_error == -EFSBADCRC); > } > > if (agi_dirty && !no_modify) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Mon Aug 17 14:57:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B860A7F37 for ; Mon, 17 Aug 2015 14:57:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D56230405F for ; Mon, 17 Aug 2015 12:57:12 -0700 (PDT) X-ASG-Debug-ID: 1439841429-04cb6c10cd2e2f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0Pa2Op5fvXUPNVYY for ; Mon, 17 Aug 2015 12:57:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3AA49602D83E; Mon, 17 Aug 2015 14:57:09 -0500 (CDT) Message-ID: <55D23C95.7090501@sandeen.net> Date: Mon, 17 Aug 2015 14:57:09 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com, darrick.wong@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 04/10] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with buffer errors References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014404.1839.75324.stgit@birch.djwong.org> <55D23B3B.6060803@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 04/10] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with buffer errors In-Reply-To: <55D23B3B.6060803@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439841429 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/17/15 2:51 PM, Eric Sandeen wrote: > On 8/14/15 8:44 PM, Darrick J. Wong wrote: >> When we encounter CRC or verifier errors, bp->b_error is set to >> -EFSBADCRC and -EFSCORRUPTED; note the negative sign. For whatever >> reason, repair and db use the positive versions, and therefore fail to >> notice the error, so fix all the broken uses. >> >> Note however that the db and repair turn the negative codes returned >> by libxfs into positive codes that can be used with strerror. >> >> Signed-off-by: Darrick J. Wong > > This looks right, but I think there's more; see: > > XFS_WANT_CORRUPTED_GOTO > XFS_WANT_CORRUPTED_RETURN > > (these return negative errors in kernelspace) > > and a bunch of stuff in libxlog/xfs_log_recover.c... Ok, I guess libxlog/* was never switched to negative, and so far it looks ok. The XFS_WANT_CORRUPTED* macros seem like a problem, though. -Eric From htejun@gmail.com Mon Aug 17 15:00:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BA1A17F37 for ; Mon, 17 Aug 2015 15:00:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A24C9304077 for ; Mon, 17 Aug 2015 13:00:43 -0700 (PDT) X-ASG-Debug-ID: 1439841641-04cb6c10d32e450001-NocioJ Received: from mail-io0-f181.google.com (mail-io0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id BeT3CFjsnFBfUz1W (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 13:00:41 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com Received: by iodb91 with SMTP id b91so164052462iod.1 for ; Mon, 17 Aug 2015 13:00:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=F6l/kwZQK6sReY4XkmCPDygnqFDcg5URs7KbFCgD2rU=; b=XEVfUrXI9AYA8qa+THH5+gDjXNjwB6K5LhXHPDOFxMVk+7YBDIhRM+ltiSXN/eOjbF U3Swpq3nd/RZmIcUqx+pknmvzuId7i9Dxg8Kx5IS577MS2RJeneQOcHZCZ6HN1SnE5xZ FyHqgHU1zQr5pzn7XR3pgVEdCr8EsuPo5HmrhOpthZZNKpYMijMzjtLZ9us28tWHYfV9 leEQcExTiaGO0uBAb/Pqvqfg2mubeOpZl4jM1G1UbPsJcveDJhcNvaKFysoo7TxmFRcB 5Xq8+HvPEvZW1a7SZUMAWfs4HpX5icAbtAF5LOUPa2RDQMv2xKhv6rW2tud1BZznj5Nv r7AQ== X-Received: by 10.107.132.73 with SMTP id g70mr3202455iod.14.1439841641402; Mon, 17 Aug 2015 13:00:41 -0700 (PDT) Received: from mtj.duckdns.org ([12.130.117.97]) by smtp.gmail.com with ESMTPSA id n6sm11045370igv.17.2015.08.17.13.00.37 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Aug 2015 13:00:40 -0700 (PDT) Sender: Tejun Heo X-Barracuda-Apparent-Source-IP: 12.130.117.97 Date: Mon, 17 Aug 2015 16:00:34 -0400 From: Tejun Heo To: Damien Wyart Cc: Jan Kara , Jens Axboe , Eryu Guan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150817200034.GF21075@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150814151401.GA6906@brouette> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814151401.GA6906@brouette> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-io0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1439841641 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Damien. On Fri, Aug 14, 2015 at 05:14:01PM +0200, Damien Wyart wrote: > I had an unstable system when running latest Linus tree with Tejun's > patch applied on top. Nothing fishy in the logs after rebooting without > the patch, but remote access with ssh when patch applied did not work > (as if /home partition could not be read). This system has / as ext4 and > other partitions (including /home) as XFS. Trying to login on tty > instead of X resulted in hang of X. I could reboot with sysrq, but can't > do further tests at the moment. > > Back to same tree without the patch resulted in normal system. > > So just a heads up the patch doesn't seem OK in its current state. Have you been able to reproduce the failure? That sounds like an unlikely failure mode for the patch. Thanks. -- tejun From htejun@gmail.com Mon Aug 17 15:03:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A174D7F37 for ; Mon, 17 Aug 2015 15:03:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86BE5304032 for ; Mon, 17 Aug 2015 13:03:01 -0700 (PDT) X-ASG-Debug-ID: 1439841780-04cbb078e14f7c0001-NocioJ Received: from mail-ig0-f175.google.com (mail-ig0-f175.google.com [209.85.213.175]) by cuda.sgi.com with ESMTP id UxUEbEEPeKce04Ua (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 13:03:00 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com Received: by igui7 with SMTP id i7so63974000igu.0 for ; Mon, 17 Aug 2015 13:03:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=8EAN/gOCokrzNRaZI1j+Fil2vPA1mjo7z1EeQMXnQjk=; b=Io6o/Z7XXxp9OQkUKjsQkU2jlm87fmMTspggL5YxmlsutIKOSn/tfE44YR+MqGcG9q n/2sCrWB9WIoDvmkeIL9fZiNEXy7c2M6heYBButldndJi4W+UXYjHUwIS386KX7h488F FEL9ho5y06OAiMMUPqsY82fP108ZT6jIgXq+ZcCKmRpYMsOsLLazBHQ6V5Wcx080Yuxt OcweXLvod1xxYENBeKAt1QagvtkOhCGlrExoGUxUO8fodbVaxfNI6cORAG10wZeUhnbY gyk8P1leuMQC5tWzzSm5nQwUm9dyBS/tgE08boDHKUQYcLaFcziyp0yGJe16KN/LdSvZ HHIQ== X-Received: by 10.50.128.169 with SMTP id np9mr18919834igb.37.1439841780295; Mon, 17 Aug 2015 13:03:00 -0700 (PDT) Received: from mtj.duckdns.org ([12.130.117.97]) by smtp.gmail.com with ESMTPSA id rq3sm3583315igb.1.2015.08.17.13.02.56 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Aug 2015 13:02:59 -0700 (PDT) Sender: Tejun Heo X-Barracuda-Apparent-Source-IP: 12.130.117.97 Date: Mon, 17 Aug 2015 16:02:54 -0400 From: Tejun Heo To: Jan Kara Cc: Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150817200254.GG21075@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814111408.GB8710@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-ig0-f175.google.com[209.85.213.175] X-Barracuda-Start-Time: 1439841780 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Jan. On Fri, Aug 14, 2015 at 01:14:09PM +0200, Jan Kara wrote: > So the patch looks good to me. But the fact that is fixes Eryu's problem > means there is something fishy going on. Either inodes get wrongly attached Seriously, it shouldn't affect size syncing or xfs but then again my understanding of xfs is severely limited. > to b_dirty_time list or bdi_has_dirty_io() somehow misbehaves only > temporarily and we don't catch it with the debug patch. > > Can we add a test to wb_has_dirty_io() to also check whether it matches > bdi_has_dirty_io()? Since Eryu doesn't use lazytime (I assume, Eryu, please > speak up if you do), we could also warn if b_dirty_time lists get > non-empty. Hmm? Sure, will prep a patch soon. Thanks. -- tejun From htejun@gmail.com Mon Aug 17 15:27:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 37FFF7F47 for ; Mon, 17 Aug 2015 15:27:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0A25B8F804C for ; Mon, 17 Aug 2015 13:27:18 -0700 (PDT) X-ASG-Debug-ID: 1439843236-04bdf051fc50b00001-NocioJ Received: from mail-ig0-f173.google.com (mail-ig0-f173.google.com [209.85.213.173]) by cuda.sgi.com with ESMTP id LRvhOMjU0klEuKyr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 13:27:16 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com Received: by igbjg10 with SMTP id jg10so64959408igb.0 for ; Mon, 17 Aug 2015 13:27:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=HPq/Ox16sgTo7Zgd23gedaCPMqmFxeAMoyA7AbJ2pmc=; b=HPYzXeOcs22uYBdyBHJjVgd0fhwqYmXITuopzHpeKwyDiPybpVykLdQAKTb3BDh3dV htGm9xY+jnOlWsGOGd7IzzwzDXw9dU8v8iVRlv1YWSJPbdjOf0U3v6//8Z2BQnzAgYK7 7r1KTMyDq5LC+Ff5IyEz3mkhbAPY/yNwApsiO3KMb1HzkPmEGOZgwsE2OW/OvK+K2zHn +uAgHepURO9obFE1pwkxcGCVmJuzExzl3lRR73W52aXm1cE3Y/7MPNv1TSRYfade50BM oqSjleO7fPPzu43UdMiAxtAYwYdEasT5ib5MSouWqKUBhdvqoHnsGuDm4tp9bt9WKHkW 7+Yw== X-Received: by 10.50.61.243 with SMTP id t19mr18557763igr.24.1439843235664; Mon, 17 Aug 2015 13:27:15 -0700 (PDT) Received: from mtj.duckdns.org ([12.130.117.97]) by smtp.gmail.com with ESMTPSA id 91sm13491331ioi.44.2015.08.17.13.27.12 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Aug 2015 13:27:15 -0700 (PDT) Sender: Tejun Heo X-Barracuda-Apparent-Source-IP: 12.130.117.97 Date: Mon, 17 Aug 2015 16:27:09 -0400 From: Tejun Heo To: Eryu Guan Cc: Dave Chinner , xfs@oss.sgi.com, axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150817202709.GJ21075@mtj.duckdns.org> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813232400.GH4496@mtj.duckdns.org> <20150814061939.GK17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150814061939.GK17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-ig0-f173.google.com[209.85.213.173] X-Barracuda-Start-Time: 1439843236 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Eryu. lol that wasn't supposed to fix the problem you were seeing. Can you please apply the following patch and see whether any warning triggers? Also, you aren't using lazytime, right? Thanks. Index: work/fs/fs-writeback.c =================================================================== --- work.orig/fs/fs-writeback.c +++ work/fs/fs-writeback.c @@ -103,7 +103,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(wbc_writepa static bool wb_io_lists_populated(struct bdi_writeback *wb) { - if (wb_has_dirty_io(wb)) { + if (test_bit(WB_has_dirty_io, &wb->state)) { return false; } else { set_bit(WB_has_dirty_io, &wb->state); @@ -844,14 +844,15 @@ static void bdi_split_work_to_wbs(struct struct wb_iter iter; might_sleep(); - - if (!bdi_has_dirty_io(bdi)) - return; restart: rcu_read_lock(); bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { - if (!wb_has_dirty_io(wb) || - (skip_if_busy && writeback_in_progress(wb))) + /* SYNC_ALL writes out I_DIRTY_TIME too */ + if (!wb_has_dirty_io(wb) && + (base_work->sync_mode == WB_SYNC_NONE || + list_empty(&wb->b_dirty_time))) + continue; + if (skip_if_busy && writeback_in_progress(wb)) continue; base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); @@ -899,8 +900,7 @@ static void bdi_split_work_to_wbs(struct { might_sleep(); - if (bdi_has_dirty_io(bdi) && - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { base_work->auto_free = 0; base_work->single_wait = 0; base_work->single_done = 0; @@ -2004,6 +2004,9 @@ void __mark_inode_dirty(struct inode *in trace_writeback_mark_inode_dirty(inode, flags); + WARN_ON_ONCE(!(sb->s_flags & MS_LAZYTIME) && + !list_empty(&inode_to_bdi(inode)->wb.b_dirty_time)); + /* * Don't do this for I_DIRTY_PAGES - that doesn't actually * dirty the inode itself @@ -2275,8 +2278,8 @@ void sync_inodes_sb(struct super_block * }; struct backing_dev_info *bdi = sb->s_bdi; - /* Nothing to do? */ - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) + /* bdi_has_dirty() ignores I_DIRTY_TIME but we can't, always kick wbs */ + if (bdi == &noop_backing_dev_info) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); Index: work/include/linux/backing-dev.h =================================================================== --- work.orig/include/linux/backing-dev.h +++ work/include/linux/backing-dev.h @@ -38,7 +38,25 @@ extern struct workqueue_struct *bdi_wq; static inline bool wb_has_dirty_io(struct bdi_writeback *wb) { - return test_bit(WB_has_dirty_io, &wb->state); + bool ret = test_bit(WB_has_dirty_io, &wb->state); + long tot_write_bw = atomic_long_read(&wb->bdi->tot_write_bandwidth); + + if (!ret && (!list_empty(&wb->b_dirty) || !list_empty(&wb->b_io) || + !list_empty(&wb->b_more_io))) { + const char *name = wb->bdi->dev ? dev_name(wb->bdi->dev) : "UNK"; + + pr_err("wb_has_dirty_io: ERR %s has_dirty=%d b_dirty=%d b_io=%d b_more_io=%d\n", + name, ret, !list_empty(&wb->b_dirty), !list_empty(&wb->b_io), !list_empty(&wb->b_more_io)); + WARN_ON(1); + } + if (ret && !tot_write_bw) { + const char *name = wb->bdi->dev ? dev_name(wb->bdi->dev) : "UNK"; + + pr_err("wb_has_dirty_io: ERR %s has_dirty=%d but tot_write_bw=%ld\n", + name, ret, tot_write_bw); + WARN_ON(1); + } + return ret; } static inline bool bdi_has_dirty_io(struct backing_dev_info *bdi) @@ -47,7 +65,18 @@ static inline bool bdi_has_dirty_io(stru * @bdi->tot_write_bandwidth is guaranteed to be > 0 if there are * any dirty wbs. See wb_update_write_bandwidth(). */ - return atomic_long_read(&bdi->tot_write_bandwidth); + bool ret = atomic_long_read(&bdi->tot_write_bandwidth); + + if (ret != wb_has_dirty_io(&bdi->wb)) { + const char *name = bdi->dev ? dev_name(bdi->dev) : "UNK"; + + pr_err("bdi_has_dirty_io: ERR %s tot_write_bw=%ld b_dirty=%d b_io=%d b_more_io=%d\n", + name, atomic_long_read(&bdi->tot_write_bandwidth), + !list_empty(&bdi->wb.b_dirty), !list_empty(&bdi->wb.b_io), !list_empty(&bdi->wb.b_more_io)); + WARN_ON(1); + } + + return ret; } static inline void __add_wb_stat(struct bdi_writeback *wb, From darrick.wong@oracle.com Mon Aug 17 15:30:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B7FEC7F47 for ; Mon, 17 Aug 2015 15:30:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A7BF68F8040 for ; Mon, 17 Aug 2015 13:30:36 -0700 (PDT) X-ASG-Debug-ID: 1439843435-04cb6c10cd2efa0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id WK5zVvwczCsM0fqH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 13:30:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7HKUXfB024623 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Aug 2015 20:30:34 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7HKUXqY018884 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 17 Aug 2015 20:30:33 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7HKUWlw020622; Mon, 17 Aug 2015 20:30:33 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 17 Aug 2015 13:30:32 -0700 Date: Mon, 17 Aug 2015 13:30:30 -0700 From: "Darrick J. Wong" To: Eric Sandeen Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 01/10] libxfs: readahead of dir3 data blocks should use the read verifier Message-ID: <20150817203030.GM10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 01/10] libxfs: readahead of dir3 data blocks should use the read verifier References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014344.1839.12045.stgit@birch.djwong.org> <55D2287B.9060900@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D2287B.9060900@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439843435 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21684 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 17, 2015 at 01:31:23PM -0500, Eric Sandeen wrote: > On 8/14/15 8:43 PM, Darrick J. Wong wrote: > > In the dir3 data block readahead function, use the regular read > > verifier to check the block's CRC and spot-check the block contents > > instead of calling the spot-checking routine directly. This prevents > > corrupted directory data blocks from being read into the kernel, which > > can lead to garbage ls output and directory loops (if say one of the > > entries contains invalid characters). > > > > Signed-off-by: Darrick J. Wong > > --- > > libxfs/xfs_dir2_data.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > > > diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c > > index c475ba8..466e096 100644 > > --- a/libxfs/xfs_dir2_data.c > > +++ b/libxfs/xfs_dir2_data.c > > @@ -250,7 +250,8 @@ xfs_dir3_data_reada_verify( > > return; > > case cpu_to_be32(XFS_DIR2_DATA_MAGIC): > > case cpu_to_be32(XFS_DIR3_DATA_MAGIC): > > - xfs_dir3_data_verify(bp); > > + bp->b_ops = &xfs_dir3_block_buf_ops; > > + bp->b_ops->verify_read(bp); > > Shouldn't that be xfs_dir3_data_buf_ops ? D'oh. Yep, good catch. --D > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Aug 17 15:45:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 530847F47 for ; Mon, 17 Aug 2015 15:45:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4315B8F8040 for ; Mon, 17 Aug 2015 13:45:52 -0700 (PDT) X-ASG-Debug-ID: 1439844350-04cbb078e2508d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id cuKSmI9Op1Zip6rH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 13:45:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7HKjmlE010226 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Aug 2015 20:45:49 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7HKjmxU022166 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 17 Aug 2015 20:45:48 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7HKjlwE005006; Mon, 17 Aug 2015 20:45:48 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 17 Aug 2015 13:45:47 -0700 Date: Mon, 17 Aug 2015 13:45:46 -0700 From: "Darrick J. Wong" To: Eric Sandeen Cc: "Darrick J. Wong" , david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 02/10] xfs_db: don't crash on a corrupt inode Message-ID: <20150817204546.GN10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 02/10] xfs_db: don't crash on a corrupt inode References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014351.1839.81382.stgit@birch.djwong.org> <55D22D62.9060806@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D22D62.9060806@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439844350 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 17, 2015 at 01:52:18PM -0500, Eric Sandeen wrote: > On 8/14/15 8:43 PM, Darrick J. Wong wrote: > > If the user selects a corrupt inode via the 'inode XXX' command, the > > read verifier will fail and the io cursor at the top of the ring will > > not have any data attached. When this is the case, we cannot > > dereference the NULL pointer or xfs_db will crash. Therefore, check > > the buffer pointer before using it. > > > > It's arguable that we ought to retry the read without the verifiers > > if the inode is corrupt or fails CRC, since this /is/ a debugging > > tool, and maybe you wanted the contents anyway. > > I agree. It seems like we should do that, though it probably needs to > be done across the board for all metadata types if it's going to be done. > Maybe something to add to the TODO? Hmm. Looks like set_cur() wants to return buffer contents in the verifier error case, except that the broken xfs_buf->b_error sign handling prevents it from doing that... and the sign handling error is fixed later on in the patch set. So... that leaves hard IO errors, for which we still need this patch. --D > > > Signed-off-by: Darrick J. Wong > > --- > > db/inode.c | 2 ++ > > 1 file changed, 2 insertions(+) > > > > > > diff --git a/db/inode.c b/db/inode.c > > index e86dabd..64b263b 100644 > > --- a/db/inode.c > > +++ b/db/inode.c > > @@ -682,6 +682,8 @@ set_cur_inode( > > set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, cluster_agbno), > > numblks, DB_RING_IGN, NULL); > > off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); > > off_cur checks for iocur_top == NULL, and warns if it is, so that's good. > The user should have a clue about what's gone wrong, at least. > > But, callers of set_cur_inode() are still going to crash often as not: > > ablock_f: > set_cur_inode(iocur_top->ino); > haveattr = XFS_DFORK_Q((xfs_dinode_t *)iocur_top->data); > > bmap: > > set_cur_inode(iocur_top->ino); > nex = *nexp; > *nexp = 0; > ASSERT(nex > 0); > dip = iocur_top->data; > > bmap_f: > > set_cur_inode(iocur_top->ino); > dip = iocur_top->data; > > and a few more :( > > Perhaps set_cur_inode() should return failure, so the caller knows to bail, > pop_cur if it needs to, etc? > > -Eric > > > + if (!iocur_top->data) > > + return; > > dip = iocur_top->data; > > iocur_top->ino_buf = 1; > > iocur_top->ino = ino; > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Aug 17 15:50:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 183187F47 for ; Mon, 17 Aug 2015 15:50:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED44F8F8040 for ; Mon, 17 Aug 2015 13:50:30 -0700 (PDT) X-ASG-Debug-ID: 1439844629-04cb6c10cd2f540001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Rkxqs0y7d1uGGcLg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 13:50:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7HKoRpC015905 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Aug 2015 20:50:28 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7HKoRHP030346 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 17 Aug 2015 20:50:27 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7HKoRVR007027; Mon, 17 Aug 2015 20:50:27 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 17 Aug 2015 13:50:27 -0700 Date: Mon, 17 Aug 2015 13:50:26 -0700 From: "Darrick J. Wong" To: Eric Sandeen Cc: "Darrick J. Wong" , david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 03/10] xfs_repair: ignore "repaired" flag after we decide to clear xattr block Message-ID: <20150817205026.GO10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 03/10] xfs_repair: ignore "repaired" flag after we decide to clear xattr block References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014357.1839.68720.stgit@birch.djwong.org> <55D23400.7020106@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D23400.7020106@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439844629 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 17, 2015 at 02:20:32PM -0500, Eric Sandeen wrote: > On 8/14/15 8:43 PM, Darrick J. Wong wrote: > > If in the course of examining extended attribute block contents we > > first decide to repair an entry (*repair = 1) but secondly decide to > > clear the whole block, set *repair = 0 because the clearing action > > only happens if *repair == 0. Put another way, if we're nuking a > > block, don't pretend like we've fixed it too. > > Hm, or what happens otherwise? > > TBH this is making my brain hurt, chasing it all the way back up > the callchain. It's *repair not *repaired; it's not saying we > fixed it, but that we should fix it, right? It'll take me a while > to work out what all the callers do with the "clearit" return from > process_attr_leaf_block and with *repair. I thought *repair actually did mean *repaired (past tense). But I might just be confused? xfs_attr.c:939 says: do_warn( _("removing attribute entry %d for inode %" PRIu64 "\n"), i, ino); tempentry = (xfs_attr_sf_entry_t *) ((intptr_t) currententry + XFS_ATTR_SF_ENTSIZE(currententry)); memmove(currententry,tempentry,remainingspace); asf->hdr.count -= 1; i--; /* no worries, it will wrap back to 0 */ *repair = 1; ...that looks like a repair to me? Also see attr_repair.c:965: if (asf->hdr.count != i) { if (no_modify) { do_warn( _("would have corrected attribute entry count in inode %" PRIu64 " from %d to %d\n"), ino, asf->hdr.count, i); } else { do_warn( _("corrected attribute entry count in inode %" PRIu64 ", was %d, now %d\n"), ino, asf->hdr.count, i); asf->hdr.count = i; *repair = 1; } } ...looks like we fix asf->hdr.count and then set *repair to 1. > Did you have a specific example of something going wrong? A few dozen runs of xfs/72[0-2] are pretty good at hitting this. --D > > thanks, > -Eric > > > Signed-off-by: Darrick J. Wong > > --- > > repair/attr_repair.c | 14 +++++++++++++- > > 1 file changed, 13 insertions(+), 1 deletion(-) > > > > > > diff --git a/repair/attr_repair.c b/repair/attr_repair.c > > index 62f80e7..2bd9334 100644 > > --- a/repair/attr_repair.c > > +++ b/repair/attr_repair.c > > @@ -1311,6 +1311,13 @@ process_leaf_attr_block( > > * we can add it then. > > */ > > } > > + /* > > + * If we're just going to zap the block, don't pretend like we > > + * repaired it, because repairing the block stops the clear > > + * operation. > > + */ > > + if (clearit) > > + *repair = 0; > > if (*repair) > > xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, leaf, &leafhdr); > > > > @@ -1524,6 +1531,7 @@ process_longform_attr( > > xfs_dahash_t next_hashval; > > int repairlinks = 0; > > struct xfs_attr3_icleaf_hdr leafhdr; > > + int error; > > > > *repair = 0; > > > > @@ -1604,12 +1612,16 @@ process_longform_attr( > > libxfs_writebuf(bp, 0); > > } else > > libxfs_putbuf(bp); > > - return (process_node_attr(mp, ino, dip, blkmap)); /* + repair */ > > + error = process_node_attr(mp, ino, dip, blkmap); /* + repair */ > > + if (error) > > + *repair = 0; > > + return error; > > default: > > do_warn( > > _("bad attribute leaf magic # %#x for dir ino %" PRIu64 "\n"), > > be16_to_cpu(leaf->hdr.info.magic), ino); > > libxfs_putbuf(bp); > > + *repair = 0; > > return(1); > > } > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon Aug 17 16:14:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 973567F47 for ; Mon, 17 Aug 2015 16:14:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7822C8F8052 for ; Mon, 17 Aug 2015 14:14:29 -0700 (PDT) X-ASG-Debug-ID: 1439846067-04cb6c10d32fce0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8VMU61z0yZPqpj0B for ; Mon, 17 Aug 2015 14:14:27 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4BABB661D574; Mon, 17 Aug 2015 16:14:27 -0500 (CDT) Message-ID: <55D24EB3.2040506@sandeen.net> Date: Mon, 17 Aug 2015 16:14:27 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com, darrick.wong@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 05/10] xfs_repair: force not-so-bad bmbt blocks back through the verifier References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014410.1839.33268.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 05/10] xfs_repair: force not-so-bad bmbt blocks back through the verifier In-Reply-To: <20150815014410.1839.33268.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439846067 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:44 PM, Darrick J. Wong wrote: > If during prefetch we encounter a bmbt block that fails the CRC check > due to corruption in the unused part of the block, force the buffer > back through the non-prefetch verifiers later so that the CRC is > updated. Otherwise, the bad checksum goes unfixed and the kernel will > still flag the bmbt block as invalid. > > Signed-off-by: Darrick J. Wong > --- > repair/prefetch.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 8b261ae..fc7097f 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -276,6 +276,14 @@ pf_scan_lbtree( > > XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); > > + /* > + * Make this bmbt buffer go back through the verifiers later so that > + * we correct checksum errors stemming from bitflips in the unused > + * parts of the bmbt block. > + */ > + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) > + bp->b_flags |= LIBXFS_B_UNCHECKED; Hm, so why check EFSCORRUPTED? If you're doing what the comment says, why not just EFSBADCRC? EFSCORRUPTED means that in-use portions are bad, no? -Eric > + > rc = (*func)(XFS_BUF_TO_BLOCK(bp), level - 1, isadir, args); > > libxfs_putbuf(bp); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Mon Aug 17 16:34:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C0BC7F47 for ; Mon, 17 Aug 2015 16:34:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E14F1304077 for ; Mon, 17 Aug 2015 14:34:18 -0700 (PDT) X-ASG-Debug-ID: 1439847255-04cb6c10d330210001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id klT9PRU04nktSJNU for ; Mon, 17 Aug 2015 14:34:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlCgDmUtJVPJ7tLHldgxuBPYJWg3yjOgEBAQEBAQabSAICAQECgTBNAQEBAQEBBwEBAQFAAT+EJAEBBCcTHCMQCAMOCgklDwUlAwcaE4gt0R8BAQEBAQUBAQEBHhmGB4UyhQkHgxiBFAWVHYxpgU2HRYhriC2CMx0VgVAsM4JMAQEB Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Aug 2015 07:04:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRS2n-0002M0-M5; Tue, 18 Aug 2015 07:34:13 +1000 Date: Tue, 18 Aug 2015 07:34:13 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 14/13] xfs: swap leaf buffer into path struct atomically during path shift Message-ID: <20150817213413.GC714@dastard> X-ASG-Orig-Subj: Re: [PATCH 14/13] xfs: swap leaf buffer into path struct atomically during path shift References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439830072-61117-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439830072-61117-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1439847255 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 17, 2015 at 12:47:52PM -0400, Brian Foster wrote: > The node directory lookup code uses a state structure that tracks the > path of buffers used to search for the hash of a filename through the > leaf blocks. When the lookup encounters a block that ends with the > requested hash, but the entry has not yet been found, it must shift over > to the next block and continue looking for the entry (i.e., duplicate > hashes could continue over into the next block). This shift mechanism > involves walking back up and down the state structure, replacing buffers > at the appropriate btree levels as necessary. > > When a buffer is replaced, the old buffer is released and the new buffer > read into the active slot in the path structure. Because the buffer is > read directly into the path slot, a buffer read failure can result in > setting a NULL buffer pointer in an active slot. This throws off the > state cleanup code in xfs_dir2_node_lookup(), which expects to release a > buffer from each active slot. Instead, a BUG occurs due to a NULL > pointer dereference: > > BUG: unable to handle kernel NULL pointer dereference at 00000000000001e8 > IP: [] xfs_trans_brelse+0x2a3/0x3c0 [xfs] > ... > RIP: 0010:[] [] xfs_trans_brelse+0x2a3/0x3c0 [xfs] > ... > Call Trace: > [] xfs_dir2_node_lookup+0xa6/0x2c0 [xfs] > [] xfs_dir_lookup+0x1ac/0x1c0 [xfs] > [] xfs_lookup+0x91/0x290 [xfs] > [] xfs_vn_lookup+0x73/0xb0 [xfs] > [] lookup_real+0x1d/0x50 > [] path_openat+0x91e/0x1490 > [] do_filp_open+0x89/0x100 > ... > > This has been reproduced via a parallel fsstress and filesystem shutdown > workload in a loop. The shutdown triggers the read error in the > aforementioned codepath and causes the BUG in xfs_dir2_node_lookup(). > > Update xfs_da3_path_shift() to update the active path slot atomically > with respect to the caller when a buffer is replaced. This ensures that > the caller always sees the old or new buffer in the slot and prevents > the NULL pointer dereference. > > Signed-off-by: Brian Foster > --- > > This is just another shutdown/error handling issue I've run into with > the same testing associated with all of the other fixes. I'm tacking it > on to the end of this series... > > Brian > > fs/xfs/libxfs/xfs_da_btree.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c > index 3264d81..04a3765 100644 > --- a/fs/xfs/libxfs/xfs_da_btree.c > +++ b/fs/xfs/libxfs/xfs_da_btree.c > @@ -1822,6 +1822,7 @@ xfs_da3_path_shift( > struct xfs_da_args *args; > struct xfs_da_node_entry *btree; > struct xfs_da3_icnode_hdr nodehdr; > + struct xfs_buf *bp; > xfs_dablk_t blkno = 0; > int level; > int error; > @@ -1865,21 +1866,27 @@ xfs_da3_path_shift( > * same depth we were at originally. > */ > for (blk++, level++; level < path->active; blk++, level++) { > + struct xfs_buf **bpp = &blk->bp; > + What do we need this for? The new code is: > /* > + * Read the next child block into a local buffer. > */ > + error = xfs_da3_node_read(args->trans, dp, blkno, -1, &bp, > + args->whichfork); > + if (error) > + return error; > > /* > + * Release the old block (if it's dirty, the trans doesn't > + * actually let go) and swap the local buffer into the path > + * structure. This ensures failure of the above read doesn't set > + * a NULL buffer in an active slot in the path. > */ > + if (release) > + xfs_trans_brelse(args->trans, blk->bp); > blk->blkno = blkno; > + *bpp = bp; And this can simply be: blk->bp = bp; so I don't think *bpp is necessary at all. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 17 16:55:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ECDAA7F47 for ; Mon, 17 Aug 2015 16:55:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD1BB8F8033 for ; Mon, 17 Aug 2015 14:55:53 -0700 (PDT) X-ASG-Debug-ID: 1439848550-04cbb078e351e30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IWKbdoaywNqYaEDP for ; Mon, 17 Aug 2015 14:55:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D/CQCJV9JVPJ7tLHldgxuBPYJWg3yjOgEBAQEBAQabSAQCAoEwTQEBAQEBAQcBAQEBQAE/hCMBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIJgfRGwEBAQEGAQEBAR4ZhgeFMoQmCQgBUQeDGIEUBZUdjGmBTZAwiC2ENSwzgQ6BPgEBAQ Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Aug 2015 07:25:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRSNh-0002Qz-Hx; Tue, 18 Aug 2015 07:55:49 +1000 Date: Tue, 18 Aug 2015 07:55:49 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 00/11] xfsprogs: Partial OS X support Message-ID: <20150817215549.GD714@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/11] xfsprogs: Partial OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1439848550 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 17, 2015 at 06:23:15PM +0200, Jan Tulak wrote: > This is a third iteration of OS X support patches. Notes with information about > changes in every patch since the last bulk submittation (or at least the last > iteration of that patch) follows. What version of the patches are these? I see some patches in previous thread with "v4" on them, so I don't know whether they are more recent than these or not. FWIW, I'm not picking on you; I'm trying to explain what I see and why it makes it difficult for me to work out what is going on so you understand why I might be asking for specific information. Nobody explains this stuff to new developers; you pick it up through trial an error, and emails like this :/ What I'm seeing in my inbox is threads like this: patch 0 v1 ->patch 1 ->patch 2 ->patch 3 patch 0 v2 ->patch 1 V2 ->patch 2 V2 ->patch 2 V3 -> patch 2 V4 ->patch 3 V2 patch 0 v3 ->patch 1 v3 ->patch 2 v3 ->patch 2 V4 ->patch 3 v3 And so you can see how confusing "patch 2 V3" or "patch 2 v4" gets when they are versioned this way. I don't know which one is most recent just by looking at the patch subject. I try to avoid this problem by putting a version on the patchset itself (i.e. on the patch 0 letter) and then the individual patches do not have a version. If I update a patch within a series, it gets a v2, v3, etc on each repost within that overall patch series. When I repost the entire patch series as a new version, however, I send the latest version of the patch without a version. i.e. the threads look like: patch 0 v1 ->patch 1 ->patch 2 ->patch 3 patch 0 v2 (w/ changelog for v2) ->patch 1 ->patch 2 ->patch 2 V2 (w/ changelog) -> patch 2 V3 (w/ changelog) ->patch 3 patch 0 v3 (w/ changelog for v3) ->patch 1 ->patch 2 ->patch 2 V2 (w/ changelog) ->patch 3 And so the lastest patches are always in the latest thread the patch series has been posted. > BTW: for the patches which already got "Reviewed-by", I added the line > to these patches. If this is not a good thing and I should let the reviewer > to submit his reviewed-by email again, tell me. :-) No, that's the rigth thing to do, and you don't need to mention it in the changelog. Seeing the tag in the commit message tells both the reviewer and the maintainer that the patchhas already been reviewed and does not need to be rescrutinised. Of course, that means if you change the patch you need to remove the reviewed-by tag to tell reviewers it needs to be looked at again and the change documented in the change log... Speaking of change logs: > undefined variable fix > - better explanation in commit > > Add ifdef dirent checks where it was missing > - added approximation of d_reclen > - text width fix > > Change OS X-specific CFLAGS/LDFLAGS > - Nothing, already reviewed > > Add includes required for OS X builds > - updated for libdisk gone > > missing and dummy calls for OS X support > - new patch (no review yet) > > Add mntent.h check into autoconf > - new patch > - autoconf change > > Add fls check into autoconf > - new patch > - autoconf change > > replace obsolete memalign with posix_memalign > - new patch > - remove strange code formatted > > prevent LIST_ macros conflicts > - already reviewed > - new patch > > Update doc for OS X > - new patch (no review yet) > > Add a way to compile without blkid > - new patch > - changed default behaviour if BLKID is disabled such that mkfs -f is required Better is this: Version 3: - better commit messages (patch 1) - formatting fixes (patch 2, 8) - autoconf updates (patch 6, 7) - changed default behaviour if BLKID is disabled such that mkfs -f is required (patch 11) Version 2: - added approximation of d_reclen (patch 2) - updated for libdisk removal (patch 4) - OS X documentation update (new patch 10) So we have some idea of what changed between two reposts of the patch series, and we have some context of the changes that have previously been asked for during review without having to go back to the previous threads. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Aug 17 17:19:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AE7267F47 for ; Mon, 17 Aug 2015 17:19:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DECB304067 for ; Mon, 17 Aug 2015 15:19:56 -0700 (PDT) X-ASG-Debug-ID: 1439849995-04cb6c10d531060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nzq8WBQxj0oSP3pj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 15:19:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 53167FA9C1; Mon, 17 Aug 2015 22:19:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HMJsb9020455; Mon, 17 Aug 2015 18:19:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3B86912204F; Mon, 17 Aug 2015 18:19:53 -0400 (EDT) Date: Mon, 17 Aug 2015 18:19:53 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 14/13] xfs: swap leaf buffer into path struct atomically during path shift Message-ID: <20150817221952.GA16225@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 14/13] xfs: swap leaf buffer into path struct atomically during path shift References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439830072-61117-1-git-send-email-bfoster@redhat.com> <20150817213413.GC714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150817213413.GC714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439849995 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 18, 2015 at 07:34:13AM +1000, Dave Chinner wrote: > On Mon, Aug 17, 2015 at 12:47:52PM -0400, Brian Foster wrote: ... > > > > fs/xfs/libxfs/xfs_da_btree.c | 25 ++++++++++++++++--------- > > 1 file changed, 16 insertions(+), 9 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c > > index 3264d81..04a3765 100644 > > --- a/fs/xfs/libxfs/xfs_da_btree.c > > +++ b/fs/xfs/libxfs/xfs_da_btree.c > > @@ -1822,6 +1822,7 @@ xfs_da3_path_shift( > > struct xfs_da_args *args; > > struct xfs_da_node_entry *btree; > > struct xfs_da3_icnode_hdr nodehdr; > > + struct xfs_buf *bp; > > xfs_dablk_t blkno = 0; > > int level; > > int error; > > @@ -1865,21 +1866,27 @@ xfs_da3_path_shift( > > * same depth we were at originally. > > */ > > for (blk++, level++; level < path->active; blk++, level++) { > > + struct xfs_buf **bpp = &blk->bp; > > + > > What do we need this for? The new code is: > > > /* > > + * Read the next child block into a local buffer. > > */ > > + error = xfs_da3_node_read(args->trans, dp, blkno, -1, &bp, > > + args->whichfork); > > + if (error) > > + return error; > > > > /* > > + * Release the old block (if it's dirty, the trans doesn't > > + * actually let go) and swap the local buffer into the path > > + * structure. This ensures failure of the above read doesn't set > > + * a NULL buffer in an active slot in the path. > > */ > > + if (release) > > + xfs_trans_brelse(args->trans, blk->bp); > > blk->blkno = blkno; > > + *bpp = bp; > > And this can simply be: > > blk->bp = bp; > > so I don't think *bpp is necessary at all. > Yeah, that's a thinko. v2 incoming... Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Mon Aug 17 17:25:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D284D7F47 for ; Mon, 17 Aug 2015 17:25:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C24E58F8040 for ; Mon, 17 Aug 2015 15:25:42 -0700 (PDT) X-ASG-Debug-ID: 1439850341-04cb6c10d331200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VkdK4x4eyGaNjyef (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 15:25:42 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 98D17A37F9 for ; Mon, 17 Aug 2015 22:25:41 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-174.bos.redhat.com [10.18.41.174]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7HMPfsg032489 for ; Mon, 17 Aug 2015 18:25:41 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9EB2412204F; Mon, 17 Aug 2015 18:25:39 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 14/13] xfs: swap leaf buffer into path struct atomically during path shift Date: Mon, 17 Aug 2015 18:25:39 -0400 X-ASG-Orig-Subj: [PATCH v2 14/13] xfs: swap leaf buffer into path struct atomically during path shift Message-Id: <1439850339-19466-1-git-send-email-bfoster@redhat.com> In-Reply-To: <1439830072-61117-1-git-send-email-bfoster@redhat.com> References: <1439830072-61117-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439850342 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The node directory lookup code uses a state structure that tracks the path of buffers used to search for the hash of a filename through the leaf blocks. When the lookup encounters a block that ends with the requested hash, but the entry has not yet been found, it must shift over to the next block and continue looking for the entry (i.e., duplicate hashes could continue over into the next block). This shift mechanism involves walking back up and down the state structure, replacing buffers at the appropriate btree levels as necessary. When a buffer is replaced, the old buffer is released and the new buffer read into the active slot in the path structure. Because the buffer is read directly into the path slot, a buffer read failure can result in setting a NULL buffer pointer in an active slot. This throws off the state cleanup code in xfs_dir2_node_lookup(), which expects to release a buffer from each active slot. Instead, a BUG occurs due to a NULL pointer dereference: BUG: unable to handle kernel NULL pointer dereference at 00000000000001e8 IP: [] xfs_trans_brelse+0x2a3/0x3c0 [xfs] ... RIP: 0010:[] [] xfs_trans_brelse+0x2a3/0x3c0 [xfs] ... Call Trace: [] xfs_dir2_node_lookup+0xa6/0x2c0 [xfs] [] xfs_dir_lookup+0x1ac/0x1c0 [xfs] [] xfs_lookup+0x91/0x290 [xfs] [] xfs_vn_lookup+0x73/0xb0 [xfs] [] lookup_real+0x1d/0x50 [] path_openat+0x91e/0x1490 [] do_filp_open+0x89/0x100 ... This has been reproduced via a parallel fsstress and filesystem shutdown workload in a loop. The shutdown triggers the read error in the aforementioned codepath and causes the BUG in xfs_dir2_node_lookup(). Update xfs_da3_path_shift() to update the active path slot atomically with respect to the caller when a buffer is replaced. This ensures that the caller always sees the old or new buffer in the slot and prevents the NULL pointer dereference. Signed-off-by: Brian Foster --- v2: - Removed unnecessary double pointer. v1: http://oss.sgi.com/pipermail/xfs/2015-August/043108.html fs/xfs/libxfs/xfs_da_btree.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index 3264d81..cd2201f 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -1822,6 +1822,7 @@ xfs_da3_path_shift( struct xfs_da_args *args; struct xfs_da_node_entry *btree; struct xfs_da3_icnode_hdr nodehdr; + struct xfs_buf *bp; xfs_dablk_t blkno = 0; int level; int error; @@ -1866,20 +1867,24 @@ xfs_da3_path_shift( */ for (blk++, level++; level < path->active; blk++, level++) { /* - * Release the old block. - * (if it's dirty, trans won't actually let go) + * Read the next child block into a local buffer. */ - if (release) - xfs_trans_brelse(args->trans, blk->bp); + error = xfs_da3_node_read(args->trans, dp, blkno, -1, &bp, + args->whichfork); + if (error) + return error; /* - * Read the next child block. + * Release the old block (if it's dirty, the trans doesn't + * actually let go) and swap the local buffer into the path + * structure. This ensures failure of the above read doesn't set + * a NULL buffer in an active slot in the path. */ + if (release) + xfs_trans_brelse(args->trans, blk->bp); blk->blkno = blkno; - error = xfs_da3_node_read(args->trans, dp, blkno, -1, - &blk->bp, args->whichfork); - if (error) - return error; + blk->bp = bp; + info = blk->bp->b_addr; ASSERT(info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC) || -- 2.1.0 From darrick.wong@oracle.com Mon Aug 17 18:48:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1D6AB7F47 for ; Mon, 17 Aug 2015 18:48:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E68A8F8035 for ; Mon, 17 Aug 2015 16:48:22 -0700 (PDT) X-ASG-Debug-ID: 1439855298-04cb6c10cd32750001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id UAvNVpYNoxcSVkJu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 16:48:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7HNmGQ9014245 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Aug 2015 23:48:16 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7HNmF7R002310 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 17 Aug 2015 23:48:15 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7HNmFPY028985; Mon, 17 Aug 2015 23:48:15 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 17 Aug 2015 16:48:15 -0700 Date: Mon, 17 Aug 2015 16:48:14 -0700 From: "Darrick J. Wong" To: Eric Sandeen Cc: "Darrick J. Wong" , david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 05/10] xfs_repair: force not-so-bad bmbt blocks back through the verifier Message-ID: <20150817234814.GP10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 05/10] xfs_repair: force not-so-bad bmbt blocks back through the verifier References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014410.1839.33268.stgit@birch.djwong.org> <55D24EB3.2040506@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D24EB3.2040506@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1439855298 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21690 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 17, 2015 at 04:14:27PM -0500, Eric Sandeen wrote: > On 8/14/15 8:44 PM, Darrick J. Wong wrote: > > If during prefetch we encounter a bmbt block that fails the CRC check > > due to corruption in the unused part of the block, force the buffer > > back through the non-prefetch verifiers later so that the CRC is > > updated. Otherwise, the bad checksum goes unfixed and the kernel will > > still flag the bmbt block as invalid. > > > > Signed-off-by: Darrick J. Wong > > --- > > repair/prefetch.c | 8 ++++++++ > > 1 file changed, 8 insertions(+) > > > > > > diff --git a/repair/prefetch.c b/repair/prefetch.c > > index 8b261ae..fc7097f 100644 > > --- a/repair/prefetch.c > > +++ b/repair/prefetch.c > > @@ -276,6 +276,14 @@ pf_scan_lbtree( > > > > XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); > > > > + /* > > + * Make this bmbt buffer go back through the verifiers later so that > > + * we correct checksum errors stemming from bitflips in the unused > > + * parts of the bmbt block. > > + */ > > + if (bp->b_error == -EFSBADCRC || bp->b_error == -EFSCORRUPTED) > > + bp->b_flags |= LIBXFS_B_UNCHECKED; > > Hm, so why check EFSCORRUPTED? If you're doing what the comment says, why > not just EFSBADCRC? EFSCORRUPTED means that in-use portions are bad, no? You're right, I only need to hook onto EFSBADCRC. I probably got too used to seeing checks for both everywhere. 8) --D > > -Eric > > > + > > rc = (*func)(XFS_BUF_TO_BLOCK(bp), level - 1, isadir, args); > > > > libxfs_putbuf(bp); > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Aug 17 18:58:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6BF157F47 for ; Mon, 17 Aug 2015 18:58:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EE864AC008 for ; Mon, 17 Aug 2015 16:57:59 -0700 (PDT) X-ASG-Debug-ID: 1439855877-04cb6c10d332980001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Db6z0VmOvyxsbm25 for ; Mon, 17 Aug 2015 16:57:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlCgDoc9JVPJ7tLHldgxuBPYJWg3yjOwEBAQEBAQabSAICAQECgTBNAQEBAQEBBwEBAQFAAT+EJAEBBDocGwgQCAMYCSUPBSUDBxoTiC3QegEBAQEBBQEBAQEeGYYHhC+BA4UJB4MYgRQFlR2MaYFNhCuIa4tHhDUsM4JMAQEB Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Aug 2015 09:27:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRUHr-0002eL-Mk; Tue, 18 Aug 2015 09:57:55 +1000 Date: Tue, 18 Aug 2015 09:57:55 +1000 From: Dave Chinner To: Mark Tinguely Cc: Jan Kara , xfs@oss.sgi.com, tdm@sgi.com Subject: Re: [PATCH] xfs: Fix xfs_attr_leafblock definition Message-ID: <20150817235755.GE714@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix xfs_attr_leafblock definition References: <1439458000-28395-1-git-send-email-jack@suse.com> <55CC98DD.6060700@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55CC98DD.6060700@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1439855877 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21690 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 13, 2015 at 08:17:17AM -0500, Mark Tinguely wrote: > On 08/13/15 04:26, Jan Kara wrote: > >struct xfs_attr_leafblock contains 'entries' array which is declared > >with size 1 altough it can in fact contain much more entries. Since this > >array is followed by further struct members, gcc (at least in version > >4.8.3) thinks that the array has the fixed size of 1 element and thus > >may optimize away all accesses beyond the end of array resulting in > >non-working code. This problem was only observed with userspace code in > >xfsprogs, however it's better to be safe in kernel as well and have > >matching kernel and xfsprogs definitions. > > > >Signed-off-by: Jan Kara > >--- > > I hit this bug in SLES12 and RHEL7 XFS kernel code. It is the gcc > 4.8's new loop optimization routine. A person can bypass it with the > option: > -fno-aggressive-loop-optimizations > but this fixes the source of the problem. > > Acked-by: Mark Tinguely Hi Mark - it's great that you had found and identified the exact compiler optimisation that was causing miscompilation of the XFS code. Troy, what's not great about this is that SGI hasn't seen fit to report this bug upstream or to their distro partners in a prompt manner. Can you please make sure that any other XFS bug fixes that SGI are sitting on get communicated to the appropriate venue so they can be addressed without undue delay? Thanks, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 17 19:38:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B7847F47 for ; Mon, 17 Aug 2015 19:38:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6431D304067 for ; Mon, 17 Aug 2015 17:38:46 -0700 (PDT) X-ASG-Debug-ID: 1439858323-04cb6c10d233270001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id HoZYp0qww5gXuffs for ; Mon, 17 Aug 2015 17:38:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ADEQALftJVPJ7tLHldgxuBPYJWg3yjPAEBAQEBAQabSAICAQECgTFNAQEBAQEBBwEBAQFAAT9BBYNeAQEEOhwjEAgDGAklDwUlAwcaE4gt0HkBAQgiGYYHhTKFCQeELAWVHYxpmiqENSwzgkwBAQE Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl6.internode.on.net with ESMTP; 18 Aug 2015 10:00:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRUnP-0002iZ-9D; Tue, 18 Aug 2015 10:30:31 +1000 Date: Tue, 18 Aug 2015 10:30:31 +1000 From: Dave Chinner To: Roger Willcocks Cc: xfs@oss.sgi.com Subject: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems Message-ID: <20150818003031.GG714@dastard> X-ASG-Orig-Subj: Re: [PATCH] v3 inodes are only valid on crc-enabled filesystems References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439858323 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 16, 2015 at 12:34:24PM +0100, Roger Willcocks wrote: > Fix an xfs_repair regression reported by Leslie Rhorer where a bad > (v3) inode version number was not reset. > > Signed-off-by: Roger Willcocks Hi Roger, Just a FYI - the patch has mangled whitespace: in it. > --- > db/check.c | 2 +- > include/libxfs.h | 2 +- > include/xfs_dinode.h | 10 +++++++++- > libxfs/xfs_inode_buf.c | 2 +- > repair/dinode.c | 7 +++---- > repair/prefetch.c | 2 +- > 6 files changed, 16 insertions(+), 9 deletions(-) > > diff --git a/db/check.c b/db/check.c > index c4c972f..b5c3b8e 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -2637,7 +2637,7 @@ process_inode( > error++; > return; > } > - if (!XFS_DINODE_GOOD_VERSION(idic.di_version)) { > + if (!xfs_dinode_good_version(mp, idic.di_version)) { > if (isfree || v) > dbprintf(_("bad version number %#x for inode %lld\n"), > idic.di_version, ino); All the patch hunks are missing the leading " " for non-modified lines. I've fixed it manually, but can you make sure future patches are not mangled? > -- > 2.5.0.rc0 IMO, it's best not to use development versions of git for anything other than testing.... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 17 19:41:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B46F7F47 for ; Mon, 17 Aug 2015 19:41:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4E368304067 for ; Mon, 17 Aug 2015 17:41:00 -0700 (PDT) X-ASG-Debug-ID: 1439858457-04cbb078e154840001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id dojMuH9otg3ynxTV for ; Mon, 17 Aug 2015 17:40:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DaCQBJftJVPJ7tLHldgxtUaYJWpzgBAQEBAQEGlVeFLUQEAgKBMU0BAQEBAQEHAQEBAUABP4QkAQEEOhwjEAgDDgoJJQ8FJQMHGhOILQ7QawEBAQEBBQEBAQEaBBmGB4UygnaCEweDGIEUBZUdhQSHZYFNhCuUMoI0HIFlLDMBAYJKAQEB Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Aug 2015 09:47:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRUac-0002hB-2A; Tue, 18 Aug 2015 10:17:18 +1000 Date: Tue, 18 Aug 2015 10:17:18 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Jan Tulak , xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150818001717.GF714@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150817193223.GE26222@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150817193223.GE26222@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1439858457 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 17, 2015 at 12:32:23PM -0700, Christoph Hellwig wrote: > On Mon, Aug 17, 2015 at 06:23:20PM +0200, Jan Tulak wrote: > > > +#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ > > +#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ > > Eww, looks like we depend on these Linux values in the on disk > defintion. I think we need to add new XFS_XATTR_SIZE_MAX and > XFS_XATTR_LIST_MAX defintions to xfs_format.h and use them where > we currently use these. Yeah, that looks like something we need to fix. > > +#define MREMAP_FIXED 1 > > +#define MREMAP_MAYMOVE 2 > > +static inline void *mremap(void *old_address, size_t old_size, > > + size_t new_size, int flags, ... /* void *new_address */) > > +{ > > + return NULL; > > +} > > + > > +/* FSR */ > > Please just build the mremap file in xfs_io conditional. Probably should be done on an autconf rule. > > > +typedef int __fsblkcnt_t; > > +typedef int __fsfilcnt_t; > > +typedef long long int __fsblkcnt64_t; > > +typedef long long int __fsfilcnt64_t; > > + > > +struct statvfs64 > > +{ > > + unsigned long int f_bsize; > > + unsigned long int f_frsize; > > + __fsblkcnt64_t f_blocks; > > + __fsblkcnt64_t f_bfree; > > + __fsblkcnt64_t f_bavail; > > + __fsfilcnt64_t f_files; > > + __fsfilcnt64_t f_ffree; > > + __fsfilcnt64_t f_favail; > > + unsigned long int f_fsid; > > + int __f_unused; > > + unsigned long int f_flag; > > + unsigned long int f_namemax; > > + int __f_spare[6]; > > +}; > > Does MacOS support statvfs? or statfs? We should use the proper API > here instead of a dummy. Or maybe just not build fsr on OSX for now, > as that would solve the fsetxattr issue as well. Apparently so: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/statfs.2.html Note that we'll need to define _DARWIN_USE_64_BIT_INODE for OS X to work correctly. > > +struct mntent > > +{ > > Another fsr issue, right? Seems like it would need similar getmntinfo > based code. As a stopgap I'd suggest we stop building fsr on OSX for > now. That can be based on the HAVE_MNTENT autoconf detection.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 17 21:14:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D88617F47 for ; Mon, 17 Aug 2015 21:14:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF5248F8035 for ; Mon, 17 Aug 2015 19:14:16 -0700 (PDT) X-ASG-Debug-ID: 1439864050-04cbb078e155f20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id o2dpZFelZPjYiPvt for ; Mon, 17 Aug 2015 19:14:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A8CgBRlNJVPJ7tLHldgxtUaYJWpzgBAQEBAQEGlVWCQ4MwBAICgTFNAQEBAQEBBwEBAQFAAT+EJAEBBDocIxAIAw4KCSUPBSUDBxoTiC0O0F8BAQEHAiAZhgeFMoQ+SweELAWVHYUEh2WCE5gXgjEDARuBZSwzAYEGJYEgAQEB Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl6.internode.on.net with ESMTP; 18 Aug 2015 11:44:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRWPg-0002ql-36; Tue, 18 Aug 2015 12:14:08 +1000 Date: Tue, 18 Aug 2015 12:14:08 +1000 From: Dave Chinner To: Leslie Rhorer Cc: Brian Foster , Eric Sandeen , Kris Rusocki , "Rhorer, Leslie" , "xfs@oss.sgi.com" Subject: Re: XFS File system in trouble Message-ID: <20150818021408.GH714@dastard> X-ASG-Orig-Subj: Re: XFS File system in trouble References: <20150728123307.GC38784@bfoster.bfoster> <55B79BFD.6020509@mygrande.net> <20150728221150.GA26604@bfoster.bfoster> <55BE7C75.4060604@mygrande.net> <55C06F41.4030502@mygrande.net> <20150804224240.GU16638@dastard> <55C8006C.8070807@mygrande.net> <55CC375C.10902@mygrande.net> <20150814012635.GT3902@dastard> <55CE75CA.5070506@mygrande.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55CE75CA.5070506@mygrande.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439864050 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21692 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 14, 2015 at 06:12:10PM -0500, Leslie Rhorer wrote: > > OK, try http://fletchergeek.com/images/md0.metadump.gz. It's only > about 18M. There's a very specific corruption that has occurred here. There are 7 inodes in a row (i.e. same 4k block) with the same corruption signature. Only the first inode has the version number corrupted, so that is the only one that is being picked up as corrupt on allocation, however. The pattern is that there are certain fields that have wacky values. The timestamps, the uid/gid, the projid_lo/hi, dmstate (completely unused field), the extent size and the generation number. The generation number is particularly interesting, because every inode in a chunk is stamped with the same number when the inode chunk is allocated on disk. The majority of the inodes in the chunk (which have no corruption) have a value of 0x93dc8d4. One of the corrupted inodes has a value of 0x7b4bada6, which if valid means the inode has been allocated and freed almost 2 billion times. That doesn't seem reasonable, especially as the other corrupted inodes also having generation cycle deltas of between 50 million and 1.2 billion I'm verymuch doubting these numbers are correct as it implies that these 7 inodes have run through almost 3.7 billion inode alloc/free cycles just by themselves. What's really interesting is this pattern shows up in most of the corrupted inodes: 600: 494e0000 02020000 00bdf700 00aa4ae8 00000000 005a4a00 00054800 00a94806 ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 620: 011cc1e5 3c3aa24c 1ca3ba8c 00a94800 004bf6a2 3868ff92 00000000 00000000 ^^^^ ^^^^ 640: 00000000 00000000 0087f500 00000000 00000002 00000000 004b0000 093880d4 ^^^^ ^^^^ ^^^^ All the highlighted bytes are ones that I can confirm are corrupt. They are all the middle 2 bytes of a 4 byte word, and they are all random garbage. The last four (of 7) corrupted inodes have the same corrupted bytes. The bytes have different values, but they all have, at minimum, the above bytes corrupted. The initial inode that was corrupted (with version = 3) has more corrupted bytes than the others, but the corruption follows a very similar pattern and is almost identical in inodes 2 and 3. Patterns of corruption like this don't come from software. All of the corruptions are in the first 64 byte cacheline of the inodes, and all have a very similar pattern of corruption and the corrupted byte values all appear to be random. Given that you initially said this: | I found the problem with md5sum (and probably nfs, as | well). One of the memory modules in the server was bad. The | problem with XFS persists. Every time tar tried to create the | directory: That's what caused the corruption on disk. XFS has validated the buffer while it was hot in the CPU cache, and when submitted to the hardware to DMA it to disk it first has to be written back to memory. That inode buffer page happened to span the bad memory location and so the inodes were corrupted on their way to disk by the bad memory. Not a software bug, but a clear demonstration of why we consider metadata CRCs very important. On a v5 filesystem, this type of metadata corruption will show up as a CRC failure, and hence we'll know straight away that the likely cause is a hardware issue.... And to close the loop, I have confirmed that Roger's patch fixes repair - it detects the bad inode and fixes it (tested against xfsprogs 4.2.0-rc1). Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Mon Aug 17 22:57:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF8F429DF5 for ; Mon, 17 Aug 2015 22:57:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DFE2D30405F for ; Mon, 17 Aug 2015 20:57:27 -0700 (PDT) X-ASG-Debug-ID: 1439870245-04cbb078e457730001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2dLtBAiMs2W7ry74 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 20:57:26 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 7E7CA98C25; Tue, 18 Aug 2015 03:57:25 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7I3vN4D007222; Mon, 17 Aug 2015 23:57:24 -0400 Date: Tue, 18 Aug 2015 11:57:22 +0800 From: Eryu Guan To: Tejun Heo Cc: axboe@fb.com, jack@suse.cz, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150818035722.GA17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813232400.GH4496@mtj.duckdns.org> <20150814061939.GK17933@dhcp-13-216.nay.redhat.com> <20150817202709.GJ21075@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150817202709.GJ21075@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439870246 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 17, 2015 at 04:27:09PM -0400, Tejun Heo wrote: > Hello, Eryu. > > lol that wasn't supposed to fix the problem you were seeing. Can you > please apply the following patch and see whether any warning triggers? Sure, will do. > Also, you aren't using lazytime, right? Correct, I'm not using lazytime. Thanks, Eryu From eguan@redhat.com Tue Aug 18 00:31:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 744877F47 for ; Tue, 18 Aug 2015 00:31:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 104A6AC005 for ; Mon, 17 Aug 2015 22:31:12 -0700 (PDT) X-ASG-Debug-ID: 1439875871-04bdf051fc59990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v8PMwd5X2ypU2Ok8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Aug 2015 22:31:12 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id BA45D8EA2B; Tue, 18 Aug 2015 05:31:11 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7I5VAjO011357; Tue, 18 Aug 2015 01:31:10 -0400 Date: Tue, 18 Aug 2015 13:31:09 +0800 From: Eryu Guan To: Tejun Heo Cc: axboe@fb.com, linux-fsdevel@vger.kernel.org, jack@suse.cz, xfs@oss.sgi.com Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Message-ID: <20150818053109.GB17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813232400.GH4496@mtj.duckdns.org> <20150814061939.GK17933@dhcp-13-216.nay.redhat.com> <20150817202709.GJ21075@mtj.duckdns.org> <20150818035722.GA17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818035722.GA17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439875872 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 18, 2015 at 11:57:22AM +0800, Eryu Guan wrote: > On Mon, Aug 17, 2015 at 04:27:09PM -0400, Tejun Heo wrote: > > Hello, Eryu. > > > > lol that wasn't supposed to fix the problem you were seeing. Can you > > please apply the following patch and see whether any warning triggers? > > Sure, will do. Still no warning triggered, and test passed too with this patch. Test patch applied on top of 4.2-rc6, ran generic/048 generic/049 20 times in loop. Thanks, Eryu From damien.wyart@gmail.com Tue Aug 18 00:33:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D94E47F47 for ; Tue, 18 Aug 2015 00:33:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ABDED8F8037 for ; Mon, 17 Aug 2015 22:33:11 -0700 (PDT) X-ASG-Debug-ID: 1439875989-04bdf051fc59a00001-NocioJ Received: from maiev.nerim.net (smtp-151-monday.nerim.net [194.79.134.151]) by cuda.sgi.com with ESMTP id zd0xjR1RwX2kxr6z for ; Mon, 17 Aug 2015 22:33:09 -0700 (PDT) X-Barracuda-Envelope-From: damien.wyart@gmail.com X-Barracuda-Apparent-Source-IP: 194.79.134.151 Received: from brouette (damien.wyart.pck.nerim.net [213.41.145.138]) by maiev.nerim.net (Postfix) with ESMTP id 6D7742E008; Tue, 18 Aug 2015 07:33:08 +0200 (CEST) Received: by brouette (Postfix, from userid 1000) id 36A5F380125E; Tue, 18 Aug 2015 07:33:08 +0200 (CEST) Date: Tue, 18 Aug 2015 07:33:08 +0200 From: Damien Wyart To: Tejun Heo Cc: Jan Kara , Jens Axboe , Eryu Guan , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150818053308.GA3629@brouette> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150814151401.GA6906@brouette> <20150817200034.GF21075@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150817200034.GF21075@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: smtp-151-monday.nerim.net[194.79.134.151] X-Barracuda-Start-Time: 1439875989 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21696 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > > I had an unstable system when running latest Linus tree with Tejun's > > patch applied on top. Nothing fishy in the logs after rebooting without > > the patch, but remote access with ssh when patch applied did not work > > (as if /home partition could not be read). This system has / as ext4 and > > other partitions (including /home) as XFS. Trying to login on tty > > instead of X resulted in hang of X. I could reboot with sysrq, but can't > > do further tests at the moment. > > Back to same tree without the patch resulted in normal system. > > So just a heads up the patch doesn't seem OK in its current state. Hi Tejun, > Have you been able to reproduce the failure? That sounds like an > unlikely failure mode for the patch. Unfortunately (as it would be nice to understand what happened), no. I reapplied the patch on top of rc7 and could not reproduce the unstability after several reboots. I will continue running with the patch and report if anything strange appears again... -- Damien From jtulak@redhat.com Tue Aug 18 01:49:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 15CCE7F50 for ; Tue, 18 Aug 2015 01:49:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC415304043 for ; Mon, 17 Aug 2015 23:49:47 -0700 (PDT) X-ASG-Debug-ID: 1439880583-04cbb078e259e40001-NocioJ Received: from mail-io0-f174.google.com (mail-io0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id yruyFx8sybDYOO5t (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Aug 2015 23:49:43 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iodb91 with SMTP id b91so177778927iod.1 for ; Mon, 17 Aug 2015 23:49:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=SeQe2wqLztGcixepeH3jH8Dit3Tf1jKl158xWkKw8eQ=; b=ehpo2US91RtV/XCYD+OFDM4/ZZ8SxlTBxgvZxraA9hiAYgFWTQF1W6Um03BtfAiHTv +1wBHs+tgbXEvkKKOPC7WKQqAXg0RQmRC00frDDgCZn98ghGFuQkGs08rQBl650Y6UV0 8JQ1PKAvkq09OGvA5LNfW3eT/rAqSHx3JExQzGY64oNbSDUufOkCOl9s54qh3qajioxF DHWFobcsQiAV/e3MYv5Akex4QN2eFrEMUSH0qgCiJ9TQqNpwJZLxZYDV+WJ6Wyr/7skV 2eA10Zj3IOhovZS6q8VAEIM2VjubYbu+C6PuuSaJa4SinrzbrnbbmZrDgkF11jhCURhg aPZQ== X-Gm-Message-State: ALoCoQnGtIbXGHvrusAHxEnIRAaFiWhW60yKSPBKVj9GWwRFdyltjpjfK+h9vnUBee2Gd4/S5oId X-Received: by 10.107.151.66 with SMTP id z63mr4774134iod.46.1439880582820; Mon, 17 Aug 2015 23:49:42 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Mon, 17 Aug 2015 23:49:23 -0700 (PDT) In-Reply-To: <20150817192300.GC26222@infradead.org> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-3-git-send-email-jtulak@redhat.com> <20150817192300.GC26222@infradead.org> From: Jan Tulak Date: Tue, 18 Aug 2015 08:49:23 +0200 Message-ID: Subject: Re: [PATCH 02/11] xfsprogs: Add ifdef dirent checks where it was missing To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 02/11] xfsprogs: Add ifdef dirent checks where it was missing Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a1140f3a6a899fb051d905288 X-Barracuda-Connect: mail-io0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1439880583 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a1140f3a6a899fb051d905288 Content-Type: text/plain; charset=UTF-8 On Mon, Aug 17, 2015 at 9:23 PM, Christoph Hellwig wrote: > > Looks fine, > > Reviewed-by: Christoph Hellwig > Thanks. > > (and didn't I review this one previously?) > I think not this last iteration, with the d_reclen approximation. Or at least I didn't get any reply to that. Cheers, Jan -- Jan Tulak jtulak@redhat.com --001a1140f3a6a899fb051d905288 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Mon, Aug 17, 2015 at 9:23 PM, Christoph Hellwig &l= t;hch@infradead.org<= /a>> wrote:
Looks fine,

Reviewed-by: Christoph Hellwig <
hch@lst.de>

Thanks.
=C2=A0

(and didn't I review this one previously?)

I think not this la= st iteration, with the=C2=A0d_reclen approximation. Or at least I didn't get any reply to that.<= /span>

Cheers,
Jan

--
--001a1140f3a6a899fb051d905288-- From david@fromorbit.com Tue Aug 18 02:02:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F7C27F50 for ; Tue, 18 Aug 2015 02:02:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22B688F8037 for ; Tue, 18 Aug 2015 00:02:12 -0700 (PDT) X-ASG-Debug-ID: 1439881329-04bdf051fa5af70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id n7tPkgxZ3prvtQEy for ; Tue, 18 Aug 2015 00:02:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlCgCJ19JVPJ7tLHldgxuBPYJWg3yjPgEBAQEBAQabSAICAQECgS1NAQEBAQEBBwEBAQFAAT+EJAEBBDocIxAIAxgJJQ8FJQMHGhOILdBWAQEBBwIBHxmGB4UyhQkHhCwFjF6IP4dwhHmaKoIxAxyBZSwzgkwBAQE Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl6.internode.on.net with ESMTP; 18 Aug 2015 16:23:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRamD-0003EK-72; Tue, 18 Aug 2015 16:53:41 +1000 Date: Tue, 18 Aug 2015 16:53:41 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing Message-ID: <20150818065341.GI714@dastard> X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing References: <55C43FBA.1080408@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55C43FBA.1080408@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439881329 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 06, 2015 at 10:18:50PM -0700, Eric Sandeen wrote: > mkfs.xfs got weird along the way; today it has different outcomes > depending on the order of option specification: > > $ mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g > cannot specify both crc and ftype > $ mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g > > > Somehow the tests got written as being constrained on what options > are specified - and in what order! - vs actually testing for > incompatible feature sets. > > It's fine to specify both crc & ftype options, as long as it's an > allowed combination, so just test for the incompatible combination > (crc=1 and ftype=0) after all options have been processed. > > Signed-off-by: Eric Sandeen Did you test this, Eric? $ mkfs.xfs /dev/sdc cannot disable ftype with crcs enabled Usage: mkfs.xfs /* blocksize */ [-b log=n|size=num] ..... > --- > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 69d61c7..9042796 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1477,11 +1477,6 @@ main( > if (c < 0 || c > 1) > illegal(value, "m crc"); > crcs_enabled = c; > - if (nftype && crcs_enabled) { > - fprintf(stderr, > -_("cannot specify both crc and ftype\n")); > - usage(); > - } > break; > case M_FINOBT: > if (!value || *value == '\0') > @@ -1555,11 +1550,6 @@ _("cannot specify both crc and ftype\n")); > if (nftype) > respec('n', nopts, N_FTYPE); > dirftype = atoi(value); > - if (crcs_enabled) { > - fprintf(stderr, > -_("cannot specify both crc and ftype\n")); > - usage(); > - } > nftype = 1; > break; > default: > @@ -1714,6 +1704,10 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), > XFS_MIN_CRC_BLOCKSIZE); > usage(); > } > + if (crcs_enabled && !dirftype) { > + fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); > + usage(); > + } nftype = dirftype = 0; /* inode type information in the dir */ So we enable crcs by default and do not enable dirftype/nftype by default, and so by default mkfs now fails. I'll fix it to always default to ftype=1 for both v4 and v5 filesystems as there is no go reason not to enable it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jtulak@redhat.com Tue Aug 18 02:04:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DEF847F50 for ; Tue, 18 Aug 2015 02:04:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE84B8F8040 for ; Tue, 18 Aug 2015 00:04:45 -0700 (PDT) X-ASG-Debug-ID: 1439881483-04cbb078e35a2c0001-NocioJ Received: from mail-io0-f172.google.com (mail-io0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id yWljujzqYxaws7ax (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Aug 2015 00:04:44 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iodt126 with SMTP id t126so179351436iod.2 for ; Tue, 18 Aug 2015 00:04:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=l/5wPYEjaWmyS+blf4NleouRvcgscP+E/qn9VuswcPo=; b=IcnZzNvdSJnHRGk3ny3hZgsMkgFNpgiPkZjFI2hkPT/e/o8BxswXEAfEL2K5leDPjI 0BK9PKORId+ZD8is6swObSMmJfOpR2o/0d6wDowSR1F+09knl7q41H1+GvJeNlR1uDTE qbecpupf6/njNmPeo2CRvpL1F40YQYuEo/xRUEPR2lmfsi36ejp4g1ElMwr/I4vVV1RN PY9iMK8CpfXZPlO/jpnUDFR2RubOdCfilfeXtisR+j4QnUuxpHn1zoTCjKbH0R10wVbc JbAjISRCTS8qkpl7xSQbhu+SCM5GtP7UWaCaSFiFV9wScCCdFy93kGyD/MCcT9o+7+bO 7vSw== X-Gm-Message-State: ALoCoQmorirv8P7115AGELx2AZt/skska8MwrVyxQr0vz/P2Q1fO8jwrppeI58nkrRWm0i9SAPwh X-Received: by 10.107.133.213 with SMTP id p82mr6670061ioi.71.1439881483709; Tue, 18 Aug 2015 00:04:43 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Tue, 18 Aug 2015 00:04:24 -0700 (PDT) In-Reply-To: <20150817193624.GA8444@infradead.org> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-9-git-send-email-jtulak@redhat.com> <20150817193624.GA8444@infradead.org> From: Jan Tulak Date: Tue, 18 Aug 2015 09:04:24 +0200 Message-ID: Subject: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Cc: xfs-oss Content-Type: multipart/alternative; boundary=001a113ece145b33a7051d90883f X-Barracuda-Connect: mail-io0-f172.google.com[209.85.223.172] X-Barracuda-Start-Time: 1439881484 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a113ece145b33a7051d90883f Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Mon, Aug 17, 2015 at 9:36 PM, Christoph Hellwig wrote: > On Mon, Aug 17, 2015 at 06:23:23PM +0200, Jan Tulak wrote: > > Memalign from was marked obsolete in favor of a posix > > variant from . So replace all calls and remove > > includes. This also enhances support on other posix platforms, > > which doesn't have . > > > > Because posix_memalign returns any error as a return code, not in > > errno, change relevant checks in code (and add a missing one). > > I have to say I hate the posix_memalign calling convention. Any chance > you could just provide a memalign impementation using posix_memalign for > MacOS? > I thought about it. However, with memalign from malloc marked obsolete (and with posix_memalign having guaranteed alignment restrictions [1]), I saw it better to use the posix variant everywhere. I could make a wrapper simulating the old memalign behaviour, but I don't think it would make sense. I searched for this, but didn't find any reasonable answer: How long can be things in standard libraries marked obsolete before removing? Cheers, Jan [1] man memalign: On many systems there are alignment restrictions, for example, on buf=E2=80=90 fers used for direct block device I/O. POSIX specifies the path=E2=80=90 conf(path,_PC_REC_XFER_ALIGN) call that tells what alignment is needed. Now one can use posix_memalign() to satisfy this requirement. posix_memalign() verifies that alignment matches the requirements detailed above. memalign() may not check that the alignment argument is correct. --=20 Jan Tulak jtulak@redhat.com --001a113ece145b33a7051d90883f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable



=C2=A0 =C2=A0 =C2=A0 =C2=A0On many systems there are alignment restri= ctions, for example, on =C2=A0buf=E2=80=90
=C2=A0 =C2=A0 =C2=A0 = =C2=A0fers =C2=A0used =C2=A0for =C2=A0direct =C2=A0block =C2=A0device =C2= =A0I/O.=C2=A0 POSIX specifies the path=E2=80=90
=C2=A0 =C2=A0 =C2= =A0 =C2=A0conf(path,_PC_REC_XFER_ALIGN) call that tells what alignment is n= eeded.
=C2=A0 =C2=A0 =C2=A0 =C2=A0Now one can use posix_memalign(= ) to satisfy this requirement.


--
--001a113ece145b33a7051d90883f-- From jtulak@redhat.com Tue Aug 18 03:00:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 751487F50 for ; Tue, 18 Aug 2015 03:00:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EBFC6AC00B for ; Tue, 18 Aug 2015 01:00:12 -0700 (PDT) X-ASG-Debug-ID: 1439884811-04bdf051fc5c310001-NocioJ Received: from mail-ig0-f170.google.com (mail-ig0-f170.google.com [209.85.213.170]) by cuda.sgi.com with ESMTP id yuLEw6ZHcFemxO4r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Aug 2015 01:00:11 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igui7 with SMTP id i7so73943924igu.0 for ; Tue, 18 Aug 2015 01:00:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=MgZBDZ5ASyrTL7jakPFlcFJp52DY2zamfsCbRqNMl3I=; b=KML7mgzganFvFTfjhLdK6OqFT/kLSRFi+KlHf4Mfp0MnoDZ7aUgjJkpfjl22lbodiu KUAqAaeT49XOlWQWF6r+6kbQBWs9bTwkzPxMsi+rz9cWsxN9BZ3KtJXe8TFD04o9viom h/xM9GBLGXAoFKClxz0RIVigJ9bJQDK4mo3nx6U8daDHQFo3vDWwmZpsn81uGje3T598 hSLRPyyIHDhkRSOCmU4f1dTy7u3Yf31b3l/YmJl8z6UyIYcoCASre4Z04f/dg5OODfvL xzEqr2L/4/9YQQfoKSBUtfjs5vjM9v70J2vOn44Z6gwPgFDzbeVxSCt7AKvoCQpmwXBa JafQ== X-Gm-Message-State: ALoCoQnr3e1Xrdmp7vt1CzntW/sSDTLFzExzKhXQ4kGqZxDmmEsb9/kqdccubE7EqTJSRFInA9Wn X-Received: by 10.50.79.162 with SMTP id k2mr2044733igx.93.1439884810839; Tue, 18 Aug 2015 01:00:10 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Tue, 18 Aug 2015 00:59:51 -0700 (PDT) In-Reply-To: <20150817193913.GD8444@infradead.org> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-12-git-send-email-jtulak@redhat.com> <20150817193913.GD8444@infradead.org> From: Jan Tulak Date: Tue, 18 Aug 2015 09:59:51 +0200 Message-ID: Subject: Re: [PATCH 11/11] xfsprogs: Add a way to compile without blkid To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 11/11] xfsprogs: Add a way to compile without blkid Cc: xfs-oss Content-Type: multipart/alternative; boundary=089e01160a02ab0b8e051d914e5f X-Barracuda-Connect: mail-ig0-f170.google.com[209.85.213.170] X-Barracuda-Start-Time: 1439884811 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21698 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e01160a02ab0b8e051d914e5f Content-Type: text/plain; charset=UTF-8 On Mon, Aug 17, 2015 at 9:39 PM, Christoph Hellwig wrote: > On Mon, Aug 17, 2015 at 06:23:26PM +0200, Jan Tulak wrote: > > UPDATE: default to "signature found", so without blkid is > > -f mandatory. > > Belongs in the cover letter, not this patch. > I forgot to remove it from the patch, sorry for that. > > > } else > > ft->psectorsize = ft->lsectorsize = BBSIZE; > > } else { > > +#ifdef ENABLE_BLKID > > blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, > > &ft->lsectorsize, &ft->psectorsize, > > force_overwrite); > > +#endif /* ENABLE_BLKID */ > > } > > > > if (xi->rtname && !xi->risfile) { > > int sunit, lsectorsize, psectorsize; > > > > +#ifdef ENABLE_BLKID > > blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth, > > &lsectorsize, &psectorsize, > force_overwrite); > > +#endif /* ENABLE_BLKID */ > > I think you need to proide a dummy blkid_get_topology which at least > sets the two sector sizes to 512. > I don't think so. blkid_get_topology is used only for block devices, not when mkfs-ing a file. And there are multiple further issues with mkfs on OS X with system calls, so such dummy call would be for no use. Although, when I think about it, removing few ifdef would certainly make the code cleaner, so I think I can make a dummy call for this reason. Cheers, Jan -- Jan Tulak jtulak@redhat.com --089e01160a02ab0b8e051d914e5f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On M= on, Aug 17, 2015 at 9:39 PM, Christoph Hellwig <hch@infradead.org><= /span> wrote:
On Mon, Aug 17, 2015 = at 06:23:26PM +0200, Jan Tulak wrote:
> UPDATE: default to "signature found", so without blkid is >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-f mandatory.

Belongs in the cover letter, not this patch.
I forgot to remove it from the patch, sorry for that.
=C2=A0

>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} else
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0ft->psectorsize =3D ft->lsectorsize =3D BBSIZE;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
> +#ifdef ENABLE_BLKID
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0blkid_get_topolo= gy(dfile, &ft->dsunit, &ft->dswidth,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &ft->lsectorsize, &= amp;ft->psectorsize,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 force_overwrite);
> +#endif /* ENABLE_BLKID */
>=C2=A0 =C2=A0 =C2=A0 =C2=A0}
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0if (xi->rtname && !xi->risfile= ) {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int sunit, lsect= orsize, psectorsize;
>
> +#ifdef ENABLE_BLKID
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0blkid_get_topolo= gy(xi->rtname, &sunit, &ft->rtswidth,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &lsectorsize, &pse= ctorsize, force_overwrite);
> +#endif /* ENABLE_BLKID */

I think you need to proide a dummy blkid_get_topology which at least=
sets the two sector sizes to 512.

I don= 't think so. blkid_get_topology is used only for block devices, not
when mkfs-ing a file. And there are multiple further issues with mkf= s
on OS X with system calls, so such dummy call would be for no u= se.

Although, when I think about it, removing few = ifdef would certainly make the code
cleaner, so I think I can mak= e a dummy call for this reason.=C2=A0

Cheers,
Jan

--
--089e01160a02ab0b8e051d914e5f-- From david@fromorbit.com Tue Aug 18 03:21:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0EA927F50 for ; Tue, 18 Aug 2015 03:21:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2B7930405F for ; Tue, 18 Aug 2015 01:20:56 -0700 (PDT) X-ASG-Debug-ID: 1439886054-04bdf051fb5ca70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id PDG6RzRgnORKYOPZ for ; Tue, 18 Aug 2015 01:20:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BmCgB/6tJVPJ7tLHldgxuBPYJWg3yjQQEBAQEBAQabSAICAQECgS1NAQEBAQEBBwEBAQFAAT+EIwEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiCYH0EIBAQgCAR8ZhgeFMoUJB4QsBYcehmuHFIxpjmOLR4Q1LDOCTAEBAQ Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl6.internode.on.net with ESMTP; 18 Aug 2015 17:50:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRc8U-0003QG-H1; Tue, 18 Aug 2015 18:20:46 +1000 Date: Tue, 18 Aug 2015 18:20:46 +1000 From: Dave Chinner To: Jan Tulak Cc: Christoph Hellwig , xfs-oss Subject: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Message-ID: <20150818082046.GK714@dastard> X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-9-git-send-email-jtulak@redhat.com> <20150817193624.GA8444@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1439886054 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 18, 2015 at 09:04:24AM +0200, Jan Tulak wrote: > On Mon, Aug 17, 2015 at 9:36 PM, Christoph Hellwig > wrote: > > > On Mon, Aug 17, 2015 at 06:23:23PM +0200, Jan Tulak wrote: > > > Memalign from was marked obsolete in favor of a posix > > > variant from . So replace all calls and remove > > > includes. This also enhances support on other posix platforms, > > > which doesn't have . > > > > > > Because posix_memalign returns any error as a return code, not in > > > errno, change relevant checks in code (and add a missing one). > > > > I have to say I hate the posix_memalign calling convention. Any chance > > you could just provide a memalign impementation using posix_memalign for > > MacOS? > > > > I thought about it. However, with memalign from malloc marked obsolete > (and with posix_memalign having guaranteed alignment restrictions [1]), I > saw it better > to use the posix variant everywhere. Putting a sane wrapper around an nasty library function is just fine. The memalign wrapper makes sense from this perspective - even gcc can't tell if variables passed to posix_memalign are correctly initialised or not, whereas no such problems exist for memalign(). > I could make a wrapper simulating the old memalign behaviour, but I don't > think it would make sense. I think it makes more sense than using posix_memalign() everywhere and then ignoring the return variable that tells you it failed... > I searched for this, but didn't find any reasonable answer: > How long can be things in standard libraries marked obsolete before > removing? With a wrapper, we don't care. > [1] man memalign: > On many systems there are alignment restrictions, for example, on buf- > fers used for direct block device I/O. POSIX specifies the path- > conf(path,_PC_REC_XFER_ALIGN) call that tells what alignment is needed. > Now one can use posix_memalign() to satisfy this requirement. > > posix_memalign() verifies that alignment matches the requirements > detailed above. memalign() may not check that the alignment argument > is correct. Yes, you can get it wrong with memalign. But we don't, because we follow the rules for DIO buffer alignment and set it correctly. Being able to directly control the alignment of the memory buffer is a reason for using memalign() over posix_memalign(), not the other way around. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jtulak@redhat.com Tue Aug 18 03:34:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C99B57F50 for ; Tue, 18 Aug 2015 03:34:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 638BEAC009 for ; Tue, 18 Aug 2015 01:34:11 -0700 (PDT) X-ASG-Debug-ID: 1439886849-04bdf051fc5cf30001-NocioJ Received: from mail-io0-f174.google.com (mail-io0-f174.google.com [209.85.223.174]) by cuda.sgi.com with ESMTP id OX5biR69DPJrhFfN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Aug 2015 01:34:09 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iods203 with SMTP id s203so180923972iod.0 for ; Tue, 18 Aug 2015 01:34:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=ILlO9LN2CIQ69tNusqExHP6OY45QgUh0cAKxLF6e5go=; b=OCzQQ+Tv2QgNY36lGC0wkMy8VIjvz9M68oL4K1n7nLxMwa++IvQtfyvyJ19A4X9DmX /8Qa3PiZtgUrOU2NMEFfpNWYFDMXmEVkNYaK881yI2A8J5KPvkWpyfRlUBL3rixOxDl/ cE5tezGSvftsSKgDfUR/AAkxZvYmjDjrgq+dzPpYw0g30oHnflvq8cs3AjA27OKj7Nn6 7S0mB4UPY0fqMhbc1EmLVWgxezukJuOIUuwQKaarFdgRQATm0VRxbmSUWpqOHipBOza3 tMCmfQcjfvEJyQatr8GwGYtNqVcJ7MZuMXVNlsbt7Vz9EPNXVdf5mzgCOq/0d7xmJAgE bq+Q== X-Gm-Message-State: ALoCoQkSTAuvSCopL5qcPepPtEPDTHSestK7NZhXRNb17TpAynqxgv6zFLPlqJapzcLAyG5XRih2 X-Received: by 10.107.133.213 with SMTP id p82mr7254884ioi.71.1439886849098; Tue, 18 Aug 2015 01:34:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Tue, 18 Aug 2015 01:33:49 -0700 (PDT) In-Reply-To: <20150818082046.GK714@dastard> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-9-git-send-email-jtulak@redhat.com> <20150817193624.GA8444@infradead.org> <20150818082046.GK714@dastard> From: Jan Tulak Date: Tue, 18 Aug 2015 10:33:49 +0200 Message-ID: Subject: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Cc: Christoph Hellwig , xfs-oss Content-Type: multipart/alternative; boundary=001a113ece14286376051d91c857 X-Barracuda-Connect: mail-io0-f174.google.com[209.85.223.174] X-Barracuda-Start-Time: 1439886849 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a113ece14286376051d91c857 Content-Type: text/plain; charset=UTF-8 On Tue, Aug 18, 2015 at 10:20 AM, Dave Chinner wrote: > On Tue, Aug 18, 2015 at 09:04:24AM +0200, Jan Tulak wrote: > > I thought about it. However, with memalign from malloc marked obsolete > > (and with posix_memalign having guaranteed alignment restrictions [1]), I > > saw it better > > to use the posix variant everywhere. > > Putting a sane wrapper around an nasty library function is just > fine. The memalign wrapper makes sense from this perspective - even > gcc can't tell if variables passed to posix_memalign are correctly > initialised or not, whereas no such problems exist for memalign(). > > > I could make a wrapper simulating the old memalign behaviour, but I don't > > think it would make sense. > > I think it makes more sense than using posix_memalign() everywhere > and then ignoring the return variable that tells you it failed... > > > I searched for this, but didn't find any reasonable answer: > > How long can be things in standard libraries marked obsolete before > > removing? > > With a wrapper, we don't care. > > > [1] man memalign: > > On many systems there are alignment restrictions, for example, on > buf- > > fers used for direct block device I/O. POSIX specifies the > path- > > conf(path,_PC_REC_XFER_ALIGN) call that tells what alignment is > needed. > > Now one can use posix_memalign() to satisfy this requirement. > > > > posix_memalign() verifies that alignment matches the > requirements > > detailed above. memalign() may not check that the alignment > argument > > is correct. > > Yes, you can get it wrong with memalign. But we don't, because we > follow the rules for DIO buffer alignment and set it correctly. > Being able to directly control the alignment of the memory buffer is > a reason for using memalign() over posix_memalign(), not the other > way around. > So a wrapper used on all platforms is an acceptable solution? All right, this explanation makes sense. I will change it that way. The only question I have now is whether to use posix_memalign on every platform, or whether to make it platform_memalign and use the old memalign inside for Linux. Cheers, Jan -- Jan Tulak jtulak@redhat.com --001a113ece14286376051d91c857 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Tue, Aug 18, 2015 at 10:20 AM, Dave Chinner <david@fromorbit.com<= /a>> wrote:
On= Tue, Aug 18, 2015 at 09:04:24AM +0200, Jan Tulak wrote:
> I thought about it. However, with memalign from malloc marked obsolete=
> (and with posix_memalign having guaranteed alignment restrictions [1])= , I
> saw it better
> to use the posix variant everywhere.

Putting a sane wrapper around an nasty library function is just
fine. The memalign wrapper makes sense from this perspective - even
gcc can't tell if variables passed to posix_memalign are correctly
initialised or not, whereas no such problems exist for memalign().

> I could make a wrapper simulating the old memalign behaviour, but I do= n't
> think it would make sense.

I think it makes more sense than using posix_memalign() everywhere and then ignoring the return variable that tells you it failed...

> I searched for this, but didn't find any reasonable answer:
> How long can be things in standard libraries marked obsolete before > removing?

With a wrapper, we don't care.

> [1] man memalign:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 On many systems there are alignment restric= tions, for example, on buf-
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 fers=C2=A0 used=C2=A0 for=C2=A0 direct=C2= =A0 block=C2=A0 device=C2=A0 I/O.=C2=A0 POSIX specifies the path-
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 conf(path,_PC_REC_XFER_ALI= GN) call that tells what alignment is needed.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 Now one can use posix_memalign() to satisfy= this requirement.
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 posix_memalign()=C2=A0 verifies=C2=A0 that= =C2=A0 alignment=C2=A0 matches=C2=A0 the=C2=A0 requirements
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 detailed above.=C2=A0 memalign() may not ch= eck that the=C2=A0 alignment argument
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 is correct.

Yes, you can get it wrong with memalign. But we don't, because w= e
follow the rules for DIO buffer alignment and set it correctly.
Being able to directly control the alignment of the memory buffer is
a reason for using memalign() over posix_memalign(), not the other
way around.

So a wrapper used on all pl= atforms is an acceptable solution?=C2=A0All right,=C2=A0
this explanation makes sense.= =C2=A0<= /span>I will change it that way. The only question
I have now is = whether to use posix_memalign on every platform, or whether to
ma= ke it platform_memalign and use the old memalign inside=C2=A0for Linux.
=
Cheers,
Jan

--
--001a113ece14286376051d91c857-- From jtulak@redhat.com Tue Aug 18 04:15:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57A7A7F50 for ; Tue, 18 Aug 2015 04:15:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4726E30405F for ; Tue, 18 Aug 2015 02:15:06 -0700 (PDT) X-ASG-Debug-ID: 1439889304-04cb6c10d33b740001-NocioJ Received: from mail-io0-f171.google.com (mail-io0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id uDUOZQySYFUD1haN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Aug 2015 02:15:04 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iodt126 with SMTP id t126so182441435iod.2 for ; Tue, 18 Aug 2015 02:15:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=ltuHbqS9oRgLHi1YId+/yH3xbh3Ke1WcW/LIIaA4hlU=; b=UL+t322Amle3zJffYIFRevhj6HJgckAmVF50zLD1DAi3zmdxyl2EhaeB5jxlS8SwRY qKnpXsY1yusQnoQsQPjW9nHuEpeCcOB7g64szPStpDngNOvVSNRltjBBtq2p10a+2TbI b/B3GWrTOLEtC8MoQ0yzM8lXlpfIusxwU1SY8b3r1gvmx44O+gfvDCgU47yOFXv4Zlaa 5lopsi+2OxdOcQ2CRruwTTsE+MezNFwygjRQOG8/427Tx6r2HypkzYfRkPNtlf4CTo76 19/JDAL2sgYm6B5viRl0v/tyMN9wRTvU8G6ccr0UoTTIGvRpr1On1nWtSLHU88s+f5Qx OJqA== X-Gm-Message-State: ALoCoQnc+1P821GreNQHwl8yacT3AK504hUs37wCzlKhYvYY6IOMAk/jAFz+Wes31aLv9IOb8Az2 X-Received: by 10.107.151.66 with SMTP id z63mr5470027iod.46.1439889304217; Tue, 18 Aug 2015 02:15:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Tue, 18 Aug 2015 02:14:44 -0700 (PDT) In-Reply-To: <20150817215549.GD714@dastard> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <20150817215549.GD714@dastard> From: Jan Tulak Date: Tue, 18 Aug 2015 11:14:44 +0200 Message-ID: Subject: Re: [PATCH 00/11] xfsprogs: Partial OS X support To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 00/11] xfsprogs: Partial OS X support Cc: xfs-oss , Christoph Hellwig Content-Type: multipart/alternative; boundary=001a1140f3a67e8aee051d925a42 X-Barracuda-Connect: mail-io0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1439889304 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a1140f3a67e8aee051d925a42 Content-Type: text/plain; charset=UTF-8 On Mon, Aug 17, 2015 at 11:55 PM, Dave Chinner wrote: > On Mon, Aug 17, 2015 at 06:23:15PM +0200, Jan Tulak wrote: > > This is a third iteration of OS X support patches. Notes with > information about > > changes in every patch since the last bulk submittation (or at least the > last > > iteration of that patch) follows. > > What version of the patches are these? I see some patches in > previous thread with "v4" on them, so I don't know whether they are > more recent than these or not. > > FWIW, I'm not picking on you; I'm trying to explain what I see and > why it makes it difficult for me to work out what is going on so you > understand why I might be asking for specific information. Nobody > explains this stuff to new developers; you pick it up through trial > an error, and emails like this :/ > Thank you much for this email - without someone providing me a feedback, I would have just a little hope of getting better. :-) Next patches should be versioned and changelogged better. Cheers, Jan -- Jan Tulak jtulak@redhat.com --001a1140f3a67e8aee051d925a42 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Mon, Aug 17, 2015 at 11:55 PM, Dave Chinner <david@fromorbit.com<= /a>> wrote:
On= Mon, Aug 17, 2015 at 06:23:15PM +0200, Jan Tulak wrote:
> This is a third iteration of OS X support patches. Notes with informat= ion about
> changes in every patch since the last bulk submittation (or at least t= he last
> iteration of that patch) follows.

What version of the patches are these? I see some patches in
previous thread with "v4" on them, so I don't know whether th= ey are
more recent than these or not.

FWIW, I'm not picking on you; I'm trying to explain what I see and<= br> why it makes it difficult for me to work out what is going on so you
understand why I might be asking for specific information. Nobody
explains this stuff to new developers; you pick it up through trial
an error, and emails like this :/

Thank= you much for this email - without someone providing me a feedback,
I would have just a little hope of getting better. :-)
Next pa= tches should be versioned and changelogged better.

=
Cheers,
Jan

--
--001a1140f3a67e8aee051d925a42-- From jack@suse.cz Tue Aug 18 04:16:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 342897F50 for ; Tue, 18 Aug 2015 04:16:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 21BCA30405F for ; Tue, 18 Aug 2015 02:16:13 -0700 (PDT) X-ASG-Debug-ID: 1439889367-04cb6c10cd3b7a0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id SaIdsbQ2ILF6gKrb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Aug 2015 02:16:10 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 52B77AC4A; Tue, 18 Aug 2015 09:16:07 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 7190482823; Tue, 18 Aug 2015 11:16:03 +0200 (CEST) Date: Tue, 18 Aug 2015 11:16:03 +0200 From: Jan Kara To: Tejun Heo Cc: Jan Kara , Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150818091603.GA12317@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150817200254.GG21075@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1439889370 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon 17-08-15 16:02:54, Tejun Heo wrote: > Hello, Jan. > > On Fri, Aug 14, 2015 at 01:14:09PM +0200, Jan Kara wrote: > > So the patch looks good to me. But the fact that is fixes Eryu's problem > > means there is something fishy going on. Either inodes get wrongly attached > > Seriously, it shouldn't affect size syncing or xfs but then again my > understanding of xfs is severely limited. Well, i_size == 0 in XFS usually means that writeback didn't get to flushing delay allocated pages - inode size on disk gets increased only after the pages are written out in ->end_io callback. So at least this part makes some sense to me. Honza -- Jan Kara SUSE Labs, CR From jtulak@redhat.com Tue Aug 18 07:02:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FABA7F50 for ; Tue, 18 Aug 2015 07:02:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9CEFBAC006 for ; Tue, 18 Aug 2015 05:02:39 -0700 (PDT) X-ASG-Debug-ID: 1439899358-04bdf051fa61740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9GPGGqGp6VAjiLHs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Aug 2015 05:02:38 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 3E04498C35; Tue, 18 Aug 2015 12:02:38 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7IC2aCu003631; Tue, 18 Aug 2015 08:02:37 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: hch@infradead.org, Jan Tulak Subject: [PATCH v2 11/11] xfsprogs: Add a way to compile without blkid Date: Tue, 18 Aug 2015 14:02:26 +0200 X-ASG-Orig-Subj: [PATCH v2 11/11] xfsprogs: Add a way to compile without blkid Message-Id: <1439899346-14995-1-git-send-email-jtulak@redhat.com> In-Reply-To: <20150817193913.GD8444@infradead.org> References: <20150817193913.GD8444@infradead.org> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439899358 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 CHANGELOG: - added #warning message - use dummy blkid_get_topology instead of #ifdefs - fix autoconf (wasn't passing -DENABLE_BLKID flag, lost during patch cleaning.) Because not all platforms have up-to-date blkid with required functions, allow at least partial functionality by adding --enable-blkid=yes/no optional configure argument. When blkid is disabled, signature detection and device geometry detection doesn't work. Signed-off-by: Jan Tulak --- configure.ac | 10 +++++++++- include/builddefs.in | 5 +++++ mkfs/xfs_mkfs.c | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index abb7904..eeba20d 100644 --- a/configure.ac +++ b/configure.ac @@ -26,6 +26,11 @@ AC_ARG_ENABLE(gettext, enable_gettext=yes) AC_SUBST(enable_gettext) +AC_ARG_ENABLE(blkid, +[ --enable-blkid=[yes/no] Enable use of block device id library [default=yes]],, + enable_blkid=yes) +AC_SUBST(enable_blkid) + AC_ARG_ENABLE(readline, [ --enable-readline=[yes/no] Enable readline command editing [default=no]], test $enable_readline = yes && libreadline="-lreadline", @@ -117,9 +122,12 @@ AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_MNTENT AC_HAVE_FLS -AC_HAVE_BLKID_TOPO AC_HAVE_READDIR +if test "$enable_blkid" = yes; then +AC_HAVE_BLKID_TOPO +fi + AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([char *]) AC_TYPE_UMODE_T diff --git a/include/builddefs.in b/include/builddefs.in index 8851956..6c16a65 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -89,6 +89,7 @@ ENABLE_SHARED = @enable_shared@ ENABLE_GETTEXT = @enable_gettext@ ENABLE_EDITLINE = @enable_editline@ ENABLE_READLINE = @enable_readline@ +ENABLE_BLKID = @enable_blkid@ HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ @@ -138,6 +139,10 @@ endif ifeq ($(HAVE_MNTENT),yes) PCFLAGS+= -DHAVE_MNTENT endif +ifeq ($(ENABLE_BLKID),yes) +PCFLAGS+= -DENABLE_BLKID +endif + GCFLAGS = $(OPTIMIZER) $(DEBUG) \ -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d349b4f..e7bbb10 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -18,7 +18,9 @@ #include "libxfs.h" #include -#include +#ifdef ENABLE_BLKID +# include +#endif /* ENABLE_BLKID */ #include "xfs_mkfs.h" /* @@ -298,6 +300,7 @@ calc_stripe_factors( * 0 for nothing found * -1 for internal error */ +#ifdef ENABLE_BLKID static int check_overwrite( char *device) @@ -451,6 +454,38 @@ out_free_probe: _("warning: unable to probe device topology for device %s\n"), device); } +#else /* ifdef ENABLE_BLKID */ +/* + * Without blkid, we can't do a good check for signatures. + * So instead of some messy attempts, just disable any checks + * and always return 'nothing found'. + */ +# warning BLKID is disabled, so signature detection and block device\ + access are not working! +static int +check_overwrite( + char *device) +{ + return 1; +} + +static void blkid_get_topology( + const char *device, + int *sunit, + int *swidth, + int *lsectorsize, + int *psectorsize, + int force_overwrite) +{ + /* + * Shouldn't make any difference (no blkid = no block device access), + * but make sure this dummy replacement returns with at least some + * sanity. + */ + *lsectorsize = *psectorsize = 512; +} + +#endif /* ENABLE_BLKID */ static void get_topology( libxfs_init_t *xi, -- 2.4.5 From sandeen@sandeen.net Tue Aug 18 10:36:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F5FB7CBE for ; Tue, 18 Aug 2015 10:36:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11FA2304043 for ; Tue, 18 Aug 2015 08:36:50 -0700 (PDT) X-ASG-Debug-ID: 1439912208-04cb6c10d244300001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id N4hhIKUEhFZfHAux for ; Tue, 18 Aug 2015 08:36:48 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 20782661D577; Tue, 18 Aug 2015 10:36:48 -0500 (CDT) Message-ID: <55D3510F.1060106@sandeen.net> Date: Tue, 18 Aug 2015 10:36:47 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing References: <55C43FBA.1080408@sandeen.net> <20150818065341.GI714@dastard> X-ASG-Orig-Subj: Re: [PATCH] mkfs.xfs: fix ftype-vs-crc option combination testing In-Reply-To: <20150818065341.GI714@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439912208 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/18/15 1:53 AM, Dave Chinner wrote: > On Thu, Aug 06, 2015 at 10:18:50PM -0700, Eric Sandeen wrote: >> mkfs.xfs got weird along the way; today it has different outcomes >> depending on the order of option specification: >> >> $ mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g >> cannot specify both crc and ftype >> $ mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g >> >> >> Somehow the tests got written as being constrained on what options >> are specified - and in what order! - vs actually testing for >> incompatible feature sets. >> >> It's fine to specify both crc & ftype options, as long as it's an >> allowed combination, so just test for the incompatible combination >> (crc=1 and ftype=0) after all options have been processed. >> >> Signed-off-by: Eric Sandeen > > Did you test this, Eric? Yep... > $ mkfs.xfs /dev/sdc > cannot disable ftype with crcs enabled > Usage: mkfs.xfs > /* blocksize */ [-b log=n|size=num] > ..... God, but not with defaults! I tested w/ all combinations of ftype/crc specified. :( ... > So we enable crcs by default and do not enable dirftype/nftype by > default, and so by default mkfs now fails. I'll fix it to always > default to ftype=1 for both v4 and v5 filesystems as there is no go > reason not to enable it. Hell. Sorry about that. Thanks for catching ... Thanks, -Eric From peace-of-mind-xfs=oss.sgi.com@homesstudio.com Tue Aug 18 11:01:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 755AC7F55 for ; Tue, 18 Aug 2015 11:01:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 693E530407F for ; Tue, 18 Aug 2015 09:01:45 -0700 (PDT) X-ASG-Debug-ID: 1439913696-04cbb078e1686c0002-NocioJ Received: from mail.homesstudio.com ([185.97.84.5]) by cuda.sgi.com with ESMTP id 35xSaBlB55Ar1MDY for ; Tue, 18 Aug 2015 09:01:42 -0700 (PDT) X-Barracuda-Envelope-From: peace-of-mind-xfs=oss.sgi.com@homesstudio.com X-Barracuda-Apparent-Source-IP: 185.97.84.5 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=homesstudio.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=peace-of-mind@homesstudio.com; bh=4VYwYAeke5am9ljhmtwjXjoFdes=; b=qaApMpf92d65pYyWivpgwgcRh3NLZgr7Qe5JG+k+veaBqf90w6mBN5cjhFQv+Ev3w/WkF884KHnC cEaEy5S45Un7kC7/5ZYCYdm/OyT1k1OqtJRXnO3bMJQHOB47gjitFeXi0lBhdTVd/4kkUK6pyoSW LqXVmHurwacHMb9uQFQ= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=homesstudio.com; b=JqOuQzealHDoKQfuRmidWSJQDFecG92vux+tjFDu4fFTNg0ZNPJDWeoftNbG8HKXaY7Ju2xDJqCs 0/KfMhl7X78JVR3wsWK4PHzI/sYOjR5+OH1Otr+6DnL3m/tGNQEKNJvhaivseu32qU/FOY6VfeQ8 Klm+7nevaHDDGPlt4p8=; Received: by mail.homesstudio.com id hqdbee0001gs for ; Tue, 18 Aug 2015 08:11:32 -0700 (envelope-from ) Date: Tue, 18 Aug 2015 08:11:32 -0700 From: "Peace Of Mind" To: Subject: Are Your Appliances Covered? Get a Home Warranty MIME-Version: 1.0 X-ASG-Orig-Subj: Are Your Appliances Covered? Get a Home Warranty Content-Type: multipart/alternative; boundary="----=_Part_1297_2127855623.1439909726621" Message-ID: <0.0.0.295.1D0D9C82AB865C0.2D118E@mail.homesstudio.com> X-Barracuda-Connect: UNKNOWN[185.97.84.5] X-Barracuda-Start-Time: 1439913701 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.77 X-Barracuda-Spam-Status: No, SCORE=0.77 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_Part_1297_2127855623.1439909726621 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Are Your Appliances Covered? Get a Home Warranty http://www.homesstudio.com/ease/846U8A6F1aa*2ZsnFjnn0ntv0Mjh2ee Update Preferences- http://www.homesstudio.com/be7J8L61aa7ZsnFjnn0ntv0Mjh88c/left ------=_Part_1297_2127855623.1439909726621 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit Choice Home Warranty | Don' t Pay For A Broken A/C This Summer!

Are Your Appliances Covered? Get a Home Warranty

Protect Your Home with a Choice Home Warranty Today.  Get a FREE Instant Price Quote.
*With purchase of single payment plan. A home warranty is a renewable service contract that covers the repair or replacement of many of the most frequently occurring breakdowns of system components and appliances. 
 
Your home is most likely one of your biggest investments. Unexpected repair or replacement costs of covered items can easily strain your budget. Plus, finding a qualified professional to solve your problems can be stressful and inconvenient.

Choice Home Warranty plans offer comprehensive protection against the high cost of repair or replacement of properly maintained major systems and appliances. A policy holder calls our claims center and pays a modest service call fee per claim when a problem or repair need arises.  At Choice Home Warranty, we strive to always offer our customers fast and simple solutions, along with excellent service technicians. Customers are looking for value for their money, and we believe we provide outstanding customer satisfaction and protection against the high costs of home and appliance repairs on covered items.*

When you decide to purchase a Choice Home Warranty, you will work with a knowledgeable, dedicated team that will service your covered home repair needs swiftly and efficiently.** With many home warranty companies, your claim is assigned to a clerk in a large department, rather than having a personable, dedicated team processing your service request. With a CHW Warranty, you will have a dedicated team of two or three representatives, who will always be thoroughly involved in your claim and available to help you with any questions that your may have.

510 Thornall Street, Edison NJ 08837

Update Preferences










 


------=_Part_1297_2127855623.1439909726621-- From htejun@gmail.com Tue Aug 18 12:47:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3AA787F56 for ; Tue, 18 Aug 2015 12:47:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BBC3DAC00F for ; Tue, 18 Aug 2015 10:47:26 -0700 (PDT) X-ASG-Debug-ID: 1439920041-04cbb078e26b790001-NocioJ Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by cuda.sgi.com with ESMTP id Cw8arkV9JRu88Meh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Aug 2015 10:47:22 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com Received: by pdob1 with SMTP id b1so15068616pdo.2 for ; Tue, 18 Aug 2015 10:47:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=GKU2aMngVCOF4Z0LzYu09QOsn8reUr53eqaboOLG59Y=; b=pu9CRUit/j3tot9/WGayV7GNQbVrreGGFboPDTdr9fuPrF353rpfA+o6xD8cyfh7TZ raNi5jn/49wEE9kQjWd64JgaGCkPIb1sMLlSu6AKXPRVOST1flhbW0uKYVdcksxoyDxX MJErE3+SHSKGddwQyQSMlYR3AqoRsIymdVB8U+a7B5NREz3P91q6+cyAso7kt4rfofWQ 3u/OQ/TZ9/GE+DlDOgB1yUiUdiLTlQIuDCDBsLPgBCYBRiudlmdWeyrcyLbj6x08ErsX GypB4nBGm6noxVgOqBvtb001VWrSXHVv9uIUDilpkASHsRkhL5ry69dRhvn8YMP0zaPY 9CsA== X-Received: by 10.70.135.106 with SMTP id pr10mr15764158pdb.116.1439920041551; Tue, 18 Aug 2015 10:47:21 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c090:200::2:4538]) by smtp.gmail.com with ESMTPSA id qf7sm18775383pbc.18.2015.08.18.10.47.20 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 18 Aug 2015 10:47:20 -0700 (PDT) Sender: Tejun Heo X-Barracuda-Apparent-Source-IP: 2620:10d:c090:200::2:4538 Date: Tue, 18 Aug 2015 10:47:18 -0700 From: Tejun Heo To: Jan Kara Cc: Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150818174718.GA15739@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818091603.GA12317@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-pd0-f173.google.com[209.85.192.173] X-Barracuda-Start-Time: 1439920042 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Aug 18, 2015 at 11:16:03AM +0200, Jan Kara wrote: > On Mon 17-08-15 16:02:54, Tejun Heo wrote: > > Hello, Jan. > > > > On Fri, Aug 14, 2015 at 01:14:09PM +0200, Jan Kara wrote: > > > So the patch looks good to me. But the fact that is fixes Eryu's problem > > > means there is something fishy going on. Either inodes get wrongly attached > > > > Seriously, it shouldn't affect size syncing or xfs but then again my > > understanding of xfs is severely limited. > > Well, i_size == 0 in XFS usually means that writeback didn't get to > flushing delay allocated pages - inode size on disk gets increased only > after the pages are written out in ->end_io callback. So at least this part > makes some sense to me. Hmm... the only possibility I can think of is tot_write_bandwidth being zero when it shouldn't be. I've been staring at the code for a while now but nothing rings a bell. Time for another debug patch, I guess. Thanks. -- tejun From sandeen@sandeen.net Tue Aug 18 14:26:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D4E3A7F56 for ; Tue, 18 Aug 2015 14:26:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA23D304062 for ; Tue, 18 Aug 2015 12:26:39 -0700 (PDT) X-ASG-Debug-ID: 1439925997-04cbb078e26dbe0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4y4M9NTW2jzA3WVm for ; Tue, 18 Aug 2015 12:26:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0644661F8202; Tue, 18 Aug 2015 14:26:36 -0500 (CDT) Message-ID: <55D386ED.604@sandeen.net> Date: Tue, 18 Aug 2015 14:26:37 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 08/10] xfs_db: enable blocktrash for checksummed filesystems References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014429.1839.69933.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 08/10] xfs_db: enable blocktrash for checksummed filesystems In-Reply-To: <20150815014429.1839.69933.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439925997 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:44 PM, Darrick J. Wong wrote: > Disable the write verifiers when we're trashing a block. With this > in place, create a xfs fuzzer script that formats, populates, corrupts, > tries to use, repairs, and tries again to use a crash test xfs image. > Hopefully this will shake out some v5 filesystem bugs. Maybe "we can create an xfs fuzzer script ..." (since it's not in this patch) > v2: Drop xfsfuzz, don't assume every block is an AGF when blocktrashing. > Don't trash log blocks by default, because that skews the blocktrash > heavily towards damaging only log blocks. and skip DBM_SB by default as well, right? And you added log blocks & symlinks to the allowed mask. So I think something like: Allow trashing of symlink & log blocks. By default, do not trash superblocks (why?) or log blocks (because ...) > Signed-off-by: Darrick J. Wong > --- > db/check.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > > diff --git a/db/check.c b/db/check.c > index afeea32..965d0f5 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -944,6 +944,7 @@ blocktrash_b( > int mask; > int newbit; > int offset; > + const struct xfs_buf_ops *stashed_ops; > static char *modestr[] = { > N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") > }; > @@ -952,8 +953,10 @@ blocktrash_b( > offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); > newbit = 0; > push_cur(); > - set_cur(&typtab[DBM_UNKNOWN], > + set_cur(NULL, > XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); Ok, you talked about this back on 5/28/15. Weird. But calling it with NULL is odd, too; nothing else does that. What about TYP_NONE, { TYP_NONE, NULL } its ops are NULL, as well... does that work? Huh, ok, no callers w/ TYP_NONE, either. I guess NULL works. > + stashed_ops = iocur_top->bp->b_ops; > + iocur_top->bp->b_ops = NULL; > if ((buf = iocur_top->data) == NULL) { > dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); > pop_cur(); > @@ -984,6 +987,7 @@ blocktrash_b( > buf[byte] &= ~mask; > } > write_cur(); > + iocur_top->bp->b_ops = stashed_ops; *nod* > pop_cur(); > printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), > agno, agbno, typename[type], len, len == 1 ? "" : "s", > @@ -1040,9 +1044,11 @@ blocktrash_f( > (1 << DBM_BTINO) | > (1 << DBM_DIR) | > (1 << DBM_INODE) | > + (1 << DBM_LOG) | Ok, so you allow log blocks to be specified, > (1 << DBM_QUOTA) | > (1 << DBM_RTBITMAP) | > (1 << DBM_RTSUM) | > + (1 << DBM_SYMLINK) | and symlink blocks too, but... > (1 << DBM_SB); > while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { > switch (c) { > @@ -1106,7 +1112,7 @@ blocktrash_f( > return 0; > } > if (tmask == 0) > - tmask = goodmask; > + tmask = goodmask & ~((1 << DBM_LOG) | (1 << DBM_SB)); you disable log & superblocks by default if no mask is specified. I'm not 100% sure why you want to change this, what did you run into, in practice, if they were allowed? If the change stays, then the xfs_db manpage needs an update: "If no -t options are given then all metadata types can be trashed." Thanks, -Eric > lentab = xmalloc(sizeof(ltab_t)); > lentab->min = lentab->max = min; > lentablen = 1; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From htejun@gmail.com Tue Aug 18 14:54:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3942F7F58 for ; Tue, 18 Aug 2015 14:54:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6587AC00F for ; Tue, 18 Aug 2015 12:54:43 -0700 (PDT) X-ASG-Debug-ID: 1439927682-04bdf051f96def0001-NocioJ Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by cuda.sgi.com with ESMTP id RDDHpUoqdAZAFhPk (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Aug 2015 12:54:42 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com Received: by pacgr6 with SMTP id gr6so139442135pac.2 for ; Tue, 18 Aug 2015 12:54:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=SYu6YiYEvjf0KS7my8lnPNeh4o1uehBl9hwTs6dA4dU=; b=C/GI7DE44AZLkBh+CnR+QXOYMP80500Ot3DzjrI//MIedm8lyz5iGimxZ78fJjYSJY pXfee6DNC8JkwBsf9yOB24/lXgsfCbv9BMUB0KSpeYWl9tAfSUnfv3Ayf8i8VzqaniDZ hDvxVXVKSXIERscKmlQnnksVL0z9eV5cBzMSEIckIu+4/f5ge4726WLJwLq3MhKCtV3H EgMF/nAY345T3wRvYEIHjGWj4AbjqOOHhJtEMpfy7ydymTCjjZinYhUiPAaUOgdhk+w1 9X0HD6KJfpeUgdALhNtO/Z/3xopyme6846ckL03peZp2LIqq8taBy9bDcSTO0DqFQHsB VhIA== X-Received: by 10.66.147.131 with SMTP id tk3mr16878948pab.104.1439927681903; Tue, 18 Aug 2015 12:54:41 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c090:200::2:4538]) by smtp.gmail.com with ESMTPSA id x11sm19190209pas.46.2015.08.18.12.54.40 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 18 Aug 2015 12:54:41 -0700 (PDT) Sender: Tejun Heo X-Barracuda-Apparent-Source-IP: 2620:10d:c090:200::2:4538 Date: Tue, 18 Aug 2015 12:54:39 -0700 From: Tejun Heo To: Jan Kara Cc: Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150818195439.GB15739@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818174718.GA15739@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-pa0-f49.google.com[209.85.220.49] X-Barracuda-Start-Time: 1439927682 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, On Tue, Aug 18, 2015 at 10:47:18AM -0700, Tejun Heo wrote: > Hmm... the only possibility I can think of is tot_write_bandwidth > being zero when it shouldn't be. I've been staring at the code for a > while now but nothing rings a bell. Time for another debug patch, I > guess. So, I can now reproduce the bug (it takes a lot of trials but lowering the number of tested files helps quite a bit) and instrumented all the early exit paths w/o the fix patch. bdi_has_dirty_io() and wb_has_dirty_io() are never out of sync with the actual dirty / io lists even when the test 048 fails, so the bug at least is not caused by writeback skipping due to buggy bdi/wb_has_dirty_io() result. Whenever it skips, all the lists are actually empty (verified while holding list_lock). One suspicion I have is that this could be a subtle timing issue which is being exposed by the new short-cut path. Anything which adds delay seems to make the issue go away. Dave, does anything ring a bell? As for the proposed I_DIRTY_TIME fix, I think it'd be a good idea to merge it. It fixes a clear brekage regardless of this xfs issue. Thanks. -- tejun From sandeen@sandeen.net Tue Aug 18 14:59:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 097457F58 for ; Tue, 18 Aug 2015 14:59:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFB3C8F8037 for ; Tue, 18 Aug 2015 12:59:30 -0700 (PDT) X-ASG-Debug-ID: 1439927968-04cb6c10d54a630001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Q0nwa7nDhXuHwrCq for ; Tue, 18 Aug 2015 12:59:28 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4DB74661D572; Tue, 18 Aug 2015 14:59:28 -0500 (CDT) Message-ID: <55D38EA0.6030701@sandeen.net> Date: Tue, 18 Aug 2015 14:59:28 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "Darrick J. Wong" , david@fromorbit.com CC: xfs@oss.sgi.com Subject: Re: [PATCH 09/10] xfs_db: trash the block at the top of the cursor stack References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014436.1839.74362.stgit@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs_db: trash the block at the top of the cursor stack In-Reply-To: <20150815014436.1839.74362.stgit@birch.djwong.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1439927968 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/14/15 8:44 PM, Darrick J. Wong wrote: > Add a new -z option to blocktrash to make it trash the block that's at > the top of the stack, so that we can perform targeted fuzzing. While > we're at it, prevent fuzzing off the end of the buffer and add a -o > parameter so that we can specify an offset to start fuzzing from. > > Signed-off-by: Darrick J. Wong > --- > db/check.c | 81 +++++++++++++++++++++++++++++++++++++++++------------ > man/man8/xfs_db.8 | 15 +++++++++- > 2 files changed, 77 insertions(+), 19 deletions(-) > > > diff --git a/db/check.c b/db/check.c > index 965d0f5..7c11b0b 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -930,8 +930,7 @@ typedef struct ltab { > > static void > blocktrash_b( > - xfs_agnumber_t agno, > - xfs_agblock_t agbno, > + int offset, a comment about "offset into what?" might be nice > dbm_t type, > ltab_t *ltabp, > int mode) > @@ -943,23 +942,36 @@ blocktrash_b( > int len; > int mask; > int newbit; > - int offset; > const struct xfs_buf_ops *stashed_ops; > static char *modestr[] = { > N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") > }; > + xfs_agnumber_t agno; > + xfs_agblock_t agbno; > > + agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); > + agbno = XFS_FSB_TO_AGBNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); > + if (iocur_top->len == 0) { > + dbprintf(_("zero-length block %u/%u buffer to trash??\n"), > + agno, agbno); > + return; > + } > len = (int)((random() % (ltabp->max - ltabp->min + 1)) + ltabp->min); > - offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); > + /* > + * offset >= 0: start fuzzing at this exact offset. "this exact bit offset" > + * offset < 0: pick an offset at least as high at -(offset + 1). "a bit offset ..." (units would be nice, in the comments. I had assumed bytes, even though you have NBBY) Ow, my brain. ;) Your manpage says: > If the value is preceded by a '+', the > +trashing will start at a randomly chosen offset that is larger than the value > +supplied. which seems sane. If we supply +10, + if (relative) + offset = -offset - 1; so now offset = -10 - 1, and we get -11. Then: > + */ > + if (offset < 0) { > + offset = -(offset + 1); now offset = -(-11 + 1) = -(-10) = 10. Okay... so 10 or higher. What's w/ the +/- 1? Why not just: if (relative) offset = -offset; /* i.e. -10 */ ... if (offset < 0) { offset = -offset; /* i.e. 10 */ offset = offset + (int)(random() % (int)((iocur_top->len - offset) * NBBY)); ... > + offset = offset + (int)(random() % (int)((iocur_top->len - offset) * NBBY)); > + } > + if (offset + len >= iocur_top->len * NBBY) > + len = (iocur_top->len * NBBY) - offset; > newbit = 0; > - push_cur(); > - set_cur(NULL, > - XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); > stashed_ops = iocur_top->bp->b_ops; > iocur_top->bp->b_ops = NULL; > if ((buf = iocur_top->data) == NULL) { > dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); > - pop_cur(); > return; > } > for (bitno = 0; bitno < len; bitno++) { > @@ -988,7 +1000,6 @@ blocktrash_b( > } > write_cur(); > iocur_top->bp->b_ops = stashed_ops; > - pop_cur(); > printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), > agno, agbno, typename[type], len, len == 1 ? "" : "s", > offset / NBBY, offset % NBBY, modestr[mode]); > @@ -1019,11 +1030,9 @@ blocktrash_f( > uint seed; > int sopt; > int tmask; > + bool this_block = false; > + int offset = -1; > > - if (!dbmap) { > - dbprintf(_("must run blockget first\n")); > - return 0; > - } > optind = 0; > count = 1; > min = 1; > @@ -1050,7 +1059,7 @@ blocktrash_f( > (1 << DBM_RTSUM) | > (1 << DBM_SYMLINK) | > (1 << DBM_SB); > - while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { > + while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { > switch (c) { > case '0': > mode = 0; > @@ -1071,6 +1080,21 @@ blocktrash_f( > return 0; > } > break; > + case 'o': { > + int relative = 0; > + if (optarg[0] == '+') { > + optarg++; > + relative = 1; > + } > + offset = (int)strtol(optarg, &p, 0); > + if (*p != '\0' || offset < 0) { > + dbprintf(_("bad blocktrash offset %s\n"), optarg); > + return 0; > + } > + if (relative) > + offset = -offset - 1; > + break; > + } > case 's': > seed = (uint)strtoul(optarg, &p, 0); > sopt = 1; > @@ -1102,11 +1126,22 @@ blocktrash_f( > return 0; > } > break; > + case 'z': > + this_block = true; > + break; is there any mnemonic for 'z'? Maybe 'c' for Current, or 'b' for (this one) Block? Not that big a deal, just wondering. > default: > dbprintf(_("bad option for blocktrash command\n")); > return 0; > } > } > + if (!this_block && !dbmap) { > + dbprintf(_("must run blockget first\n")); > + return 0; > + } > + if (this_block && iocur_sp == 0) { > + dbprintf(_("nothing on stack\n")); > + return 0; > + } > if (min > max) { > dbprintf(_("bad min/max for blocktrash command\n")); > return 0; > @@ -1125,6 +1160,14 @@ blocktrash_f( > } else > lentab[lentablen - 1].max = i; > } > + if (!sopt) > + dbprintf(_("blocktrash: seed %u\n"), seed); does this extra output break any xfstests? # grep -r blocktrash common/ tests/xfs # maybe not! > + srandom(seed); > + if (this_block) { > + blocktrash_b(offset, DBM_UNKNOWN, &lentab[random() % lentablen], > + mode); > + goto out; > + } > for (blocks = 0, agno = 0; agno < mp->m_sb.sb_agcount; agno++) { > for (agbno = 0, p = dbmap[agno]; > agbno < mp->m_sb.sb_agblocks; > @@ -1137,9 +1180,6 @@ blocktrash_f( > dbprintf(_("blocktrash: no matching blocks\n")); > goto out; > } > - if (!sopt) > - dbprintf(_("blocktrash: seed %u\n"), seed); > - srandom(seed); > for (i = 0; i < count; i++) { > randb = (xfs_rfsblock_t)((((__int64_t)random() << 32) | > random()) % blocks); > @@ -1153,8 +1193,13 @@ blocktrash_f( > continue; > if (bi++ < randb) > continue; > - blocktrash_b(agno, agbno, (dbm_t)*p, > + push_cur(); > + set_cur(NULL, > + XFS_AGB_TO_DADDR(mp, agno, agbno), > + blkbb, DB_RING_IGN, NULL); > + blocktrash_b(offset, (dbm_t)*p, > &lentab[random() % lentablen], mode); > + pop_cur(); > done = 1; > break; > } > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 > index df54bb7..681efc4 100644 > --- a/man/man8/xfs_db.8 > +++ b/man/man8/xfs_db.8 > @@ -232,7 +232,7 @@ enables verbose output. Messages will be printed for every block and > inode processed. > .RE > .TP > -.BI "blocktrash [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." > +.BI "blocktrash [-z] [\-o " offset "] [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." > Trash randomly selected filesystem metadata blocks. > Trashing occurs to randomly selected bits in the chosen blocks. > This command is available only in debugging versions of > @@ -259,6 +259,13 @@ supplies the > .I count > of block-trashings to perform (default 1). > .TP > +.B \-o > +supplies the bit > +.I offset > +at which to start trashing the block. If the value is preceded by a '+', the > +trashing will start at a randomly chosen offset that is larger than the value > +supplied. The default is to randomly choose an offset anywhere in the block. > +.TP > .B \-s > supplies a > .I seed > @@ -282,6 +289,12 @@ size of bit range to be trashed. The default value is 1. > sets the > .I maximum > size of bit range to be trashed. The default value is 1024. > +.TP > +.B \-z > +trashes the block at the top of the stack. It is not necessary to > +run > +.BI blockget > +if this option is supplied. > .RE > .TP > .BI "blockuse [\-n] [\-c " count ] > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Tue Aug 18 16:46:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D0BE77F58 for ; Tue, 18 Aug 2015 16:46:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B67098F8035 for ; Tue, 18 Aug 2015 14:46:46 -0700 (PDT) X-ASG-Debug-ID: 1439934400-04cb6c10cd4c850001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id PmnclyxWkX8404JB for ; Tue, 18 Aug 2015 14:46:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C0FwAwp9NVPJ7tLHldgxuBPYZSo1QGm1ICAgEBAoE6TQEBAQEBAQcBAQEBQAE/QQODYAEBBDocIxAIAw4KCSUPBSUDBxoTiC3SIAEBAQcCAR8ZhgeFM4UKB4MYgRQBBJUhjGmBTZA2iC+ENSwzgkwBAQE Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 07:15:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRohh-0004mz-R1; Wed, 19 Aug 2015 07:45:57 +1000 Date: Wed, 19 Aug 2015 07:45:57 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150818214557.GC3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439828606-7886-6-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439934401 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 17, 2015 at 06:23:20PM +0200, Jan Tulak wrote: > Add and update various API, macros and types where is some change > in OS X or xfsprogs. Most changes are in darwin.h. > > Add dummy implementations where native support is nonexistent > and the tools are not expected to work anyway, so all tools can be > at least compiled. > > Signed-off-by: Jan Tulak > Reviewed-by: Christoph Hellwig Hmmm, looks like I accidentally comitted an earlier version of this patch yesterday. Jan, can you send delta patches to what I committed to address more recent review comments? Sorry, my bad. -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 18 16:56:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EEEE27F5D for ; Tue, 18 Aug 2015 16:56:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D13888F8040 for ; Tue, 18 Aug 2015 14:56:19 -0700 (PDT) X-ASG-Debug-ID: 1439934976-04cbb078e471200001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mXLTSNkyzxBR7AIH for ; Tue, 18 Aug 2015 14:56:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AIDACKqdNVPJ7tLHldgxuBATyGUqNUBptSBAICgTpNAQEBAQEBBwEBAQFAAT+EJAEBBCcTHCMQCAMOCgklDwUlAwcaE4gt0hoBAQgCIBmGB4UzhQoHgxiBFAWVIYxpjmWLTYQ1LDOCTAEBAQ Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 07:26:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRorb-0004oF-PS; Wed, 19 Aug 2015 07:56:11 +1000 Date: Wed, 19 Aug 2015 07:56:11 +1000 From: Dave Chinner To: Tejun Heo Cc: Jan Kara , Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150818215611.GD3902@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818195439.GB15739@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439934976 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 18, 2015 at 12:54:39PM -0700, Tejun Heo wrote: > Hello, > > On Tue, Aug 18, 2015 at 10:47:18AM -0700, Tejun Heo wrote: > > Hmm... the only possibility I can think of is tot_write_bandwidth > > being zero when it shouldn't be. I've been staring at the code for a > > while now but nothing rings a bell. Time for another debug patch, I > > guess. > > So, I can now reproduce the bug (it takes a lot of trials but lowering > the number of tested files helps quite a bit) and instrumented all the > early exit paths w/o the fix patch. bdi_has_dirty_io() and > wb_has_dirty_io() are never out of sync with the actual dirty / io > lists even when the test 048 fails, so the bug at least is not caused > by writeback skipping due to buggy bdi/wb_has_dirty_io() result. > Whenever it skips, all the lists are actually empty (verified while > holding list_lock). > > One suspicion I have is that this could be a subtle timing issue which > is being exposed by the new short-cut path. Anything which adds delay > seems to make the issue go away. Dave, does anything ring a bell? No, it doesn't. The data writeback mechanisms XFS uses are all generic. It marks inodes I_DIRTY_PAGES and lets the generic code take care of everything else. Yes, we do delayed allocation during writeback, and we log the inode size updates during IO completion, so if inode sizes are not getting updated, then Occam's Razor suggests that writeback is not happening. I'd suggest looking at some of the XFS tracepoints during the test: tracepoint trigger xfs_file_buffered_write once per write syscall xfs_file_sync once per fsync per inode xfs_vm_writepage every ->writepage call xfs_setfilesize every IO completion that updates inode size And it's probably best to also include all the writeback tracepoints, too, for context. That will tell you what inodes and what part of them are getting written back and when.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 18 17:02:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A935E7F5D for ; Tue, 18 Aug 2015 17:02:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 807C28F8040 for ; Tue, 18 Aug 2015 15:02:09 -0700 (PDT) X-ASG-Debug-ID: 1439935323-04bdf051f970900001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BLhmvlCpsrn5KglJ for ; Tue, 18 Aug 2015 15:02:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BqCwDBqtNVPJ7tLHldgxtUaaomBpVhhS1EAgIBAQKBOk0BAQEBAQEHAQEBAUABP4QkAQEEOhwjEAgDDgoJJQ8FJQMHGhMbiBIO0hEBAQEBBgIBGwQZhgeFM4J2ghQHhCwFhx+Ga4cXhQSHZY5li02CMR+BZSwzAQGCSgEBAQ Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 07:31:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRowZ-0004pq-FY; Wed, 19 Aug 2015 08:01:19 +1000 Date: Wed, 19 Aug 2015 08:01:19 +1000 From: Dave Chinner To: Jan Tulak Cc: Christoph Hellwig , xfs-oss Subject: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Message-ID: <20150818220119.GL714@dastard> X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-9-git-send-email-jtulak@redhat.com> <20150817193624.GA8444@infradead.org> <20150818082046.GK714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439935323 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 18, 2015 at 10:33:49AM +0200, Jan Tulak wrote: > On Tue, Aug 18, 2015 at 10:20 AM, Dave Chinner wrote: > > > On Tue, Aug 18, 2015 at 09:04:24AM +0200, Jan Tulak wrote: > > > I thought about it. However, with memalign from malloc marked obsolete > > > (and with posix_memalign having guaranteed alignment restrictions [1]), I > > > saw it better > > > to use the posix variant everywhere. > > > > Putting a sane wrapper around an nasty library function is just > > fine. The memalign wrapper makes sense from this perspective - even > > gcc can't tell if variables passed to posix_memalign are correctly > > initialised or not, whereas no such problems exist for memalign(). > > > > > I could make a wrapper simulating the old memalign behaviour, but I don't > > > think it would make sense. > > > > I think it makes more sense than using posix_memalign() everywhere > > and then ignoring the return variable that tells you it failed... > > > > > I searched for this, but didn't find any reasonable answer: > > > How long can be things in standard libraries marked obsolete before > > > removing? > > > > With a wrapper, we don't care. > > > > > [1] man memalign: > > > On many systems there are alignment restrictions, for example, on > > buf- > > > fers used for direct block device I/O. POSIX specifies the > > path- > > > conf(path,_PC_REC_XFER_ALIGN) call that tells what alignment is > > needed. > > > Now one can use posix_memalign() to satisfy this requirement. > > > > > > posix_memalign() verifies that alignment matches the > > requirements > > > detailed above. memalign() may not check that the alignment > > argument > > > is correct. > > > > Yes, you can get it wrong with memalign. But we don't, because we > > follow the rules for DIO buffer alignment and set it correctly. > > Being able to directly control the alignment of the memory buffer is > > a reason for using memalign() over posix_memalign(), not the other > > way around. > > > > So a wrapper used on all platforms is an acceptable solution? All right, > this explanation makes sense. I will change it that way. The only question > I have now is whether to use posix_memalign on every platform, or whether to > make it platform_memalign and use the old memalign inside for Linux. No need for a wrapper on platforms that support memalign. We can add a wrapper when and if memalign ever goes away (which, FWIW, will break lots of code). Indeed, we alreadyhave these platform dependent "wrappers": include/darwin.h:#define memalign(a,sz) valloc(sz) include/freebsd.h:#define memalign(a,sz) valloc(sz) The question now is - do we even need to change anything? https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/valloc.3.html "The valloc() function allocates size bytes of memory and returns a pointer to the allocated memory. The allocated memory is aligned on a page boundary" Which means it does pretty exactly the same thing as posix_memalign(), and so we don't need to change anything, right? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 18 17:04:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 980487F5D for ; Tue, 18 Aug 2015 17:04:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25A03AC008 for ; Tue, 18 Aug 2015 15:04:37 -0700 (PDT) X-ASG-Debug-ID: 1439935470-04cbb078e471520001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id UcXHKDnhudo9XqMZ for ; Tue, 18 Aug 2015 15:04:31 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BRCwDBqtNVPJ7tLHldgxtUaYZSo1QGlVWFfQSBPk0BAQEBAQEHAQEBAUABP4UAOyQ0BSUDBy2ILawdpi4ZhgeKW4QVBZUhhQSHZYFNRowPg2GIL4FwCwEBAYI3LDOCTAEBAQ Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 07:34:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRozd-0004qF-7c for xfs@oss.sgi.com; Wed, 19 Aug 2015 08:04:29 +1000 Date: Wed, 19 Aug 2015 08:04:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANOUNCE] xfsprogs: v4.2.0-rc2 released Message-ID: <20150818220429.GM714@dastard> X-ASG-Orig-Subj: [ANOUNCE] xfsprogs: v4.2.0-rc2 released MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="EuxKj2iCbKjpUGkD" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439935470 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --EuxKj2iCbKjpUGkD Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repositories at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git git://oss.sgi.com/xfs/cmds/xfsprogs have just been updated to v4.2.0-rc2. Changes since 4.2.0-rc1 are mainly bug fixes, OS X build fixes and mkfs.xfs now defaults to enabling the ftype field in the directory structure for all filesystem types. There are still some pending fixes before a 4.2.0 release will be made; Darrick has found a bunch of error sign issues that he has patches pending for, as well as a couple of xfs_db and xfs_repair fixes for problems he found via fuzzing. There are still also a few outstanding OS X build changes that need to be finalised before release. Hopefully these will all be finalised in the next couple of days. Anyway, go forth and test! -Dave. The new head of the master branch is commit: 60feae1 xfsprogs: Release v4.2.0-rc2 New Commits: Brian Foster (1): [237cb37] libxfs: remove sparse inode mount warning Dave Chinner (2): [9a35e0d] db: fix uninitialised variable warnings [60feae1] xfsprogs: Release v4.2.0-rc2 Eric Sandeen (2): [98166c9] xfs_fsr: Fix parentheses around truth value [b990de8] mkfs.xfs: fix ftype-vs-crc option combination testing Eryu Guan (1): [255132a] xfsprogs: fix syntax error in include/buildmacros Jan Kara (1): [28c1c27] libxfs: Fix attr leaf block definition Jan Tulak (9): [54ca4ea] xfsprogs: undefined variable fix [19863f7] xfsprogs: Add ifdef dirent checks where it was missing [3f25732] xfsprogs: Add includes required for OS X builds [ff6f019] xfsprogs: missing and dummy calls for OS X support [bfbb770] xfsprogs: prevent LIST_ macros conflicts [96f2cfb] build: Change OS X-specific CFLAGS/LDFLAGS [5ae294e] build:: Add mntent.h check into autoconf [5121281] build: Add fls check into autoconf [6f9377f] doc: Update OS X build info and limitations Roger Willcocks (1): [307ae95] libxfs: v3 inodes are only valid on crc-enabled filesystems Code Diffstat: VERSION | 2 +- configure.ac | 4 +- db/check.c | 2 +- db/convert.c | 2 +- doc/CHANGES | 10 ++++ doc/INSTALL | 11 +++- fsr/xfs_fsr.c | 16 +++-- include/bitops.h | 2 + include/builddefs.in | 10 +++- include/buildmacros | 2 +- include/darwin.h | 158 ++++++++++++++++++++++++++++++++++++++++++++-= ---- include/list.h | 14 +++++ io/readdir.c | 12 ++++ libhandle/Makefile | 4 ++ libxcmd/paths.c | 2 +- libxfs/xfs_da_format.h | 11 +++- libxfs/xfs_format.h | 1 - libxfs/xfs_inode_buf.c | 13 +++- libxfs/xfs_inode_buf.h | 2 + libxfs/xfs_sb.c | 3 - m4/package_libcdev.m4 | 20 +++++++ mkfs/xfs_mkfs.c | 17 ++---- repair/dinode.c | 5 +- repair/prefetch.c | 2 +- 24 files changed, 273 insertions(+), 52 deletions(-) --=20 Dave Chinner david@fromorbit.com --EuxKj2iCbKjpUGkD Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJV06vsAAoJEK3oKUf0dfodf8QQALpHSdgV0OHAscCMkJQgH8Rs D9wfbDGwWKpt0jJ4goHBNpAPBi884sH829JCqsGr8quf58w6p3Wo/xRAv36WDL3H 9Tg7im7A/Zie5poE69+ufTDkOOY5/bfveBCnq9Fki3B+zp/Go3Z5vXZsvLcPX38h fSuVqio7i27uqBH3oaWh1fEbkrw95ER7iRcZLES8IjqMBCEMVIj5GfgSjnuHEYYn Iji4OgCHhGhkQoZoUsEvWqtyut+gBZqSYVQ3S6ZD5P4AanzCJqNL+XXIbhUGmir+ 4QFGa/AXMC1muZp+ST/akH4vtIjpcEpVwb1/Sq0uUH7yFH0iZKYyc9EpXZ7NXXU+ TM8dbO2Z7MJKPh/KplmSiMFRTO4/2r0b4YUH4aoV9hQlRf8AEsGWonOV9BvYbynN uC0lkVr9pbpwhuTNk4aBxThxjbUQyVJScpGpfptzIX+5YgndB7qJmo/04i9xtoA7 QSc3N6KQqoyIBO6UtBPpPzqrB5rYCyvWknG+F0Cee4itkK8ibLyVlV2MbG0yqDDm 4JblWNIjEkAci41TpmFQnOKA50d+COU4DBJgwdfzUJHAfEMCTFeh0Loa4DhLa/YN NeE9UFxxOZyp6IhnitR18fBfEQB3RoQwEQzjZcdQmNZqey7OM2DQNbNq7rwBWM1Y 1c3ajXMVOL1L6r+IqxER =NIeO -----END PGP SIGNATURE----- --EuxKj2iCbKjpUGkD-- From david@fromorbit.com Tue Aug 18 18:23:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9494729DF5 for ; Tue, 18 Aug 2015 18:23:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 313C4AC007 for ; Tue, 18 Aug 2015 16:23:26 -0700 (PDT) X-ASG-Debug-ID: 1439940204-04bdf051fa722d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id QgNrZbiKdJkhi1Yg for ; Tue, 18 Aug 2015 16:23:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AUCwC0vdNVPJ7tLHldgxuBPYZTo1QGm00CAgEBAoE5TQEBAQEBAQcBAQEBQAE/hCQBAQQyASMjEAgDDgoJJQ8FJQMHGhOILdF9AQEIAgEfGYYHhTOFCgeELAWHGIZzhAmDDoxpgU2QNogvgmWBUCwzgQUEgUMBAQE Received: from ppp121-44-237-158.lns20.syd7.internode.on.net (HELO dastard) ([121.44.237.158]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 08:53:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRqDz-0004yL-Ha; Wed, 19 Aug 2015 09:23:23 +1000 Date: Wed, 19 Aug 2015 09:23:23 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/13] xfs: ensure EFD trans aborts on log recovery extent free failure Message-ID: <20150818232323.GN714@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 04/13] xfs: ensure EFD trans aborts on log recovery extent free failure References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439233309-19959-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1439233309-19959-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439940204 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Aug 10, 2015 at 03:01:40PM -0400, Brian Foster wrote: > Log recovery attempts to free extents with leftover EFIs in the AIL > after initial processing. If the extent free fails (e.g., due to > unrelated fs corruption), the transaction is cancelled, though it might > not be dirtied at the time. If this is the case, the EFD does not abort > and thus does not release the EFI. This can lead to hangs as the EFI > pins the AIL. > > Update xlog_recover_process_efi() to log the EFD in the transaction > before xfs_free_extent() errors are handled to ensure the transaction is > dirty, aborts the EFD and releases the EFI on error. Since this is a > requirement for EFD processing (and consistent with xfs_bmap_finish()), > update the EFD logging helper to do the extent free and unconditionally > log the EFD. This encodes the required EFD logging behavior into the > helper and reduces the likelihood of errors down the road. > > Signed-off-by: Brian Foster .... > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 9d8f242..c77dfb5 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -34,7 +34,6 @@ > #include "xfs_inode_item.h" > #include "xfs_extfree_item.h" > #include "xfs_trans_priv.h" > -#include "xfs_alloc.h" > #include "xfs_ialloc.h" > #include "xfs_quota.h" > #include "xfs_cksum.h" Causes compilation failure: fs/xfs/xfs_log_recover.c: In function ¿xlog_recover_check_summary¿: fs/xfs/xfs_log_recover.c:4635:3: error: implicit declaration of function ¿xfs_read_agf¿ [-Werror=implicit-function-declaration] error = xfs_read_agf(mp, NULL, agno, 0, &agfbp); ^ I reinstated the include. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sautz@ciht.com Wed Aug 19 00:21:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=DEAR_SOMETHING,FREEMAIL_FROM, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A77C7F54 for ; Wed, 19 Aug 2015 00:21:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2EBA7AC00D for ; Tue, 18 Aug 2015 22:20:59 -0700 (PDT) X-ASG-Debug-ID: 1439961634-04bdf051f977fe0001-NocioJ Received: from ciht.com (231.158.73.124.broad.dynamic.hf.ah.cndata.com [124.73.158.231]) by cuda.sgi.com with ESMTP id stc1arWYdJaKK7tB for ; Tue, 18 Aug 2015 22:20:56 -0700 (PDT) X-Barracuda-Envelope-From: sautz@ciht.com X-Barracuda-Apparent-Source-IP: 124.73.158.231 Received: from SKY-20150217RFN ([127.0.0.1]) by localhost via TCP with ESMTPA; Wed, 19 Aug 2015 13:20:26 +0800 MIME-Version: 1.0 From: Marx Sender: Marx To: xfs@oss.sgi.com Reply-To: Marx Date: 19 Aug 2015 13:20:26 +0800 Subject: =?utf-8?B?RmFjdG9yeSBzdXBwbGllciBvZiBsYXB0b3AgYmFncyxiYWNrcGFja3Msc2hvdWxkZXIgYmFncyBhbmQgdHJhdmVsIGJhZ3M=?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?RmFjdG9yeSBzdXBwbGllciBvZiBsYXB0b3AgYmFncyxiYWNrcGFja3Msc2hvdWxkZXIgYmFncyBhbmQgdHJhdmVsIGJhZ3M=?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: 231.158.73.124.broad.dynamic.hf.ah.cndata.com[124.73.158.231] X-Barracuda-Start-Time: 1439961635 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, MIME_HTML_ONLY, MISSING_MID, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150819052059.C8492A4217A@cuda.sgi.com> PGh0bWw+PGJvZHk+PFA+RGVhciBTaXIgb3IgTWFkYW06PC9QPg0KPFA+SG93IGFyZSB5b3U8 L1A+DQo8UD5XZSBhcmUgdGhlIGZhY3Rvcnkgc3VwcGxpZXIgb2YgcHJvZHVjaW5nIGxhcHRv cCBiYWdzLGJhY2twYWNrcyxzaG91bGRlciBiYWdzLHRyYXZlbCBiYWdzIGFuZCBvdGhlciBz dGl0Y2hpbmcgYmFncyBpbiBDaGluYS48L1A+DQo8UD5JIGFtIHdyaXRpbmcgaGVyZSB0byBz ZWVrIGlmIHRoZXJlIGlzIGFueSBjaGFuY2UgdG8gYmUgeW91ciBiYWdzIHN1cHBsaWVyIGlu IENoaW5hLiBXZSB3aWxsIHByb3ZpZGUgeW91IHRoZSBiYWdzIHdpdGggZ29vZCBxdWFsaXR5 IGFuZCBiZXN0IHNlcnZpY2UuPC9QPg0KPFA+SWYgeW91IG5lZWQgYW55IGtpbmRzIG9mIHRo ZSBiYWdzLCBkb24ndCBoZXNpdGF0ZSB0byBjb250YWN0IHdpdGggdXMuIDwvUD4NCjxQPlJl Z2FyZHM8L1A+DQo8UD5NYXJ4IExpbmc8QlI+U2FsZXMgTWFuYWdlcjxCUj5EZXRpYW4gSW5k dXN0cnkgQ28uLEx0ZDxCUj5BREQ6IE5vLjUgTGFuZTI0LFFpYW5qaW4sU2hpbGluZyB0b3du LCBIdWFkdSBEaXN0cmljdCxHdWFuZ3pob3UsQ2hpbmE8QlI+VEVMOjg2LTIwLTM2OTczOTE2 Jm5ic3A7Jm5ic3A7IEZheDogODYtMjAtMzc5ODQ2MTI8L1A+DQo8UD48QSBocmVmPSJtYWls dG86aHVpeGluc29mdDU1QGZveG1haWwuY29tIj48L0E+Jm5ic3A7PC9QPjwvYm9keT48L2h0 bWw+ From david@fromorbit.com Wed Aug 19 02:25:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 868357F6F for ; Wed, 19 Aug 2015 02:25:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 687968F8040 for ; Wed, 19 Aug 2015 00:25:21 -0700 (PDT) X-ASG-Debug-ID: 1439969117-04cbb078e17b970001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id iWYFxgt5mjpgfFLB for ; Wed, 19 Aug 2015 00:25:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ADCADkLtRVPPwzLHldgxsjMWmCV4N8o0kSBpVSAoV9BIFBTQEBAQEBAQcBAQEBQAE/hQA7JDQFJQMHLYgtqn+mJRmGB4xyDEGBMQWHIopygw+FBIdmgU2HRoUPjBKBcAsBAQGCNywzgQUCAhwHgSABAQE Received: from ppp121-44-51-252.lns20.syd4.internode.on.net (HELO dastard) ([121.44.51.252]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 16:54:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZRxji-0005h9-DH for xfs@oss.sgi.com; Wed, 19 Aug 2015 17:24:38 +1000 Date: Wed, 19 Aug 2015 17:24:38 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 5bb05d5 Message-ID: <20150819072438.GQ714@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 5bb05d5 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="8NvZYKFJsRX2Djef" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439969117 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --8NvZYKFJsRX2Djef Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: 5bb05d5 Merge branch 'xfs-misc-fixes-for-4.3-2' into for-next New Commits: Brian Foster (16): [5e4b538] xfs: disentagle EFI release from the extent count [d43ac29] xfs: return committed status from xfs_trans_roll() [8d99fe9] xfs: fix efi/efd error handling to avoid fs shutdown hangs [6bc43af] xfs: ensure EFD trans aborts on log recovery extent free fa= ilure [e32a1d1] xfs: use EFI refcount consistently in log recovery [f0b2efa] xfs: don't leave EFIs on AIL on mount failure [78d57e4] xfs: icreate log item recovery and cancellation tracepoints [fc0d165] xfs: fix broken icreate log item cancellation [a3f2001] xfs: checksum log record ext headers based on record size [0ae120f] xfs: clean up root inode properly on mount failure [f307080] xfs: fix btree cursor error cleanups [146e54b] xfs: add helper to conditionally remove items from the AIL [d4a97a0] xfs: add missing bmap cancel calls in error paths [1b867d3] xfs: relocate sparse inode mount warning [7df1c17] xfs: swap leaf buffer into path struct atomically during pa= th shift [3d751af] xfs: flush entire file on dio read/write to cached file Darrick J. Wong (1): [2f123bc] libxfs: readahead of dir3 data blocks should use the read v= erifier Dave Chinner (8): [5be203a] Merge branch 'xfs-efi-rework' into for-next [bbf155a] xfs: fix sb_meta_uuid usage [ac383de] xfs: growfs not aware of sb_meta_uuid [fcfbe2c] xfs: log recovery needs to validate against sb_meta_uuid [9286345] xfs: dquots should be stamped with sb_meta_uuid [0952c81] xfs: clean up inode lockdep annotations [dbad7c9] xfs: stop holding ILOCK over filldir callbacks [5bb05d5] Merge branch 'xfs-misc-fixes-for-4.3-2' into for-next Eric Sandeen (1): [c400ee3] xfs: set XFS_DA_OP_OKNOENT in xfs_attr_get Jan Kara (1): [ffeecc5] xfs: Fix xfs_attr_leafblock definition Code Diffstat: fs/xfs/libxfs/xfs_attr.c | 2 + fs/xfs/libxfs/xfs_bmap.c | 1 + fs/xfs/libxfs/xfs_da_btree.c | 23 +++--- fs/xfs/libxfs/xfs_da_format.h | 11 ++- fs/xfs/libxfs/xfs_dir2.c | 3 + fs/xfs/libxfs/xfs_dir2_data.c | 3 +- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 3 - fs/xfs/xfs_bmap_util.c | 87 +++++++++++--------- fs/xfs/xfs_buf_item.c | 6 +- fs/xfs/xfs_dir2_readdir.c | 11 ++- fs/xfs/xfs_dquot.c | 10 +-- fs/xfs/xfs_extfree_item.c | 105 ++++++++++-------------- fs/xfs/xfs_extfree_item.h | 26 +++++- fs/xfs/xfs_file.c | 51 ++++++------ fs/xfs/xfs_fsops.c | 6 +- fs/xfs/xfs_inode.c | 113 ++++++++++++++++++-------- fs/xfs/xfs_inode.h | 85 ++++++++++++++------ fs/xfs/xfs_inode_item.c | 11 +-- fs/xfs/xfs_itable.c | 3 +- fs/xfs/xfs_log.c | 37 +++++++-- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_log_recover.c | 180 ++++++++++++++++++++++++++++++++------= ---- fs/xfs/xfs_mount.c | 28 ++++--- fs/xfs/xfs_rtalloc.c | 57 ++++++------- fs/xfs/xfs_super.c | 4 + fs/xfs/xfs_symlink.c | 7 +- fs/xfs/xfs_trace.h | 34 ++++++++ fs/xfs/xfs_trans.c | 15 +++- fs/xfs/xfs_trans.h | 9 +-- fs/xfs/xfs_trans_extfree.c | 32 +++++--- fs/xfs/xfs_trans_priv.h | 15 ++++ 33 files changed, 643 insertions(+), 340 deletions(-) --=20 Dave Chinner david@fromorbit.com --8NvZYKFJsRX2Djef Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJV1C81AAoJEK3oKUf0dfodDLQP+wanj0zTmwKbhsRwliIkw7YC bkZAVVfU/j6x6tWIwqiBeJVWuhDU8DRH3GKn5V2wrrOkMSDgirVhUhsff5jsCCRS Rtm/PIdXyklrYzAOXtSF4L8Hy+jVYRPho53uYl/SaYQttHBqjBMlr2BclcuKKQPD tA2L9gVyJYWGsdW8VwY7TsOEx5UIJfJsaT4BiRdt/XkLi15gKhMmtF4Ao0mKgIrz bzrf1IhgKNP9q2WfuF4X8KdlfkW/QalUt+AoIbRGmjLbSGSJmRAylDgUBcubcyDe TnAwpaqw8G08/0KWcwPqQDvfMfDY+vLtrwFUBa6YlJ3mn/tINVIHg46VtY4ErZzl zBBbWJyUxQFO6meuhxFGj3KnczCXN9Gdcx5Yk+HguAXrCkz/9x6V8VwJi9Bh1Mn0 ecvz4yWBPmwJ1+f+16KTzdFl7HAetnEK4PJYaZlUAXJykwVG+/DyDiVC5EEoIF+d kEMXmADvr++cpULQgDQP0+0wZXwHOz/eUaOKCX1ZhA8Z0pgwkxarAF8BZBvEtdbn eeRrt9REbzOVLrNyu5XXQUFc7oqusHRmS38T3X3DnMxPGiYS4UnhcamM94Fbl4Bi VbLTC+prn/CydFY3P8hifIq6Log0Ig/Eu4gH9NMBZVqJVCjAMrfVP/T4FN5VCojd oXWpisbYj6gjfIsYL/6A =pTYB -----END PGP SIGNATURE----- --8NvZYKFJsRX2Djef-- From jtulak@redhat.com Wed Aug 19 03:06:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 88CF57F72 for ; Wed, 19 Aug 2015 03:06:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4D97C304062 for ; Wed, 19 Aug 2015 01:06:28 -0700 (PDT) X-ASG-Debug-ID: 1439971585-04bdf051f97ca50001-NocioJ Received: from mail-ig0-f180.google.com (mail-ig0-f180.google.com [209.85.213.180]) by cuda.sgi.com with ESMTP id g2rlBQKI8rAxbWxc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 19 Aug 2015 01:06:26 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igfj19 with SMTP id j19so102496687igf.0 for ; Wed, 19 Aug 2015 01:06:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=spEI6xyVaW7uf9EZXf++028f4B89ApvLdo6Y3MhDE38=; b=aAO0Cul+9gShpzr6ivYY/uYSasEQPluURYDfGlWeHOZlHBRbk7MEAk9ZvYOMMaimEi fJOCsc9IJCxdblKY+VEH8ieihkkZxQ9GXqrcHSDklVTlixHpIdbpsel7IH02ukR4QOHA uob56lwY4HoepDWWOzPN616/ThHtOMECl8h9smPQ3GnxP86F7OXn5FiH0PuM05Tsyr4n 01Bjq6Jyrpk7mz/N9H3qqwScYL1UZMrA8ara46mk4GTWd28SxYyPEJjvSCMEqy7F6b9k evW1MlW0ZZxSARwMUujJMMP58S7enmRBKycD3Cu30Sx5xfx3ir7ZozXhVGHly+Vuki29 8lOA== X-Gm-Message-State: ALoCoQlKDO2NLYhRzyVDx7J2zbHo7jqx0KMDjik9OPhMxInuYhRdefEV0s03i7e9O9UkUNbGW01Z X-Received: by 10.50.67.179 with SMTP id o19mr24838920igt.63.1439971585520; Wed, 19 Aug 2015 01:06:25 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Wed, 19 Aug 2015 01:06:06 -0700 (PDT) In-Reply-To: <20150818220119.GL714@dastard> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-9-git-send-email-jtulak@redhat.com> <20150817193624.GA8444@infradead.org> <20150818082046.GK714@dastard> <20150818220119.GL714@dastard> From: Jan Tulak Date: Wed, 19 Aug 2015 10:06:06 +0200 Message-ID: Subject: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: replace obsolete memalign with posix_memalign Cc: Christoph Hellwig , xfs-oss Content-Type: multipart/alternative; boundary=047d7bdca610d79518051da5828b X-Barracuda-Connect: mail-ig0-f180.google.com[209.85.213.180] X-Barracuda-Start-Time: 1439971585 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bdca610d79518051da5828b Content-Type: text/plain; charset=UTF-8 On Wed, Aug 19, 2015 at 12:01 AM, Dave Chinner wrote: > On Tue, Aug 18, 2015 at 10:33:49AM +0200, Jan Tulak wrote: > > On Tue, Aug 18, 2015 at 10:20 AM, Dave Chinner > wrote: > > > > > On Tue, Aug 18, 2015 at 09:04:24AM +0200, Jan Tulak wrote: > > > > I thought about it. However, with memalign from malloc marked > obsolete > > > > (and with posix_memalign having guaranteed alignment restrictions > [1]), I > > > > saw it better > > > > to use the posix variant everywhere. > > > > > > Putting a sane wrapper around an nasty library function is just > > > fine. The memalign wrapper makes sense from this perspective - even > > > gcc can't tell if variables passed to posix_memalign are correctly > > > initialised or not, whereas no such problems exist for memalign(). > > > > > > > I could make a wrapper simulating the old memalign behaviour, but I > don't > > > > think it would make sense. > > > > > > I think it makes more sense than using posix_memalign() everywhere > > > and then ignoring the return variable that tells you it failed... > > > > > > > I searched for this, but didn't find any reasonable answer: > > > > How long can be things in standard libraries marked obsolete before > > > > removing? > > > > > > With a wrapper, we don't care. > > > > > > > [1] man memalign: > > > > On many systems there are alignment restrictions, for > example, on > > > buf- > > > > fers used for direct block device I/O. POSIX specifies > the > > > path- > > > > conf(path,_PC_REC_XFER_ALIGN) call that tells what alignment > is > > > needed. > > > > Now one can use posix_memalign() to satisfy this requirement. > > > > > > > > posix_memalign() verifies that alignment matches the > > > requirements > > > > detailed above. memalign() may not check that the alignment > > > argument > > > > is correct. > > > > > > Yes, you can get it wrong with memalign. But we don't, because we > > > follow the rules for DIO buffer alignment and set it correctly. > > > Being able to directly control the alignment of the memory buffer is > > > a reason for using memalign() over posix_memalign(), not the other > > > way around. > > > > > > > So a wrapper used on all platforms is an acceptable solution? All right, > > this explanation makes sense. I will change it that way. The only > question > > I have now is whether to use posix_memalign on every platform, or > whether to > > make it platform_memalign and use the old memalign inside for Linux. > > No need for a wrapper on platforms that support memalign. We can add > a wrapper when and if memalign ever goes away (which, FWIW, will > break lots of code). Indeed, we alreadyhave these platform dependent > "wrappers": > > include/darwin.h:#define memalign(a,sz) valloc(sz) > include/freebsd.h:#define memalign(a,sz) valloc(sz) > > The question now is - do we even need to change anything? > > > https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/valloc.3.html > > "The valloc() function allocates size bytes of memory and returns a > pointer to the allocated memory. The allocated memory is > aligned on a page boundary" > > Which means it does pretty exactly the same thing as > posix_memalign(), and so we don't need to change anything, right? > > Mmm, I'm sure I had some issue with valloc - that was why I decided to replace it. But now, I can't remember what exactly it was and everything seems to work the same with or without it. :-/ So maybe the real cause of the issue was something else, fixed in another patch, making this one abundant... OK, I'm moving it out of the patchset. And I'm thinking about some private issue tracker where I can make notes, reference commits and such. :D Cheers, Jan -- Jan Tulak jtulak@redhat.com --047d7bdca610d79518051da5828b Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Wed, Aug 19, 2015 at 12:01 AM, Dave Chinner <david@fromorbit.com<= /a>> wrote:
On Tue, A= ug 18, 2015 at 10:33:49AM +0200, Jan Tulak wrote:
> On Tue, Aug 18, 2015 at 10:20 AM, Dave Chinner <david@fromorbit.com> wrote: >
> > On Tue, Aug 18, 2015 at 09:04:24AM +0200, Jan Tulak wrote:
> > > I thought about it. However, with memalign from malloc marke= d obsolete
> > > (and with posix_memalign having guaranteed alignment restric= tions [1]), I
> > > saw it better
> > > to use the posix variant everywhere.
> >
> > Putting a sane wrapper around an nasty library function is just > > fine. The memalign wrapper makes sense from this perspective - ev= en
> > gcc can't tell if variables passed to posix_memalign are corr= ectly
> > initialised or not, whereas no such problems exist for memalign()= .
> >
> > > I could make a wrapper simulating the old memalign behaviour= , but I don't
> > > think it would make sense.
> >
> > I think it makes more sense than using posix_memalign() everywher= e
> > and then ignoring the return variable that tells you it failed...=
> >
> > > I searched for this, but didn't find any reasonable answ= er:
> > > How long can be things in standard libraries marked obsolete= before
> > > removing?
> >
> > With a wrapper, we don't care.
> >
> > > [1] man memalign:
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 On many systems there are alignme= nt restrictions, for example, on
> > buf-
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 fers=C2=A0 used=C2=A0 for=C2=A0 d= irect=C2=A0 block=C2=A0 device=C2=A0 I/O.=C2=A0 POSIX specifies the
> > path-
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 conf(path,_PC_REC_XFER_ALIGN) cal= l that tells what alignment is
> > needed.
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 Now one can use posix_memalign() = to satisfy this requirement.
> > >
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 posix_memalign()=C2=A0 verifies= =C2=A0 that=C2=A0 alignment=C2=A0 matches=C2=A0 the
> > requirements
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 detailed above.=C2=A0 memalign() = may not check that the=C2=A0 alignment
> > argument
> > >=C2=A0 =C2=A0 =C2=A0 =C2=A0 is correct.
> >
> > Yes, you can get it wrong with memalign. But we don't, becaus= e we
> > follow the rules for DIO buffer alignment and set it correctly. > > Being able to directly control the alignment of the memory buffer= is
> > a reason for using memalign() over posix_memalign(), not the othe= r
> > way around.
> >
>
> So a wrapper used on all platforms is an acceptable solution? All righ= t,
> this explanation makes sense. I will change it that way. The only ques= tion
> I have now is whether to use posix_memalign on every platform, or whet= her to
> make it platform_memalign and use the old memalign inside for Linux.
No need for a wrapper on platforms that support memalign. We ca= n add
a wrapper when and if memalign ever goes away (which, FWIW, will
break lots of code). Indeed, we alreadyhave these platform dependent
"wrappers":

include/darwin.h:#define memalign(a,sz) valloc(sz)
include/freebsd.h:#define memalign(a,sz)=C2=A0 =C2=A0 =C2=A0 =C2=A0 valloc(= sz)

The question now is - do we even need to change anything?

https://developer.apple.com/library/ios/documentation/System/Concep= tual/ManPages_iPhoneOS/man3/valloc.3.html

"The valloc() function allocates size bytes of memory and returns a =C2=A0pointer to the allocated memory.=C2=A0 The allocated memory is
=C2=A0aligned on a page boundary"

Which means it does pretty exactly the same thing as
posix_memalign(), and so we don't need to change anything, right?


Mmm, I'm sur= e I had some issue with valloc - that was why I decided to replace it.
But now, I can't remember what exactly it was and everything seem= s to work the same
with or without it. :-/
So maybe the= real cause of the issue was something else, fixed in another patch,
<= div>making this one abundant...

OK, I'm moving= it out of the patchset. And I'm thinking about some private issue
tracker where I can make notes, reference commits and such. :D
<= /div>
Cheers,
Jan

--
--047d7bdca610d79518051da5828b-- From BATV+0eec7af3b2097fc69046+4378+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 19 03:09:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3FCC97F73 for ; Wed, 19 Aug 2015 03:09:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 21EC58F8037 for ; Wed, 19 Aug 2015 01:09:43 -0700 (PDT) X-ASG-Debug-ID: 1439971782-04cbb078e37e160001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id osgqI9vCTTVSXFs2 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 19 Aug 2015 01:09:42 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0eec7af3b2097fc69046+4378+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRyRI-0003mQ-V6; Wed, 19 Aug 2015 08:09:40 +0000 Date: Wed, 19 Aug 2015 01:09:40 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Jan Tulak , hch@infradead.org, xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150819080940.GA13130@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818214557.GC3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439971782 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote: > Hmmm, looks like I accidentally comitted an earlier version of this > patch yesterday. Jan, can you send delta patches to what I committed > to address more recent review comments? Sorry, my bad. Can you revert it for now? I think most of these changes are incorrect and should either be dropped for now by disabling fsx or will need a major rework. From returns.14.7003996@smtpgm.com Wed Aug 19 03:57:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0B5907F75 for ; Wed, 19 Aug 2015 03:57:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6EFC4AC007 for ; Wed, 19 Aug 2015 01:57:02 -0700 (PDT) X-ASG-Debug-ID: 1439974619-04cbb078e4809b0001-NocioJ Received: from mailer195.gate82.rs.smtp.com (mailer195.gate82.rs.smtp.com [74.91.82.195]) by cuda.sgi.com with ESMTP id oiNxCMCsDfGsqVEd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 01:56:59 -0700 (PDT) X-Barracuda-Envelope-From: returns.14.7003996@smtpgm.com X-Barracuda-Apparent-Source-IP: 74.91.82.195 X-MSFBL: eGZzQG9zcy5zZ2kuY29tQDc0XzkxXzgyXzE5NUBidXNodmVsZHRzYWZhcmlfZGVk aWNhdGVkX3Bvb2xA DKIM-Signature: v=1; a=rsa-sha256; d=smtp.com; s=smtpcomcustomers; c=relaxed/simple; q=dns/txt; i=@smtp.com; t=1439974616; h=From:Subject:To:Date:MIME-Version:Content-Type; bh=L+CH8qiCiZOh5/cWGRiQ+puacp6nCI6xsy6YYRfpcUE=; b=GsnvKuvPZObDrlo+6/hxqjM5cTRqzyUAjot4bcRVQh0N7Mguxlx+Nz1aKhoT51gQ r/sTXGslSmcAp+W3g8ZASuD4wGXiKE7uUK7TXke13RPrlweZPb0nE1Z/Vaz3uAvH piI9hVbCCoyMvbqvNwnSHsPcwwgAABr+KBfW6zJZ/yA=; Received: from [23.96.192.49] ([23.96.192.49:64387] helo=RD000D3A60A896) by rs-ord-gm-mta05-3.smtp.com (envelope-from ) (ecelerity 3.6.7.46655 r(Core:3.6.7.0)) with ESMTPA id 4A/64-04976-8D444D55; Wed, 19 Aug 2015 08:56:56 +0000 Reply-To: "Bushveld Safaris" Message-ID: <4A.64.04976.8D444D55@rs-ord-gm-mta05-3.smtp.com> From: "Bushveld Safaris" To: Subject: Re: Winter Bushveld Breaks Date: Wed, 19 Aug 2015 08:56:57 GMT X-ASG-Orig-Subj: Re: Winter Bushveld Breaks X-Mailer: OpenSmtp.net Precedence: bulk List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 X-SMTPCOM-Spam-Policy: SMTP.com is a paid relay service. We do not tolerate UCE of any kind. Please report it ASAP to abuse@smtp.com X-SMTPCOM-Tracking-Number: 2c1aa2a8-9be1-45f5-914c-43703682bd55 X-SMTPCOM-Sender-ID: 7003996 Feedback-ID: 7003996:SMTPCOM X-Barracuda-Connect: mailer195.gate82.rs.smtp.com[74.91.82.195] X-Barracuda-Start-Time: 1439974619 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFs Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25h bC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhl YWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsg Y2hhcnNldD11dGYtOCIgLz4NCjx0aXRsZT5ad2FoaWxpIC0gT2N0b2JlciAyMDE0IEhhbGYgUHJp Y2UgU2FsZTwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLnJlZHAxIHsJZm9udC1m YW1pbHk6ICJMdWNpZGEgU2FucyBVbmljb2RlIiwgIkx1Y2lkYSBHcmFuZGUiLCBzYW5zLXNlcmlm Ow0KCWZvbnQtc2l6ZTogMTRweDsNCglmb250LXdlaWdodDogDQoJY29sb3I6ICNGRkY7CQkJY29s b3I6ICNGMDA7DQp9DQoucmVkcDEgewlmb250LWZhbWlseTogIkx1Y2lkYSBTYW5zIFVuaWNvZGUi LCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQoJZm9udC1zaXplOiAxNHB4Ow0KCWZvbnQt d2VpZ2h0OiANCgljb2xvcjogI0ZGRjsJCQljb2xvcjogI0YwMDsNCn0NCi5yZWRwMSB7CWZvbnQt ZmFtaWx5OiAiTHVjaWRhIFNhbnMgVW5pY29kZSIsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJp ZjsNCglmb250LXNpemU6IDE0cHg7DQoJZm9udC13ZWlnaHQ6IA0KCWNvbG9yOiAjRkZGOwkJCWNv bG9yOiAjRjAwOw0KfQ0KPC9zdHlsZT4NCjwvaGVhZD4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+ DQpoMSB7DQoJZm9udC1mYW1pbHk6ICJMdWNpZGEgU2FucyBVbmljb2RlIiwgIkx1Y2lkYSBHcmFu ZGUiLCBzYW5zLXNlcmlmOw0KCWZvbnQtc2l6ZTogMzBweDsNCglmb250LXdlaWdodDogYm9sZDsN Cgljb2xvcjogI0ZGRjsNCg0KfQ0KYm9keXsNCgliYWNrZ3JvdW5kLWNvbG9yOiNmZmY7DQoJYmFj a2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXkNCn0NCmgyIHsNCglmb250LWZhbWlseTogIkx1Y2lkYSBT YW5zIFVuaWNvZGUiLCAiTHVjaWRhIEdyYW5kZSIsIHNhbnMtc2VyaWY7DQoJZm9udC1zaXplOiAx OHB4Ow0KCWZvbnQtd2VpZ2h0OiBib2xkOyANCgljb2xvcjogI0ZGRjsNCn0NCnAgew0KCWZvbnQt ZmFtaWx5OiAiTHVjaWRhIFNhbnMgVW5pY29kZSIsICJMdWNpZGEgR3JhbmRlIiwgc2Fucy1zZXJp ZjsNCglmb250LXNpemU6IDE2cHg7DQoJZm9udC13ZWlnaHQ6IA0KCWNvbG9yOiAjRkZGOw0KfQ0K DQoucmVkcCB7DQoJZm9udC1mYW1pbHk6ICJMdWNpZGEgU2FucyBVbmljb2RlIiwgIkx1Y2lkYSBH cmFuZGUiLCBzYW5zLXNlcmlmOw0KCWZvbnQtc2l6ZTogMTRweDsNCglmb250LXdlaWdodDogDQoJ Y29sb3I6ICNGRkY7CQkJY29sb3I6ICNGMDA7DQp9DQphOmxpbmsgew0KCWNvbG9yOiAjRkZGOw0K fQ0KYTp2aXNpdGVkIHsNCgljb2xvcjogI0ZGRjsNCn0NCmE6aG92ZXIgew0KCWNvbG9yOiAjQzYw Ow0KfQ0KPC9zdHlsZT4NCjxib2R5PjxpbWcgYWx0PScnIHNyYz0naHR0cDovL2lzLmNpbmNvLnB1 cmxzbWFpbC5jb20vL3NpdGUvcy9vLmFzcHg/SGl0SUQ9MTQzOTk3NDUwOTY1MCZFbUlEPTEzMTQ5 ODYyJlN0SUQ9NDc4OTMmU0lEPTE0Jk5JRD02ODk2MTUmRW1haWw9eGZzQG9zcy5zZ2kuY29tJyBi b3JkZXI9JzAnIHdpZHRoPScxJyBoZWlnaHQ9JzEnPjxpbWcgYWx0PScnIHNyYz0naHR0cDovL2lz LmNpbmNvLnB1cmxzbWFpbC5jb20vL1JXQ29kZS9jbGljay5hc3A/SGl0SUQ9MTQzOTk3NDUwOTY1 MCZFbUlEPTEzMTQ5ODYyJlN0SUQ9NDc4OTMmU0lEPTE0Jk5JRD02ODk2MTUmRW1haWw9eGZzQG9z cy5zZ2kuY29tJyBib3JkZXI9JzAnIHdpZHRoPScxJyBoZWlnaHQ9JzEnPjxzdHlsZSAgdHlwZT0i dGV4dC9jc3MiPmJvZHkge2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7bWFyZ2luLXRvcDogMHB4ICFp bXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IDBweCAhaW1wb3J0YW50OyBwYWRkaW5nOjBweCAhaW1w b3J0YW50OyBtc28tbWFyZ2luLXRvcC1hbHQ6MHB4ICFpbXBvcnRhbnQ7IG1zby1tYXJnaW4tYm90 dG9tLWFsdDowcHggIWltcG9ydGFudDsgbXNvLXBhZGRpbmctYWx0OiAwcHggMHB4IDBweCAwcHgg IWltcG9ydGFudDt9IEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aCA6IDQ4MHB4KSB7 IC5mdWxsX3dpZHRoeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9IH08L3N0eWxlPg0KCTx0YWJs ZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0i MCI+DQogICAgDQogICAgICA8dGJvZHk+PHRyPg0KICAgICAgICAJPHRkIGFsaWduPSJsZWZ0Ij48 aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93d3cuendhaGlsaS5jby56YS9tYWlsZXJzL2hhbGYtcHJp Y2UvMS5wbmciIC8+PGJyIC8+PGJyIC8+PC90ZD4NCiAgICAgIDwvdHI+DQogICAgICANCiAgICAg IA0KICAgCSAgPHRyPg0KICAgICAgICAJPHRkIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNy Yz0iaHR0cDovL3d3dy56d2FoaWxpLmNvLnphL21haWxlcnMvaGFsZi1wcmljZS8yLnBuZyIgLz48 YnIgLz48YnIgLz48L3RkPg0KICAgICAgPC90cj4NCiAgICAgIA0KICAgIAkNCiAgICAgIDx0cj4N CiAgICAgICAgCTx0ZCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9Imh0dHA6Ly93d3cu endhaGlsaS5jby56YS9tYWlsZXJzL2hhbGYtcHJpY2UvMy5wbmciIC8+PGJyIC8+PGJyIC8+PC90 ZD4NCiAgICAgIDwvdHI+DQogICAgICANCiAgICAgIA0KICAgCSAgPHRyPg0KICAgICAgICAJPHRk IGFsaWduPSJjZW50ZXIiPjxwPjxpbWcgYWx0PSIiIHNyYz0iaHR0cDovL3d3dy56d2FoaWxpLmNv LnphL21haWxlcnMvaGFsZi1wcmljZS80LnBuZyIgLz48YnIgLz48L3A+PGRpdj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6IDEwcHQ7Ij48c3Ryb25nPkV4dGVuZGVk IGR1ZSB0byBwb3B1bGFyIGRlbWFuZDombmJzcDtTcGVjaWFsIHZhbGlkIHRpbGwmbmJzcDszMSZu YnNwO0F1ZyAyMDE1LiZuYnNwOyZuYnNwOzwvc3Ryb25nPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6IDEwcHQ7Ij48c3Ryb25nPk1pbiAyIG5pZ2h0cyBz dGF5IHJlcXVpcmVkLjwvc3Ryb25nPjwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJmb250 LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWls eTogQXJpYWw7IGZvbnQtc2l6ZTogMTBwdDsiPjxzdHJvbmc+VGVybXMgYW5kIENvbmRpdGlvbnMg YXBwbHkgPC9zdHJvbmc+PC9zcGFuPjwvc3Bhbj48L2Rpdj48ZGl2PiZuYnNwOzwvZGl2PjwvdGQ+ DQogICAgICA8L3RyPg0KICAgICAgDQogICAgICANCiAgICAgIA0KICAgCSAgPHRyPg0KICAgICAg ICAJPHRkIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaHR0cDovL3d3dy56d2FoaWxp LmNvLnphL21haWxlcnMvd2VsbC1kZXNlcnZlZC1idXNoYnJlYWsvNS5wbmciIHVzZW1hcD0iI01h cE1hcCIgLz4NCiAgICAgICAgICAgIDxtYXAgbmFtZT0iTWFwTWFwIiBpZD0iTWFwTWFwIj48YXJl YSBocmVmPSJodHRwOi8vaXMuY2luY28ucHVybHNtYWlsLmNvbS9zZW5kbGluay5hc3A/SGl0SUQ9 MTQzOTk3NDUwOTY1MCZTdElEPTQ3ODkzJlNJRD0xNCZOSUQ9Njg5NjE1JkVtSUQ9MTMxNDk4NjIm TGluaz1hSFIwY0RvdkwzZDNkeTU2ZDJGb2FXeHBMbU52TG5waEx3PT0mdG9rZW49MmQyN2NmNmQx MjVjMTAxNDc3ZjU3NTI2ZGVjMDFmMDNlYTZhMmY2ZiIgc2hhcGU9InJlY3QiIGNvb3Jkcz0iNDk1 LDM0LDY1Myw0OCIgLz4NCiAgICAgICAgCSAgICA8YXJlYSBocmVmPSJtYWlsdG86cmVzZXJ2YXRp b25zQHp3YWhpbGkuY28uemEiIHNoYXBlPSJyZWN0IiBjb29yZHM9IjE4OSwzMiw0MTQsNDgiIC8+ DQogICAgICAgIDwvbWFwPjwvdGQ+DQogICAgICA8L3RyPiAgICAgICAgICAgICAgICAgDQogICAg ICANCiAgICAgICAgICAgICANCjwvdGJvZHk+PC90YWJsZT4NCg0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlICBiZ2NvbG9yPSIjRkZGRkZGIiAgc3R5 bGU9Im1pbi13aWR0aDogMTAwJTsgd2lkdGg6IDEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9 IjAiIGNlbGxzcGFjaW5nPSIwIiAgd2lkdGg9IjEwMCUiPjx0cj48dGQ+PHRhYmxlICBiZ2NvbG9y PSIjRkZGRkZGIiBhbGlnbj0icmlnaHQiIHN0eWxlPSJtaW4td2lkdGg6IDEwMCU7IHdpZHRoOiAx MDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgIHdpZHRoPSIx MDAlIj48dHI+PHRkPjx0YWJsZSBhbGlnbj0iQ2VudGVyIiBiZ2NvbG9yPSIjRkZGRkZGIiBib3Jk ZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiIHN0eWxl PSJ3aWR0aDoxMDAlO21pbi13aWR0aDoxMDAlO3BhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXM7YmFj a2dyb3VuZC1jb2xvcjojRkZGRkZGOyI+PHRyIHN0eWxlPSJ3aWR0aDoxMDAlOyI+PHRkIHdpZHRo PSIyMCIgYmdjb2xvcj0iI0ZGRkZGRiIgc3R5bGU9IndpZHRoOjIwcHg7Ij4mbmJzcDs8L3RkPjx0 ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249InRvcCIgIGNsYXNzPSJmb290ZXJDb250ZW50IiBzdHls ZT0id2lkdGg6OTklOyI+IDxkaXYgaWQ9ImZvb3RlckxpbmtzIiBzdHlsZT0iZGlzcGxheTpibG9j ayAhaW1wb3J0YW50OyB3aWR0aDoxMDAlOyBtYXJnaW4tdG9wOiAxMHB4Ij48YSBocmVmPSJodHRw Oi8vaXMuY2luY28ucHVybHNtYWlsLmNvbS9SV0NvZGUvc3Vic2NyaWJlLmFzcD9Nb2RlPXVuc3Vi c2NyaWJlJlNpdGVJRD00Nzg5MyZTSUQ9MTQmRW1haWw9eGZzQG9zcy5zZ2kuY29tJmhpdGlkPTE0 Mzk5NzQ1MDk2NTAmdG9rZW49MmQyN2NmNmQxMjVjMTAxNDc3ZjU3NTI2ZGVjMDFmMDNlYTZhMmY2 ZiIgdGFyZ2V0PSJuZXciIGNsYXNzPSJmb290ZXJDbGljayIgc3R5bGU9ImNvbG9yOiAjMzMzMzMz OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O2ZvbnQt ZmFtaWx5OlRpbWVzOyBmb250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpO b3JtYWwiPnVuc3Vic2NyaWJlPC9hPjxmb250IGlkPSJyZW1vdmVNYWluIiBzdHlsZT0iY29sb3I6 ICMzMzMzMzM7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7 Zm9udC1mYW1pbHk6VGltZXM7IGZvbnQtc2l6ZTo4cHg7IGNvbG9yOiM4MDgwODA7IGZvbnQtd2Vp Z2h0Ok5vcm1hbCI+IHwgPC9mb250PiA8YSBocmVmPSJodHRwOi8vaXMuY2luY28ucHVybHNtYWls LmNvbS9SV0NvZGUvc3Vic2NyaWJlLmFzcD9Nb2RlPXVwZGF0ZSZTaXRlSUQ9NDc4OTMmU0lEPTE0 JkVtYWlsPXhmc0Bvc3Muc2dpLmNvbSZoaXRpZD0xNDM5OTc0NTA5NjUwJnRva2VuPTJkMjdjZjZk MTI1YzEwMTQ3N2Y1NzUyNmRlYzAxZjAzZWE2YTJmNmYiIHRhcmdldD0ibmV3IiBjbGFzcz0iZm9v dGVyQ2xpY2siIHN0eWxlPSJjb2xvcjogIzMzMzMzMzsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBk aXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtmb250LWZhbWlseTpUaW1lczsgZm9udC1zaXplOjhw eDsgY29sb3I6IzgwODA4MDsgZm9udC13ZWlnaHQ6Tm9ybWFsIj4gdXBkYXRlIHByb2ZpbGU8L2E+ IDxmb250IGlkPSJyZW1vdmVNYWluIiBzdHlsZT0iY29sb3I6ICMzMzMzMzM7IGZvbnQtc3R5bGU6 IG5vcm1hbDsgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5OlRpbWVzOyBm b250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWwiPiB8IDwvZm9u dD4gPGEgaHJlZj0iaHR0cDovL2lzLmNpbmNvLnB1cmxzbWFpbC5jb20vc2l0ZS9mb3J3YXJkX3Rv X2ZyaWVuZC5hc3B4P1NpdGVJRD00Nzg5MyZTSUQ9MTQmU2VjdGlvbj02ODk2MTUmaGl0aWQ9MTQz OTk3NDUwOTY1MCZGcm9tRW1haWw9eGZzQG9zcy5zZ2kuY29tJnRva2VuPTJkMjdjZjZkMTI1YzEw MTQ3N2Y1NzUyNmRlYzAxZjAzZWE2YTJmNmYmRW1haWxJRD0xMzE0OTg2MiIgdGFyZ2V0PSJuZXci IGNsYXNzPSJmb290ZXJDbGljayIgc3R5bGU9ImNvbG9yOiAjMzMzMzMzOyB0ZXh0LWRlY29yYXRp b246IG5vbmU7IGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5OlRpbWVzOyBm b250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWwiPmZvcndhcmQ8 L2E+PGZvbnQgaWQ9InJlbW92ZU1haW4iIHN0eWxlPSJmb250LXN0eWxlOiBub3JtYWw7IGRpc3Bs YXk6aW5saW5lICFpbXBvcnRhbnQ7Zm9udC1mYW1pbHk6VGltZXM7IGZvbnQtc2l6ZTo4cHg7IGNv bG9yOiM4MDgwODA7IGZvbnQtd2VpZ2h0Ok5vcm1hbCI+IHwgPC9mb250PiA8YSBocmVmPSJodHRw Oi8vaXMuY2luY28ucHVybHNtYWlsLmNvbS9SV0NvZGUvc3Vic2NyaWJlLmFzcD9TaXRlSUQ9NDc4 OTMmU0lEPTE0JkVtYWlsPXhmc0Bvc3Muc2dpLmNvbSZoaXRpZD0xNDM5OTc0NTA5NjUwJnRva2Vu PTJkMjdjZjZkMTI1YzEwMTQ3N2Y1NzUyNmRlYzAxZjAzZWE2YTJmNmYiICB0YXJnZXQ9Im5ldyIg Y2xhc3M9ImZvb3RlckNsaWNrIiBzdHlsZT0iY29sb3I6ICMzMzMzMzM7dGV4dC1kZWNvcmF0aW9u OiBub25lOyBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtmb250LWZhbWlseTpUaW1lczsgZm9u dC1zaXplOjhweDsgY29sb3I6IzgwODA4MDsgZm9udC13ZWlnaHQ6Tm9ybWFsIj5zdWJzY3JpYmU8 L2E+PC9kaXY+PC90ZD48dGQgd2lkdGg9IjIwIiBiZ2NvbG9yPSIjRkZGRkZGIiBzdHlsZT0id2lk dGg6MjBweDsiPiZuYnNwOzwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPSIyMCIgYmdjb2xvcj0iI0ZG RkZGRiIgc3R5bGU9IndpZHRoOjIwcHg7Ij4mbmJzcDs8L3RkPjx0ZCBhdD0iMSIgYWxpZ249IkNl bnRlciIgdmFsaWduPSJ0b3AiIHN0eWxlPSIiIGNsYXNzPSJmb290ZXJDb250ZW50Ij48dGFibGUg YWxpZ249IkNlbnRlciI+PHRyPjx0ZCBzdHlsZT0iRGlzcGxheTogaW5saW5lLWJsb2NrO3dpZHRo OjEwMCUiPjxkaXYgYXQ9IjEiIHN0eWxlPSJEaXNwbGF5OiBpbmxpbmUtYmxvY2s7d2lkdGg6MTAw JSI+PGRpdiBhdD0iMSIgYWxpZ249J0NlbnRlcic+PGEgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJs b2NrOyd0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyIgaHJlZj0iaHR0cDovL2lzLmNpbmNv LnB1cmxzbWFpbC5jb20vc3NwdWJsaXNoLmFzcHg/U0lEPTE0JlNlY3Rpb25JRD02ODk2MTUmU2l0 ZUlEPTQ3ODkzJkVtYWlsSUQ9MTMxNDk4NjImSGl0SUQ9MTQzOTk3NDUwOTY1MCZTU0xpbmtJRD0y MSZ0b2tlbj0yZDI3Y2Y2ZDEyNWMxMDE0NzdmNTc1MjZkZWMwMWYwM2VhNmEyZjZmIiB0aXRsZT0i UHVibGljbHkgKzEiPjxpbWcgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7 IGJvcmRlcjogbm9uZTsnIGJvcmRlcj0nMCcgaHNwYWNlPSc1JyB2c3BhY2U9JzUnIHNyYz0iaHR0 cDovL2lzLmNpbmNvLnB1cmxzbWFpbC5jb20vaW1hZ2VzL2xvZ29fZ29vZ2xlcGx1c19zLnBuZyIg dGl0bGU9IlB1YmxpY2x5ICsxIiBhbHQ9IlB1YmxpY2x5ICsxIiBib3JkZXI9IjAiLz48L2E+Jm5i c3A7Jm5ic3A7PGEgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrOyd0YXJnZXQ9Il9ibGFuayIg cmVsPSJub2ZvbGxvdyIgaHJlZj0iaHR0cDovL2lzLmNpbmNvLnB1cmxzbWFpbC5jb20vc3NwdWJs aXNoLmFzcHg/U0lEPTE0JlNlY3Rpb25JRD02ODk2MTUmU2l0ZUlEPTQ3ODkzJkVtYWlsSUQ9MTMx NDk4NjImSGl0SUQ9MTQzOTk3NDUwOTY1MCZTU0xpbmtJRD0zJnRva2VuPTJkMjdjZjZkMTI1YzEw MTQ3N2Y1NzUyNmRlYzAxZjAzZWE2YTJmNmYiIHRpdGxlPSJUd2VldCBUaGlzIj48aW1nIHN0eWxl PSdkaXNwbGF5OmlubGluZS1ibG9jayAhaW1wb3J0YW50OyBib3JkZXI6IG5vbmU7JyBib3JkZXI9 JzAnIGhzcGFjZT0nNScgdnNwYWNlPSc1JyBzcmM9Imh0dHA6Ly9pcy5jaW5jby5wdXJsc21haWwu Y29tL2ltYWdlcy9sb2dvX3R3aXR0ZXJfcy5wbmciIHRpdGxlPSJUd2VldCBUaGlzIiBhbHQ9IlR3 ZWV0IFRoaXMiIGJvcmRlcj0iMCIvPjwvYT4mbmJzcDsmbmJzcDs8YSBzdHlsZT0nZGlzcGxheTpp bmxpbmUtYmxvY2s7J3RhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93IiBocmVmPSJodHRwOi8v aXMuY2luY28ucHVybHNtYWlsLmNvbS9zc3B1Ymxpc2guYXNweD9TSUQ9MTQmU2VjdGlvbklEPTY4 OTYxNSZTaXRlSUQ9NDc4OTMmRW1haWxJRD0xMzE0OTg2MiZIaXRJRD0xNDM5OTc0NTA5NjUwJlNT TGlua0lEPTEmdG9rZW49MmQyN2NmNmQxMjVjMTAxNDc3ZjU3NTI2ZGVjMDFmMDNlYTZhMmY2ZiIg dGl0bGU9IkZhY2Vib29rIj48aW1nIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jayAhaW1wb3J0 YW50OyBib3JkZXI6IG5vbmU7JyBib3JkZXI9JzAnIGhzcGFjZT0nNScgdnNwYWNlPSc1JyBzcmM9 Imh0dHA6Ly9pcy5jaW5jby5wdXJsc21haWwuY29tL2ltYWdlcy9sb2dvX2ZhY2Vib29rX3MucG5n IiB0aXRsZT0iRmFjZWJvb2siIGFsdD0iRmFjZWJvb2siIGJvcmRlcj0iMCIvPjwvYT4mbmJzcDsm bmJzcDs8YSBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7J3RhcmdldD0iX2JsYW5rIiByZWw9 Im5vZm9sbG93IiBocmVmPSJodHRwOi8vaXMuY2luY28ucHVybHNtYWlsLmNvbS9zc3B1Ymxpc2gu YXNweD9TSUQ9MTQmU2VjdGlvbklEPTY4OTYxNSZTaXRlSUQ9NDc4OTMmRW1haWxJRD0xMzE0OTg2 MiZIaXRJRD0xNDM5OTc0NTA5NjUwJlNTTGlua0lEPTIwJnRva2VuPTJkMjdjZjZkMTI1YzEwMTQ3 N2Y1NzUyNmRlYzAxZjAzZWE2YTJmNmYiIHRpdGxlPSJsaW5rZWRpbiI+PGltZyBzdHlsZT0nZGlz cGxheTppbmxpbmUtYmxvY2sgIWltcG9ydGFudDsgYm9yZGVyOiBub25lOycgYm9yZGVyPScwJyBo c3BhY2U9JzUnIHZzcGFjZT0nNScgc3JjPSJodHRwOi8vaXMuY2luY28ucHVybHNtYWlsLmNvbS9p bWFnZXMvbG9nb19saW5rZWRpbl9zLnBuZyIgdGl0bGU9IkxpbmtlZElOIiBhbHQ9IkxpbmtlZElu IiBib3JkZXI9IjAiLz48L2E+Jm5ic3A7Jm5ic3A7PGEgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJs b2NrOyd0YXJnZXQ9Il9ibGFuayIgcmVsPSJub2ZvbGxvdyIgaHJlZj0iaHR0cDovL2lzLmNpbmNv LnB1cmxzbWFpbC5jb20vc3NwdWJsaXNoLmFzcHg/U0lEPTE0JlNlY3Rpb25JRD02ODk2MTUmU2l0 ZUlEPTQ3ODkzJkVtYWlsSUQ9MTMxNDk4NjImSGl0SUQ9MTQzOTk3NDUwOTY1MCZTU0xpbmtJRD0y MiZ0b2tlbj0yZDI3Y2Y2ZDEyNWMxMDE0NzdmNTc1MjZkZWMwMWYwM2VhNmEyZjZmIiB0aXRsZT0i cGludGVyZXN0Ij48aW1nIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jayAhaW1wb3J0YW50OyBi b3JkZXI6IG5vbmU7JyBib3JkZXI9JzAnIGhzcGFjZT0nNScgdnNwYWNlPSc1JyBzcmM9Imh0dHA6 Ly9pcy5jaW5jby5wdXJsc21haWwuY29tL2ltYWdlcy9sb2dvX3BpbnRlcmVzdF9zLnBuZyIgdGl0 bGU9IlBpbnRlcmVzdCIgYWx0PSJQaW50ZXJlc3QiIGJvcmRlcj0iMCIvPjwvYT4mbmJzcDsmbmJz cDs8L2Rpdj48L2RpdiA+PC90ZCA+PC90cj48L3RhYmxlPjwvdGQ+PHRkIHdpZHRoPSIyMCIgYmdj b2xvcj0iI0ZGRkZGRiIgc3R5bGU9IndpZHRoOjIwcHg7Ij4mbmJzcDs8L3RkPjwvdHI+PHRyPjx0 ZCB3aWR0aD0iMjAiIGJnY29sb3I9IiNGRkZGRkYiIHN0eWxlPSJ3aWR0aDoyMHB4OyI+Jm5ic3A7 PC90ZD48dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJ0b3AiIGNsYXNzPSJhZGRyZXNzQm9va0Nv cHkiIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5OlRpbWVzOyBm b250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWw7Ij48Zm9udCBz dHlsZT0iZm9udC1mYW1pbHk6VGltZXM7IGZvbnQtc2l6ZTo4cHg7IGNvbG9yOiM4MDgwODA7IGZv bnQtd2VpZ2h0Ok5vcm1hbCI+VGhpcyBlbWFpbCB3YXMgc2VudCB0byAgPGEgaHJlZj0iIyIgc3R5 bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTtmb250LWZhbWlseTpUaW1lczsgZm9udC1zaXplOjhw eDsgY29sb3I6IzgwODA4MDsgZm9udC13ZWlnaHQ6Tm9ybWFsIj4geGZzQG9zcy5zZ2kuY29tIDwv YT4gYnkgIDxhIGhyZWY9IiMiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Zm9udC1mYW1p bHk6VGltZXM7IGZvbnQtc2l6ZTo4cHg7IGNvbG9yOiM4MDgwODA7IGZvbnQtd2VpZ2h0Ok5vcm1h bCI+cmVzZXJ2YXRpb25zQGJ1c2h2ZWxkdHNhZmFyaS5jb208L2E+PC9mb250PjwvdGQ+PHRkIHdp ZHRoPSIyMCIgYmdjb2xvcj0iI0ZGRkZGRiIgc3R5bGU9IndpZHRoOjIwcHg7Ij4mbmJzcDs8L3Rk PjwvdHI+PHRyPjx0ZCB3aWR0aD0iMjAiIGJnY29sb3I9IiNGRkZGRkYiIHN0eWxlPSJ3aWR0aDoy MHB4OyI+Jm5ic3A7PC90ZD48dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJ0b3AiIGNsYXNzPSJh ZGRyZXNzQm9va0NvcHkiIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O2ZvbnQtZmFt aWx5OlRpbWVzOyBmb250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3Jt YWw7Ij48Zm9udCBzdHlsZT0iZm9udC1mYW1pbHk6VGltZXM7IGZvbnQtc2l6ZTo4cHg7IGNvbG9y OiM4MDgwODA7IGZvbnQtd2VpZ2h0Ok5vcm1hbCI+MTU0IEVkd2FyZCBBdmVudWUsJm5ic3A7Q2Vu dHVyaW9uLCZuYnNwOzAxNTcsJm5ic3A7U291dGggQWZyaWNhPC9mb250PjwvdGQ+PHRkIHdpZHRo PSIyMCIgYmdjb2xvcj0iI0ZGRkZGRiIgc3R5bGU9IndpZHRoOjIwcHg7Ij4mbmJzcDs8L3RkPjwv dHI+PHRyPjx0ZCB3aWR0aD0iMjAiIGJnY29sb3I9IiNGRkZGRkYiIHN0eWxlPSJ3aWR0aDoyMHB4 OyI+Jm5ic3A7PC90ZD48dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJ0b3AiIGNsYXNzPSJhZGRy ZXNzQm9va0NvcHkiIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5 OlRpbWVzOyBmb250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWwi Pjxmb250IHN0eWxlPSJmb250LWZhbWlseTpUaW1lczsgZm9udC1zaXplOjhweDsgY29sb3I6Izgw ODA4MDsgZm9udC13ZWlnaHQ6Tm9ybWFsIj5JIGRpZCBub3QgZ2l2ZSBteSBwZXJtaXNzaW9uIHRv IHRoaXMgc2VuZGVyPGEgaHJlZj0iaHR0cDovL2lzLmNpbmNvLnB1cmxzbWFpbC5jb20vc2l0ZS9y ZXBvcnRhYnVzZS5hc3B4P3N0aWQ9NDc4OTMmaGl0aWQ9MTQzOTk3NDUwOTY1MCZzZWM9Njg5NjE1 JmVtYWlsPXhmc0Bvc3Muc2dpLmNvbSZFbUlEPTEzMTQ5ODYyJlNJRD0xNCZ0b2tlbj0yZDI3Y2Y2 ZDEyNWMxMDE0NzdmNTc1MjZkZWMwMWYwM2VhNmEyZjZmIiAgc3R5bGU9J3RleHQtZGVjb3JhdGlv bjpub25lJyA+PGZvbnQgc3R5bGU9ImZvbnQtZmFtaWx5OlRpbWVzOyBmb250LXNpemU6OHB4OyBj b2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWwiPiBjbGljayBoZXJlIHRvIHJlcG9ydC48 L2E+PC9mb250PjwvZm9udD48L3RkPjx0ZCB3aWR0aD0iMjAiIGJnY29sb3I9IiNGRkZGRkYiIHN0 eWxlPSJ3aWR0aDoyMHB4OyI+Jm5ic3A7PC90ZD48L3RyPjx0ciB3aWR0aD0iMTAwIiBoZWlnaHQ9 IjE1cHgiPjx0ZCB3aWR0aD0iMjAiIGJnY29sb3I9IiNGRkZGRkYiIHN0eWxlPSJ3aWR0aDoyMHB4 OyI+Jm5ic3A7PC90ZD48dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJ0b3AiIGNsYXNzPSJhZGRy ZXNzQm9va0NvcHkiIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O2ZvbnQtZmFtaWx5 OlRpbWVzOyBmb250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWwh aW1wb3J0YW50OyI+PGZvbnQgc3R5bGU9ImZvbnQtZmFtaWx5OlRpbWVzOyBmb250LXNpemU6OHB4 OyBjb2xvcjojODA4MDgwOyBmb250LXdlaWdodDpOb3JtYWwiPjxhIGhyZWY9Imh0dHA6Ly9pcy5j aW5jby5wdXJsc21haWwuY29tL2hvbWUvci5hc3A/U0lEPTE1NjgmRz0yIiB0YXJnZXQ9Im5ldyIg c3R5bGU9ImZvbnQtZmFtaWx5OlRpbWVzOyBmb250LXNpemU6OHB4OyBjb2xvcjojODA4MDgwOyBm b250LXdlaWdodDpOb3JtYWwiPjxpbWcgIHZzcGFjZT0iNSIgc3R5bGU9InZlcnRpY2FsLWFsaWdu OnRvcDsgd2lkdGg6IGF1dG8gIWltcG9ydGFudDsgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7IiBz cmM9Imh0dHA6Ly9pcy5jaW5jby5wdXJsc21haWwuY29tLy9pbWFnZXMvZ3JhcGhpY21haWxjb3ph L3phXzI0X2dtX3Bvd2VyZWRieV9sb2dvLmdpZj9TSUQ9MTU2OCIgYWx0PSJodHRwOi8vaXMuY2lu Y28ucHVybHNtYWlsLmNvbS9ob21lL3IuYXNwP1NJRD0xNTY4Jkc9MiIgYm9yZGVyPSIwIj48L2E+ PC90ZD48dGQgd2lkdGg9IjIwIiBiZ2NvbG9yPSIjRkZGRkZGIiBzdHlsZT0id2lkdGg6MjBweDsi PiZuYnNwOzwvdGQ+PC90cj48dGQgd2lkdGg9IjIwIiBiZ2NvbG9yPSIjRkZGRkZGIiBzdHlsZT0i d2lkdGg6MjBweDsiPiZuYnNwOzwvdGQ+PHRyIGhlaWdodD0nMicgc3R5bGU9ImhlaWdodD01Ij48 dGQ+Jm5ic3A7PC90ZD48dGQ+Jm5ic3A7PC90ZD48L3RyPjx0ZCB3aWR0aD0iMjAiIGJnY29sb3I9 IiNGRkZGRkYiIHN0eWxlPSJ3aWR0aDoyMHB4OyI+Jm5ic3A7PC90ZD48L3RhYmxlPjwvdGQ+PC90 cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+I291dGxv b2sgYXtwYWRkaW5nOiAwO30uUmVhZE1zZ0JvZHl7d2lkdGg6IDEwMCU7fS5FeHRlcm5hbENsYXNz e3dpZHRoOiAxMDAlO31ib2R5e21hcmdpbjogMDtwYWRkaW5nOiAwO31pbWd7Ym9yZGVyOiAwO2xp bmUtaGVpZ2h0OiAxMDAlOyBvdXRsaW5lOiBub25lO3RleHQtZGVjb3JhdGlvbjogbm9uZTt9dGFi bGUsIHRke21zby10YWJsZS1sc3BhY2U6IDBwdDttc28tdGFibGUtcnNwYWNlOiAwcHQ7fSB0YWJs ZSwgdGQuYWRkcmVzc0Jvb2tDb3B5e3BhZGRpbmc6IDA7fSAjYm9keVRhYmxlLCAjYm9keUNlbGx7 aGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7bWFyZ2luOiAwO3BhZGRpbmc6IDA7d2lkdGg6IDEwMCUg IWltcG9ydGFudDt9I2JvZHlDZWxse3BhZGRpbmctdG9wOiAwO3BhZGRpbmctcmlnaHQ6IDIwcHg7 cGFkZGluZy1ib3R0b206IDIwcHg7cGFkZGluZy1sZWZ0OiAyMHB4O30jdGVtcGxhdGVDb250YWlu ZXJ7d2lkdGg6IDEwMCU7fS8qQHRhYiBQYWdlQHNlY3Rpb24gYmFja2dyb3VuZCBjb2xvckB0aXAg U2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB5b3VyIGVtYWlsLiBZb3UgbWF5IHdhbnQgdG8g Y2hvb3NlIGEgY29sb3IgdGhhdCBtYXRjaGVzIHlvdXIgY29tcGFueSdzIGJyYW5kaW5nLkB0aGVt ZSBwYWdlKi9ib2R5LCAjYm9keVRhYmxley8qQGVkaXRhYmxlKi9iYWNrZ3JvdW5kLWNvbG9yOiAj ZmZmZmZmO310YWJsZSNmb290ZXJMaW5rc3tmb250LXNpemU6IDE0cHg7d2lkdGg6IDEwMCU7dGV4 dC1hbGlnbjogY2VudGVyO310YWJsZSNmb290ZXJMaW5rcyB0ZCwgYS5mb290ZXJDbGlja3tjb2xv cjogIzMzMzMzMzt9dGFibGUjZm9vdGVyTGlua3MgdGR7cGFkZGluZy10b3A6IDEwcHg7Y29sb3I6 ICMzMzMzMzM7cGFkZGluZy1ib3R0b206IDEwcHg7fSAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAo bWF4LXdpZHRoOiA0ODBweCl7Ym9keSwgdGFibGUsIHRkLCBwLCBhLCBsaSwgYmxvY2txdW90ZXst d2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmUgIWltcG9ydGFudDt9ICBib2R5e3dpZHRoOiBh dXRvICFpbXBvcnRhbnQ7fSB0ZFtpZD1ib2R5Q2VsbF17cGFkZGluZzogMTBweDt9IC8qQHRhYiBN b2JpbGUgU3R5bGVzQHNlY3Rpb24gdGVtcGxhdGUgd2lkdGhAdGlwIE1ha2UgdGhlIHRlbXBsYXRl IGZsdWlkIGZvciBwb3J0cmFpdCBvciBsYW5kc2NhcGUgdmlldyBhZGFwdGFiaWxpdHkuIElmIGEg Zmx1aWQgbGF5b3V0IGRvZXNuJ3Qgd29yaywgc2V0IHdpZHRoIHRvIDMwMHB4IGluc3RlYWQuKi8g ICAgdGFibGVbaWQ9dGVtcGxhdGVDb250YWluZXJdey8qQHRhYiBNb2JpbGUgU3R5bGVzQHNlY3Rp b24gdGVtcGxhdGUgd2lkdGhAdGlwIE1ha2UgdGhlIHRlbXBsYXRlIGZsdWlkIGZvciBwb3J0cmFp dCBvciBsYW5kc2NhcGUgdmlldyBhZGFwdGFiaWxpdHkuIElmIGEgZmx1aWQgbGF5b3V0IGRvZXNu J3Qgd29yaywgc2V0IHdpZHRoIHRvIDMwMHB4IGluc3RlYWQuKi9tYXgtd2lkdGg6IDYwMHB4ICFp bXBvcnRhbnQ7IC8qQGVkaXRhYmxlKi93aWR0aDogMTAwJSAhaW1wb3J0YW50O30gLypAdGFiIE1v YmlsZSBTdHlsZXNAc2VjdGlvbiBoZWFkaW5nIDFAdGlwIE1ha2UgdGhlIGZpcnN0LWxldmVsIGhl YWRpbmdzIGxhcmdlciBpbiBzaXplIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgb24gc21hbGwgc2Ny ZWVucy4qLyAgICBoMXsvKkBlZGl0YWJsZSovZm9udC1zaXplOiAzNnB4ICFpbXBvcnRhbnQ7IC8q QGVkaXRhYmxlKi9saW5lLWhlaWdodDogMTAwJSAhaW1wb3J0YW50O30gLypAdGFiIE1vYmlsZSBT dHlsZXNAc2VjdGlvbiBoZWFkaW5nIDJAdGlwIE1ha2UgdGhlIHNlY29uZC1sZXZlbCBoZWFkaW5n cyBsYXJnZXIgaW4gc2l6ZSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IG9uIHNtYWxsIHNjcmVlbnMu Ki8gICAgaDJ7LypAZWRpdGFibGUqL2ZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50OyAvKkBlZGl0 YWJsZSovbGluZS1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDt9IC8qQHRhYiBNb2JpbGUgU3R5bGVz QHNlY3Rpb24gaGVhZGluZyAzQHRpcCBNYWtlIHRoZSB0aGlyZC1sZXZlbCBoZWFkaW5ncyBsYXJn ZXIgaW4gc2l6ZSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IG9uIHNtYWxsIHNjcmVlbnMuKi8gICAg aDN7LypAZWRpdGFibGUqL2ZvbnQtc2l6ZTogMThweCAhaW1wb3J0YW50OyAvKkBlZGl0YWJsZSov bGluZS1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDt9IC8qQHRhYiBNb2JpbGUgU3R5bGVzQHNlY3Rp b24gaGVhZGluZyA0QHRpcCBNYWtlIHRoZSBmb3VydGgtbGV2ZWwgaGVhZGluZ3MgbGFyZ2VyIGlu IHNpemUgZm9yIGJldHRlciByZWFkYWJpbGl0eSBvbiBzbWFsbCBzY3JlZW5zLiovICAgIGg0ey8q QGVkaXRhYmxlKi9mb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgLypAZWRpdGFibGUqL2xpbmUt aGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7fSB0YWJsZVtpZD10ZW1wbGF0ZVByZWhlYWRlcl17ZGlz cGxheTogbm9uZSAhaW1wb3J0YW50O30gZm9udFtpZD1yZW1vdmVNYWluXXtkaXNwbGF5OiBub25l ICFpbXBvcnRhbnQ7dGV4dC1kZWNvcmF0aW9uOiBub25lO30gdGFibGVbaWQ9dGVtcGxhdGVIZWFk ZXJde3dpZHRoOiAxMDAlICFpbXBvcnRhbnQ7cGFkZGluZzogNXB4O30gLypAdGFiIE1vYmlsZSBT dHlsZXNAc2VjdGlvbiBoZWFkZXIgdGV4dEB0aXAgTWFrZSB0aGUgaGVhZGVyIGNvbnRlbnQgdGV4 dCBsYXJnZXIgaW4gc2l6ZSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IG9uIHNtYWxsIHNjcmVlbnMu Ki8gICAgdGRbY2xhc3M9aGVhZGVyQ29udGVudF17LypAZWRpdGFibGUqL2ZvbnQtc2l6ZTogMThw eCAhaW1wb3J0YW50OyAvKkBlZGl0YWJsZSovbGluZS1oZWlnaHQ6IDEyNSUgIWltcG9ydGFudDt9 IC8qQHRhYiBNb2JpbGUgU3R5bGVzQHNlY3Rpb24gYm9keSB0ZXh0QHRpcCBNYWtlIHRoZSBib2R5 IGNvbnRlbnQgdGV4dCBsYXJnZXIgaW4gc2l6ZSBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IG9uIHNt YWxsIHNjcmVlbnMuKi8gICAgdGRbY2xhc3M9Ym9keUNvbnRlbnRdey8qQGVkaXRhYmxlKi9mb250 LXNpemU6IDE4cHggIWltcG9ydGFudDsgLypAZWRpdGFibGUqL2xpbmUtaGVpZ2h0OiAxMjUlICFp bXBvcnRhbnQ7fSAvKkB0YWIgTW9iaWxlIFN0eWxlc0BzZWN0aW9uIGZvb3RlciB0ZXh0QHRpcCBN YWtlIHRoZSBmb290ZXIgY29udGVudCB0ZXh0IGxhcmdlciBpbiBzaXplIGZvciBiZXR0ZXIgcmVh ZGFiaWxpdHkgb24gc21hbGwgc2NyZWVucy4qLyAgICB0ZFtjbGFzcz1jXXsvKkBlZGl0YWJsZSov Zm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7IC8qQGVkaXRhYmxlKi9saW5lLWhlaWdodDogMTUw JSAhaW1wb3J0YW50O30gdGRbY2xhc3M9Zm9vdGVyQ29udGVudF0gYXtkaXNwbGF5OiBpbmxpbmUt YmxvY2sgIWltcG9ydGFudDsgfX0gc3Bhbi55c2hvcnRjdXRzIHtjb2xvcjojMDAwfSBzcGFuLnlz aG9ydGN1dHM6aG92ZXIsICBzcGFuLnlzaG9ydGN1dHM6YWN0aXZlLCBzcGFuLnlzaG9ydGN1dHM6 Zm9jdXMge3RleHQtZGVjb3JhdGlvbjpub25lOyBjb2xvcjojMDAwOyBiYWNrZ3JvdW5kLWNvbG9y Om5vbmU7IGJvcmRlcjpub25lfSAgICpbcm9sZXw9Im1haW4iXXtwYWRkaW5nOjBweCAhaW1wb3J0 YW50O3dpZHRoOjEwMCUgIWltcG9ydGFudDttYXJnaW46MHB4ICFpbXBvcnRhbnQ7fS5tc2ctYm9k eSBpbm5lcnt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7IHBhZGRpbmc6MHB4ICFpbXBvcnRhbnQ7bWFy Z2luOjBweCAhaW1wb3J0YW50OyBsZWZ0OjBweCAhaW1wb3J0YW50O30ubXNnLWJvZHkge3dpZHRo OjEwMCUgIWltcG9ydGFudDsgcGFkZGluZzowcHggIWltcG9ydGFudDttYXJnaW46MHB4ICFpbXBv cnRhbnQ7IGxlZnQ6MHB4OyAhaW1wb3J0YW50fS5pbm5lcnt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7 IHBhZGRpbmc6MHB4ICFpbXBvcnRhbnQgO21hcmdpbjowcHggIWltcG9ydGFudDsgbGVmdDowcHgg IWltcG9ydGFudDsgfSA8L3N0eWxlPjwvYm9keT48L2h0bWw+ From jtulak@redhat.com Wed Aug 19 04:15:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D3C57F77 for ; Wed, 19 Aug 2015 04:15:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18F2BAC006 for ; Wed, 19 Aug 2015 02:15:03 -0700 (PDT) X-ASG-Debug-ID: 1439975701-04cbb078e3817b0001-NocioJ Received: from mail-ig0-f172.google.com (mail-ig0-f172.google.com [209.85.213.172]) by cuda.sgi.com with ESMTP id 4hNyCoACzLVWQhGi (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 19 Aug 2015 02:15:01 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igui7 with SMTP id i7so1274843igu.0 for ; Wed, 19 Aug 2015 02:15:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=yytX6pODQYm2TSwK8/aZ1st2Ax6Ng98vJP772qd8rx8=; b=OeEoX7sFfpvXMAORrmjV+wruSfRaAVnX7ekaJpeqvdEirZw5tWFJlnC0kbOryVx0KV INnHrHeYG/t1X2uuP+2zO1emC2B48IcVQ2UDmEooUODiTXARW1g1lYPXLCEV7TuVXMq9 kGStnG76ldZ5xx7JVBtdp4RTPkbgs2LB8qMqeo3Y1JqB+0i/e1+qkMw1JT+84Ux0LRip ZsZtaGoSF/GoKe45l4qFe6bmZCZ/nsXuzv3viPkzEIWyJ4k1lcwbVVbs8BRg1RBbi8je OvzqThwm1p0NW2paKuNZE88lUuxjJq7YPxc8fyScW+3IV2w5hqQwo8XQOi4vWv+uL/bE 8lZQ== X-Gm-Message-State: ALoCoQmrKiG4frcKLONdyAZr3qWeho4KEio0rWq2Z3yKenBRkztYEkg1zuDFDYyma980T+iN8Mxa X-Received: by 10.50.79.162 with SMTP id k2mr7994802igx.93.1439975701465; Wed, 19 Aug 2015 02:15:01 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Wed, 19 Aug 2015 02:14:42 -0700 (PDT) In-Reply-To: <20150819080940.GA13130@infradead.org> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> <20150819080940.GA13130@infradead.org> From: Jan Tulak Date: Wed, 19 Aug 2015 11:14:42 +0200 Message-ID: Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Cc: Dave Chinner , xfs-oss Content-Type: multipart/alternative; boundary=089e01160a022bef73051da678e9 X-Barracuda-Connect: mail-ig0-f172.google.com[209.85.213.172] X-Barracuda-Start-Time: 1439975701 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21732 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e01160a022bef73051da678e9 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Aug 19, 2015 at 10:09 AM, Christoph Hellwig wrote: > > On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote: > > Hmmm, looks like I accidentally comitted an earlier version of this > > patch yesterday. Jan, can you send delta patches to what I committed > > to address more recent review comments? Sorry, my bad. I guess my chaotic versioning can be blamed. :-) > Can you revert it for now? I think most of these changes are incorrect I agree, revert seems like a better idea. Especially if we want to split things like removing the XATTR_ dependency move into standalone commits. > and should either be dropped for now by disabling fsx I proposed dropping some tools earlier, but there was a valid point about the possibility to break something when not even trying to compile it. i.e. with the XATTR_ -> XFS_XATTR mentioned in the first reply to this patc= h (which I already moved to a separate patch), it is necessary to add #include "xfs/xfs_arch.h" #include "xfs/xfs_format.h" into libhandle/handle.c. But =E2=80=8B I found =E2=80=8B this =E2=80=8B when I tried to compile it. If it was in fsr and fsr wasn't compiling, I would most likely send a patch which would be thrown =E2=80=8B back =E2=80=8B on my head immediately. ;-) So I think =E2=80=8B =E2=80=8B it is better to have "bad dummy stuff" than not compile it at all =E2=80=8B . > or will need =E2=80=8B a major rework. Working on it. :-) Cheers, Jan -- Jan Tulak jtulak@redhat.com / jan@tulak.me --089e01160a022bef73051da678e9 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On Wed, Aug 19, 2015 at 10:09 AM, Christoph Hellwig <hch@infradead.org> wrote:
>=
> On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote:
&= gt; > Hmmm, looks like I accidentally comitted an earlier version of thi= s
> > patch yesterday. Jan, can you send delta patches to what I c= ommitted
> > to address more recent review comments? Sorry, my bad= .

I guess my chaotic versioning can be blamed. :-)

> Can y= ou revert it for now? I think most of these changes are incorrect

I = agree, revert seems like a better idea. Especially if we want to split thin= gs
like removing the XATTR_ dependency move into standalone commits.
=
> and should either be dropped for now by disabling fsx

I pr= oposed dropping some tools earlier, but there was a valid point about
th= e possibility to break something when not even trying to compile it.
i.e= . with the XATTR_ -> XFS_XATTR mentioned in the first reply to this patc= h
(which I already moved to a separate patch), it is necessary to add
#include "xfs/xfs_arch.h"
#include "xfs/xfs_format.h= "

into libhandle/handle.c. But
=E2=80=8B=C2=A0=
I found
=E2=80=8B=C2=A0
this
= =E2=80=8B=C2=A0
when I tried to compile it. If it was
in fsr and fs= r wasn't compiling, I would most likely send a patch which would
be = thrown
=E2=80=8B=C2=A0
back
=E2=80= =8B=C2=A0
on my head immediately. ;-)

So I think
=E2=80=8B =E2=80=8B
it is better to have "bad dummy stuff"= ; than not compile it
at all
=E2=80=8B
.

&g= t; or will need
=E2=80=8B=C2=A0
a major rework.
Working on it. :-)

Cheers,
Jan

--
Jan Tulak
jtulak@redhat.com / jan@tulak.me
--089e01160a022bef73051da678e9-- From BATV+0eec7af3b2097fc69046+4378+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 19 04:19:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1EA5E7F7B for ; Wed, 19 Aug 2015 04:19:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ABF13AC006 for ; Wed, 19 Aug 2015 02:19:56 -0700 (PDT) X-ASG-Debug-ID: 1439975977-04bdf051fb808a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Dcerl7BqG2KJhaET (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 19 Aug 2015 02:19:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0eec7af3b2097fc69046+4378+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZRzWy-0004MQ-8O; Wed, 19 Aug 2015 09:19:36 +0000 Date: Wed, 19 Aug 2015 02:19:36 -0700 From: Christoph Hellwig To: Jan Tulak Cc: Christoph Hellwig , Dave Chinner , xfs-oss Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150819091936.GA12804@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> <20150819080940.GA13130@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1439975977 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 19, 2015 at 11:14:42AM +0200, Jan Tulak wrote: > I proposed dropping some tools earlier, but there was a valid point about > the possibility to break something when not even trying to compile it. > i.e. with the XATTR_ -> XFS_XATTR mentioned in the first reply to this patch > (which I already moved to a separate patch), it is necessary to add > > #include "xfs/xfs_arch.h" > #include "xfs/xfs_format.h" > > into libhandle/handle.c. But I think we'll need another define for libhandle - it's at least in theory supposed to be a somewhat generic library. In fact using the existing XATTR_ values sort of makes sense for libattr, so I'd say define a LIBHANDE_ version as well. > So I think > ??? ??? > it is better to have "bad dummy stuff" than not compile it > at all In general yes, for fsr I don't think so. One is the pure amount of broken stubs it would need, the second is that fsr is the only program that requires a _mounted_ XFS file system anyway. Most other programs just use the on disk format, or in case of xfs_io are useful for any file system. From dave@fromorbit.com Wed Aug 19 05:23:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 859987F4E for ; Wed, 19 Aug 2015 05:23:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 65BB430405F for ; Wed, 19 Aug 2015 03:23:39 -0700 (PDT) X-ASG-Debug-ID: 1439979816-04bdf051fc84210001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id a04SD7gGD2xd9uT6 for ; Wed, 19 Aug 2015 03:23:36 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B3BwAtWNRVPPwzLHldgxuBPYZTo0QGnRlNAQEBAQEBBwEBAQFAAT+FADsYagMHLYgtqU+mJYYgiluEFQWVI5sMjBKBcAELAYI4LDOCTAEBAQ Received: from ppp121-44-51-252.lns20.syd4.internode.on.net (HELO dastard) ([121.44.51.252]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 19:53:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZS0Ws-00060H-Mu for xfs@oss.sgi.com; Wed, 19 Aug 2015 20:23:34 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZS0Ws-0004w4-Lw for xfs@oss.sgi.com; Wed, 19 Aug 2015 20:23:34 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: inode lockdep annotations broke non-lockdep build Date: Wed, 19 Aug 2015 20:23:34 +1000 X-ASG-Orig-Subj: [PATCH] xfs: inode lockdep annotations broke non-lockdep build Message-Id: <1439979814-18934-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439979816 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Fix CONFIG_LOCKDEP=n build, because asserts I put in to ensure we aren't overrunning lockdep subclasses in commit 0952c81 ("xfs: clean up inode lockdep annotations") use a define that doesn't exist when CONFIG_LOCKDEP=n Only check the subclass limits when lockdep is actually enabled. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index dd584da..30555f8 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -362,6 +362,17 @@ int xfs_lots_retries; int xfs_lock_delays; #endif +#ifdef CONFIG_LOCKDEP +static bool +xfs_lockdep_subclass_ok( + int subclass) +{ + return subclass < MAX_LOCKDEP_SUBCLASSES; +} +#else +#define xfs_lockdep_subclass_ok(subclass) (true) +#endif + /* * Bump the subclass so xfs_lock_inodes() acquires each lock with a different * value. This can be called for any type of inode lock combination, including @@ -375,11 +386,12 @@ xfs_lock_inumorder(int lock_mode, int subclass) ASSERT(!(lock_mode & (XFS_ILOCK_PARENT | XFS_ILOCK_RTBITMAP | XFS_ILOCK_RTSUM))); + ASSERT(xfs_lockdep_subclass_ok(subclass)); if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); - ASSERT(subclass + XFS_IOLOCK_PARENT_VAL < - MAX_LOCKDEP_SUBCLASSES); + ASSERT(xfs_lockdep_subclass_ok(subclass + + XFS_IOLOCK_PARENT_VAL)); class += subclass << XFS_IOLOCK_SHIFT; if (lock_mode & XFS_IOLOCK_PARENT) class += XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT; -- 2.5.0 From david@fromorbit.com Wed Aug 19 05:26:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3113F7F55 for ; Wed, 19 Aug 2015 05:26:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11DCA304062 for ; Wed, 19 Aug 2015 03:26:28 -0700 (PDT) X-ASG-Debug-ID: 1439979985-04bdf051fa84460001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id olr7j3LozuR0DPcm for ; Wed, 19 Aug 2015 03:26:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BmDwBWWdRVPPwzLHldgxuBPYJXg3yjRQabUQQCAoFBTQEBAQEBAQcBAQEBQAE/QQODYAEBBDocIxAIAw4KCSUPBSUDBxoTiC3PTQEBCAIgGYYHhTOFCgeELAEElSOMapo0hDUsM4JMAQEB Received: from ppp121-44-51-252.lns20.syd4.internode.on.net (HELO dastard) ([121.44.51.252]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Aug 2015 19:56:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZS0Zc-00060f-0x; Wed, 19 Aug 2015 20:26:24 +1000 Date: Wed, 19 Aug 2015 20:26:23 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Jan Tulak , xfs@oss.sgi.com Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150819102623.GK3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> <20150819080940.GA13130@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150819080940.GA13130@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1439979985 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 19, 2015 at 01:09:40AM -0700, Christoph Hellwig wrote: > On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote: > > Hmmm, looks like I accidentally comitted an earlier version of this > > patch yesterday. Jan, can you send delta patches to what I committed > > to address more recent review comments? Sorry, my bad. > > Can you revert it for now? I think most of these changes are incorrect > and should either be dropped for now by disabling fsx or will need > a major rework. I'll just rebase the for-next branch, I guess, and remove it completely from the history. I've got another lockdep fix that needs to be pushed before it all hits tomorrow's linux-next build, anyway. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Wed Aug 19 06:02:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37C057F54 for ; Wed, 19 Aug 2015 06:02:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B8891AC007 for ; Wed, 19 Aug 2015 04:02:03 -0700 (PDT) X-ASG-Debug-ID: 1439982122-04bdf051f986520001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UrL9mEjtCFe6oKVo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 04:02:03 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 6675419CBED; Wed, 19 Aug 2015 11:02:02 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7JB22XW014167; Wed, 19 Aug 2015 07:02:02 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 35ED0123E78; Wed, 19 Aug 2015 07:02:01 -0400 (EDT) Date: Wed, 19 Aug 2015 07:02:01 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/13] xfs: ensure EFD trans aborts on log recovery extent free failure Message-ID: <20150819110200.GA49174@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 04/13] xfs: ensure EFD trans aborts on log recovery extent free failure References: <1439233309-19959-1-git-send-email-bfoster@redhat.com> <1439233309-19959-5-git-send-email-bfoster@redhat.com> <20150818232323.GN714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20150818232323.GN714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1439982122 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 19, 2015 at 09:23:23AM +1000, Dave Chinner wrote: > On Mon, Aug 10, 2015 at 03:01:40PM -0400, Brian Foster wrote: > > Log recovery attempts to free extents with leftover EFIs in the AIL > > after initial processing. If the extent free fails (e.g., due to > > unrelated fs corruption), the transaction is cancelled, though it might > > not be dirtied at the time. If this is the case, the EFD does not abort > > and thus does not release the EFI. This can lead to hangs as the EFI > > pins the AIL. > > > > Update xlog_recover_process_efi() to log the EFD in the transaction > > before xfs_free_extent() errors are handled to ensure the transaction is > > dirty, aborts the EFD and releases the EFI on error. Since this is a > > requirement for EFD processing (and consistent with xfs_bmap_finish()), > > update the EFD logging helper to do the extent free and unconditionally > > log the EFD. This encodes the required EFD logging behavior into the > > helper and reduces the likelihood of errors down the road. > > > > Signed-off-by: Brian Foster > .... > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index 9d8f242..c77dfb5 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -34,7 +34,6 @@ > > #include "xfs_inode_item.h" > > #include "xfs_extfree_item.h" > > #include "xfs_trans_priv.h" > > -#include "xfs_alloc.h" > > #include "xfs_ialloc.h" > > #include "xfs_quota.h" > > #include "xfs_cksum.h" > > Causes compilation failure: > > fs/xfs/xfs_log_recover.c: In function ¿xlog_recover_check_summary¿: > fs/xfs/xfs_log_recover.c:4635:3: error: implicit declaration of function ¿xfs_read_agf¿ [-Werror=implicit-function-declaration] > error = xfs_read_agf(mp, NULL, agno, 0, &agfbp); > ^ > > I reinstated the include. > Oops, I thought I had built this with debug mode. Sorry about that... Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Wed Aug 19 10:12:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 65CCB7F54 for ; Wed, 19 Aug 2015 10:12:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56677304062 for ; Wed, 19 Aug 2015 08:12:29 -0700 (PDT) X-ASG-Debug-ID: 1439997146-04cbb078e494740001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vq8iqkTog7ilKX3H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 08:12:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7JFCLOq001825 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 Aug 2015 15:12:21 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7JFCLCd014817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 19 Aug 2015 15:12:21 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7JFCKTX001022; Wed, 19 Aug 2015 15:12:20 GMT Received: from localhost (/70.96.146.20) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 19 Aug 2015 08:12:19 -0700 Date: Wed, 19 Aug 2015 08:12:18 -0700 From: "Darrick J. Wong" To: Eric Sandeen Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 09/10] xfs_db: trash the block at the top of the cursor stack Message-ID: <20150819151218.GQ10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 09/10] xfs_db: trash the block at the top of the cursor stack References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014436.1839.74362.stgit@birch.djwong.org> <55D38EA0.6030701@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D38EA0.6030701@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439997147 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 18, 2015 at 02:59:28PM -0500, Eric Sandeen wrote: > On 8/14/15 8:44 PM, Darrick J. Wong wrote: > > Add a new -z option to blocktrash to make it trash the block that's at > > the top of the stack, so that we can perform targeted fuzzing. While > > we're at it, prevent fuzzing off the end of the buffer and add a -o > > parameter so that we can specify an offset to start fuzzing from. > > > > Signed-off-by: Darrick J. Wong > > --- > > db/check.c | 81 +++++++++++++++++++++++++++++++++++++++++------------ > > man/man8/xfs_db.8 | 15 +++++++++- > > 2 files changed, 77 insertions(+), 19 deletions(-) > > > > > > diff --git a/db/check.c b/db/check.c > > index 965d0f5..7c11b0b 100644 > > --- a/db/check.c > > +++ b/db/check.c > > @@ -930,8 +930,7 @@ typedef struct ltab { > > > > static void > > blocktrash_b( > > - xfs_agnumber_t agno, > > - xfs_agblock_t agbno, > > + int offset, > > a comment about "offset into what?" might be nice > > > dbm_t type, > > ltab_t *ltabp, > > int mode) > > @@ -943,23 +942,36 @@ blocktrash_b( > > int len; > > int mask; > > int newbit; > > - int offset; > > const struct xfs_buf_ops *stashed_ops; > > static char *modestr[] = { > > N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") > > }; > > + xfs_agnumber_t agno; > > + xfs_agblock_t agbno; > > > > + agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); > > + agbno = XFS_FSB_TO_AGBNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); > > + if (iocur_top->len == 0) { > > + dbprintf(_("zero-length block %u/%u buffer to trash??\n"), > > + agno, agbno); > > + return; > > + } > > len = (int)((random() % (ltabp->max - ltabp->min + 1)) + ltabp->min); > > - offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); > > + /* > > + * offset >= 0: start fuzzing at this exact offset. > > "this exact bit offset" > > > + * offset < 0: pick an offset at least as high at -(offset + 1). > > "a bit offset ..." > > (units would be nice, in the comments. I had assumed bytes, even though you have NBBY) Ok. > Ow, my brain. ;) > > Your manpage says: > > > If the value is preceded by a '+', the > > +trashing will start at a randomly chosen offset that is larger than the value > > +supplied. > > which seems sane. > > If we supply +10, > > + if (relative) > + offset = -offset - 1; > > so now offset = -10 - 1, and we get -11. > Then: > > > + */ > > + if (offset < 0) { > > + offset = -(offset + 1); > > now offset = -(-11 + 1) = -(-10) = 10. Okay... so 10 or higher. > > What's w/ the +/- 1? It's to distinguish "start fuzzing at exactly zero" from "pick anywhere (at least as high as bit offset zero) to start fuzzing". > > Why not just: > > if (relative) > offset = -offset; /* i.e. -10 */ > > ... > > if (offset < 0) { > offset = -offset; /* i.e. 10 */ > offset = offset + (int)(random() % (int)((iocur_top->len - offset) * NBBY)); ... > > > > + offset = offset + (int)(random() % (int)((iocur_top->len - offset) * NBBY)); > > + } > > + if (offset + len >= iocur_top->len * NBBY) > > + len = (iocur_top->len * NBBY) - offset; > > newbit = 0; > > - push_cur(); > > - set_cur(NULL, > > - XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); > > stashed_ops = iocur_top->bp->b_ops; > > iocur_top->bp->b_ops = NULL; > > if ((buf = iocur_top->data) == NULL) { > > dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); > > - pop_cur(); > > return; > > } > > for (bitno = 0; bitno < len; bitno++) { > > @@ -988,7 +1000,6 @@ blocktrash_b( > > } > > write_cur(); > > iocur_top->bp->b_ops = stashed_ops; > > - pop_cur(); > > printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), > > agno, agbno, typename[type], len, len == 1 ? "" : "s", > > offset / NBBY, offset % NBBY, modestr[mode]); > > @@ -1019,11 +1030,9 @@ blocktrash_f( > > uint seed; > > int sopt; > > int tmask; > > + bool this_block = false; > > + int offset = -1; > > > > - if (!dbmap) { > > - dbprintf(_("must run blockget first\n")); > > - return 0; > > - } > > optind = 0; > > count = 1; > > min = 1; > > @@ -1050,7 +1059,7 @@ blocktrash_f( > > (1 << DBM_RTSUM) | > > (1 << DBM_SYMLINK) | > > (1 << DBM_SB); > > - while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { > > + while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { > > switch (c) { > > case '0': > > mode = 0; > > @@ -1071,6 +1080,21 @@ blocktrash_f( > > return 0; > > } > > break; > > + case 'o': { > > + int relative = 0; > > + if (optarg[0] == '+') { > > + optarg++; > > + relative = 1; > > + } > > + offset = (int)strtol(optarg, &p, 0); > > + if (*p != '\0' || offset < 0) { > > + dbprintf(_("bad blocktrash offset %s\n"), optarg); > > + return 0; > > + } > > + if (relative) > > + offset = -offset - 1; > > + break; > > + } > > case 's': > > seed = (uint)strtoul(optarg, &p, 0); > > sopt = 1; > > @@ -1102,11 +1126,22 @@ blocktrash_f( > > return 0; > > } > > break; > > + case 'z': > > + this_block = true; > > + break; > > is there any mnemonic for 'z'? Maybe 'c' for Current, or 'b' for (this one) Block? > > Not that big a deal, just wondering. -z for "Corrupt 'zis block, pleaze". :) I was hoping it is less confusing than "-t" for "select eligible block types" and "-T" for "corrupt this exact block"? > > > default: > > dbprintf(_("bad option for blocktrash command\n")); > > return 0; > > } > > } > > + if (!this_block && !dbmap) { > > + dbprintf(_("must run blockget first\n")); > > + return 0; > > + } > > + if (this_block && iocur_sp == 0) { > > + dbprintf(_("nothing on stack\n")); > > + return 0; > > + } > > if (min > max) { > > dbprintf(_("bad min/max for blocktrash command\n")); > > return 0; > > @@ -1125,6 +1160,14 @@ blocktrash_f( > > } else > > lentab[lentablen - 1].max = i; > > } > > + if (!sopt) > > + dbprintf(_("blocktrash: seed %u\n"), seed); > > does this extra output break any xfstests? > > # grep -r blocktrash common/ tests/xfs > # > > maybe not! I made the same observation. --D > > > + srandom(seed); > > + if (this_block) { > > + blocktrash_b(offset, DBM_UNKNOWN, &lentab[random() % lentablen], > > + mode); > > + goto out; > > + } > > for (blocks = 0, agno = 0; agno < mp->m_sb.sb_agcount; agno++) { > > for (agbno = 0, p = dbmap[agno]; > > agbno < mp->m_sb.sb_agblocks; > > @@ -1137,9 +1180,6 @@ blocktrash_f( > > dbprintf(_("blocktrash: no matching blocks\n")); > > goto out; > > } > > - if (!sopt) > > - dbprintf(_("blocktrash: seed %u\n"), seed); > > - srandom(seed); > > for (i = 0; i < count; i++) { > > randb = (xfs_rfsblock_t)((((__int64_t)random() << 32) | > > random()) % blocks); > > @@ -1153,8 +1193,13 @@ blocktrash_f( > > continue; > > if (bi++ < randb) > > continue; > > - blocktrash_b(agno, agbno, (dbm_t)*p, > > + push_cur(); > > + set_cur(NULL, > > + XFS_AGB_TO_DADDR(mp, agno, agbno), > > + blkbb, DB_RING_IGN, NULL); > > + blocktrash_b(offset, (dbm_t)*p, > > &lentab[random() % lentablen], mode); > > + pop_cur(); > > done = 1; > > break; > > } > > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 > > index df54bb7..681efc4 100644 > > --- a/man/man8/xfs_db.8 > > +++ b/man/man8/xfs_db.8 > > @@ -232,7 +232,7 @@ enables verbose output. Messages will be printed for every block and > > inode processed. > > .RE > > .TP > > -.BI "blocktrash [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." > > +.BI "blocktrash [-z] [\-o " offset "] [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." > > Trash randomly selected filesystem metadata blocks. > > Trashing occurs to randomly selected bits in the chosen blocks. > > This command is available only in debugging versions of > > @@ -259,6 +259,13 @@ supplies the > > .I count > > of block-trashings to perform (default 1). > > .TP > > +.B \-o > > +supplies the bit > > +.I offset > > +at which to start trashing the block. If the value is preceded by a '+', the > > +trashing will start at a randomly chosen offset that is larger than the value > > +supplied. The default is to randomly choose an offset anywhere in the block. > > +.TP > > .B \-s > > supplies a > > .I seed > > @@ -282,6 +289,12 @@ size of bit range to be trashed. The default value is 1. > > sets the > > .I maximum > > size of bit range to be trashed. The default value is 1024. > > +.TP > > +.B \-z > > +trashes the block at the top of the stack. It is not necessary to > > +run > > +.BI blockget > > +if this option is supplied. > > .RE > > .TP > > .BI "blockuse [\-n] [\-c " count ] > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Wed Aug 19 10:23:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CC2BF7F54 for ; Wed, 19 Aug 2015 10:23:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F03430406A for ; Wed, 19 Aug 2015 08:23:07 -0700 (PDT) X-ASG-Debug-ID: 1439997785-04bdf051fa93f50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id BndumEK6CjbKCF0E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 08:23:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7JFMxMx018671 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 Aug 2015 15:23:00 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7JFMxA3022695 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 19 Aug 2015 15:22:59 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7JFMwxi021635; Wed, 19 Aug 2015 15:22:58 GMT Received: from localhost (/70.96.146.20) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 19 Aug 2015 08:22:58 -0700 Date: Wed, 19 Aug 2015 08:22:47 -0700 From: "Darrick J. Wong" To: Eric Sandeen Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/10] xfs_db: enable blocktrash for checksummed filesystems Message-ID: <20150819152247.GR10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 08/10] xfs_db: enable blocktrash for checksummed filesystems References: <20150815014338.1839.37405.stgit@birch.djwong.org> <20150815014429.1839.69933.stgit@birch.djwong.org> <55D386ED.604@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D386ED.604@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1439997785 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 18, 2015 at 02:26:37PM -0500, Eric Sandeen wrote: > On 8/14/15 8:44 PM, Darrick J. Wong wrote: > > Disable the write verifiers when we're trashing a block. With this > > in place, create a xfs fuzzer script that formats, populates, corrupts, > > tries to use, repairs, and tries again to use a crash test xfs image. > > Hopefully this will shake out some v5 filesystem bugs. > > Maybe "we can create an xfs fuzzer script ..." (since it's not in this > patch) "With this in place, the new fuzzers group in xfstests can format, populate..." > > v2: Drop xfsfuzz, don't assume every block is an AGF when blocktrashing. > > Don't trash log blocks by default, because that skews the blocktrash > > heavily towards damaging only log blocks. "v3: Fix changelog issues, allow trashing of log blocks and symlinks, and require the caller to explicitly ask for trashing of log blocks and super blocks. Allowing log blocks by default skews the trashing heavily in favor of (probably unused) log blocks, which doesn't help us with fuzzing. Furthermore, trashing the superblock results in a time consuming sector by sector superblock hunt." > > and skip DBM_SB by default as well, right? > > And you added log blocks & symlinks to the allowed mask. > > So I think something like: > > Allow trashing of symlink & log blocks. > By default, do not trash superblocks (why?) or log blocks (because ...) > > > Signed-off-by: Darrick J. Wong > > --- > > db/check.c | 10 ++++++++-- > > 1 file changed, 8 insertions(+), 2 deletions(-) > > > > > > diff --git a/db/check.c b/db/check.c > > index afeea32..965d0f5 100644 > > --- a/db/check.c > > +++ b/db/check.c > > @@ -944,6 +944,7 @@ blocktrash_b( > > int mask; > > int newbit; > > int offset; > > + const struct xfs_buf_ops *stashed_ops; > > static char *modestr[] = { > > N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") > > }; > > @@ -952,8 +953,10 @@ blocktrash_b( > > offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); > > newbit = 0; > > push_cur(); > > - set_cur(&typtab[DBM_UNKNOWN], > > + set_cur(NULL, > > XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); > > Ok, you talked about this back on 5/28/15. Weird. > > But calling it with NULL is odd, too; nothing else does that. What about TYP_NONE, > > { TYP_NONE, NULL } > > its ops are NULL, as well... does that work? > Huh, ok, no callers w/ TYP_NONE, either. I guess NULL works. I'm impressed you can remember that far back. :) > > + stashed_ops = iocur_top->bp->b_ops; > > + iocur_top->bp->b_ops = NULL; > > if ((buf = iocur_top->data) == NULL) { > > dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); > > pop_cur(); > > @@ -984,6 +987,7 @@ blocktrash_b( > > buf[byte] &= ~mask; > > } > > write_cur(); > > + iocur_top->bp->b_ops = stashed_ops; > > *nod* > > > pop_cur(); > > printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), > > agno, agbno, typename[type], len, len == 1 ? "" : "s", > > @@ -1040,9 +1044,11 @@ blocktrash_f( > > (1 << DBM_BTINO) | > > (1 << DBM_DIR) | > > (1 << DBM_INODE) | > > + (1 << DBM_LOG) | > > Ok, so you allow log blocks to be specified, > > > (1 << DBM_QUOTA) | > > (1 << DBM_RTBITMAP) | > > (1 << DBM_RTSUM) | > > + (1 << DBM_SYMLINK) | > > and symlink blocks too, but... > > > (1 << DBM_SB); > > while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { > > switch (c) { > > @@ -1106,7 +1112,7 @@ blocktrash_f( > > return 0; > > } > > if (tmask == 0) > > - tmask = goodmask; > > + tmask = goodmask & ~((1 << DBM_LOG) | (1 << DBM_SB)); > > you disable log & superblocks by default if no mask is specified. > > I'm not 100% sure why you want to change this, what did you run into, > in practice, if they were allowed? I found that with log block trashing turned on, we'd most frequently trash empty log blocks; if there wasn't anything in the log to get replayed, the corruption wouldn't show up. So, make the user explicitly ask for log blocks to be included in the trash mask. As for requiring the user to ask for superblocks to be in the trash mask, that's mostly to prevent the behavior that if repair finds a garbage superblock it'll scan every sector on the whole disk looking for superblocks, which is pretty slow... > If the change stays, then the xfs_db manpage needs an update: > > "If no -t options are given then all metadata types can be trashed." Ok. --D > > Thanks, > -Eric > > > > lentab = xmalloc(sizeof(ltab_t)); > > lentab->min = lentab->max = min; > > lentablen = 1; > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bounces@workgrowth.ml Wed Aug 19 11:11:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9E52D7F54 for ; Wed, 19 Aug 2015 11:11:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A738AC006 for ; Wed, 19 Aug 2015 09:10:58 -0700 (PDT) X-ASG-Debug-ID: 1440000653-04cb6c10d36f510001-NocioJ Received: from coro3.isol-servers.net (static-ip-85-25-159-22.inaddr.ip-pool.com [85.25.159.22]) by cuda.sgi.com with ESMTP id D93xPqVRJ6sTbsbF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 09:10:56 -0700 (PDT) X-Barracuda-Envelope-From: bounces@workgrowth.ml X-Barracuda-Apparent-Source-IP: 85.25.159.22 Received: by coro3.isol-servers.net (Postfix, from userid 10001) id 5500BDC05E4; Wed, 19 Aug 2015 19:10:47 +0300 (EEST) To: xfs@oss.sgi.com Subject: Goodbye from our Newsletter X-PHP-Originating-Script: 10001:class.phpmailer.php X-ASG-Orig-Subj: Goodbye from our Newsletter Received: from b115306.yse.yahoo.net [68.180.229.164] by workgrowth.ml with HTTP; Wed, 19 Aug 2015 19:10:46 +0300 Date: Wed, 19 Aug 2015 19:10:47 +0300 From: "workgrowth.ml" Message-ID: <767def7e900257cd6dd7621a1f333420@workgrowth.ml> X-Priority: 3 X-Mailer: PHPMailer 5.2.9 (https://github.com/PHPMailer/PHPMailer/) X-phpList-version: 3.0.12 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: bounces@workgrowth.ml List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: static-ip-85-25-159-22.inaddr.ip-pool.com[85.25.159.22] X-Barracuda-Start-Time: 1440000655 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://workgrowth.ml/lists/?p=subscribe and follow the steps. Thank you From sandeen@sandeen.net Wed Aug 19 12:40:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 76C997F54 for ; Wed, 19 Aug 2015 12:40:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45AE28F804C for ; Wed, 19 Aug 2015 10:40:20 -0700 (PDT) X-ASG-Debug-ID: 1440006018-04bdf070ae03060001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GkRkhylkw4GDIzNq for ; Wed, 19 Aug 2015 10:40:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7FCE5661D58C; Wed, 19 Aug 2015 12:40:18 -0500 (CDT) Message-ID: <55D4BF81.8090204@sandeen.net> Date: Wed, 19 Aug 2015 12:40:17 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , Jan Kara CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix uninitialized return value in xfs_alloc_fix_freelist() References: <1436948168-25051-1-git-send-email-jack@suse.com> <20150715111649.GA60463@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix uninitialized return value in xfs_alloc_fix_freelist() In-Reply-To: <20150715111649.GA60463@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440006018 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 7/15/15 6:16 AM, Brian Foster wrote: > On Wed, Jul 15, 2015 at 10:16:08AM +0200, Jan Kara wrote: >> xfs_alloc_fix_freelist() can sometimes jump to out_agbp_relse without >> ever setting value of 'error' variable which is then returned. This can >> happen e.g. when pag->pagf_init is set but AG is for metadata and we >> want to allocate user data. >> >> Fix the problem by initializing 'error' to 0, which is the desired >> return value when we decide to skip this group. >> >> CC: xfs@oss.sgi.com >> Coverity-id: 1309714 >> Signed-off-by: Jan Kara >> --- > > Reviewed-by: Brian Foster Dave, ping on this one? I don't see it in your latest update, looks important. (xfsprogs has the same problem, FWIW) -Eric From bfoster@redhat.com Wed Aug 19 13:39:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10E727F54 for ; Wed, 19 Aug 2015 13:39:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F400B8F804C for ; Wed, 19 Aug 2015 11:39:08 -0700 (PDT) X-ASG-Debug-ID: 1440009547-04cbb032f0072d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AnBIRcB8Ds57EaVm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 11:39:07 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id EE4CA36B1FD for ; Wed, 19 Aug 2015 18:39:06 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7JId6UN000557 for ; Wed, 19 Aug 2015 14:39:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 57DBD123E78; Wed, 19 Aug 2015 14:39:05 -0400 (EDT) Date: Wed, 19 Aug 2015 14:39:05 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150819183904.GB49174@bfoster.bfoster> X-ASG-Orig-Subj: v5 filesystem corruption due to log recovery lsn ordering MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440009547 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's another issue I've run into from recent log recovery testing... Many on-disk data structures for v5 filesystems have the LSN from the last modification stamped the associated header. As of the following commit, log recovery compares the recovery item LSN against the LSN of the on-disk structure to avoid restoration of stale contents: 50d5c8d xfs: check LSN ordering for v5 superblocks during recovery This presumably addresses some problems where recovery of the stale contents leads to CRC failure. The problem here is that xfs_repair clears the log (even when the fs is clean) and resets the current LSN on the next mount. This creates a situation where logging is ineffective for any structure that has not yet been modified since the current LSN was reset. I'm not quite sure how pervasive this is in practice, but the following is a corruption reproducer for directory buffers: - mkfs (-m crc=1), mount and fsstress a filesystem for a bit such that the LSN increases a decent amount (e.g., several log cycles or so). # cat /sys/fs/xfs/dm-3/log/log_* 3:9378 3:9376 - Kill fsstress, create a new directory and populate with some files: # mkdir /mnt/dir # for i in $(seq 0 999); do touch /mnt/dir/$i; done - Unmount the fs, run xfs_repair, mount the fs and verify the LSN has been reset: # cat /sys/fs/xfs/dm-3/log/log_* 1:2 1:2 - Remove a file from the previously created directory and immediately shutdown the fs, flushing the log: # rm -f /mnt/dir/0; ~/xfstests-dev/src/godown -f /mnt/ # umount /mnt - Remount the fs to replay the log. Unmount and repair once more: # mount /mnt; umount /mnt # xfs_repair -n ... imap claims in-use inode 3082 is free, would correct imap ... ... and the filesystem is inconsistent. This occurs because the log recovery records are tagged with an LSN based on the reset value of (1:2) and the buffers to be recovered that hadn't yet been rewritten before the shutdown have an LSN from around the time the fsstress was stopped. The target buffer is incorrectly seen as "newer" than the recovery item, and thus recovery of this buffer is skipped. Note that the resulting behavior is not always consistent. I have seen log recovery ignore the file removal such that the fs is consistent and the modification is simply lost. The original instance I hit on a separate machine caused repair to complain about and fix the directory rather than the imap, but that could have been a repair thing. The larger question is how to resolve this problem? I don't think this is something that is ultimately addressed in xfs_repair. Even if we stopped clearing the log, that doesn't help users who might have had to forcibly zero the log to recover a filesystem. Another option in theory might be to unconditionally reset the LSN of everything on disk, but that sounds like overkill just to preserve the current kernel workaround. It sounds more to me that we have to adjust this behavior on the kernel side. That said, the original commit presumably addresses some log recovery shutdown problems that we do not want to reintroduce. I haven't yet wrapped my head around what that original problem was, but I wanted to get this reported. If the issue was early buffer I/O submission, perhaps we need a new mechanism to defer this I/O submission until a point that CRC verification is expected to pass (or otherwise generate a filesystem error)? Or perhaps do something similar with CRC verification? Any other thoughts, issues or things I might have missed here? Brian From MD-NO--34306-53-FR-PR--xfs=oss.sgi.com@lists.mdirector.com Wed Aug 19 16:02:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID, T_KHOP_FOREIGN_CLICK autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 665EC7F54 for ; Wed, 19 Aug 2015 16:02:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27E8830405F for ; Wed, 19 Aug 2015 14:02:38 -0700 (PDT) X-ASG-Debug-ID: 1440018147-04bdf070b110250001-NocioJ Received: from mta141.182.mdrctr.com (mta141.182.mdrctr.com [62.97.141.182]) by cuda.sgi.com with ESMTP id OfWExZB0FTAApk3h for ; Wed, 19 Aug 2015 14:02:28 -0700 (PDT) X-Barracuda-Envelope-From: MD-NO--34306-53-FR-PR--xfs=oss.sgi.com@lists.mdirector.com X-Barracuda-Apparent-Source-IP: 62.97.141.182 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=free; d=pictyear.frmdirector.com; h=From:Reply-To:To:Date:List-Id:List-Unsubscribe:Subject:MIME-Version:Content-Type:Message-ID; i=info@pictyear.frmdirector.com; bh=gx1TulA5ebatkFOWNNkwbomWYZY=; b=X8TZM/DNhriWMzKyV9yjfDETKa69dzoS1oX8ezJNfKH3B8VNjzPkJLJmcEyt/kEId0TbGu/8CXai VAST5cRbp2uIpsT+XGpBr//LRO1vEcCfe+zjx/J7Ml/o77TL9t9l1nP5Tvh9yUjZ0D3GcY6cm+Nf 77wqPKlUadPQBBuAq+M= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=free; d=pictyear.frmdirector.com; b=lcGI92ItlFTZELpCY21h6au+0VpnYfyTTYEHkOnqMuD7nG/hxVhBO3UJLeFvlQFdRaH1BqpfKBxc YDfqPW7nk8axFqfpPtx8NGxbvC4MlCzJ1AB9ZvrWXwG4ogHQZ/MyEyDTIYOY74A0/sNMgUehA1xT q3lsjZ2A+WTx145GQHY=; Received: from pmta4.mta.antevenio.com (127.0.0.1) by mta141.181.mdrctr.com id hqjneg15mio9 for ; Wed, 19 Aug 2015 23:00:44 +0200 (envelope-from ) From: PICTYEAR Reply-To: PICTYEAR To: Precedence: bulk X-rpcampaign: mdMDNO3430653FRPR X-rpcampaignok: mdmdMD-NO--34306-53-FR-PR X-reputation: 5 Date: Wed, 19 Aug 2015 23:00:44 +0200 List-Id: 34306-3.mdirector.com List-Unsubscribe: , X-LU: , Subject: =?UTF-8?B?VGVudGV6IGRlIGdhZ25lciB1biB2b3lhZ2UgcG91ciAyIMOgIFNhbiBGcmFuY2k=?= =?UTF-8?B?c2NvIGVuIHTDqWzDqWNoYXJnZWFudCBs?='app gratuite PICTYEAR MIME-Version: 1.0 X-ASG-Orig-Subj: =?UTF-8?B?VGVudGV6IGRlIGdhZ25lciB1biB2b3lhZ2UgcG91ciAyIMOgIFNhbiBGcmFuY2k=?= =?UTF-8?B?c2NvIGVuIHTDqWzDqWNoYXJnZWFudCBs?='app gratuite PICTYEAR Content-Type: multipart/mixed; boundary="boundaryTagForMixed" Message-ID: <0.0.13.5F0.1D0DAC21DA40B96.2E1137@mta141.181.mdrctr.com> X-Barracuda-Connect: mta141.182.mdrctr.com[62.97.141.182] X-Barracuda-Start-Time: 1440018148 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.40 X-Barracuda-Spam-Status: No, SCORE=0.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA085b Custom Rule SA085b --boundaryTagForMixed Content-Type: multipart/alternative; boundary="boundaryTagForAlternative" --boundaryTagForAlternative Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit ********************************************************************** Vous pourrez exercer vos droits d´accès, annulation, rectification et opposition concernant vos données à caractère personnel, en cliquant * annulation //www.mdirector.com/track/pre-unsubscribe/category/EMAIL/empId/34306/subId/53/listId/3/conId/27804/signature/12306a1a5a54b6a8ff33328203d402ea/conEmail/xfs@oss.sgi.com/conMovil/- --boundaryTagForAlternative Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit PICTYEAR
Si vous n’arrivez pas à visualiser cet email, cliquez ici.
 
Téléchargez l’app et tentez de gagner* un voyage pour 2 à SAN FRANCISCO
 
OU UN ALBUM PHOTO INSTANTANÉMENT COMPOSÉ DE VOS PLUS BEAUX SOUVENIRS PARTAGÉS
 
Pictyear
 
Disponible sur l'APPSTORE  - Disponible sur GOOGLE PLAY
-
pictyear
La première application mobile gratuite et privée qui regroupe toutes les photos que vous prenez avec toutes celles qui sont prises par vos proches.
shoot - swipe - print
Ne laissez plus dans les smartphones des autres les photos sur lesquelles vous apparaissez
 
les selfies entre amis - les photos en famille
 
Réalisez instantanément vos albums photos personnalisés et recevez gratuitement votre FREEBOOK
 
les éclats de rire - les photos entre copines
 
 
 
pictyear
Pictyear est la première appli au
monde qui vous permet de créer
instantanément un album photos
imprimé, seul ou à plusieurs.
SUIVEZ-NOUS
FacebookTwitterInstagramPinterest
 
Le règlement du jeu concours sans obligation d’achat « SUMMER PICTYEAR » est disponible en cliquant ici.
 
© Copyright 2015 Pictyear Tous droits réservés. Mentions légales.
 
Conformément à la loi "Informatique et libertés" du 6 janvier 1978, vous bénéficiez d'un droit d'accès, de modification, de rectification et de suppression des données qui vous concernent. Si vous souhaitez exercer ce droit et obtenir communication des informations vous concernant, veuillez vous adresser à : Venise Activation – 7, 13 Bd Paul Émile Victor 92200 Neuilly sur Seine.

Si vous souhaitez ne plus recevoir de messages, cliquez ici.
 
Vous pourrez exercer vos droits d´accès, annulation, rectification et opposition concernant vos données à caractère personnel, en cliquant annulation.
--boundaryTagForAlternative-- --boundaryTagForMixed-- From david@fromorbit.com Wed Aug 19 17:45:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED8C87F54 for ; Wed, 19 Aug 2015 17:45:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B346630405F for ; Wed, 19 Aug 2015 15:45:09 -0700 (PDT) X-ASG-Debug-ID: 1440024306-04bdf070af15ab0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id MJvlyXfGDA1q9Ecg for ; Wed, 19 Aug 2015 15:45:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DxBwDXBdVVPBWXLHldgxuBPYZToywBBptSBAICgTpNAQEBAQEBBwEBAQFBP4QjAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhMbiAsHzzgBAQgCIBmGB4UzhQoHhCwFlSSMaoFNkDeIMII0HIFlLDOCTAEBAQ Received: from ppp121-44-151-21.lns20.syd7.internode.on.net (HELO dastard) ([121.44.151.21]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Aug 2015 08:14:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSC6H-0007CL-K4; Thu, 20 Aug 2015 08:44:53 +1000 Date: Thu, 20 Aug 2015 08:44:53 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150819224453.GL3902@dastard> X-ASG-Orig-Subj: Re: v5 filesystem corruption due to log recovery lsn ordering References: <20150819183904.GB49174@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150819183904.GB49174@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440024306 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21751 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 19, 2015 at 02:39:05PM -0400, Brian Foster wrote: > Hi all, > > Here's another issue I've run into from recent log recovery testing... > > Many on-disk data structures for v5 filesystems have the LSN from the > last modification stamped the associated header. As of the following > commit, log recovery compares the recovery item LSN against the LSN of > the on-disk structure to avoid restoration of stale contents: > > 50d5c8d xfs: check LSN ordering for v5 superblocks during recovery > > This presumably addresses some problems where recovery of the stale > contents leads to CRC failure. The problem here is that xfs_repair > clears the log (even when the fs is clean) and resets the current LSN on > the next mount. This creates a situation where logging is ineffective > for any structure that has not yet been modified since the current LSN > was reset. Well, that was a bit of an oversight... .... > > The larger question is how to resolve this problem? I don't think this > is something that is ultimately addressed in xfs_repair. Even if we > stopped clearing the log, that doesn't help users who might have had to > forcibly zero the log to recover a filesystem. Another option in theory > might be to unconditionally reset the LSN of everything on disk, but > that sounds like overkill just to preserve the current kernel > workaround. Well, it's relatively easy to detect a log that has been zeroed if the cycle count is more than a cycle or two lower than the LSN in important metadata, but I'm not sure we can reliably detect that. > It sounds more to me that we have to adjust this behavior on the kernel > side. That said, the original commit presumably addresses some log > recovery shutdown problems that we do not want to reintroduce. I haven't > yet wrapped my head around what that original problem was, but I wanted > to get this reported. If the issue was early buffer I/O submission, > perhaps we need a new mechanism to defer this I/O submission until a > point that CRC verification is expected to pass (or otherwise generate a > filesystem error)? Or perhaps do something similar with CRC > verification? Any other thoughts, issues or things I might have missed > here? The issue that the LSN ordering fixes is that of unsynchronised recovery of different log records that contain the same objects. e.g. ordering of inode chunk allocation (in buffers) vs inode object modification (in inode items). v4 filesystems have a serious problem where inode chunk allocation can be run after the inode item modifications, resulting in recovery "losing" file size updates that sync flushed to the log. i.e. create just the right number of small files, sync, crash and recovery gives a number of zero length files in certain inode chunks because the ordering of item recovery was wrong. Another problem with inode logging is the flushiter field, which is used to try to avoid replaying changes in the log that have already been flushed to disk. This could also lead to lost inode modifications after a sync because the flushiter is reset to zero after each time the inode item is recovered. This was mostly avoided by logging all inode modifications and using delayed logging, but could still occur... There was a long history of these sorts of problems occurring (I first analysed the inode allocation/inode item update failure mode back in 2006), and I found several other possible issues like this to do with the inode flushiter at the same time. I also suspected that there were problems with directory recovery due to the same inode item vs buffer item ordering issues, but could never pin them down. So the solution was to record the LSN of the last modification in every item as it is written to disk, thereby ensuring we knew exactly what transaction the item was last modified in. This means we can skip modifications in transaction recovery that are already on disk. ---- The first thing we need to do is not zero the log in xfs_repair when the log is clean to minimise future exposure to this issue on existing systems. Then, on the kernel side, we need is a reliable way to detect that the log head/tail pointers have been reset in the kernel. This means we can - at minimum - issue a warning during log recovery that this has been detected. Finally, we need to work out how to handle recovery in the situation that the log has been zeroed and the filesystem has a mix of new and old, stale LSNs. I think the simplest way around this is not to handle it in log recovery at all, but to avoid it altogether. That is, when we find the log head/tail point to a zeroed log, we pull the current LSN from, say, the superblock (and maybe other metadata such as AG headers) and initialise the log head/tail to the cycle number + some offset so that every new transaction is guaranteed to have a cycle number more recent than any other LSN in the filesystem and ordering is preserved, even if the log has been zeroed. This means dirty log recovery requires no changes at all, we only need to change xlog_recover() to detect the empty, clean log and set: l_curr_cycle l_curr_block l_last_sync_lsn l_tail_lsn reserve_head write_head appropriately for the new cycle number we've given the log. This is pretty much how it is already done in xlog_find_tail() with the initialisation information coming from the log record found at the head of the log - we're just making it up a different source. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Aug 19 17:50:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BDA257F54 for ; Wed, 19 Aug 2015 17:50:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5BA6DAC003 for ; Wed, 19 Aug 2015 15:50:54 -0700 (PDT) X-ASG-Debug-ID: 1440024652-04bdf070af15f20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mKh19zObnGpKlJCL for ; Wed, 19 Aug 2015 15:50:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0E46C61F8202; Wed, 19 Aug 2015 17:50:52 -0500 (CDT) Message-ID: <55D5084B.8080500@sandeen.net> Date: Wed, 19 Aug 2015 17:50:51 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build References: <1439979814-18934-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build In-Reply-To: <1439979814-18934-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440024652 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21751 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/19/15 5:23 AM, Dave Chinner wrote: > From: Dave Chinner > > Fix CONFIG_LOCKDEP=n build, because asserts I put in to ensure we > aren't overrunning lockdep subclasses in commit 0952c81 ("xfs: > clean up inode lockdep annotations") use a define that doesn't > exist when CONFIG_LOCKDEP=n > > Only check the subclass limits when lockdep is actually enabled. > > Signed-off-by: Dave Chinner Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_inode.c | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index dd584da..30555f8 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -362,6 +362,17 @@ int xfs_lots_retries; > int xfs_lock_delays; > #endif > > +#ifdef CONFIG_LOCKDEP > +static bool > +xfs_lockdep_subclass_ok( > + int subclass) > +{ > + return subclass < MAX_LOCKDEP_SUBCLASSES; > +} > +#else > +#define xfs_lockdep_subclass_ok(subclass) (true) > +#endif > + > /* > * Bump the subclass so xfs_lock_inodes() acquires each lock with a different > * value. This can be called for any type of inode lock combination, including > @@ -375,11 +386,12 @@ xfs_lock_inumorder(int lock_mode, int subclass) > > ASSERT(!(lock_mode & (XFS_ILOCK_PARENT | XFS_ILOCK_RTBITMAP | > XFS_ILOCK_RTSUM))); > + ASSERT(xfs_lockdep_subclass_ok(subclass)); > > if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { > ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); > - ASSERT(subclass + XFS_IOLOCK_PARENT_VAL < > - MAX_LOCKDEP_SUBCLASSES); > + ASSERT(xfs_lockdep_subclass_ok(subclass + > + XFS_IOLOCK_PARENT_VAL)); > class += subclass << XFS_IOLOCK_SHIFT; > if (lock_mode & XFS_IOLOCK_PARENT) > class += XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT; > From david@fromorbit.com Wed Aug 19 18:41:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 16B547F54 for ; Wed, 19 Aug 2015 18:41:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99CA0AC003 for ; Wed, 19 Aug 2015 16:41:05 -0700 (PDT) X-ASG-Debug-ID: 1440027662-04cbb032f618f60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kP78pJhtqdXVucE8 for ; Wed, 19 Aug 2015 16:41:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BcDQDqEtVV/3AqLHldgxsjMWmqBQEGlVMChX0EgT9NAQEBAQEBgQtBA4Q8OyQ0BSUDNIgtqR+mHxmGB4pbghcMQYExBZUkhQSHZo4ijBImgUoMAYI4LDOCTAEBAQ Received: from ppp121-44-42-112.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.112]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Aug 2015 09:11:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSCyP-0007Q7-Cc for xfs@oss.sgi.com; Thu, 20 Aug 2015 09:40:49 +1000 Date: Thu, 20 Aug 2015 09:40:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch rebased to aa49338 Message-ID: <20150819234049.GM3902@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch rebased to aa49338 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="1sNVjLsmu1MXqwQ/" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440027662 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --1sNVjLsmu1MXqwQ/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been rebased to add a build fix to the xfs-misc-fixes-for-4.3-2 topic branch. The new commits are below. -Dave. The new head of the for-next branch is commit: aa49338 Merge branch 'xfs-misc-fixes-for-4.3-2' into for-next New Commits: Dave Chinner (2): [3403ccc] xfs: inode lockdep annotations broke non-lockdep build [aa49338] Merge branch 'xfs-misc-fixes-for-4.3-2' into for-next Code Diffstat: fs/xfs/xfs_inode.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) --=20 Dave Chinner david@fromorbit.com --1sNVjLsmu1MXqwQ/ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJV1RQAAAoJEK3oKUf0dfodZioQAL7DtVLbhvvBUReFsTQnXssB gb2YVtmapGxWrfxa4CJJtZgDtOo2Ej2Lakaa8O6kpFKYYoAzFRAYZ9wRovsBgFdr ZbbVjuybh7zxNS/6BUbqjdHC3Z2rLtdpbm5qpgth1YKmrqPwb4/NFS/ykMZvW7Jo Xb92UA+lf2JXwLGsZrJWkdr3s+KpHZH8TEGMoMGPfJNYsykL58/unxIAceeJvTcH hybx32fPj28hUNsAk7M4Xa/0CiFFvzObBMU0i5HPlkiBBVqmhxQThSoYSLJ/XAaE oJfiRuKT8EUkXKSqwgSmiV8/uV3EEG/fczqdMDpIMQyv+AILcCEqokM7wiVH4wmD VHK3gd7Px2I1pHEMimTUuPLfI/ST1JL2MhX3wR2BCVwJfMjqA6cpo+dEm5qN6M15 w25OWDgQYCRlmfhY4SKElthPMZIMOxZItbVVyoWZd8mPiH2ZZ1SFkUe/Gu3ACw0E OhENLuhnNl7fsLMUOe5WR656sLDxtEPGFykd0Th5+c/ixTvlsyq0JsL+cnlfbsSz Kwt2/3UkdIutbAygTt9gmM7XUzm6ijeOLPo28FzC8MmRFsoe6RW6BwDwZ/UHlgSN npAo1KPO8XuoT6LA3WEyusuDQKqIQDUCmbe4Yur4/vGc60Owic364xN6w3IgCHoq Ds68cDXB36hKCUCaK8UV =k0Nn -----END PGP SIGNATURE----- --1sNVjLsmu1MXqwQ/-- From david@fromorbit.com Wed Aug 19 19:23:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C2A267F54 for ; Wed, 19 Aug 2015 19:23:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A559A8F8052 for ; Wed, 19 Aug 2015 17:23:09 -0700 (PDT) X-ASG-Debug-ID: 1440030187-04bdf070b119fb0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 0MWaV2iOmCINj6C6 for ; Wed, 19 Aug 2015 17:23:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AzDQCCHdVV/3AqLHldgxuBPaoFAQabUgQCAoE+TQEBAQEBAYELQQODYAEBBDocIxAIAw4KCSUPBSUDIROILc8UAQEIAiAZhgeFM4UKB4QsAQSVJIxqmjQmhA8sM4JMAQEB Received: from ppp121-44-42-112.lns20.syd4.internode.on.net (HELO dastard) ([121.44.42.112]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Aug 2015 09:53:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSDd5-0007Ti-SV; Thu, 20 Aug 2015 10:22:51 +1000 Date: Thu, 20 Aug 2015 10:22:51 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, Jan Tulak Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150820002251.GN3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> <20150819080940.GA13130@infradead.org> <20150819102623.GK3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150819102623.GK3902@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440030187 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21755 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 19, 2015 at 08:26:23PM +1000, Dave Chinner wrote: > On Wed, Aug 19, 2015 at 01:09:40AM -0700, Christoph Hellwig wrote: > > On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote: > > > Hmmm, looks like I accidentally comitted an earlier version of this > > > patch yesterday. Jan, can you send delta patches to what I committed > > > to address more recent review comments? Sorry, my bad. > > > > Can you revert it for now? I think most of these changes are incorrect > > and should either be dropped for now by disabling fsx or will need > > a major rework. > > I'll just rebase the for-next branch, I guess, and remove it > completely from the history. I've got another lockdep fix that needs > to be pushed before it all hits tomorrow's linux-next build, anyway. Getting my trees mixed up. I'll revert the patch on the next push. Cheers, Dave. -- Dave Chinner david@fromorbit.com From 3SUTVVRUJA9oLAPANOKJ76HH696LdaaWeCI6EH.8KITBOKOO.OCE.8KI@trix.bounces.google.com Wed Aug 19 22:06:54 2015 Return-Path: <3SUTVVRUJA9oLAPANOKJ76HH696LdaaWeCI6EH.8KITBOKOO.OCE.8KI@trix.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CDBAC7F54 for ; Wed, 19 Aug 2015 22:06:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B0E6A304039 for ; Wed, 19 Aug 2015 20:06:51 -0700 (PDT) X-ASG-Debug-ID: 1440040009-04cb6c27831e980001-NocioJ Received: from mail-oi0-f70.google.com (mail-oi0-f70.google.com [209.85.218.70]) by cuda.sgi.com with ESMTP id tAmsFWLCp7q1hXm2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 19 Aug 2015 20:06:49 -0700 (PDT) X-Barracuda-Envelope-From: 3SUTVVRUJA9oLAPANOKJ76HH696LdaaWeCI6EH.8KITBOKOO.OCE.8KI@trix.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.218.70 X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.218.70] Received: by oio137 with SMTP id 137so33314155oio.2 for ; Wed, 19 Aug 2015 20:06:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.218.70] X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.218.70] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; bh=44r6tf0v1j1R+GnEA3fDK8sZRlBHib2HjXv3/CX2EXs=; b=09fA3fwgRJrdgHuHpKm5tiFVF6RKooxshM6ygH/cRDUj41dhPj0zjPifyeZMyThAUG A6U+PLx2OV8CWcEPu2c3P9mxUXoWiMS78LmP0jahYw5rGygxel+9BGcxH7IQZDNMTMYB FVZdbGL+VMlXElroKa4xfYmWdbGqjEy4jzgoX4kSmNF75G3dJ8FMcUdRBJy5iQ53ylY1 Zqq4QO3T1RY/jNPL2DX4pZCjD0vKJETz/08pfzwv/ZpkoxlRhdKBfR6eQ/7AOrDXw/D7 8mzBPalbqDRSwUKyIcKQ9TJWY/7wPpWqQlObsKckCcyHvPLC3kgZpYGuqwCJK+La8weH FHMA== MIME-Version: 1.0 X-Received: by 10.107.134.165 with SMTP id q37mt978840ioi.25.1440040009062; Wed, 19 Aug 2015 20:06:49 -0700 (PDT) Reply-To: petersonballadap74408@gmail.com X-No-Auto-Attachment: 1 Message-ID: <001a113f8ef633ee26051db571ac@google.com> Date: Thu, 20 Aug 2015 03:06:49 +0000 Subject: =?GB2312?B?vPK7r8T6tcS5pNf3o6y/qreiv827p7rcvPK1pQ==?= From: petersonballadap74408@gmail.com X-ASG-Orig-Subj: =?GB2312?B?vPK7r8T6tcS5pNf3o6y/qreiv827p7rcvPK1pQ==?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113f8ef63678a6051db57182 X-Barracuda-Connect: mail-oi0-f70.google.com[209.85.218.70] X-Barracuda-Start-Time: 1440040009 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21757 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a113f8ef63678a6051db57182 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 MaGi0rvM7MvRy/e2/sj9zfK/zbunyv2+3aOssO/E+r+qt6K1vUIyQqGi1bm74cnP0/ayu7W9tcTT xdbKv827p6GjDQoyoaK439Cn08q8/tOqz/qjrLDvxPq78bXDuPy24NK7ttTSu7jf1srBv9PF1sq/ zbun0a/FzKGjDQozoaK439Cnzca547K7ts+jrNGvxcyyu7bPo6y2qbWlsru2z6GjDQrTxdbKv827 p7+qt6LPtc2zu7bTrdfJ0a+jrM7StcRRLS1ROjIwMzYwMTk1MTnWsb3T1NrP37LZ1/fR3cq+oaMN CkkndmUgaW52aXRlZCB5b3UgdG8gZmlsbCBvdXQgdGhlIGZvcm0gVW50aXRsZWQgZm9ybS4gVG8g ZmlsbCBpdCBvdXQsDQp2aXNpdDoNCmh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvMU9q eTUzWWlmSThld2p6VFc1TlNJQ1l6V1pBZFZJaWZvSTk0UDNrcEh2YUUvdmlld2Zvcm0/Yz0wJnc9 MSZ1c3A9bWFpbF9mb3JtX2xpbmsNCg== --001a113f8ef63678a6051db57182 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable

1=A1=A2=D2=BB=CC=EC=CB=D1=CB=F7=B6= =FE=C8=FD=CD=F2=BF=CD=BB=A7=CA=FD=BE=DD=A3=AC=B0=EF=C4=FA=BF=AA=B7=A2=B5=BD= B2B=A1=A2=D5=B9=BB=E1=C9=CF=D3=F6=B2=BB=B5=BD=B5=C4=D3=C5=D6=CA=BF=CD=BB=A7= =A1=A3
2=A1=A2=B8=DF=D0=A7=D3=CA=BC=FE=D3=AA=CF=FA=A3=AC=B0=EF=C4=FA=BB= =F1=B5=C3=B8=FC=B6=E0=D2=BB=B6=D4=D2=BB=B8=DF=D6=CA=C1=BF=D3=C5=D6=CA=BF=CD= =BB=A7=D1=AF=C5=CC=A1=A3
3=A1=A2=B8=DF=D0=A7=CD=C6=B9=E3=B2=BB=B6=CF=A3= =AC=D1=AF=C5=CC=B2=BB=B6=CF=A3=AC=B6=A9=B5=A5=B2=BB=B6=CF=A1=A3
=D3=C5= =D6=CA=BF=CD=BB=A7=BF=AA=B7=A2=CF=B5=CD=B3=BB=B6=D3=AD=D7=C9=D1=AF=A3=AC=CE= =D2=B5=C4Q--Q:2036019519=D6=B1=BD=D3=D4=DA=CF=DF=B2=D9=D7=F7=D1=DD=CA=BE=A1= =A3

If you have trouble viewing or submitting this form, you can fill it out in= Google Forms.

Untitled form

=
    • Option 1
P= owered by
3D"Google
This content is neither create= d nor endorsed by Google.
Report Abuse - Terms of Service<= /a> - Addition= al Terms

<= /html> --001a113f8ef63678a6051db57182-- From eguan@redhat.com Thu Aug 20 01:12:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DABE47F54 for ; Thu, 20 Aug 2015 01:12:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD0688F8050 for ; Wed, 19 Aug 2015 23:12:29 -0700 (PDT) X-ASG-Debug-ID: 1440051148-04bdf070b126470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JhEGawskNQwzJB1G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Aug 2015 23:12:28 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 14A5591E90; Thu, 20 Aug 2015 06:12:28 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7K6CP6g016304; Thu, 20 Aug 2015 02:12:26 -0400 Date: Thu, 20 Aug 2015 14:12:24 +0800 From: Eryu Guan To: Dave Chinner Cc: Tejun Heo , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818215611.GD3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440051148 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 19, 2015 at 07:56:11AM +1000, Dave Chinner wrote: > On Tue, Aug 18, 2015 at 12:54:39PM -0700, Tejun Heo wrote: > > Hello, > > > > On Tue, Aug 18, 2015 at 10:47:18AM -0700, Tejun Heo wrote: > > > Hmm... the only possibility I can think of is tot_write_bandwidth > > > being zero when it shouldn't be. I've been staring at the code for a > > > while now but nothing rings a bell. Time for another debug patch, I > > > guess. > > > > So, I can now reproduce the bug (it takes a lot of trials but lowering > > the number of tested files helps quite a bit) and instrumented all the > > early exit paths w/o the fix patch. bdi_has_dirty_io() and > > wb_has_dirty_io() are never out of sync with the actual dirty / io > > lists even when the test 048 fails, so the bug at least is not caused > > by writeback skipping due to buggy bdi/wb_has_dirty_io() result. > > Whenever it skips, all the lists are actually empty (verified while > > holding list_lock). > > > > One suspicion I have is that this could be a subtle timing issue which > > is being exposed by the new short-cut path. Anything which adds delay > > seems to make the issue go away. Dave, does anything ring a bell? > > No, it doesn't. The data writeback mechanisms XFS uses are all > generic. It marks inodes I_DIRTY_PAGES and lets the generic code > take care of everything else. Yes, we do delayed allocation during > writeback, and we log the inode size updates during IO completion, > so if inode sizes are not getting updated, then Occam's Razor > suggests that writeback is not happening. > > I'd suggest looking at some of the XFS tracepoints during the test: > > tracepoint trigger > xfs_file_buffered_write once per write syscall > xfs_file_sync once per fsync per inode > xfs_vm_writepage every ->writepage call > xfs_setfilesize every IO completion that updates inode size I gave the tracepoints a try, but my root fs is xfs so I got many noises. I'll try to install a new vm with ext4 as root fs. But I'm not sure if the new vm could reproduce the failure, will see. BTW, I guess xfs_vm_writepage should be xfs_writepage, and xfs_file_sync should be xfs_file_fsync? Thanks, Eryu From jtulak@redhat.com Thu Aug 20 02:33:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CD9C37F47 for ; Thu, 20 Aug 2015 02:33:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5760CAC008 for ; Thu, 20 Aug 2015 00:33:54 -0700 (PDT) X-ASG-Debug-ID: 1440056032-04cbb032f02aff0001-NocioJ Received: from mail-io0-f177.google.com (mail-io0-f177.google.com [209.85.223.177]) by cuda.sgi.com with ESMTP id aZNcWzuuWBhk8G1G (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 20 Aug 2015 00:33:52 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by iodb91 with SMTP id b91so36702307iod.1 for ; Thu, 20 Aug 2015 00:33:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=zUdE6PXFIVCX5kNfxurxdXTPaEybBj57/wU9sKKnScQ=; b=KWRfWgSs2AGm3ObawW/+YaJuLC6bAOazVEoqypXjBiCetun4NiqV6KX3P5IoWCp8FS 1vDDQjHmxb4pYCVEAfya4CJVrV7xoXvOFGXPhTJiMRdLgVkudzSl5s3Ej5wD7cx1AyvI EzJ9pWsdsp5EXbeCWaSaiYp8CBsUz2v0jvKwH3MWBvpVx/egkkOTsraWWTT5MiXIV/BE R4FPG0lTx4aiCcDVdhg6raULw2zaCTC7CloQdvzu/RWbdFLgZjIHx94XQNlPTMOVOJVT 9pIUQ1x+qP7xOtQ6oDR7bC8tDYUutfL7RE+vXcCt2/8t2l1TImwteDkklZM/UmlpydEk WkhQ== X-Gm-Message-State: ALoCoQkex9kaP7ZO8o4lQ16JAA73igKMLVortto3T19h8r68QXtz1NKfBSeZXkcFNGbygEWhQICT X-Received: by 10.107.158.16 with SMTP id h16mr1598075ioe.52.1440056032382; Thu, 20 Aug 2015 00:33:52 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.132 with HTTP; Thu, 20 Aug 2015 00:33:33 -0700 (PDT) In-Reply-To: <20150820002251.GN3902@dastard> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> <20150819080940.GA13130@infradead.org> <20150819102623.GK3902@dastard> <20150820002251.GN3902@dastard> From: Jan Tulak Date: Thu, 20 Aug 2015 09:33:33 +0200 Message-ID: Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Cc: Christoph Hellwig , xfs-oss Content-Type: multipart/alternative; boundary=001a11402b3a449ad5051db92c95 X-Barracuda-Connect: mail-io0-f177.google.com[209.85.223.177] X-Barracuda-Start-Time: 1440056032 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21762 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11402b3a449ad5051db92c95 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Aug 20, 2015 at 2:22 AM, Dave Chinner wrote: > On Wed, Aug 19, 2015 at 08:26:23PM +1000, Dave Chinner wrote: > > On Wed, Aug 19, 2015 at 01:09:40AM -0700, Christoph Hellwig wrote: > > > On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote: > > > > Hmmm, looks like I accidentally comitted an earlier version of this > > > > patch yesterday. Jan, can you send delta patches to what I committe= d > > > > to address more recent review comments? Sorry, my bad. > > > > > > Can you revert it for now? I think most of these changes are incorrec= t > > > and should either be dropped for now by disabling fsx or will need > > > a major rework. > > > > I'll just rebase the for-next branch, I guess, and remove it > > completely from the history. I've got another lockdep fix that needs > > to be pushed before it all hits tomorrow's linux-next build, anyway. > > Getting my trees mixed up. I'll revert the patch on the next push. =E2=80=8BAnd as I noticed, ' xfsprogs: Add includes required for OS X builds =E2=80=8B' was =E2=80=8Balso selected in an older version. Other patches looks OK, though. :-) Should I send delta patch for that one? It is just about three #includes. =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --001a11402b3a449ad5051db92c95 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Thu, Aug 20, 2015 at 2:22 AM, Dave Chinner <david@fromor= bit.com> wrote:
On Wed, Aug 19, 2015 at 08:26:23PM +1000, Dave Chinner wrote:
> On Wed, Aug 19, 2015 at 01:09:40AM -0700, Christoph Hellwig wrote:
> > On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote:
> > > Hmmm, looks like I accidentally comitted an earlier version = of this
> > > patch yesterday. Jan, can you send delta patches to what I c= ommitted
> > > to address more recent review comments? Sorry, my bad.
> >
> > Can you revert it for now? I think most of these changes are inco= rrect
> > and should either be dropped for now by disabling fsx or will nee= d
> > a major rework.
>
> I'll just rebase the for-next branch, I guess, and remove it
> completely from the history. I've got another lockdep fix that nee= ds
> to be pushed before it all hits tomorrow's linux-next build, anywa= y.

Getting my trees mixed up. I'll revert the patch on the next pus= h.

=E2=80=8BAnd as I noti= ced, '
xfsprogs: Add includes required for OS X builds
=E2=80=8B' was =E2=80=8Balso
= selected in an older version. Other patches looks OK, though. :-)
Should I send delta patch for that one? It is just= about three #includes.

=E2=80=8BCh= eers,
Jan=E2=80=8B


--
Jan Tulak<= br>
jtulak@redh= at.com=C2=A0/ jan@tul= ak.me
--001a11402b3a449ad5051db92c95-- From bfoster@redhat.com Thu Aug 20 06:32:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5C6917F47 for ; Thu, 20 Aug 2015 06:32:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 30D4C8F8050 for ; Thu, 20 Aug 2015 04:32:05 -0700 (PDT) X-ASG-Debug-ID: 1440070321-04bdf070b231c60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9lC7aq0MFF8HFBEZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 20 Aug 2015 04:32:02 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id ADCFA8E748; Thu, 20 Aug 2015 11:32:01 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7KBW1fo010093; Thu, 20 Aug 2015 07:32:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6F940123E78; Thu, 20 Aug 2015 07:32:00 -0400 (EDT) Date: Thu, 20 Aug 2015 07:32:00 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build Message-ID: <20150820113200.GA13033@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build References: <1439979814-18934-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1439979814-18934-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440070321 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 19, 2015 at 08:23:34PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Fix CONFIG_LOCKDEP=n build, because asserts I put in to ensure we > aren't overrunning lockdep subclasses in commit 0952c81 ("xfs: > clean up inode lockdep annotations") use a define that doesn't > exist when CONFIG_LOCKDEP=n > > Only check the subclass limits when lockdep is actually enabled. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_inode.c | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index dd584da..30555f8 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -362,6 +362,17 @@ int xfs_lots_retries; > int xfs_lock_delays; > #endif > > +#ifdef CONFIG_LOCKDEP > +static bool > +xfs_lockdep_subclass_ok( > + int subclass) > +{ > + return subclass < MAX_LOCKDEP_SUBCLASSES; > +} > +#else > +#define xfs_lockdep_subclass_ok(subclass) (true) > +#endif > + FYI, there's a compile warning with debug and verbose warnings disabled: ... CC [M] fs/xfs//xfs_super.o fs/xfs//xfs_inode.c:367:1: warning: ‘xfs_lockdep_subclass_ok’ defined but not used [-Wunused-function] xfs_lockdep_subclass_ok( ^ ... Perhaps it's best to just use the #define in both cases? Brian > /* > * Bump the subclass so xfs_lock_inodes() acquires each lock with a different > * value. This can be called for any type of inode lock combination, including > @@ -375,11 +386,12 @@ xfs_lock_inumorder(int lock_mode, int subclass) > > ASSERT(!(lock_mode & (XFS_ILOCK_PARENT | XFS_ILOCK_RTBITMAP | > XFS_ILOCK_RTSUM))); > + ASSERT(xfs_lockdep_subclass_ok(subclass)); > > if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { > ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); > - ASSERT(subclass + XFS_IOLOCK_PARENT_VAL < > - MAX_LOCKDEP_SUBCLASSES); > + ASSERT(xfs_lockdep_subclass_ok(subclass + > + XFS_IOLOCK_PARENT_VAL)); > class += subclass << XFS_IOLOCK_SHIFT; > if (lock_mode & XFS_IOLOCK_PARENT) > class += XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT; > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eguan@redhat.com Thu Aug 20 09:02:05 2015 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2CD627F54 for ; Thu, 20 Aug 2015 09:02:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B63DCAC010 for ; Thu, 20 Aug 2015 07:02:00 -0700 (PDT) X-ASG-Debug-ID: 1440079318-04bdf070b236b80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DD5rScVetmy2qvxo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 20 Aug 2015 07:01:58 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id E66BB96D1; Thu, 20 Aug 2015 14:01:57 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7KE1kuA000856; Thu, 20 Aug 2015 10:01:48 -0400 Date: Thu, 20 Aug 2015 22:01:45 +0800 From: Eryu Guan To: Dave Chinner Cc: Tejun Heo , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150820140145.GH17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="hcut4fGOf7Kh6EdG" Content-Disposition: inline In-Reply-To: <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440079318 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --hcut4fGOf7Kh6EdG Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Aug 20, 2015 at 02:12:24PM +0800, Eryu Guan wrote: > On Wed, Aug 19, 2015 at 07:56:11AM +1000, Dave Chinner wrote: > > On Tue, Aug 18, 2015 at 12:54:39PM -0700, Tejun Heo wrote: > > > Hello, > > > > > > On Tue, Aug 18, 2015 at 10:47:18AM -0700, Tejun Heo wrote: > > > > Hmm... the only possibility I can think of is tot_write_bandwidth > > > > being zero when it shouldn't be. I've been staring at the code for a > > > > while now but nothing rings a bell. Time for another debug patch, I > > > > guess. > > > > > > So, I can now reproduce the bug (it takes a lot of trials but lowering > > > the number of tested files helps quite a bit) and instrumented all the > > > early exit paths w/o the fix patch. bdi_has_dirty_io() and > > > wb_has_dirty_io() are never out of sync with the actual dirty / io > > > lists even when the test 048 fails, so the bug at least is not caused > > > by writeback skipping due to buggy bdi/wb_has_dirty_io() result. > > > Whenever it skips, all the lists are actually empty (verified while > > > holding list_lock). > > > > > > One suspicion I have is that this could be a subtle timing issue which > > > is being exposed by the new short-cut path. Anything which adds delay > > > seems to make the issue go away. Dave, does anything ring a bell? > > > > No, it doesn't. The data writeback mechanisms XFS uses are all > > generic. It marks inodes I_DIRTY_PAGES and lets the generic code > > take care of everything else. Yes, we do delayed allocation during > > writeback, and we log the inode size updates during IO completion, > > so if inode sizes are not getting updated, then Occam's Razor > > suggests that writeback is not happening. > > > > I'd suggest looking at some of the XFS tracepoints during the test: > > > > tracepoint trigger > > xfs_file_buffered_write once per write syscall > > xfs_file_sync once per fsync per inode > > xfs_vm_writepage every ->writepage call > > xfs_setfilesize every IO completion that updates inode size > > I gave the tracepoints a try, but my root fs is xfs so I got many > noises. I'll try to install a new vm with ext4 as root fs. But I'm not > sure if the new vm could reproduce the failure, will see. I installed a new vm with ext4 as root fs and got some trace info. On the new vm, only generic/048 is reproducible, generic/049 always passes. And I can only reproduce generic/048 when xfs tracepoints are enabled, if writeback tracepoints are enabled too, I can no longer reproduce the failure. All tests are done on 4.2-rc7 kernel. This is the trace-cmd I'm using: cd /mnt/ext4 trace-cmd record -e xfs_file_buffered_write \ -e xfs_file_fsync \ -e xfs_writepage \ -e xfs_setfilesize & pushd /path/to/xfstests ./check generic/048 popd kill -s 2 $! trace-cmd report >trace_report.txt I attached three files: 1) xfs-trace-generic-048.txt.bz2 trace report result 2) xfs-trace-generic-048.diff generic/048 failure diff output, could know which files has incorrect size 3) xfs-trace-generic-048.metadump.bz2 metadump of SCRATCH_DEV, which contains the test files If more info is needed please let me know. Thanks, Eryu --hcut4fGOf7Kh6EdG Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="xfs-trace-generic-048.diff" --- tests/generic/048.out 2015-08-20 15:00:06.210000000 +0800 +++ /root/xfstests/results//generic/048.out.bad 2015-08-20 20:52:58.847000000 +0800 @@ -1 +1,9 @@ QA output created by 048 +file /mnt/testarea/scratch/982 has incorrect size - sync failed +file /mnt/testarea/scratch/983 has incorrect size - sync failed +file /mnt/testarea/scratch/984 has incorrect size - sync failed +file /mnt/testarea/scratch/985 has incorrect size - sync failed +file /mnt/testarea/scratch/987 has incorrect size - sync failed +file /mnt/testarea/scratch/989 has incorrect size - sync failed +file /mnt/testarea/scratch/991 has incorrect size - sync failed +file /mnt/testarea/scratch/993 has incorrect size - sync failed --hcut4fGOf7Kh6EdG Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-trace-generic-048.metadump.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWQ+4V/MFGfR/////////////////////////////////////////////4bH/ d2+Li6WaAAAAAAkkGTQAADPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA53Q AAD4pREI4cbhurhsPlTw2CUIVwAACxdMrn3H1zgAAAAAAAAAAAAGelVVezVabAFqVIsBtFQS JNaUKoAAEsBKAoqhIgEhAAgrQfR3QGAAAsF8AAA4AADgABxbyhQW70AAAAD4jgCVSKOzH0YA AV93ZdHG2xqPbbxvRbvHgjEPcg9sOhUBuHXYLjby4BSoRVxjV7hgw2qedc4eB8AEAMD5UHq9 8zhX1TfDAueDcAEIGHgYBxBx2AAOKgDh3XAAwQDnXnAeIc3Bye97wAAoAiBiA56sHCAPEPIH EABpxBwgAAMnTjsAkHgvYF2ebtvAEgxAB3YHEAAAAAAHoBxDhAYjDDzgMRuM944eDo5cTLNN 5xOG7ljbhO7MNnCy41xddmZuJyxsSyDImM9VyOJljbvcXPfTPGGDF64TjFkYZmGO4zkZZMY+ xjjFixjMshkTaylsKTGC2BTEFmCixgtgAAAAuUoXHKWYttJjUaKUsYKblgpcyjIBiUUGmIKA iTju5kpJZm3lh3miweNlCgKKCl17mQaDcdztlmDW5gZvA5yPTdLMdmd3c7NzudKXM3rOlO7E A+2dAHL3mSlL0gDZKF2GlstlKDQb72gODT00FBpI29497UjCBKioAEil6AAAABkk91TnW5KW d3dNbmGNGRUEzaIiF1o7GdgRBtazHZOOoTmcdlXZzgzEiLTKUKZMgiFsDQoCgAKFAyW8oAou XZtmomoAIrYAYoK0bMaooLM1otmkgpWi7vG9zFYNIgAEgHoDSYAAAAAAAAAAAAAAAAAABlJb xZmy7DSgE22QYwYGSRCmTuMT2ZKXsNCQpTQDcF3XAB4gAAABz3ixTWgkpJTQaFwBiyuDbCCl IAAAAZGIAB/6qg0DQAaaGQGhpoNGh6gafqgNMmn/iqg0aGgb/VSb9VAMT1BtDU9GibT0/ApT JpqeInpPTJvwTVEzRvVRhonpP0//fpVVU9/pVVBpJAgAwmQ0ZGmCaYbQQBkyaEaGETU9TRPP SanqYTRMTag2poNE2jI0DUyZMAAAEYmmmAYEyaBGmnkm0EU2MjQAYiglTEE0GSMQDSmTEIAC MACMjTUNMSY00U9Mpqb1PTJT9D1SDHqTGNU9CaPJNAMajExGJmk02o9TR6GU9TR6aj1ND0hp 5TYKeibSaGmmhoAafqSUSCnoAmmmAmU8EmNBE36lT2aKnmJMp+gk2mFPTaTyYU3qnpT0J6mn lDNQZMnqGm1AADQGg9TQ9TQA0eUempk9QBk9TQBkaGg0BpmoCalJIhNE9RMpmJgiMpvKjyGp vUym1PKbGiaaeiammTxP9VNHqmDTTak2k0ep5JjRNB6QYJ6mmQYgMNEZDQZM1GjR6TATaTRi M//VUoyb0o/SJ6NT1HlNP9VAqKSIRoA0yATQA0AmEGACaMgnoaGptNBMAARphNNP8ShMkwTa ABoMQ/UjQ00Cn6DJoAGhiGIjGgCbI9Q0GH6qptQ22SZkUf6P7bVnmvrGzz0nYT2Nm/jMjxum wPztjGWeOk92/hx5c+mvXxdmIeIHScOc7h6fl8MfUlPHv9LHd6H+C4igfu9GB1a3ZNtAwzsj EIIGCRoDvKhQs6E+hZWQ+hQs+ZN0pyMM8JLUz93asspYknOdbu9bV6HQSSdTq4AxSSSoWqqy GBrA/QLQxgzEctUL3OkcPPVz3XOIdZDlpDhZDmkLg1Drkqo4R1RKJJiFIknY5ElXKu1ds7d4 d3Dq3iHRPsH2SZMmTJkyZMmTJkyZMmTmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTmTJk yZMmTJkyZMmTJkyZMmTJkyZMmTNs2zbNs2zbbc+kpB8/X7OGTNJW7z+IyCeW/u9P7n8HHfOP mOyAxCLK8HwGbmp7N0QBaoMRAUzEneUgBvNMCqGcmsmJwp03FEwkdColtT8vEkOaqSZXmqSc 1Yk6CpJzH/nwOl9PM85+IbkqCOom4h9b/vwHb+brfMahibGLhGTjEB0gUkiyMgGMDGMDY5hE Ihk059rJpVRGXXryjmO3f7V3Ac5CO7cg0crPtJ9KGaURyvZ8IEUCKKhFlcyOZB5EUiI6W1C1 LRHFoD3OzfX5OcB73tBM9jRE0Eiw5D9N798B+o+CztRyXJcl27t3bu3de+Y/zz/QP4p/GMjI yMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLLTMzMzMzMzMzMzMzMzMzMzMzMzMzMjIyMjIy MjIyMjIyMjIyNMzMzMzMzMzMzMzMzMzMzMzMzMzMyMjIyMjIyMstMzMzMzMzMzMzMzMzMzMz MzMzMzMyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyzzzMzMzM zMzMzMzMzMzMzMzNNBDExMTExMTExMTExMTExMTE0NDMzMjIyMjIyMjIyMjIyMjIyMjIyMjI yMjIyy0zMzMzMzMzMzMzMzMzMzMzMzMzMzIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjLPPMzMzMzMzMzMzMzMzMzMzMzMzMyMjIyMjIyMjIyMjIyMjIyMjIyM jIyMjIyMjIyMjIyMjIyMjIyMjIyMipQwLy4uLi4uNDQBHa9ETxFTsO07SI5z0iRGiRIkXDvO ASSJIkSJEiLh0USJEiRIkXOdFEiRIxRIkXDokSMYpFUi5znpFHrEeRIwSLj1EcEZCSJEpIkQ CKMixIxSCxIuc6JEjBIrFUi6SOcNKRIkPkRAIo6JEiRIkAcqEYkYokIkXOkjnPkSJMkiREAW JEgRHxIgDRIkSL0iRHOVHRIkSJCJEASJEiRIkIuc6JEjFEjEiDokSMUiqRIjghESJEjEiDoR EiRIkYuHIjiERIkSJEiDowVYjRIkSLnOhESMUSJEiDooJEjFEjEi4cqEGiLGJEhEHPR8SI9k iRIjnQe0RoviqQi4dEiRikVSMXDoLCIyxiiQi4JI4kSlJJKkiI50INEaL4qkIuHESJGKRVIk XAj4kVjFEhFznRIkYpEjFznPezRIkIRVIxAIJEWMUiqRIg6JEjEiRiSQHQkSJMkiUREHOiRJ RkkiJJAdIkRiiRIxRHOdEiRiiRIxRBzokSMUSMpSRBzpEiRIkRiiOHNEiRGiRiiOHRiiRiiR IxEQc6ERIxRIkYiIOGjFIqyxIkSSA5IyislSRIkDmiRiiNEiRc50SMUiRIkQJI6KQlJHqyyJ EXOdCMFiqRIkXDmjFEiNEjFEAHxikWSJGKI5xF8RSI0SMURw6JGKJEiRiiDnReosUiqPiRii OJI4IykqSJEoojhyRIkSJEhFznRVIkSJEhEcWOc5znDnQVxIeo57kGJECUpIkRzvtOQkSJSk klSI52bSht429HXWBmdJTFeEsnra29e1ruK/Erva4dftV8av8K3NNzW5sfTVuq3Vbqt1W6rd Vuq3VKIUQogUQojnYIYIYIYIYIYIYIYIYIYIYIGCGCOKIUQohRCiFEKIUQohRCkwMSgiWwcF UHXWTf81OidE6J0TnnROfdE283N3KyPK2Sb1xaYri2TiVv64lcSuJXEriVxK4lcStzTcoYI4 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 AAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZma AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZoAAAAAAAAAM zNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAA AAZmaAAAAAAAAADMzQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAA AAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAA AAAAAAADMzQAAAAAAAAAZmaAAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM 0AAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAA DMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAA AAAGZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAA AAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmg AAAAAAAAAzM0AAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZ maAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAA AAzM0AAAAAAAAAGZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAA AAAABmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAAGZmgAA AAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzN AAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAA zM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAA AABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAA AAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAMzNAAAAAAAAABmZoA AAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADM zQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAABmZoAAAAAAAA AMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAA AAAAZmaAAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAMzNAAA AAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZma AAAAAAAAADMzQAAAAAAAAAZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAG ZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAfH7m 7u7u59T5G567c23d3d3d3918nueR5HkbnkeR5HkS/0wsj22h3Zlzzy+hkLJH+OZlkgw0Mow8 JZmkU/8rQr+etzXv695Xt6+1r6uvV7xze3zN7Te1vK4ghVCqEkKoVQqhVCqFUK/i/mVAy/pK 4FHDiBEXWmAGhngIPDFcMRIZZYtzrc9hptl9Zd67Ns7ezd2tXr7/L3+XK4ev5GdPx0yNv3M9 /DfxtOPL735n39umWWd+9+26XH83djTdH79Z7Ofd+b+ZfLZON2mnZy8XSt/kn212+Lldyv74 7ruy03zy8fPxS3dkO/x9iZw55tu3Qj47PF2JPG/Kkvv5diT56adiL4/wce3uMbE7pYeQ8Xbh nx25cZ9Onjt6eEu7fj3499l+c8K47sMOHh4ufYvW3dpOa5pj29fHR/hzrZys247818NVsvrV mpSmEOHd16P789J+NY3Tv37O/shHTZ4p7/FDs3Ydz588Dwnzt39nK7uny77e/pwlp4u0j4ZY +POzv37n392Fl9vTs8Vu3HOXhd47Z+Pdj2p293h3eLus2TSXfZ4x/Cu3vl4ufeT57JdvZXhu ttO/DDuThfLHZpVK49/bfivO3Oe2dqeHj76JbuhlHrN7/Df3y7Mb4dstcce1/DG7U8PDnj16 3Xd+Gvd3ePw7m5Rf44c+OO3LHu7k69/b4YdOmnfpwjp28OfgePh4+dumqZQ8eBwx2d/Dpvte +fh2S47X+Lt02UxfXwt4+B4/Cvhrd3X9L+3lh18Gpq/xw3w8KW9idfDXwORDn3Z12Hhv4eB2 YdnXlHXffhpVPC3v2Q6293Xt4W+HS7wj4br7u/hnj07IX43cfA48+7f0u636+Pt6N4X9X6eH dUj4Uu7k7KdfA4lnPplwyx3b/A64S6ePpu44bq69/h28O7p2Yd3h4/Dre/svlmS8G8OW7Hst yhZx0OPLv068O/GvLu54WdWw7td3h37CN2OPanDHx+B4zp3ZP218PA62x6cfHrpw8NLvE3b3 7uuh2It/j7O/nd4Pu2xld4d3hy4eLszvhO3luOVvfp4d/fbz8Lo+HS/w5dvDwxI+Svdxx8PA 7jLXa/ZTyZ+Q1ulz4d3TDh4W9V7M5dnh1iqx77/CWj/DPb5O/LXyYcs/HPu2eSniw4dnk17I tf28vF5OWMfJj5PImPh4HkJa978e3p5NbY6w1s0txt8G7F2dfGiR6Q76+K67jPnp3eHM7/Jj lw18menKzny8XZ3+Tp06c+fPmLguHkZmVVZmZlVWZu5VVmbe222222222+EW0qqW0ttttvmW 2222wlve3d3d3d8Pdtu7u23d3bbu7vnbtbd2tu7W3d3d3d227u7bfN3dtu7u7rM3JmZmZmZm ZurMzMzMqqzMy9VezMzMzMzM27u7u7u7u7u7bd2tu7vi85dtu7u23d3z93d3d3d3d+o3d3d3 d3d3d3d9xtt3d227u7bdZmZmZmZmZmZmZmZmZm1ZmZmZmZmZmbqzMzbu23fc7tt3d227u23f qK27tbd227u7u7u23d3W7u7u7527u7u7u7u7u7u75W7u7tt3fR227u7bd3fP3d3d3d3d3d3d 3dtu263bqMyqyqras3YzMz3ve973ve9/c973szM973v8TM0Hve973ve973ve972ZvFB73vZm Z73vezMz3ve973ve973ve97MzPe972Zme973szM9/e9/ke973szM972Xu6b05zbebznN3d9P nOc5S2ltLbbbbbbbbbbbbbb6VtttpbfTbaW+6ttttLaqr2XbbbbbbbbaW16e2lttvp222n1C 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 3Q/J9bxtn8u17rdw3fe+B6LyeT2fqv2/D4+r5Hx/ceg+78H3ngfe/i9x6r8Hz/idh1/0P7+3 /p+n+nvez1XvvofD63zfn+n7T4HpP8v23n+l8z0/+7/B7T2ntf8X0vh8vyvpL1fJxdvrOfyv K3fn9zd3N3c+R+n6vR/w/Se3+R/Jtp9xI+5fRw9/XzLPz5mknt78D335nh/fee/wld7+j3/k 9LNmzcz7j2vI+2zZs2rPb81if0z4NjpzJNvT8GGUiz/jq/+86P57H/Vj5P6Ps+T9TzHre00j 2Ed973yn9Pt3+P9f5j/L0v/PRTot14eSTIy+V1V7nF8BVUaEP8X75gZ2fy/93/X/2T34Rs/g RnOdqf7X+//r/wEz/e7nO9QBAPUSN8uUi1Sqe5vyK9d/J+u/G/kyzZM8+BU6e/xXf/3/7fyf 6fp8vKicr/q7/p/l1vMT/X/3X/54v+eWn9z/yNPu/18xH9nkdh5HkeRa5nkU/I5nkeR5HkeR 5E/yPI8hbyPI8jyN3yPI8jcxPM/R8TL2e6+Pnfo6nV0ur3HV1ur3PVlfo73+U/pO/+lR9B3X 1V/+vZdpa857TwvkvbfSeu/hdP/bg+W9x6T2X8z0PTfRbfW/H5896j9r17cnyPmfN8/733V6 r5TzdvW/Le59J7D+Xt/6+o9F/o+r+2+Z+j9P7L+z3+o9p85/p9T7Xh+m5ur/H9V5fb9B9L9l 7b6Hx+u9x6P6r5z0vj9jw+Px/b/PePx/+f83j959f/q8fj8P0Xj9f7f/f6j7X3H/Tx+V5no/ s+f3X0/rfZ+79L7H7jzfT/a9Xf6j1/Z93yfC9t77y9vc+dt5vqLb2nJ9zt73o9r7P33q/vdv getbef7Dx+9+99i870Pt77z3ftfce67+zzvP8723n++9/7n4PwvvPN+B8F7z4XivO+G9D0Lz 9ba9Dx7bVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqq qqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVV VVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1V VVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqq qqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUN qqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVV VVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqq obVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqq qqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVV VVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVV VVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqq qqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqq qqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVV VVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVV VVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqq qqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2 qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVV VVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ/L/EXxG5tfEfY/tvjdz+ hmJ/j6X6bJJP3Uskm+/16LKQ9L9L8r1H/7/T/T5e7+Vu/W7f1mWllo7fR2220dDP/c3c5cdN 0Fy0t98z5uNz1PzcnTpb0vzMie6sSROcqPM69Hrc/Lc7ct1KqJ8dqjrR9JhtIXhSTFSLUkcW yGpYdCKVLCE8n/sRgeCsGOt6fwMz51+Z4TBD3sLJ1NifDiLD3OKrxxD7VP06WVtLVarhPe5A dDRzO2w8HueD2mb/zrsRInVWKsWLFli5a34bLlq1lmk1lZobX3uOZFWLS2SWg/I9DzHsvQdp oJOdshG60Nbn+L1/McHSg/F//vnuvmsF58i/Hea+knT5PEB8jkqQkTRr+z/XwKq235OZz0PD SJwKnkM2H/fu8Qw6hxLBppKlfb2SrGk5kESOTSYU1ttzeUgiSc3c91sY41jF4N4FHO0fizhU AvUvYFuUW5XA51yDnDgGQ2G3Lr2H3XPlbyLkH6vlwSir2WHstey1Jey0XstK9lh7LR7LUnss F7DQr1MF6nqY29Qm3sE3jeMcTc6zVZgMYUYkkJu6Kr0Z6NIf/3seS5lB7HEXsclLppd7UDe1 EN7RCbqyIRuLANxZ6ur1dA8+Uq8/ocB8ZpT1ff/j/Ydvx/o9Ho7I51a1rXD9/fdO667j+B0Y uHDgHODBHADgcYYLgh639rl7Z7Z7S6VIr5F7HgPzF8dOUPd5LxWkI9nZE/nMUns7ClV7SyRA cOjy1kQ9PTgKSTuHfPo3hj7pvGhIWIBejgHG5HOMN6OvORyORA1OhxNxMmTJkyZMmTJzJkyZ MmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJk yZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJz JkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmT JzJkyZMmW9BbJqk09vttLRzZtu0pIjgrGlJAmLILULY2JbJNqltUW1R++yExUi2JLSTi9Nj9 HPxvW3RaSHR2IhE3alVfhffcRS9r1+AulK8mCXs7Qc0oj9HRhFV4+w+0+mu0k83qet1jx229 HOa4uFttxcKWze73e77Pn3WkiJJNz94whD7xoPGjxh49Kq9NiPj6wq+k9rt8zz5ncTQuh4zQ z6GjppPo2i8TdwEVYkpUSrIjMgS1JC0kS2A4FIGLbBLomybEW1DaEbRWxUtqKuaE5lKtpVtS m1RWxNF01LTVWtrC0wsyiWiSu/VH3ixPKrI8qrfaGCd+sTfLB5ODDnZHgKONddxtO47juMCZ 5jyHmJkyZMmTJkyZMmTJkyZMmTJkyZS20tLS0tLS0tLSZMmTJkyZMmTJkyZMmTJkyZMmTLbb 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 Tl1t59Up04y555a8+u23Zutyhrvjx538N3Ljpx59NnPinUu1lft589evM47uMd2lU6bUxj00 51u1Mresk3y6a9NeS5ctNdbK29enTmbbp37uXLbz3Z7n3701w4ZdH78s6X15P1679vHjDjh0 38benXFteOHHpvu41rPLnn14btOenKx+3jv469Or6YNrq1Ou5Gw2vrljz2w28sOlWbhu2dLO HXPlyzf1OaZ2aceuGr+GzWN+WtmPXhZsuy0l1jpw3a3aW6y69NnHLdpXZv6aQtly48efG1da 8V027WhpbDPnBdemmG3pjs6anHj138559NbJdK7+HTTp069eNNOONI62Z9et0uMk4W6IlMeX OfC+7htyhHrlffv4cONtKc35y05bOl3Pd15r1jnwm1vWme/dhVOufLTf1ft232U6a7ht/OWN 9ONd0rtOvDPLrfu0z1058+UeXLXpu289deuzpauOPDZZW9Kz3nCe/Prs57elX7n6rDjvx15v 6qlnXp1WXLr10wbfZpEt1y4WWcN23Hfft6yv48qct/Ku7hnuxz2az529b55yfrv366awa3Pn r1x3L0fw13V5XaaVttlrGq7ceGzdr1wx1f049NOPTlx69OmvVuFOtl+TeIcO6OEcE0AAABRC RBGpQki0iJJaIO/qD8KRkr2miVtVLwxK8LJWyFbVUpbIqtpRtVsUNhIs1ETmlZ424p21VXNO ZQqrZFcyl9ctVxitipYrL6e2Riu2gVW0qeW1FXusxYjOWIyq1lLEH3vu/Teu0M89Lx+Nwef9 Zq5/q+Lt/X6jfKGjG7+LkSNiTkCLlOog1xiZeoMfIHoR8od0PjDP0y7oPx3XdfM9FBg+i9N6 P0/pI8qbOSjUNehKoK5+VlaykURYoiiKIoiiLFL0uVFEWKkIwjCKIvp4wjCMmExBg+wkyteF rjXFVuaHiyNTUhwoWnp6emWkNjTGnpjTGmNMaY0xph9p6emNMaensDTq0asygJoo5+poZDk1 XMzMvLPl5dXGykkkqNGjmURQoUDoozznVSSOeIiijOnTZkdSRImSI8xSbIkSMeU6dSpWLiYg lU9jY2BKFLYGwNjYoyZFCjHSoyZMmjr0dfX19dWUrsSJUiRHlR6cWLlxNWnPVoz4qsXGU1tX V1FNXV1RihMogpDWLWzGzlTU1FNVTVUUUiUlVY0aNGpR48ePSkUpKaaevr68mTIkSD0jx5Ma NGRioxosWlFixYsWieTMNARhzxqDUCWqKcQaWLECQ1hk0BFEWgIz2MFFBIFASZIVGuqJUoSh KlBURJkCAIEAQBAEB+/fv87Ozs57FevZexTlSk6CilJUUoSqQSCQSSSCSQSCSSVOm/p028B+ /f04ECAeBAgQH7/Ozs45znRRmhWbNmzVJ05SdOpoo0zy5cuWcTJkybMmS5eLi4h8XEGIJoxc UHnCcJ04TgcTg7nCcJ1IIhFFGgc9Cgmkkkkkkeekkc56YRhn1s2dNozw3D4Pg+pZwzhQD8P3 78UBAEAQIFAP8+gJ5UBn0KFKjQoT589VXIznlJHVGrqjV1S1Rq6uqNUauqNXL1dUapaojxA/ iCJqUtWlq6+rS2IlKlRo0aNGZJSCQSCQliXLl7GxsbE2VJkyZMiRHSkSJCUmSlJkyT68mlJk xpMmkgEAgKVIUxTFOnSlZLelNoZtN27zc3NzczMx0cydOmzZkylMmUpkyYrsbEqVKla+vrz5 GrKiRJWrrxFVdSXq6svRmI6+U5zEYSMoZYlChm5onuxkCe8EsU5kwKCgJ04UAiEQiKYh0Row xpA5aZzunDoQNNM0vMgSnSh9E5EQcGIAiBasnWm6uLMizZ8lufImZznKmUsXHmZme4R9n3dP Wj6tg/TxVpf7limzDHGUKW5cPXa000rTbf9XDHb7L6/V3U1rrTHvvzpgvCWV3KufO7LlDldl y646W9dfFLhhrDj11533TTe+WjaP29dMrOvXfvbXXpuzw04w6Wp1x3whqlq2V1203X368rbb uHJd+y/THPPfwzxy6bsOfPjdjuxvwspR9NI2dLN3Lb15ba8dmzdLfupytvpl0wxnhzsuaHW2 +2b9Mb999vLDbjlwa6GeV+s9/Xbw4U6at1tae3Xn142dapvhyjelsuErt3PFM+e/TdmmzNNd eXPllsy5a68+tnPLotOWyzhlllWt9tcusOOjQ3cLt27rz0Xlry6JqbrdZXbeNeOvXmlq7tOE p7t2xOee2XPdy2dMG3kd1vWacbefXmu3nn069eue7rr0tsu38rp488+WWkMN6dK78+j92elb 8ej9evTbrzhzhhrw527detmW2PSvDdfvx4bLOWnTjt37tOL+U4beXDl049X4aYdMq003JZXJ +zZxsft44Soza106lm/Xbn146Zx6nLfvu6c+uPV/Xpn1lScbNmXLG7Pd03U3crN/S7G7Wzjr t47umnBYv5c90V1nn0bHDWfSFm3pLbwgs+tNnHBeOJu1166z28+kcM+XHjrr1trt0wjby1t2 4c+u+SX3ZIlbONk59dLeMda3bKddd/G6uDdJcuPK3lp1TrDbes9dqZ8bb06deNc9z8ccOvOn JbeMbePXDSPXn055bdb8suXXKXR8d/A4ZV115c+OMGatKb50uTrV+hunu69ML9vOldukOm7j rnrxI85dFht111134P428Il+zjLPZjpPbvx28OWHCO3Pdnhspxs4c+tm3k/XZu3dNJRay3Pj 06892xOcOEN3HKfK+W6uN21+PNt0Nu7hzs049cNmtvPf03ceHThns4v1tf16mHXbXmtNej9x 4nOB3U2qO+sg5znOAK9GpT1tKNkvmrNhfGWiXWip1Y8d4Y2VV/AxJKS5qvR7zkq+t8UnGVM0 No1oVmq2JfmdScsTNaLWmq+r0uVX8DxnUeHZ63Pp9ddrNajwtp9y5VwxaVTaEtpUbKotm01S /c5NXjckeFi1tVFqtSTK1Wo0lNhU1qqmyVMWCm1SmsrQKqu1WoWy9XUvJou1hmFCPdspF46g VfZVaCvLgVeOShI9bK9b1uUvNaJDy2r9vpLrUm2Xk4vk+i5hiQrq1SgeousrlKQ+e0+W7OFV XhgU8+8/n4XbXhYquaKCr5fX5PVS+7yvu2Ij1ZhF78xKHJpSFzezlIfIXDmoklfqfdL5Xqk0 SyRNzYFoICZngjHQFkIzpUBLCxEkHD393+/zGkoGaisRWCQw0/r2JMom2WRNwq0iNu3FmBPP rz+fle9wbRUnn8/mt0vKWF4WrICI5zh3/sP9hC230/4Zhh9kmznORyOHok5szMzMzM27u7u7 tNbu23dpzJmQyTM5u/oumo5L+hu6v+MncOzs10i29NvW83blnHHOnSc7HL0sUZGlFUfKUElK EYQeiPSEhFkyyEi5YvZnK58EhvJtvTo1vVrpbt3pzeznXkcxrOi7zZdy7dlal2Xd3arZdu1d l03d2XdUiNuxi21o3cu2bZuzdxZd3ZNqi7dbm20rZt3Rtzec445pro3nN5zm1KD3wUhJHwV4 giwe5mIQIvfARB7MzovewsWXocam7tVbd2M1Ntm7sWbttu7tSqlssWbiXZu3b03nMi2y8bdt 26ltrbdS3W3cTds3ZdrGWaS7tupU3bdm6m7uxrZZbvY5svN01bGm9eTpvTr1vZyLenXp2dLj ema27CxWtsWLZqqMiszIyuVWRkg96MRlF6WOcDgKDhBw4ww9bpJ6mpV4WhB4a8PDhKVV2VpB 8Z/K/le9fxviviviv0HxG3/VdK+A8u+G+G+G+G/icB+dwv033BHHkj7Y8gOxLEoXBMDIpicL AuBcYBsigLg2hTHIKA4x3rzDy7yjuHh3fvQO55v0DluW5bluW5bluW5byjluW5bluW5bluW9 c5bluW8c5bluW5bl8bluW71y3Lct6Fy3Lcty3Lcty3LeJhOW5bluW5bluW9c+octy3Lcty3L cty3Lcty+c5bluW+tcty3LctrtdrtdrtdrtdrtdrtdrtdrtdrtdrtdxdfXa7Xa7XaHg9fXa7 Xa7Xa7Xa+312u12u12u12u12u12u12u12u12u12u1+Brtdrtdrtdrtdrtdrtdrtdrtd0yGu1 2u12u12u12u12u12u12u12u12u12u12u12u12v0eu12u12u12u12u12u12u12u12u12u12vw NdrtdrtdrtdrtdrtdrtdrtdrvvthsNhsNhsNhsNhsNhsNhsNhsNhsPINhsNhsNhsNhsdHsNh sNhsNhsNhsN9I8txMIm4pE2Gw2Gw2Gw2Gw2Gw2GxudhsNhsNhsNhsNhsNhsNhsNhsPv9lstl stlsuebLZbLZbLZbLZbLZbLZbLZbLZbLZbLZ6PZbLZbLZbLZbLZbLZbLZbLZbLZbLZbLZ4Gy 2Wy2Wy2Wy2Wy2Wy2Wy2Wy2X4my2Wy2Wy2Wy2XnSddTZbL0DZbLZbLZbLY2dPDZbLZbLZbLZb PS7LZbLZbLZbLZbLZbLZbO52Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Ww2Gw2Gw2Gw2Gw2 Gw2Gw2HcNhsNhsNhsNhsNhsNhsNjqdhsNhsNhsNhsNhsNhsNjc7DYbDYeUDYbDYbDYbDYbDY bDYbDYbDYbDYbDYa7Xa7Xa7Xa7XewTYbDYbDYbDYbDYbDnmw2DYNg2DYNg2DYdVdg2DYNg2D YNg2DYNg2DYNhursGwbBsGwbBsGwbBsGwbBsGwbBsGwbBsGwbBsGwbBsT8jZNk2TZNk2TZNk 2TZNk2TZNk2Tsj3ykco5RyjlHKOUco5RyjlHKeDvKOUco5RyjlHKOUco5RyjlHK3Vco5Ryjl HKOUco5RyjlHKOUco5RyjlHKOUco5RyjlHKOUeT5U5RyjlHKOUco2TZNk2TZNk2TZNls7Ozs 7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7PZ7GxydjY2NjY2NjY2PNRPTXz/SYkhNjY2NjY2NjY2NjY2N fwTX19fU19fX19fX1+Jr8PBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH7Pf39/f39/9bv7+/v7 +/v7+/v7+/v7+/v7+/v7+/v7+/v7/ym/v7+/v7+/8Xv/vt/f39/f/Abm7/h3dzyN3d3Nzg4O Dg4ODg4ODg4ODg4OD9jwcHBwcHB6bh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4dfX19fX19fX19fX19fX19fstfX19ea81342xNjYmxsTY2JsbE2NjY2NjgebQe ilg9Csx6e30D4apk9wr2Gkvm1FaQzNKbZMTs9H05X2lHXes20z58+UhbIlsLUD01k8mjyakT yZ5rVax5dQsayxuW42tNrZ/lVdOdVX09qeUsiD8/bWvJbzebrpXqZFKeKwPDw8OlV9pkrwaD jNoPDw8OhLwLVC66520TxyPCsuvDw9S7KvHFK8Xj4+PaUDtWR27duiFV2Lt27eN4KqVeHhzw 8OSrxxW1R4Go8N4eHjdSV4MpeG8PDkP2lgatHhrWrw8PDojyZTwNVLw8PDpDsrty7duIrtXO dduU8MF4Qv2P4uJGjQM9JI06QkDQWEwoQzZFwjCYowx+5MLYtlpkly02UrnScrmNwuWjnFuJ ybnKc5lWEUx9FkyMHV5spGZcVMRFkAxRI9FqvLZNnZXbnKvN10dLnLrdTRAb1YjNYZLYsjFM SXHiMFWESSbn0v0/qbxfw95t5tobfbsqOF6vdfb+q936n8DSgSSfcfeY3FgoPVrVc05aLmri 5yX+x+0z8P1QoeHhwo5VzHLmq5Nz7+lHVdV18x+v+d7Q+wyPdP1XA9pq8xqq99keHPX6qc0T JUg065Ga4DQkuakwmjZlYxjKMmLNxVyc1Oc1cXOREcucpxrm4c5cauctyBDlc+x5O3a7Z5L6 hXKvA6uO3S3KbIVyyKlzLic9xePaETciJFxs+si+h/z4D/a0Ked6v/37nefV+hp/Ezfm6HUz el7TwMDCvveVi+09l/73/M2u81/v/B/o/P/t8l03SWSW9NMYGBUj7inUXNSMymKwMUuEwlYt rEjFkxMeHYEiBbx2KuxkduVfv+dXVc5yc5c8eV11Ny4uaW8bqunPG7dnLTw3H/Jt1XQvG8OX JzLccObrHOrhlzOGueFxXU8XXXbdlzksypFlmRKlzLZLMqbzot50zk6SbsXFpc1yaSrnJblz tl11xiua5OaXHNeFqL7P7X8T9r2keH7HlTzaRDzVaLtePJNxytobUebdqucrk8OumrJjGEYw xGMP1e2yyZov4n3Nl1lVTBWGFKwwphVMJVYYMKVVUwUYWXDClFUwpgpFKqmFYVhUwowYVTCU phhWEwVhWGEwYlUpWDDCsMGFLWFYVgphKpVYKmFVWFKxhhhhgqlVTCxVS3SyYVKrJgxhhKsw lVKKYViZZMmTBZcsMmTDDLLDJFKVTCsFMKwYVhKVhTK4UyKslVhVVVVVVGIZVGTJUwqxWWDC lU/mZiMkoUjKKqqwwqsEwlKVMKyXNWYrMrMrJVKowyYMlVWFYUqslYWVVFZKwwyZMlYYYYYV kYYVhVVkKwqsFmGGGGIwVMMMGCrKwVhVSmjoSQmjDGEMGOfyufiPsrwV4dris/j5f6tu3YuH 21v43bl2LzaTLNmGD7etvnYmek3yzNoTJmwP/Gf9W5qec3G3PXH2RQDX9YrUjFCLiUhnoPHf 8hXf2Y9Qe5wjsKS8Z2PbTrk5syZZm+LN5yXMyd5qTZFiLm5er7LnZ2yuK5igcaB7K1eT0cR7 VHDnPEjFzrGZBgILbMhhEcsBXO27Xve4KXttgpBxtVmL0c1r1POc57ibD0wVTZBzmQBGFsRz fge2q0tsmy2IVbUqmlUTN5iM8Yz5luULMVDElb4yyFyMGPksU6da8lXR1pbq4rnOHOXDnCue OXDrXJdddXRzlVONIQc1wucuVzXM1cyHu8F5Nev99yHVlO3irq6pmZ2L2XCSclslyWyyLckX LmVktSysWLJFlmViyySpkuVlkzZN2c5k3ZZIliWZWYuXLcsktlklsyzEysGVfraDm3fPMN68 0+C0fENxGnUumuJLhiYsuOZVOGpPWtU2oddVuOVa5xlqfyG5NpmWW2S2WZWYsuVkrJLcwTGM MYXHKbuTUdY+Z5+5tuPrG3mPBXNjGMXKadhxlZ13EaDPgXJiRjGExhhND0WbKFzMGazJk8eT IZstBnwiZpKxTBKxYREEuWyzmtxW5cZ5N1un1lyOVVfQck0ZZRwIYtox7uH4GdngcKkYmMT0 Y8xp26l5NRt4ZPHCuY7fpTnOtciu3uv4duXObeHHh2uPCnWnhYXhvz02Xbinjqnazl1yl5cb E7auYnu/Wcv3VovkVgCIOHTbJysj7D6JG8LL8N/m5754+fxofi/xyOp4uvylWPm9l0vPdp1f P9P5vjfO5OuT+B5P6f1f5vrPg958HrE6iR1OEnWLkkS2YqZWSAtVDnXK6wmyXNQrrUNiV1iI EFQG5gYD43yvUxvX+8P4F/4H0tb2HwvqfN4Nv1vsYnu4PqdqDkmeZ2Zi4mTlQONdue/Lbt48 OO7hv4cvhcIH4yO+v9ZwqdrgVBBHHYIJ1cM4PgEcfZTlB7z7AgzQRvoi6EYkXq/7AgysgzIM zxpWudCJBXiK308ArHyjpOHH2kPtOEc4c5xihFtVNk2qUraTZG0q9j/x3FnV1zNk5NuzKkrJ vgdk6dIZypnWZPi+Jmnqb+F4KXjg8+h46dZFzBzBXOuUo5qVzE2KXWjZ1q5hzUuaLa6wushb RV1qXWj/l7a1d1lzn2esjNidMyeFKydn+f7e2CeFLuu3ItwWDPbdAuIkS4tMChcWmzeX+kcP tn2zefbPtn2z7Z1EhdF0XRdF0XRdD1/pQyL+YQwSAH3Pi/kab63Ztm3+zpw2+4b0zqC4Q+Vj PlZHc+LT6KR5CR4hM9a0njdbE6rjE5mJu06Cba3oul4pxJPL8X2uiasjPbbaWqq2YaPT8jp9 PfdP0+76fp+n3/T9P0+93qWRm3V8FJv8ZUt3mgDf0byw8FNG4fx+rn1NYbaxPPg2Ee31dZ41 YXbCltF1hfod61XbFOVc16jdtyzePjldXy2rq0V45WwnNSn9D4PF1MpXa5i3KObaReTBXi7Z ch2yi+69vVxJdZSltI2qleOLhuattwysLQtlpaQgH86yqknT3xnB6bH331edjN//ZeC8d1OW 30MadkkrTEE79UghLGu4WQM/DmGW8zJvbJO4+T7TpdHm+x6voue7TQ+30/2/1tO4/q8TI6f2 PL+PE2vO/0YvqptnjpK0Oz885yNNrP0I8z+zLmWZ3jRIz3138vUk+y7fkNz3akzzcn2Hg++a ypM3639Gn137d/7vtfmYiv+n8Xy/5dqn/j5t+088/jfRlQ8j4VOrb3eGJE7qYvTmwvQ42ft/ +bdLuqf9LUX0el/b6D3XvN3fj5uD+v021+vgu/kodZ7O5+96j9Pef5b3qt/eu2XChRaklR5n HmfrMOBl56so21jQGTGXR5ZW+oqTFJnWu+w74qGUmEwj1PNYkTc2RnNPGFiVKWnYrhkxBubl TbVExEsCxFszNGXJlFZ6z3KZk/Zsdj+jM5oWIaE0cNtdzJzy5s2dLNkiOXOYnGtxm7c3EmVc 646ynTrl1um63WdNdYkut01Cc/g8dO3Coultldt2XbiUVzW0lkkk1Jca1s7d5y5zGVc2zWbm 3NbnLxxnMZu/ud5izGs3OWak3Ns1m41NbibtzcSrm2btxNs1uNZmZmTUmeGz+2jLy8SEqS25 0ayalZKqYtyVKyVKlSW32mVNSW2T/Qzbk1WVkqTJbo6TFiAif7zoyYd/KcymA9Q/nGcGHo7c A8cKheornzLx4vHfSuuV/Jc5dtT9s65OtAv5LrlNd/NuarMWyZlZUlSpUn8Jrfaskqf36cZP dM/BPHsvXzPC7OknEzxOlzjjKqYtkqVJWVWSqyYS+NLk27smslVlVmZNZLtzL6Nk1nbcZqsl VhKkvusmYxUMsTXhI21TGexmuLMXFFxgxWKVlVkq+ZZKmpLbJKzKlTMzLbMdlk6+RzZ0Z3Gs 1zbM1KkPbMknEycScTMklSVmEltmO1ZKmpKlSVkltkJUltyVktsltmLZMyVJmVJWUxUxjBax TGMRimLimKY2MD6jlXEb0kncSWeH2ep4nW9zsmdGSsqdE17blzNtyGX9yMJlWWriJJlYyuf+ /qbbar8JWFVhgYYVhVLJUwwisMMrkpVTJUwwwwpWDClKqUsYYYYVWGEwuFYVhTCphUwqsMFY YVTCphTCsFYVhUwYYRgwwKrBUqqwrCqwqqwVVVRVKiUsiVVVaqLFUqlVVVastVla1rWa1gum 8fBePOHm3MyONP7IX6eJFgigSSSHqCf2MVKCEkcMg5f1LGT98QZxNPu5ui2DoK6KHJHeeXf+ kYMRCKPR0v7W1hIKOgn78Qy2n6c3yRxLw/dSIQcVQ/6oyyR2BdMpdKISQ3CbS9SCA6CZibMV gjnQfCRCDjEhhmPII6xAVCsqZVZLbmdlupnEms9ORJxJ6b2zoyP4MzneTpBqCQQdmquejsEx eo9HY5vZzn5ye9w9MGwatm2yxnpp5YMrNHLD3NmbLEmMYk3QsnPw+2zMsnjdLnVJUqZWSXxb rJtuYVJUlZWS25ltzDL7ayamp05eMzluS25hUlSVlZKypM9L6iXJmZWXss6cnOnMJOeTLm2b uayW3LbkW5UrKypWS24SstuVktuVlTFuVKkrLbktuErMYxMWMYxMY9tk+yfJe3eieyfZvZNL 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 L0vS9N8p6Xpf3b0vm3pel6Xpel6Xpel6X0r0vS+gfcP1T+A/pP8V9y+nvU+2fl31j5G/pvrn 8F3vkPhvyD4T+s+4foH3L7t/2P4j/Deu+rfYviPsH5Z/FfxH9V+ifdPz7138q/t/0r7194/y X1b9M/OXyHw3rv6b/Ifmvo7+w++fzH9V+ofzX6Z/oPiPuX/0/sP577p/Weu/SPXfdu77++D9 6/Tv6T7x8V+ofFvwPxXxXxXxX3L4r4j9U/03xH+4+I+I+I+I+I+I+I9Hu9+737vfu9+737v/ Lc/r/Ybvf9N/17+/v7+/v7+/v5O/y+/v7+/v7/rfV9/f39/f3+w7/1nsPVe9+Feh7/4Pwvsv Zbef7X1norb2PoZt1+O8e3j8evcbe5/MfN+R193t/b+Hw+H8p4fD4fD4fD4fD4fD4fD4fD4f D4fD4fD4fy3P29vb29vb29vb29vb29vb/V7e3t9n2/X9vg7e3t7e3t+K7Ozs7Ozs7Ozs7Ozs 7Ozs7Ozs+T+Q8jd3N3d3Nz5fyNzs7Ozs7Ozs7Ozs7Ozs+L6+vr6+vr6+vr6+vr6+vr6+vr6+ vr6+vr6+vr6+vr6/iurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6ur4rp6enp6enp6e np6enp6enp6enp6enp+Y+Y6enp6enp6enp2+Z+M4+Pj4+Pj4/xvHx8fHx8fHx8fHx8fHx8fH x8fHx8fdycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyd3Ly8vLy8vLy8vLy8vLy8vL y8vLy8vLy8vLy/MfK7n7/l5eXl5e7m5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm7u fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fu6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6O jo6Ojo6Ojo/neq3Nzy/L7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7vie7u+522222222 97tt8Dbbbzt7bz9ttttttvh7eP1//567u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7 u7u7u+2+gr+Gvw+u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u 7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u 7u7u76r813d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3 d3d3d3d3d/rO7u7u7u7u7u7u7u7u7u7u7u7u76J3d3d3d3d3d3d3d3d3d3d9q9d6713rvXeu 9d678vXtvUtzcuc8N1bbhJf6r8T8P7n9r+u/B+f+q/Zfd/qPa/sf2f5Hh54jxLc/jTd224W3 Kiy5bYSpauW22yFZUlttuW0z+TbtuW22yFty223LbDKtuVJbbbhfI8vnM5bdm7m9ZdjNttuW 3PItw39/Mm7m21lZbLLSypLVirlpZbLLSy1cqZIZL0m7mbbbclthM2W5trhVVyqrhFV3wf4h 2n8eMHEYvP/9CDoftT9897h8z+W97v4d398M56OkjpFz2PK8m97iP5FhHAoSk6X+5cPe49tY M6HXrOnMnTveHOcznan3/OZOW53JbNZWW3JbctuFk2e8cqDlg97z/5kNuMION++OdYxdK9mI o7Zk9h+3w+cyc54POZzubuTw7zcrJbcltyW3MkhKysrKmW2W3Itysn0Jk3dy25Lbniy2ayst uS25bcj3Fysm25WV89PU5z3nk3pOeP7jnR0nS2ZbYqy13Jdm2XFWWrlYqy0stllvcbNpZyXW y222PxrlTPk/y+9875nkvH6XY6fg+4676Lgd9pbxbFsti1aLZbFsti2QmGGQyEkMMhhkMMhh OyWYsti2WxbLY/6xiHXc7rY67g8Prt5xNra2uJtdRtbW1qbW2236Hbb47bbb9Ftttttttttt tttttttttttt8l+p+o/rbfkP6f/fxfO/XfjPpff/8flfo/x+u/nY77yKfhpfWyXThu+zM57m ZOPjvIGc+fPnr3OgQIG0ANAriG0DEARg2IrhvOZf6P3f09Op3wMY3wTINvTI75cEff39/f39 /f39+dv7+/v7+nC68npE5DeYmEHFkngcx9tzPM3Pm43G6LPpcjbwNOOcbxvHIeTOZ0XM2aSW OtqTn6nDWSTPp4INK7fGCcWyJJ2J0z3W7Pyv+b6eeF2desdlvxJZuly2klvxJbstLi3Kyr6s s3bltbJLNSSSbbJJJdlm6WBLdm7tlssttZUy3ZbsVZabNm7LLSy2y2xVlq5UlssxZEmKkkxc VjFv9eT/98t6lj/p/+ch8xpf8PDtPcXcLSy2WWllq5WTFWWllsstLLznuOcg26wPrVdcutzm 4DnOKq2qrVlpYtqS25kyW3LZZaWSWltzkLmcyq5zcuc4D2/s+urtoOc7duu05SwzKypbZbZb LLVlZLSxVlttstllpZaWKsq25kklSfofxvtf0Pm/wfk/L6rz3mfLdN5DjdL/Vxeq/55rg6oH BvBtrGLcMYtwuLhjGFVRUWS+z8g9iCEPiPb/dD4xVUFke49vbyPcJOgjlvFaKqgqH1yWRtjG dRrB/uxHvs+uXj3kkmJ/xXvRhbqjPR78RnoI9XOc5yoKg4AVUUXCr3gAIjno/Yo5znPR6AAb GUZBznO8M8Yf6oRxaRti0Nni71nOm1st8Js3d2bbKkkkqZ7zMgiIMzGSSTdsW5WW2W2Wyy0s tLFskklSszMy1ZbLLVys/+WpvrrGrLSy2WWlno7psVZauVktllWrLSx9Ys2ly/azZs2llq5W LbbmZmVmZmfV2zbLLSyrVhLbirLbhnZrMzMwzMqqwjMrDMyqwADI4AFZhhWb3jrrrtdddc5z qt110e17cKezyitoVbKbA2pVbFVsK2StpKIxiAIxiIAGdU1qmK/n469u3rW7b22zOt2+17VP tWu1nUu17Xte1qdrc7XtV+17Xte1V7Xo9r2u32vm/N7fm1QB/d3v7v9/Rd95r/P1vpMbGr9z R//ekO16KV7GJodo+y8jGxHTrOevcvIf5PsM796BAzs7PgP8XOKYbU2P2/5uP3tzK8vEb/W+ 99r9CGO288Xqb169ekXr169evXr15G9CAot3dCFqZtdra7xvjkABq/89XGbakZ8hKbyJDqLF Qbt42SQADn+nxfwfl+v4fl/bxpnifg/Q/pIzXc8wI7lAEQw85AEHTp02dEl2xjGLv2P2P2HP eEYsqr5zwR71c9mV4IzKznDNtt2Td2bJu79nu8zjJu7bdyN27Ju7bdk3d3HtWTnLs5zl5mbu 2y7Mbt3Mkkkkk3bu7uazN3f2MxyZzlm7t3INslpZLX7KtkSbpslpZLbJVSWlkvlZqW7JaWS0 slpZLSyWlktuVUlv0Z9Ld5Jb4duyWlktLJaWT6G6bJaWS25VSWlktLJbcmZltktLJaWS0slv 9Bbsnzd3cqpLSyW+N2bvJLec3eSWlktLJaWS0sltyqktLJaWS0slpZLSyWv4V2TbLJZblVJ+ Z/qf63+x16nWS0slrv3ZNpZLSyW+79/nv573vOjGQey89n/aIxgKsQ9m4e/zz2PY9ksdFIoC rf9AzPd+3c5Nkz2ttCyzbgM0wrgfaIQx2GRSEJhX1h77yjNEGtHvyqM0QVURQVaKrBUgPe9y oqBSj320Zoh6VsMIxeqxDZt2QhhRmkFuL3yVYBgzKqsGLMbJaWS25VSWlktttktLJaWS0slp ZFiyW3KqS0slpZLSyWlktLJaWS0sltyqktttktLJaWS0slv7TJLdktuZbZLSyW3KqS0slpZL SyWlktLJLSyWlktsqVJaWS0slpZLSyWjIAIIBAIBAxkAggPj6hZc2I81nWrckTrly5cuaNy5 buXO37d/2/b9vt9vzu3j0e3v9v2/b8/g7ft+37ft63b9v2jOHt+K/y9pt9W/gn2ZvqNvG+d5 7g97zPVXOtwo8UnrNV28eOnLh+8zHr55nO8t48du4ED6MCBA21jDbM5gIfbqeKPM/fQbfpwt +z+g3vG7DlYuDBgwYMGB/sYMGDBgf4N8CCQeAxspAiIoOf4aEBt/y3QboZ9XLjZ+PtpJPJNy 8k8K5BzHMY6xpJz1IRJM22xoWJM16PLBhoM2bMzzz/n/PzMaHkmjkGWMCSTGMQBjGADGMQBj 6JlkAZYxAGMdPlIgq1ZFsFokZZYgDGMAGPFsspEiaapDNliQDFxYAxjABjGIAxjABjoXUM1z JCefsSSpkRkhmSTOnLkkltt8bZm7cl6za20trZd23Kq0trZd29kt20t5N5JNvLS2ltuVVuy3 bS2ltLLSrFtLbcqp9nu+N2bvTrPF87p0OlpbS2222ltLbZVS0tpbS2ltLaW0ttyqtLbzxd3l vObvOs3TbS2ltLbZVT7ySbptpbS2ltlspbS23Kq32/kOTOs6dNt7LdtLybptpbePPmeuQhGb NKIzQ8TN1n2ECLopFHnY973k3vf6pC4s/2CUvWO5mmqzLbKEIRwqYkId/rjNKVw99C1miqoi qqIt8nve5UFRVfezP3Z52RjnNmsnm9+1VhCL32KvTwt3lvO9um22223Kq0tpbS2+HLdWLaW0 ttyv4+3aW0tpbS28lu2+bbtpbblVb+Pkt20tpbS2l6TdNtLbcqrS2ltLaW0tpbS23Kq0tpfX 3TbZbKW0tpbaCN9h3paOnBcv4akNRRRRRRRR8nhw0MKWHDhw4cOG9Np4cOGrUw4eVhw4cOGt hw4fNYeh8vp1/9/9LP+P4PHsO/E/up+F/ansy//fyxv2fWxsR04ycR1AfPn7547zc3NzX+dA gQIEC4W2bxfK83d4/fOBObAzf7LfWJt65ttbu7H3d3d3d3d3d2bz7t3QKDxn23A1McP3mM3D +44WfifD2+mD+E5nA4ne8bKIjNYxZltkzc9r2vazmdetyW2S2zLb+rmJNamW2S25LbJbcltk tsltzKrJbctuS25bZLbJbcltktuTLbJbcltktuS9rWxhu7ktskqsy25LbktuS25Lbkv2+7lk Zu2S2zLbktsy25bcltyW2ZfkTUm4zDEmtTLbJbZltkkltmW3JbchkpfydkYN25LbmW2S2zLb ktsy2ySqyW3JbZltyW2ZbZLbMtuS2zLbktsltyW2S2yW2S25lVktsltyW2S2yfBbtktuS2yW 2ZbZLbktsltyW3Lbkt+rzNzNSTWS2yW3JbZO13uc5ktsnOc5zJbcltyW2S25LbJbcltktuS2 zKrJbZLbktsltyW3CSy2S25LbJbcltktuS2yW2S25lVkt+8+95JzlnX07nHElVkqpKrJVSVW SlRyoqOFRUDnu5nQjCKOGN0ZEYRQOH/vHs9HHnDKyB05iuej0cel1R7PQKekPZ6OPFBHs9As ZWQMCr2ejpdlhB8EcbGVkBUVHDMrI5+B+ZB8EcKlSVUyqkqsnid3m8ZlSsnd6c3iTxNunGe+ 2D4IFNr2ejh9Xs9Axvez0cRi9noGLKyBVSbt1k8LbqSqyVUlVkqsypWS2yVWSqkqphJYrMqp KqZVZVZlVJVZlVJVZKrMqs++kibvzPvnM5yyW2TwN3Zlty2yW3LbMtuW2S25bZlty2yW2ZVS W3LbJbctslty2yW3KrLbltlty25bZbctsypUqpVSqlVKqVVVKv7eWa1KqVUqpVTzNupVZKqV VVKrCWJUqpVSqqqqqqpVVWeq02MBomQ/2Q/Z/mEDAwxoUPJxIEJLITTTTTTTTzk0+w1ew7CU fd7DsOw7DsOw7DsOw6xLsOw7DsOw7DsLHM7DsOw7DsL3YTv4qHlfmg4u/afen/s+RXr9llbP 9/z+sseZW+2rluG7Z7mvcvHy3+P57L80+gO3efAz89/j7WyYrhhu//fw/8G932nbNtBv4/d9 5jb0je3t7ekb29vb29vb29vaP0wNcFJBSAUcE4AAELNgCDowkNQaTbxr+MADpu5jkuqk48PJ PBudcl5I5/n9wO9beSqp1PRz673e9kIg8QET9fernFuK3o/3xmvHCPaDr/1P1HQhI9QBBllb hGPIsv9WWMyMYtwjGOEx3bLcDOjNlVmS3ZLfxpyZEk5zll+FN6Zn4Kc0syWlmS8m1ucTN3/u kluzJa6S7Mm0syW9ZLdmTd1yfvNdJk6WTpw5JLS9jw0znZOlbMlpZkt/MyS3ZktLJLe1Jbsy bumzI3Z+XrkyJN02ZLeTLdklpZktLMlpZkt3KuzJd02SWlmS0syWlmS0syWlklp9DM2ZN3mV Wwkm6WZLSzJbuZbsk2btluzJaWZLSzJaWZLdkt2SWlmS32/b6c50mS3p06cTOJnSZN0uSdzk k5y28klpZktLk4k3eZbdkm7LMllLJLSzJaWZLTZuZznDZktLJLeSW7MnscnOW3kyWlydE3RR wqoigKqIo4ezKed6J5RvPjGQ4h5558Ie+PZo3IO9G8uIxRQRYDhrxHvjcM0XFEI3+kf4hKTC rG9LEHWemmJKTYQKkISHEXfCPeo1z3sOgOEPoHvQR44VURQFVEUceuBdthCQKsRxjse/bgzR A02TgQlczSAilr34qrwNjMiMOMWZEYJI63InJw2Zsybu5JJLdmS3Zkt2SbdjZkt+jbvRJN0s zW6WZLekt2SWlmS0syW7JbZmzJu+99jd5Mnge/5w5JLSzJaWZLTtbmbpZktLJLe1JbsyWlmS 02ZsybpZktLJLSzJaWZLSyS3ZLdmTd02SbumzJaWZLTZmzIm6bMlpZJaWZLdkbMmylmS0syW ln66JN0uSdN02ZLSzJaWZOm7YYxf+mDjFSx0nWRqScrMr169evXr169ef0ej0ejqdHo9GnY6 PR6Nbo9Ho1+jP6PR6PR6PR6PQ53Q6HQt7f2fB839D1XhZnj8vf8Lzvj9Zk+Ov44oePO8fyJL py4bZrh5lu3eZlZOpwOBrcDV1tbg6zue6spDxVJJHc3xfivFZbWpb/nwfZeFzfc49Jj5uX3X /9G3t7e3t7e3t7em729vb287IiJb9JvWPWzfooaelpaDrShDFBEVFIR+lPc/T+76fT3veVRe O7aiXktDrriV4t8PXw8+GxDt4+PVKnOchzm23vKuc22wO1LeSWvzcrJmZloAAABuS0AuS3kt AACNkU2WgfQyS05aALlSS0slocloAAAGyWgB5skkloAAGyWllp4Hb3Td3estA+ZaER1ktAAA AAslv/vb0loBZby0DyJ4vk+ROnS9Z5H7Ge7nXr+gHP0h75KviOvYXBCGEhmROzsLCUIemQZr zYzQLmZhsh78FXIozNaMyIiIiJODNcCrTJmbBm3b8Xvmqz2M117Niqqq1VbFWqqiCTRAVAcq KgKqAAPCloABsl+w3xdoAAdJaAHSS0toAAbLQDZLQC2/TtACIDcyVaAAXJVoAW+hdZz291/4 fCyAITQ5QMYB83xE42K/OfHPGOc55BznPx8fHx3OPj45PHx8fOwc7nc7nc7nc7nK8vnc7nbf O51Lnc7+T7Hc1fr/WPUf6+p9fw3fh/Q8Lw/E8P0niex9h9LxM589fPXr549z2ba5bdnDLbv4 8N3Hjx3/QfQg5wKgCo4+0jhEAFQDrCuZHWl1qOsXNPosXWNqbBdsbHbS61FbS5pVzVTaK6wn MTa6xVc0K2tq2ltJbUWzbrVVs5qdZTmWwbFXWhtV1hNhbFGylW0pWSszM4k4kJCQkJDCQwkO JUhJCSGYYYQwltkMMlwTYjaU7aLmguPc8+bvD3Pz+XYVeOHkypPoq222xVzV1luclK0kJihI WhMUdVZnaN0vq/F6GP6L8vP/k4v7MbF0cq+CALjBBAAEEOrj729vbzx/vb29vb28/3k97OD0 AADTQNeWnH+Xre/9qkXyt/p2ucB4y88R4HeHXr+VYiORDtVQqz3Vk0Zn7xJrhqzWSmclhYlE Jy2GENtwwwnG7LC28thnE1CaIQhzlmpxzbbajll25qc222ctltzU4ms5bhLbktstuEwltltl tl2zjjKnNttu2Eu2XlnGBhnGGVMMMrKypWGGalQwysqVhlZrKwwycYZrNSQwhNZWVhhDMRhC QyExGZjbmWMMzUm7crDLVnEu3Lblty25bctuW3LbLtl2y24TCQy1crCQy2y25xm7ctuEi3It mbbIZvLl25zly7Zy2Qzbc1i3DLtkmststubbltyXbl25duXlysqayagSoQlZKlQkMhCVCVCE qVkyahOJAJxKqahCEJVEhACaJUJUhDNZN3m1WV3JJ6lwJXrNLoqOCL49r3+2QSx36v6rDoxj /DX8ob5oD2UVVLbMltl+2lyTW234mtTd20uS+7m7ttv8jd0t5PiTnLJzdttpbybu222176Vq Td3JeTd239Zum2+3ybvSc3bf4G7ZmW7bbaWUtttuS/j5u7S222220uW2387U3Q22222yVa8v zHOctt9vu7aW0tttLbbbbbbltltttttLbbbbbf9KSSS3bbbbQuSqtttt8npu8ttttClltttf Ju7bJbZbbS222220tttttt8zJbtttsypKt+3t222222ltqqqqqr53hkPfDyQ8hCEP1zzPe/Y MzedEUHvRFb0Ee9/oWeKEIWwHvf7Z6L3/blePfKuA976DM3pMzX0HvRHqqIiLt2Pe8FVbXve +TM2/fhCEMGa6xmhRmZmZrmZk72y713d9Dd222lyW22220ttttttLbbbbbS23JbZbb/w5rJm Zlu+8mbu2222ltttttpbbbclttLb6O7tzJbbS222220tttttyWlttpbS216N2bbS2ltttyW2 22222ltttttpbbbbbaV5VzwvqfH955/Z4/pd/3vf7/f7/f7/f7/f7/zvnfO+dQ4+PjT4+OxY 41+PjqcHHx8fHx8fGsxt8fHx8fHj9r9N/9jV+t6uf8P6/hZP2PB9t4PgeF1vN8Klx+Cg8fQM vay3j/NzXrt+8f52dnPs7Ozs/P2gLmzB8tuMnnG/jQQQ//on/b79zl1tbu7u7u7u7srd3d3r rt27m9lnkCLP/A80XOfoNrDlubEIiKEYi389DuJM4ySpbzPa9rnAD/qzLXW0AWS0D6rLQAAA 2S0ACIAALJaAAAABZLT0fuN3uefugAAAdZLQAAD7vJloBslofeW9e9ukQAdJaBZLQAAAALJb Zb91PV3TpaAB0mZJLbJG9wwkOfVJGbLETNhgkb5TNlhEYxh61RrUkZs2IkZ78RYZs2JHQqSa 1kZs3Kr31i9th27cle31Hb+FcS/pWrx8eE9RZJp0zZsAYxhEcamisIzZsRNJSPHTt25Rsea1 HXXKl57I665TyWlJugHg27Jbtp43idvnO1b2+5enJe7btsAA+9t7sloe8loAAAGyW/MloAAA AbJaAAAAH2FuyVaCIAAALlWgAAAD07Zv71PYBhl6EOC6eOp0OdOnTp06c8nTp2HDaw4cOHDh w4cN7DhmYcOHDhw8OHDhwnw4aeHm4fS0PrfV+zkeLqKfX8L5UHxNlHxPE8X43rdra8TxXuTj YjnLxHWK/xoD949zXz93nPnz/aAue4IXPq/n9zT/P+huHDa5+j5fQdYmjx4MGhgx8GDBgwYM GrgwYII0wABoDPfs5v/EDTNodDEdYwIiV6waQ1R1g6wCHDpKjGBCOZvjOdyZmZmZmctmTpN+ 4nOmeD9LpwB+mlr05JaDw5a7ct7klrwbtm66y0B+ouzafc1JaNlo6yW20s2fZTUyclO1LRyW h9tVv5uSWh2SW23rLQP30ktAAD7O3plSpadJaABZloAblVJafKtA22y25JktskyW2SZLbJMl tkmS0LJaRHjeLuh1lodLQAuW20A+jaAABslWvceT1nOdrz90+PadJaAdrp5k9DyJ16+5+Adv bbGPjLGZE9cgSQHv8CTM9VWER71L2az/LGaU7x76irZ+oM0gHEvrD3vAcWHme97gcKqgOFVQ HCqibVXa8GbZJaPFz4beEIZqr1WWxmxVURlXbfBtAO9JbbQAPEloABsltt9T0W6d60AOstAD rJaAAFkzORERERERE3dmxERERERERERERERERKqqqqqqqqyy/z9M/+PSsvxnCfrvjviv2W5b lVVVVVVVVVVVVVVVUiIiIiIiIieBPA8Dk5EREMRERERERERERERERERERERN3ZsRERERERER ERERERERERERERERN0LIWUAAstAAslp+vy0AAAAnb5Ono+J6Xi9nlev7Poez7Ps+z7Ps+z7P s+z7P1tHnzKfP2ufz1+fz+exz+fy+fQ5/P2bXP5/P4ex7Hsd3sex8WVSo/T8LFcxt/5K8Pa+ CM+8PtcPi+P4/keP5Htbbg2e8zMp9kv32VlP859mPg+D19n52c/2gLm0mx+SFJN9X87dw2Hs W/5zfvodzdu3bt27Jybt27du3bt3OgkRFCzyzvzf8By4NnmbuiIs85M8j9P5POVbuen+r5z5 0tdbQAPVlo2S0AHqSpLTtTkRERERERERERERERERERERERERN3ZsREREREREMRERERERERER ERERE3dmxERERERERERERERERERERERERE3dmxERERERERERERERERERERERERE3dmxERERE REREREREMRERERERERETdO8uyKAAPUrJaABslr+nrLQAP22Wh7VoHSS0AAC2gBZLQAA7U2Ii IiIiIhVVYTLLAjTyyyEYxgRjGBGMKWS0DwOm6AAAHJLQAAAALJb820ADrb7aSqiIl+Zte9cn kCEM2GZvKM1wKsFXSIzIiJ/KeWvfvVX/6IzPVZgOGZmBzjEQL/MQg8AcKqgDhVUAcIoiJewM yn7c7DHCMairnezW1ZkSVvgW8t222+BaAd6ZaAAAABZlp+p9nd7vq7oAAAHWZaWWgAWSTJbZ JMltkkyW2ZmEmSyhZLfvZJs3QLaB9naABuSr+PNp5VoAAe9tADj7BEYwLxjEYwJAPMlPL4sT MOd2c5znhHOc52uLi4uLip8XFxbmHDhw4cMvDv4beHDhwpYcPXYcOGd4fb/A8LznS8T6P2vs +If7Hjav2vjWus4PtPsZHFh52LlvXeY7zHbt3mvM56/fP377ZsmK5wAbPzPem8tj8iCvnvyf k6nqPQOpGDBgwYMGDBgRe4MGDBpj5RgRForaSD7gx3HwUG7oAgHA6wag1h1gGjougJ8NPT8a c7nJOvZ225k7OHTPp/TvOD1paAfEloDsmWvQloBZfozJtOSSdkIQhCN3ZqEIQhCEIQhCEIQh CN3ZqEIQhCEIQhCEIQRCOk3ZqEIQhCEIQhCEIQhCOTdmoQhCEIQhCEIQhCEI3Qsltl5NoBZa 3JaAAfS2ZugAAPMrMloBuVfFs3QAAADpbuS2y0AA7JqEIQhCEIQhCEIQhCN3ZpEIQhCEIQhC EIQhCLZUIQhCEIQhCEIQhCEbN2ahCEIQhCEIQhCEIQjd2ahGTESIkRIiRCEIRN0LJbZaHg83 QBy0AFyZf57d/ez5XTgAH6rMloAB0kv8XaAAAO7257mc55W+vPYnTp5uzdPN9EvB71tGbstG aRBma0Zr/4gzQFW+8ZvWFVRLCjxkREREREngDM+9mmq353vfRVgqvttc96JYqo+bb3bQ7Vp1 ktAAAAAuW3LQAAAA/Bmbm7+R+Vulttttqrb0vLfuvAfEabn33bSdY23NOS986d515x0L/Vni d0A8fLQALaALLQXLQALJklpZJaABZmLcv+cyBAwMTYAwAMQIiIyAMZLNSPiakx7Tp51OnAp5 9OnodPp9PSpdOF0+n002en06/T6fT6fT6fT6fT3KfT6e10+n0+n01dYwnqGQAN3ZfkHd9l3v m/y/Lx2zep7xu5cV6datWrVq1atWrXlls1bQzQ7Buw0gRE5/3c6EXPxXGnoWRF62/2aABYO/ NOfa9w75+vzfPCAD0j4rCELHfs/2b3oiAAA+9kzrN3t5bbT8XLQP3H5EfRn5E/An1M/In7af s5+NO53YA+8mS0DwMtAf88q3wpaAA/76klp0y05LQD58loctAC5b+3t+q/SN3sn0933MttoA AB2stACI/CyZkloAfoySSS05loHm9d0PnyduboAAdct+haB/gyWgAAHd6ZrU/2t25mZmdk3f zZJJLQNloB9T6/sT2J06eyemzer6wzetAZrRqOe+EBm+6Kr/VGbBVU9daUYgP8DDEe/EqzQM Wa/+kMyIiIiIiY02Oe+arjNm48YvfG229rwt3w7fAt7Le5b4FofOmWney0AA8OWgAbLbloAA GyWgBuX9LN/n525zQiAA6y0A65aAAAAAXLQAAAD622eFnoYyTCIkzomYZJxpNbYmbYWrBq0m rBrVNbNbSZtoZha2tzKca2kzW0ma2U1rWozbRazWFmJtWtVzDlaG2xM2ymta1TW1ia2tHMrl tYiEZMjBMmICSVMywEyYiFEtKq2IqquKkYWrIllWkzWyWe/5zKZtpNbMpra0mtrSa2tJm2qb WttF1rjbUZthZthbWttUzbKZtlNbWqbZlNbWo1tottWU1Ym1asTWi2rNsTNsrmlsram0psT5 74Hy/wOxF8D4HwPgdiebQS0Rbp6eEiMqi1Il6/ot1xs4kz1AcIgDnORAdWtavcDh1a1q9wBN K1rWta1rX0ej0et6PQVcwejVV6MHo1VejB6NVXowejVV6MHo1VejB6ND1dejKvQ6QysrKysr KysrKysrKysuw7sWIdjj4+Pj4+Pj4+Pj4+Pj41OPj4+Pj4+Pj4+PjT40+Pj4+PjnkQE8wAIx gYySSobERUe26/7ex97Gn/bg/d3fIk+Tlfez/ufO8f+V/p/+f9z9qGWWlcsNNuNc8c923du4 Z/xuO7hw3gcnPU5ozlERB2LBjEwd1WS2wlen8VneK09AaLg2XPI7/qPPf1R0GG6Gi2+Fl98D A3QbNDIALLlSsGCVgwYMGDBgwYE8GaROwYQoiAc538/n/cfyue7l/Q8fWMOycFtuADu8RWvl PKHb22WIiCIgiMB/DtZIjCRGAAQICJMdv1ul69JM5bbufifidOn3E67Nv3eWg+1loDkvxZtG 222J48tALLQCy0bLSy1stB+Ba2WgD/rtOloAAABbSy3w/F3fB9fdP1OZaAAB2Trmeoyc4EQH MmWlttoABbQ8TtboA5mZkmZlSS0AstWrQAAAADx/bt0OtoAdJb5Pl+VPczp08ydd3s83d6eJ Oj3+kTZn59fUGe+4aI/s98ZrJEXvozN3UL5EiMZKsRrXvgq92IzIiJ/YOFVERNtWZZs1smbd nR76GLNVb4PN3r4W6dbetvhWh3rQ9q093yMzPMZmZOcAAAAf01oAAAAJ0stnJ3kknvGZMnjd eoAAAHbtAAA7LQAC2gAAB59vqTLTmPv7ni+d53g+d2eR4XwfR+D8H4KUZ+/SSSS4lFOJLi4u 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 JuyzU3ZZqJuzZqJuzZqJuzZqJuzZqJuzZqJuzZqJuzZu54rMzxWZn+FP68erH0x7wVh+cVAs PzjGAAaBSECIpJg7MAYDSTOnrS4kutWrVtPTrVq1OtIrYOh0OhT6HQ6C9fh6HQn2Oh0Oh0Oh zehb6HQ6HQ6G3ydDodBXc3/P+H8JWX+/4vxfteLJ5fh+LE9l4vH4ni+Nv/abPHmVjv3eZkPo D7KfvnuY/fvs5+/fwNva0QMWjtkh3QmeWPlt27n+s3bfgbdZ5mpFv379+/fv378y/fv37+Pp AiLOkfU0vrPOHHpr1TrrL/Wtn4raVADu6+P8r8qAEIKL/13Rd+5/csD3B6zlaCp1C0lhqQsm SumKOcc4x9kzszNlmWWc5Nm2WWbs2aibs2aibs2aibs2aTbsTSbs2axN2bNRN2bN/fTn4UzL J5V02NFW8voKkm+yxlWZZE8xJhj0FMKcHg80M3jY1HnigL1SRuXuO5e8tW9zpEmsTtvF7+/5 iA+RdUuH3I3h7BfIhi14zvMJPapkqme3BuHBd25ckkmabqrTat+e1slVx1Oou8Yb8w/Q/ReP IxGGQQZhhkE3Zs1E3Zs1E3Zs1E3Zs1E3Zs2zDDLJkyqssmTLKT9tYZlSeNr6YX6n3T4r1D3I b2B/gMsdyPmjJGOBJMRFEMCAbAaqspWXXkQq9GvX09OvXr169dTpzen09/p9Pp9Pp9Pp9Pr+ n02un0+n0+n0+s6dXp9Pp9Pp73T+ztfHi/Y8GnkeCwnueL7rxfZeL+/8z0mrzLfi+N42O8zM 7NxnrvMyX8B/nwIGbn5+fnwID/PQ2YG78rysae6bt/vOLLpu2g+83Nzc3NzW3Mjc3Nzc3Nzc 2NzzNB3okRF/Zn1vy/PheE3xoTds3xQRF9F5F5FzjyLdnI5HhdxjS25MmJ6v1eXkG5YVdvXi 1yV9HXXsmFU59hgr08mMlyXylmTJhMMMFIpg5XDCeB4CvGGQQZhhkEGYYZ4oo95s1E3Zs1E3 Zs1E3Zs1E3Zs1E3ZkyzMMM2ZkyymZY4GpjJvugyMlSqVUqlVKsy3+MlSqVXmopj0WHhPO4Zl VQgjszkrCCFimaDCHXp6A3Z2+uNIedrfzxVeKLwSfeKQEPIh65hMm+J5fWJxITEiJ7B52waA joCYIbMVeYKiKcs2kgPEhitMVMEiIII7xHiFTMYugo8hAYZBBmGGQQZWEbcoo94w0ObDEOk2 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 6s8VSMxZmo3ObGMYJPyU+2ORwZ+kaG5+468zpqVj4uiw8Qtw9bLhbzxLd6Ytky0a8SMiFLyF TsVDBaWC2H4FmI4jYuy/Br0RV00wbBMcVEwq2KbsVmjhzqPVzg/NAQDDBXDvBB33Qw0AYgMw nBYptZxrTp2POnSJ06dOfTpz6dOv379+9evXta9evXr169evXmb169el3r169evXr17w6FLn eDj+LJb0fF8Xw3KDaGPf9ajVq1atWrVq1atWrVf1V64qgOfOZua4GdqaUKHD8XxkHWo2dDLF gRBYGmBFywRlyN15d933fTN26x2Cx1qpz6nkyYYm7klmFO57rDJ3UmIdjJoTEPFSo0Llv8cx 0eIGNbGMYR3lcwI4DijnoO11geIf6/j8S+MeWiEDxqsBYpYwqEFf7B/pHf55C4vXvS4qspiy eK7chiy1R2W3Fnpdir0W9d1W2uW4xE8pCzc1Ju1g4tHq93jNSPLcPEMs1s/0JEnFh6SSSSSU 5RPVTk31L9BFW/fv379+Tfo379+pTv379+/fv0r9+/fv35/830z/VbfWgfz/zOB3CGShi4ve ysSlScUusp06dOnTp06dOm7ys7QM+bZ31cZ9D4OV1uLw9tw8/ieP2vwlx0+THezve972Zn4n +Mw8eFk/CSp9u/5e9fiv+Xy3sHCfmvx23d7f4YWH1yWPN12fV8SZP40sN9CuI2+JP45TJUf9 yCAWPLipksjSSKeV5/FxiJPKeVxm8Loshz/P9C6Nm6bHXv3mbnor6tgsi9pj3iemPvG9aQsl krSgLEUe+0h2JZcL7bfEN7B7C0EcbVWh+h0rshgl9m1m4YNBMoLkn6g4W5sqsaFt3thkpVk3 dwv4V8xZuqk+iWSaWWJHO1DtLyO5dy7lrO5dz3L375LS2yecfVPuHPPNPNPNPNPNPZMzMzMz M/694136DdSSSdWjydBxKDqqDydAH5aAB+WgAfUQAPy0c5x3e55V934vv+dWta1rWtcK1rWt a1rWta1rWta1rWta1rWrqUpSlKUpSlKUpX7/3/v/f+/2S3Zaurq6ur2XZdl2XZdl2XZbPZcf ZVuy7Lldl2XZdlTZZZZZZnggcwAAOYFHbdf+r4aQzBaDw1B4ag8NQeGqRnoeFK5vhtvAceEb xEA6N4f1zYwEF/lZ2cwxksMMMMMMMMMZ8fRjx4+dH3NxAUU5HnlpMmTJkyZMmTJkyZMmTJn8 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 5aLYtq2LNbFmtipKc1sWa2OWdgyLNUnP2fX9j2va6/U8v8H2mZ//ug9MjX3vuJ4TrMeyeonq PUenmYzuosSw41kJJ5KxAWyIlqCFsC2EthGUSaa3mHMOO3jKzWHi7Iy7PEOLS5LiZEkNddC6 6MrrhxaXJcTIkhrroXXRldcOLS5LiZEkNddC66MrrhxaXJcTIkhrroXXRldcOLS6K3EyRYNd dC6EbrhxMuS0sIkhrbYW3RldcOcWlyXEyJIa66F10ZXXDnOtLkuJkSQ110LroyuuHOdaXTW4 tkJYNc110I3XDnOuc7+Iio6iOcffDcyJ+by6dbDx+P8J/OMezuEieMsT1y/v8BKWnzl4siN7 yywYsvU/hGMVKY3/XyceJHB2o4cCo5znCI4FRw4FQcOLty5tnfjil23ZCEnudbb+kC/OO1LT t7CEIg1BEEQPRJMMh+2baYnieJ4niYJ4nieJ4bhuG4bhuJ4nieJ40izTRc2rbt50OTAt27du 3bt251vmczmampqampzOZzOZzKnM5nM5nM5nM5nM5nM5nM4a9evXrr+fQ/k8oLa3lt/PDyvE Q855V0W7gd1q1atWrVq1atWrVq3w/D9YHHft7+/x7u/6fxGGGGPKTJkyZMmTJkyZMmTJkyZM tIkSJEiRLbS0tJkyY8efCW/CfCP+EaW0MvL2htDL2htBw87EXOxD7sR2IcwNcdiNC+NgOIN8 KjS2xCDjXxHiOniOpDp1Op06nUhz6mpz1DUIc9Q1DnqGrucddeeuseeuvOWuseeuvOzXWPOH Fd66LRdi2rgqTnYs1sWa2LNbFmtizWxyzsGRZqk59np/zd8PcPa9hPafD5owkV8n3T7p90UA JWXpZo55P+fz+eWsNwUCuDFFYXgDAaZEOBu2H9gAfFEFTxneNy7Id/hGWHkNRznIBc64mRJD XXQuujK64c51rrSwiLba+22NrrbRznWutsEiJba+22NrrbRznWutLCIttr7bY2uttHOd+yud cTJC3XPuujc679peOc651xMkLdc+66NzrvZ/nn70/bjf1D/UP4Z/yj9U+IzHOdm7M2mIueb8 845uztHOda60sIrba+22NrrVtHOdaf1qXEyAt1z7ro6c09vppJTk7joO6+kJzB1bN0tuQiJJ tsdP4J1XjX0g9mZ9WREf/kntse28iWvF5Fn3CIyMSUgPkVh+yL/vE7SILdbcX2RfddZK8Yk+ R+8bY3jc5D0P4ApqdTxnadgyhqCIIgtC0LQfi0LQpi0LQbBsGwbBgWhaFoaBPzS9eZatQ63K PyuU1yuVyuVyuVytrrOxhw4cOH2Nzsexvdj2O/V5OVycnJycnJyXVlllllllvoeV+Meo9k9/ G3+f/Wb5rbzeRmVKlSpUqVKlSpUqVKlSpZ7LwosV9Fixc+Ltx24bjx48mTJkyZMnMmTJkyZM mTJu+YiRIkSJEtLS0tJkyY8efAW2/AfAQ+A+ghT6D6Cn0H6RDb+sfszL9Y/WIbv0jkcPun3S HL7p15/SakOepqc9TUhz1NTU1H8uh0OXQOgQ5dA6O5dA6BDl06cunSHLp05S6dI66687NdXR 5w4rvXRaLsW1cFsWa2LNbFmtizWxZrYs1scqSdOamxUofgUv/TIKClj984og8gDty7ft+3L/ Qh0yHxy6Q9qQLzRaIzBBCHTi/prHV2v5w5zrXWlhEW219tsbXW2jnOtZLSwiLba+22NhbO0c 5yOtLCIttr7bY2utzLhznXOuJkhbrn3XRudda4cXCOC51xMkLdc+66NzrrRznWkktFIi2222 wtdbaOc610y0iLba+22NrrbRznWutLCIttr7bY2uttHOda60sIi22vttja620c51w74/6pE/ QcH59X8YnX0TqePt+wfZO3udulLvH99heW4YWlp+hEst8hcfG9j8QTExvxWu3djjhfHZa1Ux KX/xmHcMCn5b23w4fT9Nn0/Ts+n6fp+nX6fp+n6fp4sLMhllnDhw4cOHVw4eDDh63Dhw4cOG 8xZaZs2bX4fxcr+rYQ/F9XwENX4n5M74OIOljVKlSpUqVKlSpUqVKlRZauPa52cDQPLhIQNM 3lwtV03sDKyrA0wNPTdiEOYXM5nMJcUBwkRRgfrROH1AmNgVQ5XC4qjGAFsEXW53RE/sQPR7 /aO3ynm8x5yeeed53tETeefO0vBPQgYDSvMJrcYWlxYsrJbNlbbraXFtsLb/zgPP9Gh5zhKi o3ow9GPL6v1fqqqvFVdNVVXdV3d2Ru7u7W3aO7u7qae7P3a27R3Z+7u7u6svu7tjd3Y0BP3n bt8lugndUUUUUUUUUUyFFFPq/2/tQzn5jPm/1bgKpvFvb28XrgwYD6REPx/z6ez0UvDILakm 1LZJtJbErY2VS2kfv60nMLaBbQNora2KbSRtVVtEktRLUkmJO/eKe8bLzDyj3r7h7171/DP8 k/in4Md4Odj6m1E8//E/I7/G7zjv9k8PLGJ5YisPkQiPhEvvfCEXhZ2BE25MRxjEpmNsiTwz 3OJPnz58+BPnz82fLn8Onw8PDw8PDw8PDqcPDw8PDw8PDw8PDw8PCpw8PDw8PWdZrBMAW+FN NNNNNNNNNNNPMTToCgHooCgHpqamWfpDLf95O87zvJ4N0ziN4RN5ZI6yg8b3TkO6eMZu7d27 t3bu25TTVqp3EOLvMmdwcrcZJ5FTNmwDt7pE3buSA9ODIaWLpw4eJlStSVKlSpUqVKlStra2 tra2NrY2traibW1tJbOzs7Ozs7Ozs7Ozs7Ozs2tnZlltHOc7g5znOc5znPjgDaLa2topoDjT /09aPwUdpPix13YcPhdMx2NvQ9p2WXZye/NDLtxjGaXbucfW1nWtoZetra2tra2tra2swwww wxGYYYYYYYjnYYYYYYYmsMT2GGGGGGPvhmUkkkkkkkkkkkkkklm0BQFAUBQD0B69dAqBPwyy yXwynVOxh0jlTjvgU3CU1JJJ+u2X6zZfoPzXzn7DzjxTg8fuZMY1eNzGbof0wNT7SNKwO7pP dbjh9o8Pz/RaM3O34iQixSBTJPvwAAA4DnfzGzxy913Wod+fJSSSepJJQHp7169evXr15WJe vXo969elXr169evXr169evXr174V8JJJJJJJJJJJJJJJXpN8r7JdcQk67ws6A4vrnQufabnX NulaPRvqW2h2UcjdWr47eBvh+OHaj/sDo93d4+18Z/Jd5fLf5b6YeWnlrWta1rWta1rWta1r Wta1rWta1rWlKUpSlKUpSlKV8vl8vl8vd8nyfJ8nyfJ8nyfJ8nn/J8nn/JXlVznr1069dWvX oV6K68SaqPeT56qiiaR8cgQcmABjNjAgU/FNPxvCW3f9/1/Z/q5+P+7nPvgcr2n1vsczj9Vp +xzN+BD1NS5q3NS5rXLly5HuPBCEcdA6FqGpqfI76TcPhaWWCzvJ0nSd5MyN23eEeHZDLKRR wIARx/yEwb+xZmZmZmZmZlVWZmZmZmZmZm3d3d3d3d2d75/JOr767V69OTst3p01zU7G5Nc3 bdttsbvW652dk7HXS6uzedOk3nTd0tVGhBWFjBIsLKEnvikGjY4+cQAtHOcg7tFOLpOHYLRq 1Jx6mgk8qTQxFsmiqN1SGFP64o31hkpM95ij3MWSxmZiTjZkR0SlSh3qyZipPfJUhiVIqy1K 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 QMkwJckhNHrYI9y/le0fnv0nm377TeneeaO3VwJYw+tTiQZljfWJLYZj/0P3XpuH4xHG0rfz 7j1P0cTms3Eul59zXhwN7ncZuJrZDubOnTp06dOnO5069evXr169evXocK9evT7169evXr16 9evXr169evXryV5NNNNNNNNNNNNNNNP6Wa7oZuXfK/fvlp4gIAVDECL/wxAUSFVusQLIQMYx tosoibNphBkN22biY0OHiw4b6HDhw4cOHDhw1114K66666666666668hdddddddddddddddL 1JVE00000000000000080UBQFAPhQD4B8+xAAuS665TxVE0d4RSR8ACEP6jD3g5A/pOcfWP5 ZaZ7u7i55pxijB8jj+dzlKJ8jSc5EHD3tgbGc4sGC6zI+VHjx48ePHjx47TTWi1GgtNNNNWL EuxYsWLFiwlYsWLFaxYsWLFhJpJJJJJJJJJJJJJJJL6gBAETRNNNFVBB5UMa0RCaKtVw4zoN cg2WDhDyx9gibtsV1iwoWLChZMKFChQoWnp6devXr169evXr16+xrV69evXr169evXr169ev Xr169eenQnJpppppppppp11FFHZAAEABRBgCoiiHwoh6A9e4gIUAuS665Z5EmNgTyJYgzHQC uH/HDB/sdj8aOM9xHH38nEqITiVEW1Q2W0i2SrahW1EbVRbStjYQtpLZbFWyrYGy2VLajYNp DwTL56vb/1iDggg56A4OLIjB6Vg4bVOsvJY+/zOHOd511k59upjPpOTJkydGS/dyZMmxrwrF ixYkWLGxYsWLFixYsJ2LFixYsUbFhSxYsWElEkkkkkkkkkkkkkkkqGaC8gPDANE000X7wxPz lxAveC6OiO+Hx3tH4z8Z7l459LN0/kymGr4mSSc7vrcxjGHkIo4lZs31vxw83m83m83m83mx u/E8NvoehsrWta1rWta1rWta1rWta1phfdbPExBl4mXi5eNl4+XkZeTl5WVlypUrOlbe3t7e 3t7elt7e3t7e3t7e3t7e3t7e3t7e3t3Lly5cuTZsURSIgmYtgwE4xERJNwmgmntmx8fFUUUy VFFFFMsvqR+rnlsxrSJoSNCwzCebQn9Lvp+n6XfUPRMTTERw5USN7ZuKRi/nvxHfPynu3vn3 T3zeG8bkbqHEHbzwTLicXDr+Jlbk+Fcsu3MpHAkJlWrRyMzuJGjoZfB+eEG2pkwYkTFe6+tr 5uvm6+u919eDbt27duXb1Ldu3atWk7Vq1sWrVq1atWq9q1atWrR7ZznOc5znOc5znPbK2uuX uiAbEB7QiC/+IKsQ/aX1gBWWf6C5jMkUNs2DREghjGdOMSHDdQ4eRDhw4cOFChQmGGGGGGGG GGNhhhhhhhhhhhhhhhhhhhhhhg8xFFFFFFFFFFg5zn+UABPE8Tw9E8PQHr10CCoZJdlkq4SF YAbA0wQbgd+RGGRt+IcqsGu3OEPFFwH8Lc9gIL0SULN++VO2/tp29vbXt7e3tXhrrrrrrrr6 y66666668pddddddddddddddLoLppppppppppppp9V1XVeCk7Kdl2XZTm5qkT+mP9AOEyIni h/pH/EkySfuqvnTUo+Y6VVe5+d24k5+44Un4tXtPnaqsDqk+B8DiT5DUnl83FJ9AhdJBs6kY kiRiyJGRIkSJEiRIkSM5/Zk2bNmzZ1LNmzZs2bNmzZs2bM+zZstNNNNNNHsnOc5znOc5znOc /nqBUBQFAZwoDOAzs7IDi0Vq1aLHOP/xTR+sFpjUhhMRQcIhxNH6B8wTRjD6oBgX9pFYItP+ MQwRCDnGM3CCDRBC2RGbNyBavqwCQbNoUSJExMubNmzZs2bNm7E2batWrVq1atWrU21anJ2j 2rSVq0latUrVqpatVrXWT0zEAgYGJlAgmmmmmmmmmmmmmmmnmEQAAALIAAAVVyrRWrVovEG0 Ck4Lr+wWSSYkSY8F5J/K92++f+35T7155/+fkO5jjyOr4nX31hZHAUiJI6PgY1SScBJM7oc9 uDuk0ESLwHh4dLwsvyO5ZAf1tVEfS3Uz4vg/mO13XUV3WteGqq1rjjjijVcVxrgo4KK4Cjjj jVVrVAUa1oDRVaqiq1wBqgA41w982ovS3eN6c43enLu84ct1o10cs28obts0pdlibu63Nl3d uzbIm7dTd3bupU2bu7LVGbIGQIyCBmxja2MMp1kBwEIua6hzsTJjx506dOezZs2bdu3bt27d u3btO7doS7t27dl3bqd27du3bt27du3TuSmooooooooo7pznOfMVCoVajrGoanA0SfVHjZ43 xvjZmdY6R+Y59x3Yu3evfyvYPKth+g/FeUfnTTPICvezup5xIfo2R5jHgnSaLmXH6vSnPSST 8ZBxGRvgoskxpJkDYhAiLTIDHbt75ATsptj4uRKlYuanmJvU08tNNNNO9evXryd69evXr169 eq3r169evXmb168ilevUb15LgSSSSSSSSSSSSSSSSn3yv375UQAuREKxiIswxEGGBp5jh+MT VxCAJAcBkOAtDj8SI/4mbl8bs3WDhx2QijPWULPF4rKeK/xZsKFlvYUKFCXXXXXXXXXXXXXX XXXXXXXXXXXWOsssqssdc5znOc5znOc5znVCoVD0Kh6A9e/zhULkuuuRx8zLBSh70DTA/XFT 3jspKcZxnHYYqsMMVWGGKrDDFiWWVE/8Zs2buZZZssqJZZUSyyqwwxt0dHVsqvsn99xOksP7 eX+s/n/bz8W9z/pzn+nD5zk6P3V5/Vw5++bz+fgOq9VCD7Ldb226XycZeRR/3p8dunMMTEsu WWXLLLJZZZZZcssuLFyyy5YgEMvMVxcbfAyUHD10ijiR6GPQy8vLoaFChQob9Df39/f39/fk b29vb29vb28xvb29vV9zer729vb1PePvnOc5znOc5znOc+bvFvb28XuypimgC5u/bUklSSf/ w7STfNRqMMMMGGGJhhiYYY2ysmTEwwxMMMTDDEwwxk1QK4Wnbg7I8JmzevjO0WltlxMMMTDD Ewwx5+smTEwKK5RRXKKK5RRXKKK8/x/ynAo4nOLL9ff9fu7rIkR5EzMmJEiRIkSxYsWLFiFY sbFixYsWLFixYsWLFixYsWLFixYsWLGsDzkUUUUUUUaBznyjnVCoVDwKh4A9euG7uwVixYJQ bAWBf10xpHFiV1SSnNTiuO47Ewwx+cSsmTEwwxMMMe+VkyYmGGJhhiYYYmGGP00cLh8/2SP9 +Ok8voHancnclyyy5ZZfkYmzZcssuWWXKKK5RRXKKK5RRboxaS636+LxWZeTs31rTyeTyeTy eT5fF8rDEZhhhiOwwwxMYYYYYYYYYYYYUYosMMJHOc5znOc5znOc/0g7Wdr2vaz9JPWI/Vn5 k/JTeN83zEwwxMMMTDDEwwxMMMTDDEwwxMMMTDDHX9hq9o4fZW8fGHiDSdydyXLLLlllyyy5 ZZcssvkJs2XLLLAgEAgEAgEPUVE8XFskJdgg2zMrNixcWLFfRXjx5FixX8WLYsWLFixp2LFi xYsWLEaxYsWLFixYsWLFixYsWLB1TnOc5znOc5znOdUKhVqOsahqanVu1na9r2s6d1DkuKjW cJwmJcLjDDEwwK7JhhnKKK4xYYZnDDDOFFF+AcMMM6Z+kIY6IihN3wDrd0Y9YjpCEy4uFUUV wooqiy5Fi5ZZcssuWWXLLLlllnJ5HZZns5DDFbYhsZzjwIDrNh5cPMzMyHDhw4cOtqVq1atW rVdaFVq1atWrVlVatWqnVq1atWrVq1T1vTpJJJJJJJJJJJJJJJLEsssXECH1/oggB8giBDs0 +5T5/34/JR21kQkknG1AHbONe3h2f1mbN0PsbNqRsgnTrKM4cOcmO6jx48ePGexo0aNGt29C 3bt27c63bt27du3bt27du3bt27du3bSt27ds9k5znOc57SSSSSSSWXPE8Tw9E8OCevcYfnGh RqvEeI8RNx2KeCdK4qP2pBAOw3WjbvMY7eNSQNm2jmt2z5s+xH2JkQoUKFkwoUKFpQoSyyyy yyyyy0RZZZaOssssssssssssssssssiiiiiiiiiiiiiiijVUTyaxVqxPCL3hwMeECIetH9Kd V/QnYp63sOx7KTfSI3WVvucY7YuL2p+akkdwgB39/Hv/dgeHh4eGzDsyy8vlyxxxxrWta1rW ta1rWta1rWta1rWta1rWta0pSlKUpSlKUpSvl8vl7PL8/z/P8/z/P5vD5/n+f5/n+f5/n+ez Zs2bNlpqi0000000pOnIJKBRBRSeHRBMw61miARERERFadZLmlSxaVKlSpUqVKlSzyIg7IiL PGeM8Z4fAPn0ArVnQKeO+Im66ZUTjPgxx3w5TM/EJhgT0KVv99yMkTA2S9l+A26EQ/AddXUX zw111ylfHlS2cWjB+lUk8QLBnsHhVeC5p26D6XNobzKy4ULMeyHsiRIzJD9/IkSLNmzZsyLL TTTURpqY00001KaTaaaaaaaaaaOqCIiKzrJJJJJJJJJJJJJJJZtgrFiwSwJyA7pmNWqgCrV3 EHOcyDnSVXOciDnQku5V/wtfsuBopJ9vTpPphf058+ejo6L3SWWWWWWWirLLLLLLLLLLLLLL LLLLLLLLLLLHRRRRRRRWOc5znOdUKhUPAqHoD17RIKjjACxLLLEkP5AWwM0DTFckD/HBA/G/ 4Qf631nG3gieNVRPmccuPf3/pGMo6y11u2eS+mHk8kaNGjRozUZpppppppqS00000001Oaaa aaaaaaaaaaaS8qgmmmmmmmmmmmmmmmnmz3iBWCsWLBNwCKYDECBgYAAwMBVIxAcrFfG+bnOc 6tDrrh1avmaXzWJcl9A0mSWaGhgaCnx+NIIBgZKlUie68h4z4vfSHXK9DzsoWhnh6I4jh6I4 jiOI4jiOI4jiPHGfHEcWhaFoWhaFoWhaFoWhaD/StWhaFoWhaFoWhaFoWhaFoWhatBK0LVoW haHtR0h7wdsO+HrB6wf7j4NoZv7fas9iPaD/MOPajuh/cOgPVP1H3b6D6t7N9S/sfev/b+x9 +9U/VfEeleV/Beoexewefcx/4++ejejf3PeP8HzfWvVP2nv3rntHv3u3gPsH/1/8fBfuvkP/ v671n+T6r+l+a/naOt90+ue0fiNn959X/M/FfmPh/CfXP13wnLfjPhP+fn/dPhP7n6D8V+c9 0/Dfpv6XvnxNzfcNXd/7+5f0v2mX7L3HzX5T4T+18N/C//n/b+J+e/mfDfrv536z5j/p9B8V /i/wfpv/j5L5T+Z/K+M+G/cf1v8XzHxX+D5z/p/m/qf5v3/73w3y397+581/o+Q+U/8fOf1v Af6tp/x/S+d/a+Y+a+U+e+c8B8p859B4D5b/j6D5X+7530HzHzHz3z3/j/x/02nzn0G0430G 03//3mv9f1dT+DW85FfrKh62JJtbXydra2tra/w2tra2tra2tba2trbbbbbbbbbbbb4v85tt tttttttrWvO1rX6jWtfGbm9tvb29vb29vb29vb28fLOdUKhUPQqHoD162cO/aF87+f+clBQI hLGiJBAeiH8I9oPZj7R7V/7fYPrX1jTf9SU7iT+5ZSphZ6GLJP45ZVE/XsOZoncVOZpOapD7 ZUSczliYxhBc5yn0dZLyfIp2yp1I8bPHtyleFUJ+ZZBPkFgj5f73v/a/odr+l+bt/Xep/1/g /N4/iu7d27t0ju3dtDu296d4d3bu3du7d27t3bu3du7d22m02m02m02nhnmn0babTabTabW0 5O06vabTabTa2m07ptNptNptNp/22m02m02m04Xim+2m086862nlG0/ybTabTabTabW08dtO +2m02m0/7ehbTabTabW03m0/6/29Dsv8202no9p6Xael/1bT8BtNpvNp9P8x8xtNp6vabThb TabTabT2j7htPtm02n3DabT7rabT7xtNp7Z9s2n3zabT8BtNrae4bW02nttpm4HLe22m02m0 2m02m02m02m02n8TabTabTabTabTabTa2nvtptbTafsNHabW0+DtNrabTabTabT5Tafvtp/o 2m02m02m02tttttzbbc223Pifkf8P5r4n8fu7u5ubvtvb/deZ5nvPee77/F73xeLxeLxeLxe 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 q/dNfP3t6cmjCvk7VNYWsi5cva/H9k6sp2r6iY7aq6lLWC82pe+7duhrI5qbDkstTc1XAYiI h4fZdz/9nvfUa/8X9X30fneT9rqz3/qP4Pq5nnfxfmx7np+vyf3/i/8/NxWf8Pw+2x/+vk/M /b+X6vy/mvtOjQPBdNiGMYJaTplHM4idtYM1kpG3amsaVovsG6yW0j7PT9IJEksoWTOsqqUF QqKsHv1Lw0XFHVajrVcx5uuG0OrDVNDZVr6RVepkf6nXCu1Llkkz0jutLEnj6M6kyqGKjPfK pUyJLMrIjCi2D69+26VvH8z8dy39D9p4Nt4STTRKlU3FRI+icHZz59/n33dd5wuF0PB7zvuy 77ed9x++77Z8ps7Ozs7Oz3fd8zu+74+7v2u77vmd33fd4avd933dfu+77vu+7OQYAEo5znOc 5znOc5+pI7L6Xg0XeVLPkz+jndP6znvPVd9+vM75/lZaXt7vaY8D1L/12P5r+mz9T0jUPa/B 8eY9qw6Oh9l5n5n3pE+PpyffdbKf6OJ8bNfSv2fU+n4Wfc/t6DHlKWvB/w+3qfP/687j+bd9 Tu/V+z6uV+1t+z9f6f+suO9Zb/T/Z7ztvWbWj8+5HUzPK07kbR/kTgf88l2hbfd76v51+5cw aX9Xr7vs/13Pbfud17LtNj7P4Pi/8O/7vvew9D6GSQkmpPV+39vNToJJ89B6So+38l6rzmv7 D2PrPJeL28OnTZaA5UnnN765Nf6aSSfVyTh8j77/Lo+O5D5j4PzH0zs37r8d8x9O8m+Y+Y+/ eneQfZPbvkNTvGt/a+K7J5B/E+Y+Y7V8h8R8x7Z4l3L2z9t793TyD3L3D5jxrvHzHzH4bx7y 34bq//rwfmH8L4T3T2LzL4rT7x13ZTw/h1xE/UH2UzZsE8OBSfpEsn318q8a+/fYtF7Z5l3b vW5bdJOl4bo2o5J0DnnOIgxNMe40CX38vjz/eaGlxQdL2en7z3kPo+41fePontvkfIjdp7iR x/I9H2XyO3+R0/e9L5HyPS+6+R1O29z77zvyPke+6vyPkawUTUTTTTTTTTTTTTTzE01CHdPH j0jBANw3GoampnzetnJ19eavVPijpH1IGkBxXqFdlFO8gGW8bD6ALxC2RPeutTSqOFTzNf2/ w2DIYzbFdYmJiZGRkamUA7MQK6RUM+WMYxInQWJlllJJOck95/N+14Hs/vdP23ufjPs33j9Z +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 IOe9ERPjB3Zx9v7h7Jzlz38+fTDHp317+/v7+/v7tZ/Xr169evXrwq8ivXl19ivGrrrrrrrr rrrrrrrzFK8053B25znOc5znOdRNQl5K65Zr2jTIhnAkPB+yFSGQ3bB0ggEENcIIVQ3AOwTk Q+A+zf8P2XYuxdi3bscmTJk8m+Q/1fqPKNbk8Pk8nk+f5+7l4dfD0fR7K1rWta1rWta1rWta 1rWta1rWta1rWta1dXKysrKysrKysrKysrKysrL2NjY2Ni1atQ4cOHatWrVpK1atWrVK0rat WrVq1atWrVq1NmwUwmmmm5cfiqTHGM5VVVVVVVVVVVVzs2mkgEwgEw4qByOudc65+Q+wfgvy Gv9i+3dw7h3DuGpqNRqNRqNTUajUajUagD0B4A8AeAPAHjx48du3bt27d2hHGuNca4kASJDc rq926XMNw/UjtHWvKp059lH0ULGH5JN3qYybdPuD9aGDjtbW6rwfjpG43GkYxiTwnCzZm3cH QdrXUhM9ng7Ix3kZmUQ31hPpOjdG6N0bo26ch0bo8mTJk6N0bo3Rsx3pQNKVK0acOnBp06er p06dPf39+FChQoW/v7+/vy9+hv7+/v7++pW39/f39/f39/f30znOdZJJJJJJJJJJJKcJwnCc JwpCkKQpDcG8N4bw3h94+8fMfMfMfMZGRkZGRkZGRkZGRkZBkGQZBkB4A8ePHjx48ePHjx4T hkRd6pvbxWwAcSdj4NwE2bGN2PWDofTH1jf4wv9bOP3vz75/9y6CRhKEpSe+MZSkqxhCUYwl CMYyjGMYylKMpSjCMYxjGMYRhGUIxjGMZSlKUZRlGUpSjGMYxjKUoyIwlKUpEYQjCMoRjGMY ySUoylKSQjGEoxSMYxlGT4xjKEkfCL4xlCMYxlKSSlKMoyhGMIQkkYxjKUiMYxjGUIxjGMYR jGMpSlKUZSk+MYxjGMYQfCUJSlKUpRjCMYxjKUpSlKMpRlCUoMsZSlJnyhKUZSlKT5SlCMoy hKUYylGMWhGMoRlGMZRjF8IxlGMiEoxjGT0jGMpSfGMZSlKUZSlGMiMZSlKUYxjKEXssYxjK EINB8YwjGMIK+EovjGUWlKUYq+MJPjGT5SlGMYPhGUIyJSlKUpRhGEYRlKUpSlGTSlKUZEIQ hGMoqkYxjKSyhCEFgiDQjKEoxkRjGMpSSUlhZZGB/nAfst2OP1fvQ/NDlCjg92SJIkiSJIki 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 ZZZZZZZZZZZTZYZiCYnYOduc5znOc5z5Zzqh2FQqFQ9Ae/IbODOv+3RGDTRPlBsDiOPgdzxP gAvcO+NyOatK7ds7ta6666666666+/7/v+/r7/v+/79SpUqVI0qpUqVKlSpUqVKlSpUqVKih AiIiIiKaogCIERAAgBVMQIhsJJOUkkkkkkkkkkkswgFCp0ynlSAVdaxEMQAeGCS+IQHwwQxa hs50M/TFUVgITi4RAzjFe40LGhQsmFCyYUKFChQtHUWWhLLLLaiyyyyyyyyyyyy05ZZZZZZZ ZZZZUAFOUQCyTdJJJJJJJJJJJJKeHYnieJ4eh62I4WWL/gEWwJw1wYf8EBogYd5Jh9BTz5mR 2JyN/bk32/vMZDtpHEw7M1uDtts/xnEDIy9XK1dXV1dV3q6urq169evXj169evX1K9evsV69 ebXr169evXr169ddeYnXOduc5znOc5znOdMl1ypEQxAVEgHecPv0ypUzPqgxHTjJc6Ghj6Gh j6GhoaGg80NDQ0KlSpUqVKlSpUqVKlSpTp06dOnTp06dOnTp06NOnMTFRNJJwkkkkkkkkkkk kkqHioeKh69xQoHA8MqpVSQBThw3/9Jw36NPtK7BXkE/hf0x4/mtW3wfaTfauftjhz0H94k2 tB9DoPsNB/n6D2Og+50H2Wg/faD+hoP8fQfh9B9noPrdB+S0HzOg+FoPptB9hoPndB+C0H/R oPptB9DoP2Gg/BaD73QfR6D7/Qf2NB+j0H4TQfxtB/E0H1ug+o0H8nQf19B6+g+FoPmNB9po P/XQfPaD7fQfrdB+w0H4zQf9+g/s6D9DoPpdB+p0H7bQf2tB+J0H63Qff6D/20H95oPs9B+5 0H4rQf4mg/oaD7XX/tvu3PWdbf/f9zcJCdl7/auPROHHXmdIZ+Rx8HXfg/ydkAACAGSYz3E0 cflc3JyMnki8nJybHJpdgfqwJ/V6vVrdXq9Vrq9jIjyer1b3V6vV6zq9Xq8zq9Xq8nV6vV2F ZqjZsCAlnO5O5Oc5znOc/Vn+sJ2AQVFBAFQL0JehLNbkAEV7XD69kFcwI+j1+Mnte10nrNev Z66RXvOHjgqlJYhv7IEH5chX0jbPBt2zIy3U27KBohIhZOGwaKyQmVkoltsmF85RzhKVfs7I vLmtHtlhiHkfabcT8IttttqameyJOcv7Ohmwx0ksk/qRIkH2/2UiJGJE/U/3ZzJzP9CMT+Gf o9zK+L6RusvphhSjIM0sKW3W0upbAwssmUIECFCMSNCV1koxjCEGnSxEpfg8o97x7x5ZIskS IkbaUsJSlGJGOFKQIDyjx+EIkTCROwkRjEjGMYwfSN6i0o95R48ePePIzoTsLJSlSlkowgQI X0wpEiQIFzhzijhzryVL0a88L1kXj6sLz0rxseeK5luwYpbJuBGLG5SRuZIZKaSQwrirnOcq AiOdVw5xhaW2lsydglaUpOymD5RcOMVVsML/J/VknO+//QFdkO8xr5x6w54PGJOm48BO4+ST oOGtdLzB//zFBWSZTWSf3cCwAvBx//////////////////////////////////////////// /4CMSOAAAAAAAAADggAAAAAAAAHzl8AAEAQAAAAAAAAAAAAAAABAABAEBNNDJppo0xGgBo00 yMTQ0GhppgIaMmmjCDCDIMJiGgMIzSMTCYgaMg0ZNMmTbSPUPSPU00aaMhoYTRgJiaZTZMmm o9QkwAEwABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGAABNNNMAJiYEYAAACYCMjT BDCNMAAAAAATATTBMAAJkwBMEYJiYABMAAAA/3+qqo0HVT9UYgMQNNBpoaNDRppoGTIyDTIG gGgDEyZGExBhDRkZGI0GgNGmgDJk0DTCNDIAAaNA0AP1TQAyZME///aqpVH/+qqQiVKAAamD 3/7VKlVAAAAAAA0AAAAAAAAH6oAAAAAAAAAAAAAAAAAAAAAADaVVRAA0aH/+9VVSeo0000wj QGmmgaGmmhoaaaaMIZMQZGmIAP9VDQGIM1AGTEaGJgmgZMEyGmIMgYIyAf6VANNADIAE1OT1 BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcXJzdHV2d3h5ent8fX5/gIGCg4SFho eIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6wsbKvEgCrCxBsrO0CF2 tsHbjLgbc3Q67H3l6QI31/gEsHCwyZQqWxC+LjGDJo2cOnsc+gQ5CLJRpMpKmy06jMU5qr+f 1X/qr8VdZ+a2u/VeJAFWFiDZWdoELtbYO3GXA25uh12PvL0gRvr/AJYOFhkyhUsXxcYwZNGz h09jn0CHIRZKNJ+8pKmy06jMU5qr/oAAAACr/wAAAAAAAAAVYAAAAAAAAAFXWAAAAAAAAACr rAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAACrAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAA AAAAAABVgAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAA AAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKs AAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAACrAAAAAAAAAAqwAAAA AAAAAKsAAAAAAAAACrAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAA AqwAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgA AAAAAAAAVYAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAAAZp06dOn Tp06dOkAAAAAAAEIQiAAAAAAAAAAhCEQAAAAAAAAAEIQiAAAAAAAAAAhCEIQhCEIQhCEIAAA AAAAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAA KsAAAAAAAAACrAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAqwAA AAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAA AAAVYAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAABV gAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAACrAAAA AAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAKsAAAAAAAA ACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAKsA B2frWrqaNGrqaNGrqaNGrqaNGrqaNGrqSalk1LJqWTUsmpZNSkmmyabJpsmmyabJpsmmyabJ psmmyabJpvgwhJAh/myBISQkVC5V3QjBHHRjpx/SkPTBqCXshlRSlidyX+kXvzNTIOh2s7z1 tK7xPjaBLcrdgiIFyCm3QOfiHobRxJ8fSRiIj8ZFIS+vfSk6qUT4lbMKTAE2/mwZ/sHgqPtI A/d3VatX/L/wEgEAhN9ISFIASQkNGjR37Ro0eC0aNHh/A7PZ8b2ez2fS+z19n1Hs7nMzmczM zm7u7u7u7u7u7u7u7u7zOc5zd3d3d3d3d3d3d3d3QAVVVVQAHegAAAAAAAAAAAKqqqqAB3gA B4OZzM56nu7u7vdbu7u7u7u7u7oAAAAAVVVVVAB3YAAAAAAAAAAACqqqqqdN3d3d3u93d3d3 d3d3dAAAAAAAAgCqqqqrrgDuQAAAAAAAAAAoBVVVVV4tAO4AAAAAAAAAACoCqqqqrxKgO3AA AAAAAAAACqBVVVVV4dSq7aqqqqqqqqqlVVVVVVVVVVczMVczMzMzMzMzNbzMxV1lVVVVVVVV VVVVVVVVVVVVczMxXMzMzMzMzMztmZmYrrCqqqqqqqqqqqqqqqqqqqq5mZmLmZmZmZmZmZ2v MzMxaqqqqqqqqqqqqqqqqqqqquZmZmOZmZmZmZmZmtZmZmYxVVVVVVVVVVVVVVVVVVVVczMz MxVVVVV1pVVVWqqqqqqqqqqqqqqqqqqq6+vr6+vr6+vrvPMzM5zAADsABmZmZmAAAAMzMzMw AAABmZmZmAAKqqqdXOc5znAAHgAAzMzMzAAAAGZmZmYAAAAzMzMzAAKqqqnVzM6ZnMznVnOZ znN3d3d3d3fA3d3d3d3WZmZmYAAAAzMzMzAAAAGZmZmYACqqqqdXOc5znAAd8AAzMzMzAAAA GZmZmYAAAAzOZzP7uZzM51ZnOZzN3d3d3dAAW9XOc5znAA70AAzMzMzAAAAGZmZmYAAAAzMz MzABVVVVU6uc5znOADvAABmZmZmAAAAPV+ZzM51c5znOc3d3d3d3d3d3d3d3dZmZmZgBVVVV VOrnOc5znjd3d3d3vN3d3d3d3d3dzMzN3d3d3d3d3d3d3d3dAAAAAFVVVVU7zmczOAHdgdgA AAAAAAAAQBVVVVV1wB3IAAPR8zmc/c6szM506dOnTp06dOnTp06dOnTp06dOnTp0AAACgFVV VVXi0A7gAAAAAAAAAAKgKqqqqvEqA7cAAAAAAAAAAKoFVVVVXh1QO2AAAAAAAAAACqgqqqqq 8Kqg7UAAAAAAAAAAKqhVVVVV4NVQ7QAAAAAAAAAAKqoqqqqq8ZVVHUAAAAAAAAAAFVVKqqqq uxVVTAAAAAAAAAAAqqqAADsAAAAAAAAAAAAKqqp4/mczObu7u7u7u7vY3d3d3d3d3d3d3d3d 3d3d3d3dAAAAAAKqqqAAO/AAAAAAAAAAAAVVVVAAO+AAAAAAAAAAAAVVVVQAHegAAAAAAAAA AAKqqqqAB3gAAAAAAAAAAACqqqqoAO7AAAAAAAAAAAAVVVVVQA7oAAAAAAAAAAJu7u7ugACa A7kAAAAAAAAAAKAVVVVVeLQDuAAAAAAAAAAAqAqqqqq8SoDtwAAAAAAAAAAqgVVVVVeHVA7Y AAAAAAAAAAKqCqqqqrwqqDtQAAAAAAAAAAqqFVVVVXg1VDtAAAAAAAAAAAqqiqqqqrxlVUdQ AAAAAAAAAAVVUqqqqq7FVVMAAAAAAAAAACqqoAAOwAAAAAAAAAAAAqqqgAB4AAAAAAAAAAAA CqqqgADvwAAAAAAAAAAAFVVVQADvgAAAAAAAAAAAFVVVUAB3oAAAAAAAAAAACqqqqgAd4AAA AAAAAAAAAqqqqqADuwAAAAAAAAAAAFVVVVUAO6AAAAAAAAAACAKqqqquuAO5AAAAAAAAAACg FVVVVXi0A7gAAAAAAAAAAKgKqqqqvEqA7cAAAAAAAAAAKoFVVVVXh1QO2AAAAAAAAAACqgqq qqq8Kqg7UAAAAAAAAAAKqhVVVVV4NVQ7QAAAAAAAAAAKqoqqqqq8ZVVHUAAAAAAAAAACqq65 sWrCSauwAtgBbAtAJbAC2AFsALYSWhCWwAtgBbAC2BLQJLYAWwAtgBbCFoSS2AFsALYAWwC0 AtgBbAC2AFsJJaELYAWwAtgBbAktAlsALYAWwAthCWhJbAC2AFsALYBLQLYAWwAtgBbCQtCW wAtgBbAC2BC0LYAWwAtgBbCBaWwAtgBbAC2AFsALYAWwAtgBaWwgWwAtgBbAC0LYELYAWwAt gBaEthIWwAtgBbAC0C2AS2AFsALYAWhJbCEtgBbAC2AFoEtgSWwAtgBbAC0IWwklsALYAWwA tALYBbAC2AFsALQklsIWwAtgBbAC0CS2BLYAWwAtgBaEJbCS2AFsALYAWgEtgWgarVarp06d OnTp06dOnTwunTp06dOnTxzAAAAAAAAAAAqqqAADsAAAAAAAAAAAAKqqoAAeAAAAAAAAAAB4 7znM5nOczM5u7u7u7u7oANAAd+AAAAAAAAAA//F3JFOFCQOIffyg --hcut4fGOf7Kh6EdG Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-trace-generic-048.txt.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWWQf160Gf7TbgHyQQAP/9wAKv+3f8GDJ/wAAAAAAAAAABAAAAAAAAAAAAAAA AAAAAAABD3wpnAAAAAAAAAAAAAAAAAAAAAHfV8XjtY0dHTrSQ2YhWw6cduzu23bTdmzdcZ86 N4eGvXO6baqIiWhudw7sdckm2yRSttztWVY3PLw4Txo6rd25qKLZ3aZk7jp05TWzLjsJ4jDw eDodNAKAA2wG2BWtdsSASu6rG023M48Fg8XugAAusF2zduokU6NsaA0AC05ps23PMcQQ8PLj Tq7to3ddnZ0bMd3Dbuu7M3A7sIzjzxDh4Obb0JNsdsJHbFCuGx11k7ZUmczwmDw2vVUJu7q6 Cml2YhZhzGdzLZGmg7sbmeCDw8MHptourMWmjbU7O4RZGQFAdlXVs6TwLhwwHoCgOjTLQGgD QLbRdsnTIu42orc7TtVkLY7uXFbNSwZVa2WpqtNqrG0dw12ZZZ2s3dcONBDZbt3a4eeLcPDd 4m8PDePE8PDOFw4e8Dg444eeHi8ABKqf+2wMP1UqqqjD1QwCAMgYKnhpmqpVKDTEGCYjIwga Yqn42kapVQ0SAAAAAAip+2iJqVKNFGUyBoAA00Aqf7UqaqoYJtEaGRoAADEEiASSpAUxqmp6 aamT2pP1MjTTT8gAAEL+/+X8/71Uuv8v71aEkkf3/oJAkhCj/cQi5/ykSEJCE2JAkhC/6pCQ kITBIEkIX9z/RDSSQkIX+x/qf/IgX/MEkJCF/rCQIQCCIhJIQiAaASQB/0EgTQIYJIaBDSQh oENCTQIYJIYhDBJDEIaQkxCGCAYhDQCGIQwSQ0CGkkxAhoEMQhgkhpIQ0kAxCGCAYhDQgGCQ 0gBgkMEAwSGgQMEhgkhgkMEkMEhpAhgkMEAwSGCAYJDQCGCQwSQwSGCSGCQwE0JDSQk0JDAA SBiSGkISBiEAwSSABoSGgEkj/Uj/2QAkhC/7IASQhR/6+/sB/Q/zEkl/hAAQACP8AAj/AAIo AEf5AAj/AAI/wACP8AAjwAI8CSPAAjwAI8kkliQBIkJaCSIBJGpIRqEtBJFgkjUhLQQHkAjw JI8klyBHAkjkkBwIDkIDkgDgQHIEHAkjwJI8kCPAgPAgPIBHgSR4EkeAXkkJeBAcgSOBJHJC RwIDgQHAgNBAahIPAkjgSRwJI4EkcCSOBJHJAvIQB5JAeBAeQgPAkjyQiQEBIICQEBIJI8CR yAMF/5JL/e0k2km0k2kNpKGkoaSbSG0k2km0lDSUNIbSTaSbSTaSG0lDSUNJNpDaSbSTaShp ChpJtJNpJtJQ0lDSTaSbSQ2km0k2km0htJNpJtJNpChpKGkm0k2kNpJtJQ0lDSQ2km0lDSUN IbSTaSbSTaShpENJNpJtJNpDaSbSTaSbSTaQ2km0k2km0iGkoaSbSTaSbSbSTaSbSTaQm0k2 km0k2kQ0lDSTaSbSE2koaShpJtIbSTaSbSUNIUNJNpJtJNpDaSbSTaSbSE2km0k2km0htJNp JtJNpChpKGkm0k2kNpJtJQ0lDSE2km0k2koaUNJQ0lDSTaSbSTaSbSTaSbSG0k2km0k2JQ0l DSTaSbSTaSbSTaSbSTaQ2koaShpJtITaSbSUNJQ0htJNpJtJNpCbSTaSbSTaQ2km0k2km0hN pJtJNpJtJNpJtJNpJtIbSTaSbSTaSbSIaShpJtJNpDaSbSUNJQ0k2kNpJtJNpKGkQ0k2km0k 2km0lDSUNJNpJtIbSTaShpKGkJtJNpJtJQ0iGkm0k2km0k2koaShpJtJNpNpJtJNpJtJNpJt JNpJtJQ0lDSTaSbSTaTaSbSTaSbSTaQ2km0k2km0iGkoaSbSTaSbSG0lDSUNJNpDaSbSTaSb STaSbSTaSbSUNJQ0k2km0k2km0k2km0k2km0lDSUNJNpJtJNpJtJNpJtJNpJtJQ0lDSTaSbS TaSbSTaSbSTaSbSUNJQ0k2km0k2km0k2km0k2km0lDSUNJNpJtJNpJtJNpJtJNpJtJQ0lDST aSbSTaSbSTaSbSTaSbSUNJQ0k2km0k2km0k2km0k2km0lDSUNJNpJtJNpJtJNpJtJNpJtJQ0 lDSTaSbSTaSbSTaSbSTaSbSUNJQ0k2km0hNpKGkoaSbSTaSbSTaSbSTaSbSTaShpKGkm0k2k m0k2km0k2km0k2koaShpJtJNpJtJNpJtJNiUNJQ0k2km0k2km0k2km0CbSTaSbSTaSbSTaSb STaQ2km0k2km0k2kNpJtJNpJtJNpJtJNpJtITaSbSTaSbSTaShpKGkm0A2km0k2km0k2km0k 2kJtJNqA/wCSEhCZYv4bQDaAbQDaQCEIUIoSEJCFxCAEkITDr7+P4/v//+/n27uf5/6d/Xv3 7d3uecmf0MYr/7//gCPf4+u5nveb3vUzz3Jne97nnJn9HsYr3gI8fVMz3erzmtenkxzl85uZ /d9jF+qqXfvT/H1TM93q85rXp5Mc5fObmf3fYxfqql370/x9UzPd6vOa16eTHOXzm5n932MX 6qpd+9P8/TERzV7vWq36e+5Peu95PP3axi/VVLv3p/n6YiOavd61W/T33J713vJ5+7WMX6qp d+9Mfn30RHNXu9arfp77k9673k8/drGL9VUu/emPz76Ijmr3etVv099ye9d7yefu1jF+qqXf vTH599ERze75e91z3e7jnL5zcz372MYv1VS796Y/PvoiOb3fL3uue73cc5fObme/exjF+qqX fvXU/Pvpme7243u+e73cc45zcz368Yxfqql3711Pz76Znu9uN7vnu93HOOc3M9+vGMX6qpd+ 9dT8++mZ1ptrV1Xojk967znKqPmMYeu78eXU/Pvpmdaba1dV6I5Peu85yqj5jGHru/Hl1Pz7 6ZnWm2tXVeiOT3rvOcqo+Yxh67vx5dT8++mZ1ptrV1Xojk967znKqPmMYeu78eXU/PvpnOWm bmfd7uOcve9zPcYvOc36qr1+8up+/zGLzM97ze96mee5M73vc85M/o9jFe8BHn6YjOb1eaiP d7uOcre9zPcY9nOb9VV6/eXU/PvpnOWmbmfd7uOcve9zPcYvOc36qr1+8up+ffTOctM3M+73 cc5e97me4xec5v1VXr95dT8++qq1ptrSq9Ec5xrWpnmMM5yTL1+8up+ffVVa021pVeiOc41r UzzGGc5Jl6/eXU/Pvqqtaba0qvRHOca1qZ5jDOcky9fvLqfn31VWtNtaVXojnONa1M8xhnOS Zev3l1Pz9VVnLec3M+730963vdV3GGc5TMvX7y6n5+qqzlvObmfd76e9b3uq7jDOcpmXr95d T8/VVZy3nNzPu99Pet73VdxhnOUzL1+8up+fqqs5bzm5n3e+nvW97qu4wznKZl6/eXVVj+qq w47rSq9EcuohznK799eMQmZev3l1VY/qqsOO60qvRHLqIc5yu/fXjEJmXr95cz9/TM4bNaVX ojl1EOc5XfvrxiEzL1+8uZ+/pmcNmtKr0Ry6iHOcrv314xCZl6/eXM/f0zPs+5729+u4jd13 re7u4xjGMQmZev3lzP3+YvOZnu9a1mZ36ezPOc5XeVX6PYxfvAR6IiPZ973d7VURv1d63u7u MYxjEJmXr94VWP6qr2ec97e/XcRu671vd3cYxjGITMvX7wqsf1VXs85729+u4jd13re7u4xj GMQmZev3hVY/qqvZ5z3t79dxG7rvWru+4xjGOoiHq94VWP6qr2ec97e/XcRu671q7vuMYxjq Ih6veFfVVV7POe9vfruI3dd61d33GMYx1EQ9XvCvqqq9nnPe3v13Ebuu9au77jGMY6iIer3h X1VXsb372vVXe6qeczMzzGMYxyu9773veFfVVexvfva9Vd7qp5zMzPMYxjHK73vve94V9VV7 G9+9r1V3uqnnMzM8xjGMcrve+973hX1VXsb372vVXe6qeczMzzGMYxyu9773veFfTPvta97e 0zEbnnMTM7xjGMb9zle973hX0z77Wve3tMxG55zEzO8YxjG/c5Xve94V9M++1r3t7TMRuecx MzvGMYxv3OV73veFfTPvta97e0zEbnnMTM7xjGMb9zle973hX0z77Wva1cR3vp5zEzO8YxjG /c5QXdz9/vvqxUe7vWtZmd+nszznOV3lV+j2MX7wHp/u99973tauI72Pc5iZneMYxjfucoLu 5+iH2tNaqI71POYmZ3jGMY25ygu7n6Ifa01qojvU85iZneMYxjbnKC7uYhrLOaiN6RzmZjf3 3329ucku7u5iGss5qI3pHOZmN/fffb25yS7u7uplvWs5qI3pHOZmN/fffb25yS7u7uplvWs5 qI3pHOZmN/fffb25yS7u7upnbm961Ucyje+91+n77e3OSXd3d1M7c3vWqjmUb33uv0/fb25y S7u7upnbm961Ucyje+91+n77e3OSXd3d1M7c3vWqjmUb33uv0/fb25yS7u7upnbm961Ucyje 897v9P33OO9ku7u7qZ25vetVHMo3vPe7/T99zjvZLu7u6mdub3rVRzKN7z3u/0/fc472S7u7 upnbm961Ucyje897v9P33OO9ku7u7qdN61mu7w7rVa73n6fvu9RCV3d3dYxi8XPo3rWs1W/T 2Z5znL7yq/ReMX7wHp797BmubxxrU673n7333e+iPSu7u7qdN61mu7w7rVa73n6fvu9RCV3d 3dTpvWs13eHdarXe8/T993qISu7u7r/TpvWr1ccyjV5iN/q++5yeyld3d3X+nTetXq45lGrz Eb/V99zk9lK7u7uv9Om9avVxzKNXmI3+r77nJ7KV3d3df6dN61erjmUavMRv9X33OT2Uru7u 6/f06bzebjfWbx3uv1ffbqeyld3d3X7+nTebzcb6zeO91+r77dT2Uru7u6/f06bzebjfWbx3 uv1ffbqeyld3d3X7+nTebzcb6zeO91+r77dT2Uru7u6/f06YvFxrPGrzWv6v291PZSu7u7r9 /Tpi8XGs8avNa/q/b3U9lK7u7uv39OmLxcazxq81r+r9vdT2Uru7u6/f06YvFxrPGrzWv6v2 91PZSu7u7r9/TvbN5vWOM32tf1ft7qeyld3d3WMYvFz6N61rNVv09mec5y+8qv0XjF+8B6bq da9m83rDua7Ov737e6ns+ld3d3X7+ne2bzescZvta/q/b3U9lK7u7uv39O9s3m9Y4zfa1/V+ 3up7KV3d3dfv6d7ZvN1vPWs57W/6v3OVMSpd3d3X7+ne2bzdbz1rOe1v+r9zlTEqXd3d1+/p 3tm83W89azntb/q/c5UxKl3d3dfv6d7ZvN1vPWs57W/6v3OVMSpd3d3X7+1pi7nWOM+1rtc/ q/d7Uz71eu7u7r9/a17F3OscZ9rXa5/V+72pn3q9d3d3X7+1r2LudY4z7Wu1z+r93tTPvV67 u7uv39rXsXc6xxn2tdrn9X7vamfer13d3dfr/b37OCt5732cxW/6v3OTM+9Xru7u6/X+3v2c Fbz3vs5it/1fucmZ96vXd3d1+v9vfs4K3nvfZzFb/q/c5Mz71eu7u7r9f7e/ZwVvPe+zmK3/ V+5yZn3q9d3d3X31/b374rXI9jHa1/V+3UzPvV67u7usYxeLlG9a1mtejkRvd85uZ/drGK96 7u796T9ete+J1z14x2tf1ft1Mz71eu7u7r76/t798Vrkexjta/q/bqZn3q9d3d3X31/b374r XI9jHa1/V+3UzPvV67u7uvvr+3v9dznnOs57P+3vczMlLu7u6++v7e/13Oec6zns/7e9zMyU u7qpv6/t7/Xc55zrOez/t73MzJS7uqm/r+3v9dznnOs57P+3vczMlLu6qb+v7nOfXc97DHe1 /t73UzJS7uqm/r+5zn13Pewx3tf7e91MyUu7qpv6/uc59dz3sMd7X+3vdTMlLu6qb+v7nOfX c97DHe1/t73UzJS7uqm/r+jve4u1zNYxERf+5zl1VF3d3VTf1/R3vcXa5msYiIv/c5y6qi7u 7qpv6/o73uLtczWMREX/uc5dVRd3d1U39f0d73F2uZrGIiL/3Ocuqou7qZivq+7zl4tURMZz ERX+73tVQu5iO/TicT03rWszr0ciN7rnNzP7tYxRd3d+9J+uOc5i5mIRnMRFf7ve1VC7mI7P 0/c3d4tURMZzERX+73tVQu5iOz9P3N3eLVETGcxEV/u97VULuYjs/fTjm7vObVMzOczM1/u9 7VUBUzFffVjuzOVVMzOczM1/u97VUBUzFffVjuzOVVMzOczM1/u97VUBUzFffVjuzOVVMzOc zM1/u97VUBUzH1YxWe7M5VUzGMREVP93tYqgKmY+rGKz3ZnKqmYxiIip/u9rFUBUzH1YxWe7 M5VUzGMREVP93tYqgKmY+rGKz3ZnKqmYxiIip/u9rFUBUzH1YxWe7YxczMzGcxDk/3e1iqAq Zj6sYrPdsYuZmZjOYhyf7vaxVARHarGKz3bGLmZmYzmIcn+72sVQER2qxis92xi5mZmM5iHJ /u9rFUBEdqsYrPdsYuZ1MzGtahyf7vaxVARHarFYqIb1rWZ16ORG91zm5n92sYou7u/en+GE 97jCq1MzGtaiuT/d7WKoCI7VYxWe7YxczqZmNa1Dk/3e1iqAiO1WMVnu2MXM6mZjWtQ5P93t YqgIjtVjFZiOM5vNVuqrWtahyf7vbxVARHarGKzEcZzeardVWta1Dk/3e3iqAiO1WMVmI4zm 81W6qta1qHJ/u9vFUBEdqsYrMRxnN5qt1Va1rUOT/d7eKoCI7VYxWYjjOcTOpmY3ve4dn+iK xQCI7VYxWYjjOcTOpmY3ve4dn+iKxQCI7VYxWYjjOcTOpmY3ve4dn+iKxQCI7VYxWYjjOcTO pmY3ve4dn+iKxQCI7VfViI41rWZncRM73vcuz/RFYoBEdqvqxEca1rMzuImd73uXZ/oisUAi O1X1YiONa1mZ3ETO973Ls/0RWKARHar6sRHGtazM7iJne97l2f6IrFAIjtV9WIjjm971M83E a1rUOTP6KxigER2qxWKiG9a1mdejkRvdc5uZ/drGKLu7v3p/j67qqjm971qt+ns73e96mf3P YxXlUu/en+PruqqOb3vWq36ezvd73qZ/c9jFeVS796f4+u6qo5ve9arfp7O93vepn9z2MV5V Lv3p/j67qqjm971qt+ns73e96mf3PYxXlUu/en+PqmZ7vV5zWvTyY5y+c3M/u+xi/VVLv3pk k/sgBJCFB/qkkhIQv9UkkJCF/zSSQkIUgJCSA/mgQAghJJCQhf/RKSSSEIX/I/3AAiwSRKBB 5JCX+YID+EkB/3oGkkPRpMZCSBCQNoQkCqqz/T/T/IAAAAAAAAAAAAABttgAFmyqqqqqqqqq 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 Ynpkv1ZvkCSKSBFVGE7Li/ezSNeZPSvMN9mWvZT93m8RFULFzp35PGd3Ose+MuHbZ9DJaKis IjLyYJa90GxGNYxbMJS2yHcTd9tHTyX30HehNi3IPmU1WvPdjyqV1fUeRPoNb31F+vJn3ZNv FArdUMwzKteuGNV5ZPPPeM8S15bUOqryW6T9uEw9p7sdbmcn1ZWd7PeqM2rm0IEhAYCAhj2I ro6d4vd90ZBXZ7L++ncyRlnqKmGs2BU4+gh3udztY1XoXvotilqGQNGT88602pZ9X0qajmvN Y6aPrjK9vvlslWW7r9Xq7dPFYsLj+ReWbV6/XO163VVNTdq1my+HMho463eJfatj65F9WXV3 +LpzvY6PtS+UXD+2twNW+eY9bwqy9wz1t1Pqkq/U9k8ZszU4QYCA+RDtmNKG3LuoQ2UwmbWd h0ac7avskh79B8zm3rxrmEs9RFsr7Pi/bjPuKoozJc++Kn6tT+0qLD5jeCIu0cURelQ9HCbv b4v1HjHvn7dvtgraq2m/U6bHg8Wef4y0kqvkjK1Vrlcm89566xXzo3sq89JZnaPcdWP0V8lv Kpf7LstlQm87hJUSvahuS9uOu+s2yc6352gEbWT1VThjgn2YxTGtKUnn7vH48JZc2rmVd7x5 zxjy1bbyrft22ug4/W6uhUqHVeedFtz9ivF7Z90VPnb+XzS+ZVwoYpm/ouPu0KffQtZLRjVN U1W+1wyS+vrt9ev27Cqt6dnZzKfGfaQevYrb0jeir0tl7JObXqj3erASR8eaFDRLLfr9WY+r t2PcfXHo6rgwj23WjzrQL6O9vKMyk3NivLlRnnmLPUd3aUd3P3xeQVUAvmY7v7XxYDYsqEQ1 DUNXnzjqSllvmoaTfX99nX09o/Vjc19DU1bNQvH/P99NpHBe7fo9361iXs9eKvavO1he+x+P YWvl0azK9ohzmqr9+/UKs60PkeVmm1kP5dl07rL/G1891r0kEr9U+yGeN+1wuy23J1+6ZfbX 2dZX733q/IrgxBFRHRDI+imFtWzanaOe7BvbnZkP5l+h177xXvOX9ivq8r/J67laXB37VQsP DXc3XwO5rvwsRl0L7k+rc3O4GuSe1tv5+771z7jvp7soDN+lO0ufYlhg1uccrl2i5Gk1u02u 0pmx6V52VVfvi6XHnWV9shFx5m9Es+dvWbuSresjK2VQU6zemh83m0rTz6/osZt/Sb4Er3Wx 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 5iZO3pN28X08i3dUxU7rIyX9dcsVR1L2+tW765dU7Vu5i/Vy37RH3TiDryC8hW3uSrZTv5z9 s2GfNzMtS8ZrUsmz7XNLxj9Pj1YvoY9E03L22nWq90oFpZ0pyUUq3UTIhvDyS7yz2V3r9uM9 V3UmZ7OyZsd74ntAuV6KvRsre2u3k+a3tPUqSbWOr0O1brrxguvrPbl7uwy68PupQpFeqI+e sFvIxTXXnnq9V8Ve72LsFrVTPN8N3WN5u97sZb25rujbq3amBspVEVd56J3rrH44g6jodzI6 L3NZW5eK79cWzeMDu3Pb7BN7ecWFuleEVJHszRuU8WSU6N3cilC2o+vh7fkb1pOZnXHRVZ49 Mgu23vNFa5d1F7odc8oSrR6s3fOerY1au+KenNovFfer18ebyUUrtuZqXPZ5yHpm+Lprtza9 xTQevCeVd7Zw+RpLpPZeF9mY5QVV56uvbo1rpUV+3S7LqJPVRrno1Wesgq7uw7te0s8+lQ5k 3yKfPXqoVa69xWrh9HVZZvVV/K8Kqo+u432bWwmaXGcok657OoASQheBAkID8kgAz/jQCEQh LASRYIDASRwJI+SEfAkjM/n/X+tJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJNtttttttttttttttttttttgAAAAAkxtiX+QAAAAAAAAAAAAAAAAAAAI5IJQAAEACqqq qqrvve952qqqqqqqqqrve97ztVVVVVVVVV0d73vt0B7ttgAAAAA7u++4AAAAAAAHu999wAAA AAkkkkkkkmNttttttttttttv+/6vvvtSX9YH8klVJsA/poBu9Vf1kAN0DgMzM2BElsCJKQPA wAYGwCAbAIBsAgGwCAbAKo3ekgBuhmZhwGwCAbAIBsAu7ACJLYESUgA+4A3QOAB97pJJJJJV SJJNhqS9vcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJJIAAAAAAABtttttttsQDSSbgAEkk kkndPfvfvWvf2+9TpU68O3rt/MLdkTZFH9PtnXrJZuxL30B23j/cLk47Fj9bLDJLj+WX9fOZ bvmGcpauu6bmpc/BMW9zPu4JddDahluXU3Id9Gdc1vnL7bobKe17KLdVGXnW2+z584Z5ksbC GQ1Rux2YRRumfRjNdNS8adTlBX0U8+955mEs8OWsqFLP7XH7OkzYR0/VsH35++6vrmLXoJyH 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 ri2U6j3PG+BLTlQOnzc8jyeod23FfbuMmJS9qiR0+N3Z7U3OlzM7gW37bl0twdPM6+0qLPLW pytOZVzNoU0oF25m0Guqv73vCSELAPAAj4BH3xQ/OSZm5ma9BfuKtl6UrXy+jxuF1r9q3qvg S7yM0VLlj6PevuOVNpKs3mWnRki8peT0iqr9qG7bZpsyvLyO7vMD2uevNOp5l2vbXZJjolG+ Tt+q1uWzS1fDD2SLPRllLz82JU+apJ5SmG07s7c1arVzSoqu6uyd+pe/lazxf2/WSntvZ8br HbdXKKku7w67pgkj8Ajdzx89Iv67mu9e9utZnT9Hq9t5kcTj4ZS5156uz0XksZcliMWJyrKb 14/CGbt32U9fp27t9ekOUkueAeFnTXQ9MVJi4nl5j2CeXvpZyqsvNm3XtH3dnJJHnuI1Xi3N 2tJvk1yXWYGoQvHeqZS8va/bwgMWYJKTusI1V2TJue2mVVGJseRkJxvXetiSDx3bvuuqisu6 ABHwCJrG7upqqqo+uPXmR6HP2P7Vec+zIdJT92J08PNS5vRtQBFoAARYhqut0yAhAF3mZMuJ c8cjWezHPGnQ2FlwFfZr9u75wcRXtqLZXklqzdlW47IOKbkT245fNN0CH3uzsr1VVyD1xX6h 5JXoledniy/LLpPr7rfYerrjfevd49j94AEfJIKj6vHncl3W2TXits+uzzvCs8wtYv1P6tSF yXc83Ooqwq+QF+HN7yve1VrVYPyfbx1YlnjV6CfOD66Tjx5dUV+786wpdTVihvtl70vKV0+9 m9jTkxsZrjkMJ3sWlPzx61neqI2iX51WVUHV2bS3qy0kkvkkE+xd9XvvVv3d6u55m/dr0j5o NG85A9yFJasdmyeB1cTu/da7w36vVturtVb7xnqWaaSEz7BSXnlar3Qy950UrdyT0y0vPLq5 nZc2qMi5vIL15c6tUt8VmydZa6rNl9CSd6r7a0dTnpfc5jp7t3K8xJJfJIJ93xovahL7Y5ud V/XnvYqu4Ql1rpe2be4VcX9qH4/VeZLn3Nv67z6tHfyvg12ef3ziS4okq/s2rIJX9vsc+SF8 CCjKlbLvczubd36tH+vhdit6Cb7i82diXjvS4qazav1+r2Vt5LYopMjYV1+yrv1b1zkyyndQ fP9feVejw3Jfaw8iKLqbgiercSzk1Vr0p2Vr9q3afYusv1Xw0kWWeq92/MexrjtIPdC7WtVn r31dsPF5ynbhbvlnvCFszOjYgrtPXK7PevxOSzkY95XDu9yR561mHvdpnZ5qXvWYndKlASbz XvhLLu7lXbDGll4t8s7UK8AnRbbzyO8tMPLYbvFZWbaq8cH5innWjXu7O3j2bpxVZma+2cum STfVjpzWm8MuN+9mXNboS0qdvYTsXjhDzAqpM8/dKlSqTlSbd2pmb5vn3P3cq6qzzkLqrPZK 3PR1kiFfpi7J2Dj2/ctUq0jitqijaONvXVrKnet0qwVYlVRJ8+7d6/K25j911552xt+mipze c1R1HRRPrjXr38hAl7+/GgAiwARAkJeBJFggPIBHgQHwJI/ukhCQhf0Rbbbbf94iIiIiIiIg AHAAAAAAAAOAAAAAABJJJJUkkkkl/sAA/2tttttttttttttttttttttttttttu22Nttttttt tttttttsAAAAAEkkkkkkpAAAAAAABIAAAAAAAJAPi22222222AAAAJAAAAAHdttttttmYJV7 9/En9tSX9oH9ElVJsA/jQDd6q/rIAboHAZmZsCJLYESUgeBgAwNgEA2AQDYBANgEA2AVRu9J ADdDMzDgNgEA2AQDYBd2AESTEjd0EkukSSbSUSSXT0AAACqDd3e5J7u+3uYAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAkkkAAAAAAAA22222222JJdu7vcJJJAAAEh7773r8V3qEVOHTYtqdm xXV/4z6/ZW4930js55plYU9fuyhHO8i8/PW62pC6nvCdrwF0q87wliOV+2jqd7NCyuo2nnuj zNvS78GbsXP2cqurlX3lWeynU5Dk2KW09rOeqrxePVPz71rO1pKc7tVe4i9iSgiAID4SC99E VZ0Tb+d/b9UZVznTGd9R71eXk7KSXvbfZbMz1ryRXGc5YyXotSmSk+9WG7OcChF5G7zY063f T87ui1ZR7LksSqxGbNNjwSudvSXi1ZlD32hDzKF69LmHkzbdDtxmbjM3a20h1j9J3jHfnZFz eW445xx2mzlZE4TGwY49Sl0wQHwkER6pc3E/feyJd2/riW/iMy3EEpOneWZvZ0yXiWaut3nb r10qtYVr0v1pteVrEN97cp1ipKuQFx0/U7Mp0h3dm5jnX3JZ1ZemEq86nUyb/HIDqHe38gmt 2fs6c2qvd2KnM4jrQID8AiPZ21UU6d5PlHPAVMLGfb9jlYdJLtuo3b0dNalAPI1qMx0VwOuW ZNrLjfuyW4Ai7noW4UAIPXkr2ZqfOd7Mh+lPpMzqZDSzq3C7Ul6a0z2ex/q1VXK0S+tDzIN0 EkfAI7Z5kzM3J9cOnrxxU1UM5029Nsk2R/TL+nZclW2UHN15y6lbMGpVuzbf5sTTbEUkdkk7 vd2al3udZyWrVa8+9mYsbK9OXqfVr1PQ/FIvlvec263b5s2DpmzDaJ3P3LvIxxV3lAvcg5dZ 2PzPdBcnZUVnHcyI6Cej3oOkSR8Ahw8fd0O7+yK+iIyJplSpdVE/XEH1y/VnPiUL3mtUu6ir TrdPDtu2nClO2EX4vjCAHMrp55u7Wyl55auOeulaSoukul1mztX5pZdCVFbEU7UnrnpFnb3b jhhWs3DJby6I893k8j5Yq91vENq/JSOrNvL9KBJfAId0PRh0R9uP7bW39oYsUnxtXZ7Hu7Df 2NUk0FSu/bqb0zGWM8vbsbrLFWm1CrT/Zcqe5/pfVi6XDlKTTo1cbvq7xGt327qPZVt5a9Er 8rusz0UZ1TCrecRl7GVWvYe97x5xyAPkkA681F5el4/t/S/lSlr70xBKvye2ZQ5frzkrObo0 kipXl4R9crKsv1u6NvQyXddRXt6LZeNb4vzvDBSy1KawbeP953bvmF7zeQQy3kyyrM92IqG+ 02e9PTOuKN13Vdb9ewOM97anoMl5u9O84jvkkHZkQjFkdqz7Ex59N6Hvlr8IuBKbt+saizNt dT7Kp7Tp4ZcJObLnLMu5RlhqLS103WGcvTE3BYM71LAybgvbjRoMur8YoeGr9SMiqaa55KtW cqU85u5mpX7h4iiLs7t2memS9tJ9T8uF4j8wqZ7KJoHHr9m4t7HM6TnX2+75JBfx773zh/tk gX+f8P5ky7a/FXSqzFT/gS+xX/Nnyn41zMyl5bdPFYndRKMz4Tn53kuE+X6XF8S6Gq+NubuG ++e3+7EXkVJroqeJ/PY+qgs22bm0tsu/basT+x/j8yXT2t9RVZuz0QjoZmYw89645DIG273o e02e/K+zu0KrMvF5JditqLwmVXUDtSuXLzaamT3cJicSP16kteeORF52XUrbr3qt+WHHr70l ed7vTPRQnc5eJ2T1bku+vK8qd6tukyOrci9Hzuo9Va+mT2XdOb2bFTfusWiu5lX1w2tO4XLz q+Dlqu6dCBXmy/Ud2TLwvMPB6ePVN4WTtr3VWLNfBsdgbKj3rsst7Hs3q71kXWuRtxDHLS8d 6OU+e01XL3b5PZakoPexYy273+y35L7vdbv673NpK7L02teVc2NqPOW1708k1XlkaK+ZlLcm vuf40Mfhetv2d15XtSNuY9dSX4ojfNefYdy271yRecpae8K63POh1m9JzL1pY6PxPc9LdYco umHbrWwOt3t9jnD9t5nXK7Cte74lxNEZHRVWtI5nXa6zMrCLH28cpfFRv2LxyLvyXS6jWLPW lGjd865LIrV1LuRc9jd4P3bjiS7pXbXjz3XTS1uvOu27F0+uH/AkhLVwAIsAEeSEvIQHgSRo IDgSR5AF3/T+f9Kqqqqqqqqqqqqqqqkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkmAAAAAH+W222AAABGEI2AAAAAAAAAAAAAAAAAG2Hfdu92AVVVVVVVVXe+7vVVVVV VVVVVXe93eqqqqqqq6ABXe7vqqqqqqqqqqq993vqqvQAPdtttttsAAAAAAAA22wAAAAAAAAA AAAAAAAAAAABtttpJJJJJJJJL+kn8dwH8Af0/mBVGpJNgD3qr+Ikk2GpLkkoBsAgGwCAeBgD SWwIkpAiSkCJKQIkpA8D7pEkmwzMzUlIESUgRJSBd2ABsAgGwCAA+SSbDUkm990kkkknoCSS 5JSJLybgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkkkAAAAAAAA22222222JJdu7vcJJJAAA Eh9996u51/Xq1jVf5UzMt4p9Noi/bweust7DLrKy19iqur+TnPU/xS0+X7q1Z6YVmw5eUp0k XQeNeW6uRMApBK+q7v6pdSw9j/XhCt2ymsjeo99BrMazYXt8df0P33EfQFXX6XSyTAQuP30k vEHARKtFlLMoHm+yit7Zr2NTxe3Wt/bjONuVrVtWyHNwi6d1X0ZVO6e598g99gm6Xopf09Xx dd4lwRL9U+rxPOC62aytz3rl0UTFfkkH5bffx1TSL/UilTpPF99v38vS3/De9g8OL5cVfqzd y7tMRWJLXfWlJlp9zH98Kqdl07p3+Yvyx79ZMu0nHNDaY7d1fm+li+v2pJW6+2/GU4sS3vs7 dddm7pe93qLqWYjzsyCWY4abhjqAtlOvT9fUTz018yGc/mT3pRjxlzHNQOmVVx6dsCtqUU6v 4+qUeV/diXt31Oh0q2ipy+207qy3V9En7IVye0XOHlFdtV0zoX5mVpe9Ozv4ffv1UI+R9oS+ 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 vbq+q7NcvOO7UehVKO76+8ZoJI/CQH33dfutxdRN10/XUut3Tuytt0yqr73Zi4nuq4yIn9T+ yfYV7Ec93Ou1TCXdRT96Y6Z2w5qHrp802W6ouUQ1HZFddPLIvYFzMy5btmMPmXeMiTH7e0+l Pd35ffVv3vnvb9JpnuMst6HpY2MxyydJ+QplrElUbe3pSyyQ6b7N8liRdZiAWdUvPV2ryRVP 0OyuwNu/AObTVdlXe9lXmzubJDt5HG6CS/CQBHZvzJ9Qvril98yBeG7Xs+9kxUtzbqT2Ve+v C6Zc93h4ebp5ZHqG97c9qrlt9+vrCJpfyWecP307zvnzqIJZDl26ZzJZdkW/TeuL34lmkOmf MPM1g3zLevXl1Kz2H1++6pr7ytw9ZjVPzt225apw6v71ZLzfbqefUwcF3qSWUu+53Wv3cl5O WpKrvRezkCzlrrqqsygeNy77XebG2NOlvReLOMqXk+tx1V7KEgPwkAeyuyoqaon0ayekuwSR ubePKnZzHLudPmCSJrC4+pz6Y2PTd8khGydsMnf0/QvM+Zfvu96HbtCWU/mU0fXk40W76Cmp Ze/WuQkiznTp6TCzoIZg8Z5ohyyOK+jWCSLRbO6Bc36/o+rKf0nkhJ3t7W3cx7Mv6rHU8CAx +3s31Vvpy6jKZPIBGxVy3Fxu+2urea2/K48zU5SZu7nFeKnTw8xVtdnjge+zNfe3zm292NQC PyQlgJIYhGfi3+ZpVfRPT9Hkkqt3P3rqLo/Przc2Y9sb1X3sqt6/TGd0entQI+l2yms++kVt KD3tPV0AkjDXVlyNpN0wfQQyYhsv7dgh5spIDDzUtc6YXnSfPGoW+77ILYICLrY6vq6vveQg Oqub1zLhuPXM4kARM45x30Y/ZfmCA+MYNnn588ZTCZp3QU5YYz9Nq87PLht/jHTbqU/fxV+/ F/ZJf69zoJrs8vrVRejMrd9nTy3qnjbMHSyvU+7LO2vZVSuFU96dTEZZuE2k/FSnb5KqeCOp be1l01Y4ylPF4pT6+q5lHa731aeeLdflR4WXqd0iy+e1f5tpbXEJv5TXtMs9vVWy8TbMu31x qLsntV2fFOrrqKja8og71askoiPLdwl4PNwDRG+4y/VE87u+2t9edkrn1VFOkjArT72l96Dg r5vO8Uoy89UN33nfYrz9qrvcnt7Q3O19Tr1K99HOW+aT8Xj2vZkbvFb9aOmKQiaubJxo96e4 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 1gLalepN1621sXm5kWXN/JWbdWGt+qan5qIfe5VlrItoxWig7poBSb2qE2VbY+p4vTzxrNxo zLOcTK2/XVKiPKp6LUXd84kk8UXrenbVq4q57mdlylKpw81T569hooe32m2p0foePLTk1p1w fl6+VXU5tCLmXdGQg9eiQoUnTXkb1ZXE2/d73dZVy+59Xs7fQv1cTZG869td6jD21U9NsKGp PVsXJCIa1b8896suU+EZu5kzw+5TqtsIIvQKLXjN5+v3b6s1yDJAfn2X6ufZU8yrMZjwnOC6 t3lQap6eGtsMrt0l+pvPqxnI9uuvDVX5VPbvPm7yy/CwtSk1VbpU3lmclPMem7CXl3nfVuK+ j8GPe2vapXBeiJjqAnYvKkYa3H7Y554wE23Pcg6HcB6u91ezxmn7OtmkDzgsoC6zwBPTK5VK zsq3YZ2TI+VXm88zK1256YzmxGd7fd1cq3GsbBeqPNsZlFSovYCV37Qp+u9k6TFnS53G4l5b dtJ1C8uqddFy9uTB72tXeenRXVcUk7DvDnb136/N95VKz1XUR2DM6nRDIt8/TxV2Vl7bnPak bbA70cM9qaed7kzfT2E4wK9dvMhdK2VyXp7vbNsd+NM2+0v0/Ki6PGKXt02u951tcHtV2pFh S8ekaRvTlZIkplK3tYyzt1mJ7j3i88G2uOTB3ft1Ktp9YLx1Z6KdOrucPXd5Ze5qwp3xWr2C pZ7sWZVv2evvAta3b5Ikv1bnVvGsPZVwuc3RHStU5K2bvn6vVu7t662N6bWw36Y6yiSj0E7u 9OTZxh2z6sMu17Hk9h7jNexXs0W7aJG2uZDs5evz8rH1ud7qp36FXFAHa513r50u59lw9vnt 7p6LcxJGnp26XIU3l+eU2+V9vsva8q6zOzEqh5xrvXVUSZ6cpJT7ex2ru6eaUs9ueMMWV1dZ HvcuIbM3PLUVdzN+e+t9vJ+7Wp7rCbAtZ65WdQxN1vUc4hHq3J0uc0Wj3+j7sM+WWkyvp5fo Jk27exmHrxeR9TfeS02+4i9+Ly3H7yK3VJF2Y7uzya7nz3Drym7UKq83Sus7bFpUG6gr26S2 ky527cu/qq8uDt37XEmDrpW65yryl95+u4d6KoTafl7bgs7dqeKJQhb5b0jmx0VlZ53depTK GHPLKKrMO8tT8+sVvnjZO/S/GcV6PEnN8h89LvY763mLrVxedbhSmPuqmer3Fv13FjwfU3K3 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 WRWRWRWorUVkWRWRWRWRWRWRWRWRWRWorUVkVkVJFZFZFZFJFZFZFZFZFZFZFZFZFaitRWRW RZFZFZFZFZFZFZFZFailRWRWRWRWRWorUVkVkUkVkVqK1FSRWRWRWRZFZFZFZFZFZFZFaitR aitRWRWRWRWRWRWRWRWRWorUVkVJFZFZFZFKitRWRWRUkVkVkVkUkVkVkVkVkVkVkVkVkVqK 1FZFZFSRWRWRWRWRWRWRWoqSK1FZFZFkVkVkVkVkVkVkVkVqLUVqK1FZFZFJFZFaitRUkVkV kVkVkVkVkVkUkVkVkVkVkVkVkVqK1FqK1FZFZFZFkVkVkVkVkVkVkVqK1FqK1FZFZFGRWorU VkWRWRWRWRWRWRWRWRWRWorUVkVkVJFZFZFZFJFZFZFZFSRWRWRWRWRWRWorUUZFZFZFaihU VkVkVkVkVkVqK1FSRWRWRWRZFZFZFZFZFZFZFaitRaitRWRWQf+ggKCPBAUEaEBQRxQFBH/X /6/zv+/7/r+v9f/r3u7/c5r/b7/LnP8c/d+7/O9/d73+s/4zP/GPf5M7u1u1VTzsR9t+iPR2 bnJnszO56Z9HpmdzMmf3v31VWbGyrLrcmUzO1W3lZS7u6zJn9799VViE7WXW5MpmdqtvKyl3 d1mTP7376qrEJ2sutyZTM7VbeVlLu7rMmf3v31VWITtZdbkymZ2q28rKXd3WRH9v9z6qrEq2 7zt7tUqkyrZ2d27usiP7f7n1VWJVt3nb3apVJlWzs7t3dZEf2/3PqqsSrbvO3u1SqTKtnZ3b u6yI/t/ufVVYlW3edvdqlUmVbOzu3d1zn8rLzl3eKXVZdbszs7EbOQzKqpvn8rt7y7vFLqsu t2Z2diNnIZlVU3z+V295d3il1WXW7M7OxGzkMyqqb5/K7e8u7xS6rLrdmdnYjZyGZVVPux/c t9d3vlTPanc9sbzmxnu9mZj1x/WPru98qZ7U7ntjec2M93szMeuP6x9d3vlTPanc9sbzmxnu 9mZj1x/WPru98qZ7U7ntjec2M93/OzCIMqp4iPtv0Rsdm5yZ7MzuJn0emZ2s9Mv11zMztUuq 7dbOkohPu9iIiO1Pv1jmZnar11XbrZ3yUQn3exERHan36xzMztV66rt1s75KIT7vYiIjtT79 Y5mZ2q9dV262d8lEJ93vOc52o575iO7OZd+7d527ut8pMyr2ZERzLjlfMR3ZzLv3bvO3d1vl JmVezIiOZccr5iO7OZd+7d527ut8pMyr2ZERzLjlfMR3ZzLv3bvO3d1vlJmVeycmZjOfV+sc 2Luq9dVu973t75cxCfZGZMxnPq/WObF3Veuq3e97298uYhPsjMmYzn1frHNi7qvXVbve97e+ XMQn2RmTMZz6v1jmxd1Xrqt3ve9vfLmIT7IzJmMmOV8z7OXcz6vF3d08XUyr3IzJmMmOV8z7 OXcz6vF3d08XUyr3IzJmMmOV8z7OXcz6vF3d08XUyr3IzJmMmOV8z7OXcz6vF3d08XUyr3P8 yI5z3vdqp5sR96/RGx2bnJnszO4mfR78mNnPV6Y9zv7v13Eb6ve93ve371+926r1xsTu1U7t zHeb+79dxHvV73u972/ev3u3VeuNid2qnduY7zf3fruI96ve93ve371+926r1xsTu1U7tzHe b+79dxHvV73u972/ev3u3VeuNj+Tu1W7Ec73m/by7mUi7u6yt26mdrZ2f5W7d6iOZnHzl3Mp F3d1lbt1M7Wzs/yt271EczOPnLuZSLu7rK3bqZ2tnZ/lbt3qI5mcfOXcykXd3WVu3UztbO/l bs65z767hzY2Y2NKqq7O5UxG7W1v5e7UOc++u4c2NmNjSqquzuVMRu1tb+Xu1DnPvruHNjZj Y0qqrs7lTEbtbW/l7tQ5z767hzY2Y2NKqq7O5UxG7W1v5eTx993nLudiMjmczU5PY3JjN2dn fyszj77vOXc7EZHM5mpyexuTGbs7O/lZnH33ecu52IyOZzNTk9jcmM3Z2d/KzOPvu85dzsRk czmanJ7G5MZuzs7O1VVMXMx7nP1Wc9Gz2rrKqlVTfVU7Pv5f9mfTy/viO12fTHo2I7F8zsdz IyM/Pye95vN++u42tnZjY2I7F8zsdzIyM/Pye95vN++u42tnZjY2I7F8zsdzIyM/Pye95vN+ +u42tnZjY2I7F8zsdzIyM/Pye95uRvOd7MVs7MbGxHYvmcvO87zv5+Z3vNyN5zvZitnZjY2I 7F8zl53ned/PzO95uRvOd7MVs7MbGxHYvmcvO87zv5+Z3vNyN5zvZitnZjY2I7F8zl53ned/ PzO95uRvOd7MzW1tTzOc7y+Zysvm9j8zvebkbznezM1tbU8znO8vmcrL5vY/M73m5G853szN bW1PM5zvL5nKy+b2PzO95uRvOd7MzW1tTzOc7y+Zysvm9j8zvZjcnYiIiJ2dnZjIjsc5nKy+ b2PzO9mNydiIiInZ2dmMiOxzmcrL5vY/M72Y3J2IiIidnZ2YyI7HOZysvm9j8zvZjcnYiIiJ 2dnZjIjsc5nKy+b3nsmZiNmY9zn6rvPRs9q6yqpVU31VOz7+X/ZnfVU9j0zMzXamfTGRHY5z OVn3r5+ZdxG9nI7MzM1lTOzGRHY5zOVn23z8y7iN7OR2ZmZrKmdmMiOxzmcrPtvn5l3Eb2cj szMzWVM7MZEdjnM5WfbfPzIu5ne1kZMzM3dTOzGRHY5zOVn23z8yLuZ3tZGTMzN3UzsxkR2O czlZ9t8/Mi7md7WRkzMzd1M7MZEdjnM5WfbfPzIu5ne1kZMzM3dTOzGRHY5zOVn23z8yLuZ3 tVk5VVVd7Uzsx3neffZVZ9t8/Mi7md7VZOVVVXe1M7Md53n32VWfbfPzIu5ne1WTlVVV3tTO zHed599lVn23z8yLuZ3tVk5VVVd7Uzsx3neffZVZ9t8/Mi7mdrt3lZd3dZlTOzHed599lVn2 3z8yLuZ2u3eVl3d1mVM7Md53n32VWfbfPzIu5na7d5WXd3WZUzsx3neffZVZ9t8/Mi7mdrt3 lZd3dZlTOzHed599lVn2397sRkRszHuc/Vd56NntXWVVKqm+qp2ffy/7/ZnfVt3eV67ve3u3 VeqM5nPvtqt+Xz8yLuZ2u3eVl3bt7t1Sozmc++2q35fPzIu5na7d5WXdu3u3VKjOZz77arfl 8/Mi7mdrt3lZd27e7dUqM5nPvtqt+Xz8yLuZ2u3eVl0ut2plUd53n32VT7XY/NnvapWXe1t1 t1u1MqjvO8++yqfa7H5s97VKy72tutut2plUd53n32VT7XY/NnvapWXe1t1t1u1MqjvO8++y qfa7H5s97VKy72tutut2oTzv3effZOfubfPzIu1Ky72tutut2oTzv3effZOfubfPzIu1Ky72 tutut2oTzv3effZOfubfPzIu1Ky72tutut2oTzv3effZOfubfPzIu1Ky7rb3t729qoTzvfv3 9yc/c2ufmRdqVl3S97e9vaqE87379/cnP3Nrn5kXalZd0ve3vb2qhPO9+/f3Jz9za5+ZF2pW XdL3t729qoTzvfv39yc/c2vvZHtiEzFc5+q7z0bPausqqVVN9VTs+/l/3+zO+rbu6y/dve3t VHp53v37+5OfubXPzIu1Ky7pe9ve3tVCed79+/uTn7m1z8yLtSsu6Xvb3t7VQnne/fv7k5+5 tc/Mi7UrLul7297e1UJ53v37+5OfubXPzIu1Ky7pe9ve3tVCed79+/uTn7m1z8yLtSsu6Xvb 3t7VQnne/fv7k5+5tc/Mi7UrLul7297e1UJ53v37+5OfubXPzIu1Ky7pe9ve3tVCed79+/uT n7m1z8yLtSsu6Xvb3t7VQmY73n1/ZefVt8/NjvVZWXdL3t729qoTMd7z6/svPq2+fmx3qsrL ul7297e1UJmO959f2Xn1bfPzY71WVl3S97e9vaqEzHe8+v7Lz6tvn5sd6rKy7pe1t1szqZjv efX9l59W3z82O9VlZd0va262Z1Mx3vPr+y8+rb5+bHeqysu6XtbdbM6mY73n1/ZefVt8/Njv VZWXdL2tutmdTMd7z6/svPq2/vbG84iOcmI+e+c2Ozc3Mpmdz2xsP5X9/tTO+3e97denanYb 6ZjvefX9l59W3z82PZnr297262dqdj2+mY73n1/ZefVt8/Nj2Z69ve9utnanY9vpmO959f2X n1bfPzY9mevb3vbrZ2p2Pb6ZjvefX9l59W3zY9mevb2+97e1t1Ee30zHe8+v7LvOXvY2fbvr Wvve3tbdRDfTMd7z6/su85e9jZ9u+ta+97e1t1EN9Mx3vPr+y7zl72Nn2761r73t7W3UQ30z He8+v7LvOXvY2fbvrXV3dZOUqZb6qnM5937t3nL3sbPt31rq7usnKVMt9VTmc+7927zl72Nn 27611d3WTlKmW+qpzOfd+7d5y97Gz7d9a6u7rJylTLfVU5nPu/du85e9jZ9u+tdXd1k5Splv qqczn3e3efXtxs+zPXt1d3WTlKmW+qpzOfd7d59e3Gz7M9e3V3dZOUqZb6qnM593t3n17cbP sz17dXd1k5Splvqqczn3e3efXt89EbziI5yYj7ffbzY7Nzcz6Znc9sbD+fz+TEb7drbuvTtb Uy31VOZz77vbvOc242fZnr26u7rJylTLfVU5nPvu9u85zbjZ9mevbq7usnKVMt9VTmc++727 znNuNn2Z69uru6ycpUy31VOZz77vbvOc242fZnr26u7qOymIZ6qnvebzmZ3vucdhPt3b26u7 qOymIZ6qnvebzmZ3vucdhPt3b26u7qOymIZ6qnvebzmZ3vucdhPt3b26u7qOymIZ6qnvebzm Z3vucdhPt3b26u7qOymIZ6qnvebzmZ3vucdhPt3b26u7qOymIZ6qnvebzmZ3vucdhPt3b26u 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 AAdVVVVVVVVVd3d1VVVVVVVVVVVVVVV3d3ckkkkkkEgkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkgkEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkEgkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkklVeqqVVVeqie+7ubbiSUnzqr79KrlABmAKqjgDve973pVe 9V9VXft3d34qrtQ75VfffVXd3fvqbu5m974VXd3d71wBwZgCqoZgAMwVVAMwBVUbu7maZgDM ABmCq5SqoBmAMwZgDMN3dzNAqqGYcAcFVZkAGYKrlAqr7773ve99mDMd3d3XfcaqvVoiapLu +X3z3A6unCLLZMZBZJqMgSCU7q7rTVrFZxV2MssldXczi5704W5da4qDWTG2wZlnpTo3bBy6 cLgLWQslaaraxbz226adGXhrHEi7qcuRYxUwJFKjwg5MLdjOrKNksMErm5mp3e7ru9EBA4Cv wCZ3fu856t71qHLjT+2jqy0EY7zHI2bSNY4xbZJlJWbyPZClJFjO0XmvN3MOuzqsjPtm5t7S aaNp6ByBtDO3c6c8sSNuLFzrA85Zt9nN5r3MO7OfXs8h2U8avZ0mETd3M1bsrFm5m7jsx226 17u7s142DuMtNqXkmSsTTbZUawEF4k8L2tyKOGiWL4+yq77ucy+zLv3da72Z3vedARsED4BK 1rzpoz57eMbqWbponcT36S62RSOty6v47V3yxB0ATqNws3wFkUtVcA6fZm0F6WXiWK4qZaU1 vZM15ia6s5Qc+GdMmabWZl08qw4wsDLa1syauI0DLOIlLE96Ze1H2UdrsOPUOkWlmNKTeA1U +LPDqs0qMvCIdPOb2O82MOiKOMYVhF9eta9m7rt1Obmc3lAqWCB8AlcvV1f15aWNE3fgmiR7 5dHCMH0GxqJYlRUbMjpuZ8K3tJuckEuOY3h7a2rjgLVlW28tVeCNWQdK0HudZldhdvVUWlVm tp5mxVzbbOddXjy3AQrSJSTlYtUzADbSaMraZy1RDXZTnKsLANZXYLs2zbpdrO1zO82e73nd 7quF1YFAI/AJ9zMl7Low0ykMNM2NxK08XP6rLhOWyiLhWJqzzsZHfoPGg9YaIp6Xm1t2le0x tkARYm95KdubLhiULu/W3FtDqbOmA4SwrAw+dI1jeAWwMRzKdimUdBsEcmpqB21JO5Gk8u6y npncxvoU+GHLeTtnIe1Jm77r2s5ua2CjgKnwCev6clXyy2svVQu0Lt2jX0pfMGQy6Ron6yS7 F3Re7FbiwVbCwXx3KqidOo9UwKaX2VkNA2Rx8CgqYzmMXDMhpsUEuOd583k4mriTTPMndeJB IVQ6Ly4hWU+4nGLO6spkvMPXmXbCjzRGduy9IMYRm7RpMgLYHwCV34qev2Z3hNfXsveSb9ZU qqLzNrWskmpFkNBePzNGL2o9VsnVQyr1zo8BVRxce6lFW6d0pVViGlHo55SIvqrO9bmbLrTZ NzZu9x0b2XuyxFIKm4Y61Ol4dh29cl87rO8MqTN9NnQQMBR+CvV8bNvDqCfRdbEogAd9eq2j qh5byIwSxG4z3SDq3Jtvk7KBxJVmzNV1TPdTo6FSvbu2eST4W3RUEKeDdyyUmeoyZ1q4zN7U M4J3UjL3btAKkr3hjhYUEto1r020FyHWu9Ort17fGN26sAD3kC/Khlzuqv0vvNH2+UVZz1E+ 52sztWZW1eJK7KOx67rhUmlNhhd2wWHsHDLNm12ZpmbrMaiw5RFQjkKeRrpdC6S3ZXOkOzfS M070+7gxRQNFbFKh7F3W86wbfG+EcIdcZxVq2evty1BFudgYrKzpcrebOTZZJ7fveyjwDYIH yoZ05UM195YS+J3ipVqUD9i0O5j0VfLswXrFau1XBO6VN56Jsy+lPjxmhbdYSD1neZryg1BQ JAFZJvesqAqZztgqXAQuAiEgCpUBECQO+5Xd3oFB3vmsAVOQFTRAVPQFGvUCBICr7l6rd+2A J2AgdICBuegApft2AqVVADcAQKgD32/Xox9M3q8ZMqUKfsoiCTrJwBFQpW1NZzM7qw0cy+tu ILKYt3cGvZKsus5VGIIL59eu7jFAy+o1lQqCxbxHnWZdwuc+alaXV46yqzL3e6GQw0wYey9V 52GOqKHOWHm9je5U6lddva0uxizSeXvnS3Fj5SB1x4raBsnRqeDiuZPZHJRhhKu1VLMxRDWO 3TdTsk2WEhiojPdjw92dW0acuXFJh7RlQ1wawSlU5jjIini3ShXODpsORs01vb3FvcwwPl3Z mZ7J6SVljYFV2LCoMgsZcvpxPZSymlG5q0Fh5g4vN3lkSPMhl4DFzGuVBlb2NhN883FMsVxm zLF0qC6W0nr2BEAIE3LIyt2K2JaGSims4tdrCKWOumEyDtbVzpfRbQctSDqVQ7O7NojambNk mZAAPe+97wBADFQiowAEx+AAOgqdBU6CuwHgC9AfAo5mZmZmZd1VVVVVVVVQAABtttt1dzzz zzudzzy1VVVfPNtttttttttttqrbbbbbbbaAAAAAAAAAAAAAqqqqqqqqqqqqqqqqqqqqqgAA AAAABe96vCq96kd+7ubbiSUnzbbv0VXKADMAVVHAHe973vSq96r6qu/bu7vxVXah3yq+++qu 7u/fU3dzN73wqu7u73rgDgzAFVQzAAZgqqAZgCqo3d3M0zAGYADMFVylVQDMAZgzAGYbu7ma BVUMw4A4KqzIAMwVXKBVX333ve977MGYD3pPesBMq0EXcAS90gIfVQABcBEOwBa1r2AAGTf1 IqXvdgK5ugQNZQAvYA7gAJkBTdUAh2IAb+5LBA1VACF+oBUyAPYAqfi5QDGAqS4fWC05z7Ne 7YCBxgAsYAyAgTk+sEWjXrQbfssFS2qASggAhunRzAVtzve/SvuAgcdUCBTztgI29oFSvQ5Y FBEUZuGWC03QIFFz6wBacnrAaft/G/bqKjsKI6hUT0DsbzvvtJq95w9rZ2XfsXNwUK74iTEc Z60DWfEKcNh2hGbu501HVU16w+DU1Q2iDudjrUZXXDWtUzwzl0537qQWb1YmLLzkTkSYybVS dRtdpi2LB01W/wA8F88Kpbvbefj+XrI+IyOoZL7RV04Qqdjnf33qzQZnS3O8tyX8LCO+Qw/H yIwj5Gp9nrIstoMzV5kQiGX9Y+2Gdddzr7UcuaVYSPlgYtPCm9mWsZurNh385W711DpT7BhE 3lSmUXrGaerbfbubtVc0F/M+h8NIok+o+EtCz4UpR7ncybdw7K1R2PouTUyAXDJlbK5X0zRs fy7X8wjry3mEx9akY929l1NKUAGVsrKznbuvdhd1ecJ+AT93dG4feKCp+mg6RDRHWtItoCNu wIWZTz9VVxOjy/IcdMIHEDSKNkYePvdTlYgsmxYKRh35AqZofVqtHT9W7hufCjD4DCKOvcqp f0Py5ddOL486K1+NdYv53c+yClpda9gas3fxc3HJc1lJybhc3lbj419bdUam46m4N5Rkd+3Z kNx3Cc5JJ7Wg5HOUcgahqbddbupdS6jaNDdR+F6l0L2vsMRmbB4odyk6B9m9RPK9iWObu69v 0IvsH4AeEm3Plc+KKo333yZeDE7dRVkkjxZdAAhU6/axSllrzundL4S/S62tvEq+1H1Xgdlo YcI9ZxJG7Wnx+PYK7PWYRjUI8Ku3arvsoXp2aS64k26bRSOK+ZQvJSVlV8idLbf3qtDJe37S BEvU7rTpgrLH3sh9SIrb84Klrmmlm/dtODUCWRROXWVoANP6uQDR4LMVCYSyHgU5JUS5Rd8X nXVVm9YXPTvRAUEfyCS9fd9q8rWS7/WRk/ZNH6mIaIo8QzpEL5eZEpBlnSYvbg9vYi3XES61 Y/0fQkfMozIGHYVGyYqxddy1UNa0kSfueyGxd4N1lncTb0KS7dmNp03RPKHBKQRsy2qR40Th vdLDMRS0h9LWbbQyQ4Wjd2UKKAlDFuHJR5IsEjN7GICMpJZVJZx7cdbpjYlqxaNl0+9+9Veq 8+YPa0OL2r/GBDIfSfMCiIYl7mhpGbtYR6zMXmxPwquzwieZd5h9RD0OfG+6/pRHxBPzQ44Q LIws3fldUrIP3JROVd6xSuhAbd1d+N/fClAbpNHU9tx1uk3Gi6G5UXRd+9O+1w3fLXhHUk8T c5HvKNxs0VuPIamQvKkPpp/fQmsQL35HEzZsIWuUv6jhqYSLG530sVdMHcP33y+ByjgVxMMY D2mBzqKSkEQ2+Wjq0X1lxay8794Dw/CEQ8aI0+9TBQquoDztCWrH1/vn+IE3fh6nflauvECj OsKmMs/H106Aql6i9nIlSvu48SDjp1dEmJtY47OofWhEbqjiWDXa1vXRbS7usknoezssFntc 3uYWqrN1ctZsGmUdfW0cMdjNd8Mmo4ibdG9Lb3o6g/eA8aMOQopy97O3+PVR2FRkdwuFwDet /b/Z9usMwuZMz1kkBEA8XQskij4kWRRbhuJfstnb77N1qq9wLmpUStUfd1eo/RyXlZ33vuTl cD76m5kAqAfd9z6XrcDn1LVIfH1C/QFby4vTs+1Z8xZmJWrbVWIvvAn32148lrzx+532H7nk gjwsw29IOmpTqjR3Xrx6Wb6dvQuhVbnc+/eA8IqwfLnfvYZ9yq1MZ7WZh+K59ze9lwNwkG4X ERE3X9vUxzXr+Qw+Gn2lkeRpdOGeqL2F3NR9DISOEqN53N7192um9Uy7sIapnaw8u+sKlWqs nU4YWRaPwKrRT7Nfyl00vCRYRZ06fWVEMNYvLEMkY6mPsubyNSm9+WPCrXJuYO7nbwWfHtnb jBwztY1pYzucVFrdven71V6v1PMOXW/CjVq1wRGGzTP1APVZ9pzdf7BKQhy4ey6k3L3ro4B+ Bs2Brn2MrjkGmhcIi14RfYAawaw2zSTzHV5mZyJYOWqMnZQWvM3gja5jO2c4aSV0TVYEqXVS pE1U47cwazNSbPI3ndl3pWQtBQJ06fbt5zrLS0Uscp2uHXBOWqY97mWUlfVWUqMc4dl5l3ZO zRXMY3ZXHUlx59kau+xXlPsNi7bkFJ1iZuXvUxtSS0drcd8e5dVAy+uETkL1NDTfdGE9ZFbn Fy4jYlUeKtzK4HVplCkcEDCXSiV5pX7Nnt405hDwWkh0scZLtZ1VnQkFrswFzDWtPeVrdp7O xbcWy9VKYVy0qO2crmZJL6glTlDho6xb1oLdurJE0ZY6z3FbhjbT4Sjg1OQ1Mo05ddB3AwXl Fqk627u28ZouhlSlHQ0p3fUHs4bhKjlaLgXUY+LNwXhvi2tY3GNordby0evjUDNTuGM6Oa0H jquIpdpYOvINK3iZGr1UO3BvUjT5kWtYbxpODHIt69WkGNl1edsSO0+XGPTnStm7dGHePHLv Ki3vw8Pe95ge8nQVPgVNAgaABPAAHwKngX/oICgjmZl3d1UkkkkkkkkkkiXVXAC7q9VJJJAb q7QySSSSSSTMzMJJJJJJJJJJJJJJJu7uySSSSSSTtttttttu7u7bbbbbbbaAAAHagAAAAAAA tQAAAAAAAAAAbu7u7u7ul+/fffNtxJKT82233c3XKADMAVVHAHe973vSq96r6qu/bu7vxVXa h3yq+++qu7u/fU3dzN73wqu7u73rgDgzAFVQzAAZgqqAZgCqo3d3M0zAGYADMFVylVQDMAZg zAGYbu7maBVUMw4A4KqzIAMwVXKBVX333ve977MGYAzA+9XqH3Z9vH42z/UmKb2fbKpofr66 99bId+Cqbo+4PYvKY8F4GtoWQ7VHjhPMffXfwcquA5DGK8QKV1RugRQOZKT87qIK0QSLPqqV 4cz0w2VkOFn1kTF6z4KVVPq9q+0rAdWd9w6yNI9k6gJgXhRR0ibI1TrSsVG9vLpsedhxDbH2 Gj2WCR9ZLi+IytL2TwM1aBYsI1G80Puy8FNR6tMfLuN9uWsh8r1jmtMpBItmlM7Xc/e9Xqk4 fD8cJpVeUZ1iv31cWUltj9BZuWoQ4dzQlR+7pZsjttoJJOrOqudMVHWSlRITKNo3m92LZNG5 pVAEe6nLlSQRuTtq5mZKPWUjd2wljHIdGeaSPVzy5k4haWCqRvSalmBq4VoFYABlY1o3alut DgpKXGybYl6w6RqTa/e8PDJm1VCqiH1BoKywXQRXfOQk9U+QasCr3e6krgq8zom07uqu73FM 19PwGn0yy7JIMhWWQKl078VQdu/O6dti7p3TYPCpctWbrdXqtadLOkM+04b+QvEERSusLOmy O1Ubnwlu6Vu74G/sgx32d0IXyBxTAaifGjgaGzLbeUZjO9fApRF90mfver1fuYjFZZujaYrL qImkWfU78Uirr5M07q7ZsV1lirxw/otVvWvySVRV8m2XdlEn75indOycMg9SuhdO1cuvPl9k p45aKIC6s+3vWF6qjPqw+MlS4DV03A9qnUDUPpuGRn1JqJk4Q1NQLjrtO90PtXnPEz3WsjH3 069hp6icoKso3dqrjXUn3Kry5t01jYrMFyDNlwufveHgeuUizXLssn4WDTJP2IrEUviQSOCS JAOuUpTtkYB+1dJN0/HCjU3CvqORb3y9w12gNxyZAr7h4X6mg79VAjxsfIJkG8qyl8lo+Lv6 zdsWcV7tVcNHS+HNntswNrR0R7u3e1XkDPX17pVg5yypUy8BNGpb/e9XqhLiVa2lpsrua+eJ C/1T6JU/hWPD5mGixXvQ73x9D7xt7D6Dl08qnItQ5mrHUfboDcyWRPR0c5kw1DcC4GRyH01A kd2j6yZWv0LPuv1K/Vj613d9LypfwFlW0rrtvw+el05dVwCuqoXXxqQ6hvT60q5ut0xUZogP xHGTkguvRL0WD0q+PLnkvVJuX+94eDRpbL+toi/m+ktqrVYZPz3MNtzLoD97dZvey41BqFwL jcbgd19CvVvRyVEqBU5C4ty7py/t87Ly9nIdhl38QGEqGF6y3wQgOKLXV142a+1z6wsvMhkk PZTcSarXKLgcmpcJNfZm67t7XrMhnaZOQ1DUXJV1knclHid8YZDPsvKrFOkpAOsf0G/XJNrc 7l3ZzpZerbM5KIqg/lE/JmiT7sPvj7Z+rl/S9VP2ZzXrrm1m5lmLbWUp958vE+sij4cfUR6s 1W2t9FnJ3tfHOfyTw/GjRsUEeV/D5oM+wjjDIqwSxn32W/BJe8WhWhD6bQZA01qDPSb9Lv75 CjtTvkfkj9sd85fMMNiO70o/cavicZsa4XuDd15ukTNIrcjudw5atQ6jkWp8N5wzKCru3lgp Kq9VV+9VerDBPh985VtzS7bwngx9v5Xdsj0ApAbburuni0w4a3E1n2ws5ln55urD6yqW/cO+ PO3fwV+XE1X1+FlCvK1dH7Zf2cRjvQvnyY+KPrvUiU0CjRU+b86+eqTAAdSf1S5aslUarr6/ K66w/s34PiPoIITdqGzhpm39Nv6HS5eVQIsq5tGup1tE3wNbumzj1S1TNiIUZuIYtnS6Sjiy +Kq8tJFeqve9+9VepGluIRIhvH9mGun3FJrESiI4YLyzKFHGrKdp3DCEyQAXBQVBM9RFm+ZK MALW2ZUmR84aArLko47ijLsmbhLc6oigEumQVlC80ZzaVijcQ3uSbvNO5K32YLnlodbbN51L HdSFYjxenhHxdo2tocxvozYK2cqC5bxnM3irmAGp1wthVjGYbV6m62+VsqubXBYzuEIdfCUi +6iAS0+4dI+SKotjBbs4D2c42wL14y43E9j67QkOhcjovZl08UC2pO4XMDphYLunSzc0+jd7 e3DnHkZJTQmePaYSNavuddb2teWljiWy07K5btkxdjvqsTbVXvKm4N6ltBcKS4pEYd1mlt+d 9UvZ1WdzJXdENXO12bUll8F1TLYqDCnSNqly2Zx3toIWni0yZADG9lS1q2NDG86N2qPC8ZNl Ldm9Y0VqXn2+wm9smDPdDUvUXtZtVjyVo6hYUmwAUdGu5rFsUpDieJUdl9fZUq+SE8OpXMeV WbqocVbu1WFpslcnOYuZGT2EhDd9qvF77y76e8e37l773hl9+FFdKg0CPgDwA9BEOgp0B8An gQO6B1VVVVVVVVVAAG220tbbbbbbbbbbbbbbbSvnnSSSSSSSSSSSZl5MkkkkkkkQzLzAckkk kzMvJJJJJJJJJJJJJJJJmddtttttttttttttttu7rtttttttttttttttt3ddtttttttttttt ru7u0kSSSSSSSSSS6r3vVb+7ujbcS3e9/VVQquUAGYAqqOAO973velV71X1Vd+3d3fiqu1Dv lV999Vd3d++pu7mb3vhVd3d3vXAHBmAKqhmAAzBVUAzAFVRu7uZpmAMwAGYKrlKqgGYAzBmA Mw3d3M0CqoZhwBwVVmQAZgquUCqvvvve9732Z73pPe973vSepBN7vf5yP6agcmao0Q79JZX1 809h3tB2JeZZkOwyPeTISrMhupddvVhA08eIGfj9KMz2n0IwizepEivkPlv1s7qVIYV9iy76 avnr2q5jsc7h3uBQky9No9g7Xz4oi9vryU4saN4wUskthQj77GRe3BjXsuqdm6V2D8HW+dvQ VQoD5MMJzDn0d0JFqJqWRDMJ9pjx0SFdXxFT8gnxuPJuO/1Br6tXR6O5uHN7vm9OzQLIszFh Py4s+/HjzQzuqH3yu+z1EO5BjvdSG6hZw7t1Re/K9o/aNpeiU+QsGEYdKN6vCzkbsa2c7PfE a0z8RZh9SYbHndK3YeMODBWXdU8iwr76RjszqHzVZWK+aaMTvhOmSrWqym+Mf1Pr0i7vygl1 SKRBu2iQBdoExIsdogq8JJ1Yvaln27Nlhus0kXG0hmVv21JfXvbbkMM1BwcS1eqq9VfvVXqz nnE2QPu3peYdcu8/VmWdg5++57Qeh9D3O2ZCR96anaxfqQh94WRYW29n2OoABxE+QvUND7eD ufWbs5wnxnZQ4IGYKZ3KK9Z4wTdU70rtUHVsLpYe7GgA7RFQgPbzqF5oyl1Od0b6d7nZNG8l 79PZ7O+23Wd73ngRD8ghqofvrH4CHduh+f2dtx+9Pzo6gOI+5DMle8pT5N5TCIo39Hu7Rs+o 2QjRcuKa6+bgGEDSBVLsQGcvZpmnjcn0FmpSQaBfwFL4iCDiaSNdd1LFNBv7VkwRbrMfSKOH ha0qiSmy+Bs1Y6VbcupKvSSAXdarQFEiow1c11zhzLvMTpAnNPQs9ft6zeqvutczxwvpIgv5 BPtffuzsMyjkkOzWq0fU3zdZ+PXWbbnZcC4VLj6Gao/TGcz1/JiIkI+iXttGlv3zav5RgMiE UR5HyPqox7r34V9SVfUN1aC2U9TIZ7amxh7cNJgOK0rxYtdIuUkqFZSFQuZKcuVZtXT2SxvF Z3bG6by2asu+wbMMvSadIko5Sbo8qD6Hjm9tLMTAAAH7wJ+5Aualz9A5+7e4b5RyfiyzKK7z WbdxqqBItOhZOKyIR6/01LyP7JFhH1S19eDSLOknT6SSqq3imqGYkRpFm8yhpWrxk+zaVZdu 9xJIsyQySZR+zNybkKhTuJGvlDcm2+jVEYO0yTCQCCSq66bbdVaeLMTRndO47JeVlzMxOZc6 9dOQ7Ft4Le3KfZUmOSI9WzhnmFK7a45LFQqnlOGq971fvVXqjrOdBCyvsUg1x22PitdA1gAp 59TEhAAlm4AgAB1dY26fTORu/yJ0R1L+jS9Rs3RvxuZjeHteHVfqd+ws+s+hq1hFp/ffYjJV TiBmIMwjThwleKqHvfVV71TIVJKgXLhcM+rXs6fFd+SylgriPVd0LCwy6WAXLpYppB1fNn5/ aqUDQ+yaq0cgBeIKSY7phWyUNwhHd6nOXXec3oEfyCfg5dMrV+mTIH11c7CqB5bzWfJRc7JD Kqv1zpQcOilXoLOyrzRvVHz2GS5K3huTdahWy/etLgXCo8uh5bH1xWri4W7suPbaAVAnsCrr F0hm44ytrIs7KtEfR1ZZMxHHXOxYlqjE9+tJmOakcWYbdHsxVlGXMMsZ53cUd0cBAPyifg3A Lnonc/fTDU3JFyFQfv2Sx9OW/vss78UQz5UiRD73YvKsneJz3x9xHcYsgvrxD672Vzw1p4G0 MGDd5Fk8lln1YSvvr07VP7HdMmtz4URp+Pni8og1AyZFve67fd7TkA3CoyJ9CrokdzxhXEZe BlWDOqT5/J62E1LcBsGrOBeuq2bmSZ7wflE/OrpIRJOt0P0DZCjhi/WsC2vqJC+6rH6uMs6l TZJiWunyu/XuE19kDIGTv1ahzUOe3k9W2XR4lxtqEfH2E6gMPsPxFkYRby1z3xI3JFRWXLKd X1pazZBXHQze+QOAfC0kKwmtgu16EMjTTao3b31vrJV8CiNvs1hm7xSt2s03m5d6amtUHNEO Fzc2IZi3lO5vdY0tPoNys8Se2G21vCF73Rhk2i+zUWa2qp9j6aqrStVm+qIbzZu+diyT2dzS haHE+Q3Rb5d2PKlyqzU5yFvQecqdrfPbJFVdExyks23gUcEfW4+6TcG7CawFS0Hw4mkNGdmu n2jOna76NXRLdzhC6zOvtMz17mTD7rh3tuWerWkkO1MNrjhqrunfQWmie7Te7t9faU9mUXzb utfPHorJe1hnLbaith3Os8RbaKzCCw6uFU+USrNn8nSr6/qg7lRVV9bOTRtPNs7xeBmhETZY tY6azQrTl1Mp1DZmXrXFGs263pm33PJEVU2cAllPU4xVpGM0+sNbUZso6c63fSSYTtt2nHTs pxQbs4vltk1NNZe9gsM7HXJ1xrbO1tGeMZWhZwsUyyr0OpeB9ZRq63N/q973vewEDoIBgIGA IGgF6Ah8Cp4AQ8ILJJJJJJJJdVVVVVVVVSSTDbbbbbbbbbbbbbbYoAAAAAAAeVQA6qqqqqqq qqqqqqqqvO7u6qqqqqqqqqqqqqqqqqqqrzu7uqqqqqqqqqqqqqqqqqqqq87u7qqqqqqqqqqq qqqqqqqqqvO7u6qqqqqqqqqAANttnVySSSSSSSSSSSSSSXckkkkmgBf5fy/Q7Ve9Ve9+qqhV coAcAbu7o4A73ve963d3va9u7ve+qqFV3d0dKr776q96r6ryrMve+FV71V7zMAZgzAFVRwAD MN3d0BwBu7uiqsycAcAAzDd3czSqoBmAMw4A4KqzICqo4OAOCq5QAZhu7uZoFV9993d2QnuH d3d3DuQ8PBehvXRCUq06q+C+WPFjr4jtee3+Vqrp1sxwZjuvqvxv1G6dgXLgahkvx73dOodi XAuE7Rk7DJIcfLNXHM92IQ4fRKHxpURDh0j1xDSVO708gGochyGoBWqyHOb8c3tORuXDcy62 /U2SLSs/fKuukKZO6S7Ehj+rNwi5o1NXoUtbdi0/gxDjkGlrgVSbVClb96ues5q2zvrvOd7Q Kn4RKv0zWevC8+1Y3ee6DT3tku82N67u798y5gOqbd1elUrqm+pC1s7cq9cqasVgqVjzaZOt pnWxlAku9yjd3qu+JDpQfo5Q9aQJEIFnLF+NxjxR764vk31yLo9KYERRhM+y93VMQONjUqpi RY331S8QqneXVMilbh2uR6j1s6czKDNnDeP7A/skw4zctDtanqqrmO6q8zM5c5etatED8In5 NdoOQ8WcIhR8O1Dfl6tZyjIt8tGTL+V4ppnfsN5W0roIjHUYcvjrzo1WV2ccgM6oUwCWrt2A zbq3QvCwGAHAs5zm4uwYrCBPdeLt4Zr7ggAtJV4OOU8Joyil84vazNnIyvnWjrN35r6pbMd5 V5fTMmo3Nb9NPveujfu4ZeZ2u7BF/CJ+Poan6focI78h+ahAZ9tyvDMtacG1vs/ZdhpafDoo QGcawjGqPgWbn7twgZ3dWZ7COOkZ8mfNCi7JEIZsjYvLUPcsrT6jhGkZHNk09J2FwOaoNTUz VNTt0GTU3U1pwk7A6QDIZr6bpOzb7T1u8FNK3uXVXHW59N2wycXNZvWWvbmPasmsJd9bo50Y WwLAqo13ayKCe7cPTr6hRb6kQ8VzetA55vFW0j0i1XhzNTmZdYB73h+94eD4lp9n41GXRkc0 e1u63tyH6OQOTJqP0NEdwYfZP25x0cSCLln9mfEfHzLPhhwVd61voTJqPZkr6gzWWtw9r08Z yHt0ajyOoqJqUZw26c+YMHxzJhr7uCHS5qWPlt30uW2ivvBkabKIs2RhE69oWyJyHND2EUZi Zo4cI28S2T3fTD776kEk97B8hMYN+5v7hcPYR0MnPpnMcCq17j0ZVp865fea16q1dzntankV PyifV5lV9d8+1O52cymLy+trfpJXok96o9aBzMOIiVu8V1KidhpGasYRPKlsk2AQ23IzxDCe XOGhrcsl3mSVMTp05CcNg9arAU9nL9kQsgXNofEYYYQ0tGPA3hNEaCfBGmrv3zFVlq5B6zsG di+44vjSML4PvPC7Q67cqt3mlrSMqlyeid2XRKnSgPe8P3vDxPx6P09HJ9HKrJkHJ+1ej7VT XPtd0vN1fELPgiiKNPUZ+aytA3HKeDDhFkeoudPVPQ9x9A9C4Fw7lZBzrL52zW5qLcq17yP4 3aDyQS0vZ7iN6aD8d7c+++a1Dc3uO8xgO/DevEekt+5okC8QpoYfUWWMxbV2e5AkZYR1E/EU SbkWDHgaWYK7FyhDlnE/Sr3dg+e1sHcabKkugH1XVVX5RPyfohInY1++7qr5P3D31B65+nr1 vVffZI/l87yzmXWped9gjCguI8WIngRG06Ft7W89oGDjlLtzI4OCVmdvURHWuXwcreOV3dy4 k9u0awHsfZvM2c6g6JOJ6ws23kJGLiS121uPJVp9s6gPAD97w8L7c+nfcUXPyI9cHtIrLl1V M1dEYqP4U9yz3aLkidrLKiyHoG43Po9qbPXrRPVQgqX6uQ8xn31nfkfmnlAO7o5l3XKZ81Gg 1hUZqjNmddjrWhSnwVk1lHHmTBpu7OHV1kKYX2YaiwkOyr3HBbsqu56iWZbVu7xZSeMNiXd0 EIbczTS6Oq973vyifYc0du5f4uirlc3Ya0ezX3Yd+887WQ9JDcMlzJ6N5TIerZK7eHIb3L7m T9DRAoHDR6hyocR8wta8OKN2jSDSs8PlrZNi8VAoWB3M07dzvjLhifdXzvfawry/U8CULuq+ tsS5dfOdpLqtIp3VZdUgDIGXkllTJI3GXWZWUVUzVBWUZPs6Zz3KQZy1COIGYczfj3LWd2s4 NnJsUIJLKSm2Q0PsO0FV1l8aVPFVzHm2YLS5qUJrIVMQ6LpxqIyI7JhGuukZAzbqpDhBD1nD uFlbBtMrMWDUpHfRqo+0VrKqDJGedXpOWST3LnpI3Q9xKjC5dDedFkmQ7dZsu2JbpdT81NlF MHeQNAjeyjdmtnU1m0L4osa75rEWk7MFHIqNgB6XUJG5WPr8oeZyIgc9SmTpz7XuEpJW8uua zrRyl3dQJ6pb7YtGCN1oOtds1anfSthzD1EjV3u3dVupVB7wQGdvTBhN1zvWhNicxDsnppeh kGYe7WM4gjk7A3W8NzEKMK6O+xjtow3u6VE6aVhCXY0FJO9GakuGuyBorCM4bKMmE61zonau PzyU8T3cGxTr1OGzrPc100Jc2+XtuKtzDWG92UHQcFdzmkXbL5uVuWnVPqPV7b7osOs3d549 plvLw55le2ryrWKLtLklJnn3aeCoJq7hWr8Kq7AVwPAq8AeAAHgAOgvgV8A0ySSSSSSRCQHJ JJJVXdVQH56qqqqqqqqqqqqqqq7d3VVVVVVVVVVUAAAO7u4AAAAAAAd3dwAAAAAAA7u7gAAA AAAB3d3AAAA9qqqqqqqqqr333332qqqqqqqqqqqqqqgAPfdttttvt555585/H8v5/r9frtV7 1V7386qhVcoAcAbu7o4A73ve963d3va9u7ve+qqFV3d0dKr776q96r6ryrMve+FV71V7zMAZ gzAFVRwADMN3d0BwBu7uiqsycAcAAzDd3czSqoBmAMw4A4KqzICqo4OAOCq5QAZhu7uZoFV9 99u7shPcO7u7uHcveHh9pmKlUV0eBvrRVz4A9uLHJ/ZYgy6jhFXQGcsv2KR2HTP6sNAjHtYQ jIxdZQcNX0GkWcMiJGnT7BuV8RhAs7u5z+3WLapr4+4ohjNraSQjtW2j6fM0oSWUgn8fXWD6 YYFawfEzsIjWbYW5jxrDpiYt6k5IExeRDbmcx4jgc6mUkKSCQ1NtIJEmG+d88rkUsvTCne12 Cq3UNYQkGDMwTh1lxjZz2755JISptBLiB4AfveHhVZv3X8trdOYV5vbNpNu6FP6OUibIsAjb G3n2brLsBcFKtnSc3oqjxo1jOmrs9+Njrl2Vg+IFHxSNqzeputX2mqI3DZAGNBnyaH2/Qkc6 265AXVG6+nxqldfChQp05mT7hVcQASNI5GsnxeoyeZFEeR96Xvd33z3TuXdNpX2UhlOwTNNo 5dafuvCbTeiNlVSB+UTPxqB9G4n6Fc/WXr74wuHIVlGMVV36tvx+/c317qZVXl1nHvj91sUX c+S3V2fDzKvOH0qmavrRwy0jq198dvhdQESitZyb34+eRGRdwK7fxNZphFu6G4Qj6igLPrIs 1ZDztOEkirkH1Wtso7tBhGja2ncWfVuPaaD2DnMrhSc5aA83MzgIH5RPwdunsPo/TkT108g5 9f3s5OHKNfrprX1Ex9Qi8ER82MhwM+TyvDSDD6ZA3vv2PYu4OR+hI33V79rNZ3MMK9KRlccY DFtuswSlJoumAb9TuqN+63dRZ9Iu1+Z4h9vX5HwwjSEfYsuulvQYmaNxGu2nkC1Y9UF0PmXa JNPu3b8Jm1Kr2TC/dKlZzuv6wFH+KJn37p9R/Ln41up9rf7d8Mn8jkDInuSguFV23cK6czX6 vb7qWmvqzMltPL0g7bUlG/k4RywKmatJBZClxOiqXNZzEFPBeIhYLtbYlXDlDFrm4bvKTJq7 QipOlCj2i75nEcWpHoUpam3De4nRX3kfUeva8MIog6K1kULQkWQUQ7xtDcolq6ztLf11qxUd JqPrNZ7vJ3vAVPyifnP1P0H6GT2tcxuBqZDWLSP3NOq1fs3CBp4+siEYcisj1avcIHwf5aVu WOVyZcKKtKW9vM+D20yFR5Xjm7Wo1qTFO3t7uYRx0rO6Kpqavpd30wyN1VV2GC73nMhrW+rC F3PsN1eaN4v41dAWR7SKIFW9++xmIkG7d0iPm6N47FMJbslkpiwIMIG/DWaHYCtvddV73q/K J+Qr8U9n6J9D7dP3KNz17/Y5fOmPZc9H0M1Qem4OpI7Ib3v9VVPaOzsJyri3fhbuopqrxv0u qqXRIKdN0hY+TH0l3BKo2br6PX8ufzIs/Hj7SPWRx+JuUyLtevPbv5UGXnKu79ddq57huIgT eV2neZqFT51Ve94i5AAN2xYrJxRI1FjFzUForkhSOrFbCicqZ2dhubb0ix2rnQAHiCp+USuZ 9vuVeprOuZ9PvlVNmsKKru3MxiC6dV6q4PYaJFqQjDVer1U23KW80vRhZHhqq95PL4gYvyYy /HXe1VVVUqOr9WZunkCyFxKlxLno1qae9BU1zKdTULg7jkOwy63E0VvW5nAR2nPcvs57dhNV qanYahur5C/eBAN9nZ2BkyZMi1C65325fA5vVEImRm7L5DNUk9RrWa99p+uh32nSLZGYX93B W40+3rULVTWMsma5vnrvk3Vb1oBAgAv5RP3pIfo1D0JD7vtYyP37f7td9+BU6fR1Po3lLc5H 6JvX03sq+UCBnNlSQrC+s3efXwEXh9zt12tbzh7AVNYdz2tX8ue7zkYCpoORZNw7G48q7MPf d97ut9wFTqn0dz7dyvgLjQZWVVU47+QDo8KFV6qpVmisBRbyrA973tZJFHfoDITHYgCdVdnG b7Hh5DNkAnBiYhdMZGKzNg1wvIjYzmzQNACflE+5zd3z7m9d3WAgT6puyTIc1mpQIEzOlGr1 lV2Igaycmb7rK2ijV7N9/b96pqgVMMnY9gm8oyOfu78eyd+8fAqfHoD6Hodj9CzZfCgBxfVR c95370fze9W1Veqq5mwhmQ/Fc6qvZ2Ppxq32dWo6Ld91l7JNMvDrWDePBLKk0UlMrX25suJ0 S815jKxiGtCyZmO8p2znrwmFm1m7Ydja7TZzeJ4pNU6tJ4pZrbpbPdvZLm6d6yRBFOV5eArN SXNM9eK+ZoZN3uDmIWj7cQNcfURBo4CguDwUiBEqmwvi6y7G7RfI5TGb0q+UCNroTz7s17od cx3JpVJWm5bbkre63sN7j2rTwLaRqbXdOm9SWomBFvO28Zb583EHq5vuiAVdcAsdcKWKuV6e KD0bWCnWuR9ZmbnDFhOTOzqKir2bVdoJpFrs0zTd6TAb0p6KuhUe8+ZLa3jklGZXDn3Vwrem 3pxvuj0x80I3mdp3E0J6tOQsuJaotW1QtSli6Tcs0rtVVEnrp9HjifTcRtS+OaaGVD3WpfLr 7L1mCdg6pvKmOHDJXDbiS7e1W8isun2Z+HgAAP5RAUEc/an1+uvWZda8fZqtH44bu/3Nc7XF Y3u9L7ualVlxddJty3ttk6sA2WVlbeOmlR7bSymilRy62pK2upNVkarfXvY7q8tXT4N6+WXK PcuenlSrUj2kmsqJR2+3Ec3bBB40njuR3kW9NXps6zVlVjlbwJ7txVIMusXK1w6reltVCsY5 A0w9FkVIwuVgbWJ3lnKi2dnm85mlO8REbwQm5i43W5TtnMyPsqt4GPPSm48WI5YThWaU6e6d XSjKxd1zrI7smV0qu3s1Ts57edr68gZrg5RBTRPX16WkS8CYzL0am01BkK2r5yJNtXliVljm dWzE+WXdk1KbfRHnz7bwy9yvODe3mr2H3VlvnbkrOdl03wzHlgoIPESeWUOngFV5xSwTNB3g 3U5qruoYZr3DcvcR3YCLvHdQ5owbzHZV4VwjklSXAzqNSToM7sJ7ujE2WHnBcTR7OAOYuSvA gBMwbyzcGNydXLVvCZsRnbLWLdxScGW81dLw9tjc3Lgvb55mnOyzH1srSbFshtkmWa286pR1 1p0iiZXLpqxYmL2KIF513wGPYb5Ks5ae4inH0KVjsd2chnRY625rNBDFSN8nr2boV2LGYQ1w lgu26PXEausflL5lZu9pABTPPRpubOtXogvr6dLp8Q2aWJzROq+si6nXpFlp7RHbT7FUmPhQ opZMrDyMGdqMZxI+uwViqPRQh0vZXHo+OTcdOATKVPuK7XT7HXctp68GEzsmday7usrmZsG5 cnFmi5Vii+aO70ty3gp70JWJ4zONZWOmSr2Xw7bNdp0mvUFs21KTdceumEpeEOWNToYKeS8F B2erNUsboKQdI2okSbRjgVlO9rEeSrKwJdok69AJyoTjHdq5bNZ3NVzlw1bMKzddbw7W7zOC Fa1zjqWdbzb7qABTIeQTr5IG1tXdpnLtRbwrAt29BkhRuSrrRtPHIpvtZ7X1V7HlXe9quU+i tdLpYcfMl6bEPDjN3tOo0azshKDop9Kq1wlp0ydw6XH5WJ1i5RLi2rnOzwvsO0ry5E9FrU7n aLC1c87o5OpYqI6PKmVmyBjhooVByyjSOc6g0nBrOJnTjzrVTqdYdQLrG+TwSolISidF3xzt rqZ2t7aTZmUainLsRhpB0cyWLlk6Bl6y97hqq2Fewk5KSbnLB2AyrZ2Wd7qe4VedT0joXW6o IFzkQzHY3ItT4Sctzu4dnDmTrNQmxBnE2e7CLwU6Lu9BGpTN4mQsxAHDoG9rYIJnImzpzV0R vCMqzXjjyB7dVr47vHZ289axDuB7HjIPXLenrTgd9t9WdCcmaXjvOfpmuxhlnJfEpHslvp1E 3VX2U1oZxKOnxvekuXlnXvSktJ7Ka4dk2kOV50RbplXRuwYs8wurNVth/7e1OycJ7658kqEK SYOfHRK+vubereTTTdaR26RzNbvupapQp1zoKpTkx9mTbQcrGAcOVxdDmSyFTrTeynfr2gcI g4jpshycFeX00ScdoyKsvScph6htC9fZOp45iWNLlzA3jQG3GdWoOC2XgK3cx5OoF66GrikN TJu1c3Eeyahg1CKu5utFBDiNh7ND6CYooT1XZvcEq9dlBbWbfYTu9uPoJopHVup90pdLjpTj NibvhwwHd7trFhrFvSaXR0rTi7VUuMxNm7OdFr7tvDJdN5I6yhWobql3uUdl9nJc3wjdqA65 18EnBfcHzdZ1YijVh4jtTLnTOAq1dhUtqMYdyAdjhrTsqGA4FJzUzHWt03j7OrVNF7U1QgMp 0z2XnHls3N4YscUJh0l5mbKVXT18jrj0X1dTpUnavj27Ja41iydrdsmVaLljvbUlDpYWzGdm 3tigSyTOrrcwnRg4hHJAWghtVuSZhF9XqK7d1VNBe3u8WVMgI7tUpu+wcEdjO5duO4re3Ak1 z6uoVDBIoOdaQOxM5srlk6C3M3tOcTUCeMdTycxwFZTecL1jglmt7lNHYDWTq3wxN1gyktWy 0iNTImFIksWcASrruss4IktFm+KyshtJ0DOCx7vACWVZdGhFo3WDtkVZzaKsHFl7zADhvoQV m7tB42WYYOzkbOt8rTnA9crYChd9d096zwWZ29zdmN6t7RUus7M3u7dqxG3GSC0+xWth0+N8 7pWadYsVqtqZ18yvA7jGwt5PTpRs06dasl7E97a1Rvtgg06cG4qMvonivWuL5MZnIbuupi1u r1UlmGHJmoF5do8KQwPKBGWMABTIqwdnNCgDzxiWgaCWHlmc9rK7t2VJiiekU97OMkZ4UwBM SHZxZZNEGAVG485b2nO1hZS3OUQK7lXTd7Vq15SubS1noXVKhqqUAqwNRu3faaIzCCOJ3u0U qwuu5yzuVN3bbd4XdTnli9CiyC74X044o3TuImXkDFBx9l2EbHViS3eFSyt6iitvYaJO9Bcj 1xQaxs1ZwL2lqHS87bKrM5VC8vs3uzeys1YjcsY6k0LdSlcDyRbovNfVJcNisJMxYUNUgSzR mbNnUYA2JkgXR5m8zCODM8xHsytJ123l9s04weHBxZW5tpTBNjLLM1KpavM66rCrxt6KMJ2M 9RDJJeW7GZjzX2K12K1WxNE1YtsJdMdbbybEnI+u6dgYYF7uLE00A0Jl70cvbO+42SaigqwS L8bqXiaHWXpT7e3idD7W+4ZhWTz3bSVMX2g0OUw9Bwt4ONpqG/NUIEt7EC09FRtJ1x2ZW5EF HaZtrDjjTL3TtPtd2Se4MzbwYHdsZD3VMx9Gt4uVmQ8ZbnUh1ZMLJ7Ya23ISQ9zbd8WAszX1 YnJ1cEqrVFx7Gl1Je7D7YX7hVrsY9s1Bd5YJXDeNHDtmTMi9YIRvcaizt3pscvE6JHK13ZMk 85wfqHZnZfIc4terRQqDiFT9mRphA1u6oXNJ699Yzq4GssEm6lYg4T0tDqWuC0aXF5c7coZT pzd3sx7Lmqwt2oMLp5pBm14LOHnJM6THjmPGcd2sMtpZ20KfO7q6NxRdCdlBdmiWlgzV2KN0 AR2unRpMVe8B1w41KYUdbSQ7PdMCcvppzVqJPDcU4Np7e0X3TexdM3r0YRTazaSXdkroUQ6M XaprGKDeoX2o3d2QWVkKyVxo3Zii6YAe0b0Y4ZpExC+yKd3Bta+wHWmzqe8Sc5aU7fO95vST 3o74vOjZYQqCl0nU3rVC66ui3FOu0Ft9vJrG1MVbpu3Lvi0+zus71PbVYnw46KFBpKMi2LmZ ze2xtPTSayKKa3RW3aRaV4o+HMzslN49V8gUd6+SbyN9pjUJ3r6+Ubt6kuD11XWqaovbmUq2 DrkFOKseE9b325DctEb2XjSTfdmrDeHDsayDRQfIYhpizWsUkeXCX2Pdrib3MXKUTRp25GRm hZFLFsdH29dGR5/gylUhpfVxXD7Tm0R3yorB0L2bbFH74arJ2Sq7Vd7nLq4s263Zku8BDlJP OB3ES4YpQpobj2+rltaVRVXaT2+STg47HZzaG1cN9sCoSxZfV4lOmTe9cK0YKxi6WtnqQ4bQ h3ZmzInJwxDrzqW8zRdkVljrqtVxcCQiOHIdy1DobncLIqGbnVN2g5nZXXUIeHjieim5xKrZ r7WXUQsxcdQIqpOx5BguFjJKEsXUhV34NTbeNkQzgM5OEgcc5ck8a03prr4ZnUIBCRl5t5ip 882K52EpzZMKKGzl3Qnt7b69D0AQBARYcbPdSp105cU74whnQ63iLCuvQYC4c5NbK3tw4ZH2 Zh1jmw3FeXnG7e09nO63ZMOLicrTjd5V6tsnq0c6q8VHp3F0CEpDGc7jM3KnJDsJzrPbcLsx SG6C5zKndt27ZzKx5m296iAfp0dbSP3cvpUm2U5dxbiBlX9R11j7tGdNWlYywwQtdd01ypVc 1S3ULrRmD/pfL2mgHW9BYfznzFwsWWC4PnVzuGOVvYgKCP+wgKCP+BAUEf8xAUEbEBQR/wIC gj/sICgj/zEB+eefPPn19/3/aqqqqqqgADbbbbbbaI22222222222+eRb7tttttttttttttt tu679L0AAAAAAAe+3vr0AAAPaqqqqqqqqqnt7717VVVVVVVVVVVVVVVVVVVU9vfevaqqqqqq qqqqqqqqqqqqqnt7717VVVUAAAAAA9vZwAAAAAAAddVVVVVfx/H8fxzf6/6f2fv91XvVXvf8 KqhVcoAcAbu7o4A73ve963d3va9u7ve+qqFV3d0dKr776q96r6ryrMve+FV71V7zMAZgzAFV RwADMN3d0BwBu7uiqsycAcAAzDd3czSqoBmAMw4A4KqzICqo4OAOCq5QAZhu7uZoFV3vd73v vZPePe973vHvf7iAoI/q/fru7u7u6qqqve7u7u7u7u7u7u7uqqqqqqqqqo67uqqqqqqqqqvp JJJJJJJJJJIkkkkkkhBtNEkkmqqqqqqqqqqqqqqqqqnr332ABttttttttttt773vvuJJJJJJ JJJJJJJJOZmZhJJJJJJJJJJJJJJOZmZhJJJJJJJJJJJJJJ3vvvvvu2229AAAAADe+++96AAA AADbbbz31kkkkkkkkkk3f9/f39/Nt5jbeZ/Ntt/u6q5QA4A3d3RwB3ve971u7ve17d3e99VU Kru7o6VX331V71X1XlWZe98Kr3qr3mYAzBmAKqjgAGYbu7oDgDd3dFVZk4A4ABmG7u5mlVQD MAZhwBwVVmQFVRwcAcFVygAzDd3czQKr777ve9++zDgDh/55+c5z8/OefPPn19fcNttttwAA AAAU0AAAG2222+gA7ncAAANtttttttu7vt76AAAAAAAPfffffQB7VVVVVQAAAPfXcAAAAAHV VVVVXHdVVVVVVVVVVVVVVVVVVVVXHdVVVVVVVVVVVVVVVVVVVVXHdVVVVVVVVVVVVVVVXvd3 d3JJJJJJgAAAAAAA3/f39/JJbG25/fzbdfzbu7maAHAFVQzAHe973vVVdq++qve+qqFV71XT 3lVffbu73te3d+Vyu/fG7u97VdMwBmHAG7u6OAA4KqgHAFVQquU4A4ADgqrMm7u6A4A4OAOC q5QN3d0cGYAzBVcoAcFVZkBVfffd73v3PjgDh/b+fnOc/Pzzz558+vru+u7u7qqqqqqgAAAA A6u6gAAA222222226u5ttttttttttt883dd3JJJJJJJJJL1VSSS9Xru7u7tJJJJJJJJJJJJJ JV/f39/fySUjbc/v5ttvuSSvNADgCqoZgDve973qqu1ffVXvfVVCq96rp7yqvvt3d72vbu/K 5Xfvjd3e9qumYAzDgDd3dHAAcFVQDgCqoVXKcAcABwVVmTd3dAcAcHAHBVcoG7u6ODMAZgqu UAOCqsyAqvvvu9737nxwBw/t5+c5z8/Oc/Ofn9OfnAUEf/KgKCP9/1JN1VVVVVVVVVVVVVUA AAA2ABttttvsAAAFqAAAAAD76qqqqu3dwAAAAAAA7u7gAAAAAAB3d3AAAAAA2227q2222222 22222222p8822222222222zNtttttttJJJJJJJJUkkkkkP7/v+/7/vMzPb1rWt/3/etaq/Td 3czQA4AqqGYA73ve96qrtX31V731VQqveq6e8qr77d3e9r27vyuV3743d3varpmAMw4A3d3R wAHBVUA4AqqFVynAHAAcFVZk3d3QHAHBwBwVXKBu7ujgzAGYKrlADgqrMgKr777ve9+58cAc P1+fn5+fn4iP/4ICgj/kICgj/3EBQRsQFBH/koCgj/yEBQR5/wkyu3d3d3d3VVVVVVVVVVVV VVVVU0qqqqq/L3d3d3d3d3d3d3d1VVVVVVVVVu7rqqqqqqqqqqqqqqqoALu7gAAAAAAB3d3A AAAAAADu7uAAAAAAAHd3cAAAAAAAO7u4AAAAAAAd3dwAAAAAAA7tuAB5+/3+/3+93d+7Vd/f 7qqN3dzNADgCqoZgDve973qqu1ffVXvfVVCq96rp7yqvvt3d72vbu/K5Xfvjd3e9qumYAzDg Dd3dHAAcFVQDgCqoVXKcAcABwVVmTd3dAcAcHAHBVcoG7u6ODMAZgquUAOCqsyAqvvvu9737 nfePe973vHvUAABSqqI/CAoI0CIf+BAUEf91AUEf9BAUEYICgjYgKCOKAoI/7CAoIwQFBH/Q EBQR/zEBQR/zUBQRsQFBH/uCAoI+UBQR/8CAoI7UBQRsQFBH/7UBQR/6iAoI/+RAUEf/IgKC PUQFBHagKCOAKcEBQRiiACM4ICgj/uICgj/agKCOCAoI/8BAUEf/VRAUEeCAoI7UBQR//zFB WSZTWUba05UCbq9bgHSQQAP/9QAKv+3f0GDL3wAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAj 6UACpCPoGcAAAAAAAAAAAAAAAAAAAAfePq8cctsLWFSrZogqgNWytKZAqqQJnwLwCcvZNg1o NVVrK0WgS2iYzNZiDS6Yc8DvXYBb0UNVilUJY2iQiCkFULtqVFVcvAeAM8j1gLFgGJqamAFG RpkgJLPAeAc9KiXmyIQszVsy0TakqEqhEoDPAHgHnAKA8zIZstjTIbbVbWJoaoqXbVU43qAu 8BvcaNmGgprRmmpW2NGQKjRlVXTjvAN4B48cmUpqsWmqJKVsNtlKbaqhKsPB3gHbwpc7OTZi KaNLRltibYNaCqhQx4PAPA68G7OXYatDLYzZloZQmjCoSLbRIKAoTtqqFUCqJVJUhVFrCQqV EJEm2JSVRLgDwHgGwMAgCPQ7uQ4BzOIOAcM4m4BAACVPTz2yYn+qVVVJoGg0ZAAGKqfpvaR6 qqTSU9Q0MgyAAGDU8gyUlJQg0A0AAAIp7BCUqin6oZMmgGRhNMgVP9qUpTJJ4JAAAAABCoJo KiIZNRNExPyT1TaNNJ6ooKA/y/T+f6fr/T9sc65r+nOX6g8RBXqwgAIjuozjFirGc5sYqxZS WSUmaSRicYw0lSsoqjQkQJEAxKtULELEhSqljAA4mkWkKoKAFSJQiBpApiVQBzZkBFzIMQAR C0qVQLVCUgRANKiCBiFVRV/2BUFBgFARHg6H+QJ/UQWEVVB/wKp/cVT/0gIf2RBFB/uqn/kM qIqgwoQoSEoiBAooMooASqIKEoCKMSqoESiRIKjkTKqYUTAgsomSUVkSQSED+4qmBP+4qACP +6KACOBP2Rf5EoJH/UBSBA/gED+oIH9QQP4BQOgVP4BU4A8BU4CpwRTAfsKPYIHYonYKnYKn YoGgEDQIH7iAHZBApAqcBA0CBoBDgKnAVOAPYKngKngD4Cr4CB4CJ4Cp4AD4Ap4CL4CB4ACe AAngCngL4Cp4CJ4AHgKngPYIHYIHYInYKnYAPYIHYAvYKnYIHgIHgIHgAPgCeAgdIEoDgBNg K+KLlBGBTwFA8AA6AV8AOgQfAQ8AE8AXwAAhR0ChoED/IUP85ooSlaVpWlaVpXcriVpUpWla VpWlaVpWlcSuJWlaVKVpWlaVpWlaVxKGJWlaVpWlaVxK4laWlaVpWlHEriVpWlpWlaVpWlaV pWgSkaRpWkaVpGkaRoSlaVpWkKVpGlaVoWhaFxI0riUpWlaVpSlaVpWlaUpWlaVpSlaVpWla SlaVpWlaRoFpVpWlaVpWlClaVpWlGlaVpWlaVpWlaVxK4laVpRpXEriVpSlaVpXEqUriVpWl KVpXEriVpSlaVpXEpiVpWlaVpHE0riVpWlpWlaVpWlKVpWlaUpXEriVpWlKVpXEriUpWlaVp XEpiVpWlaVKRpWkaEaRpWkaVpGhcSuJSlaVpWlGlaVpWlKVpWlaUaVpWlaUxK4laVpRpXEri VpSlaVpXEqUriVpWlKVpXEriVpSlaVpXEqUriVpWlaVpWlaUpWlaVpWlpWlaVpWlcSuJWlaU pWlcSuJWlaVpWlGlaVpWlKVxK4laVpWlaVpWlKVpWlaUxK4laVpWlaVpWlaVpXEriVpWlaVp WlaVpWlcSuJWlaVpWlClcSuJWlKVpWlcSjiVpWlaWlaVxK4laUpWlaVxCUriVpWlaVpWlaVp WlaVpSlaVpWlaUpWlaVpSlcSuJWlaUpWlcSuJWlaVpWlSlaVpWlKVpWlaVpWlaVxK4lKVpWl aUaVpWlaUpWlaVpUpWlaVpSlaVpWlaVpXEriVpaVpWlaVoGlaVpWwIL/CigoOATaKACOgVBQ ef655+P3P39/Bvet7533rQqnoqkqiKDz9POfn/x953/L+Xfeu//H6f1+++6666666+/Pvf7P 9m7s85wXfJ/PyLvZ3d2627uM+/f3N0VznOc4N39flVteqoiPyf2t3ZtlRERe9133rqu99vZz 5n2Vz839n2pv2VERFu67711Xe+3s5HH25kV9937t1EfbzvN1PsrfemZi+Xv25kX9935VRH28 7zSfZW+9MzF8vftzIv77vyqiPt53mk+yt96ZmL5e/bmRf33flVEfbzvNJ9lb70zMXybnY3P2 v39qVVMc5sZGs76q33pmYvk3Oxuftfv7UqqY5zYyNZ31VvvTMxfLjebmfV99XyqmOc2MjWd9 Vb70zMXy43m5n1ffV8qpjnNjI1nfVW+9MzF8v+RvNzPq++r5VT99vM5rMz13p3vc+z+c37Mv 7v32fKqfvt5nNZmeu9O97n2fzm/Zl/d++z5Vfv7v2fau79d753vc+z+c37Mv7v32fKr9/d+z 7V3frvfO97n2fzm/Zl/d++z5Vfv7v2fau79d753vc+z+c37Mv7v32fKr9/d+z7V3frvfO97n 2fzm/Zl/fd5zOLu/vt5z7V3a732973Ps/nN+zL++7zmcXd/fbzn2ru13vt73ufZ/N59aPz37 72pt3nOcr077uZdV3ub2c++37cjOc7Ec5dXf32859e7mYzNVVVWcz+Rv3ve9zlRHOLu/vt5z 6zMxmaqqqs5n8jfve97nKiOcXd/fbzn1mZjM1VVVZzP5G/e973OVEc4u7++3nPrMzGZqqqqz mfyN973vvqqOLu/2t5+2ZmLve973pn8jfe9776qji7v9reftmZi73ve96Z/I33ve++qo4u7/ a3n7ZmYu973vemfyN973vvqqOLu/2t5+2ZmLve973pn8jZ973oiLvjMn979+dz1V71VMzM3X 856Lu7iIquZ7J/e/fnc9Ve9VTMzN1H9j03d85yq+z2T+59+dz1V71VMzM3Uf2PTd3znKr7PZ P7n353PVXvVUzMzdc9F3dxEXdxnvdv6+ft+u79VVMzM7lwnMzIiMzI892/r5+367v1VUzMyy 4TmZkRGZkee7f18/b9d36qqZmZZcJzMyIjMyPPdv6+ft+u79VVMzMsv+OfX5+P0vZve85zle nfdzLqu9zezn7vt9z3rmWZLzufZz9td2qqmZmY3Ll3IzNmZ970tdz7Oftru1VUzMzG5cu5GZ szPvelrP3Prtd2qqmZmY3Ll3IzNmZ970tZ+59dru1VUzMzG5cu5GZszPvelrP3Pruqr3e9hM c3LhNxd7MznvS1n7n13VV7vewmOblwm4u+73vc97us/M27qqd72NmObl/2E3F33a73Pe7rPz Nu6qne9jZjm5f9hN3c72Zz3u75+Zt3VU73sZvZjfZ/Zmbu53sznvd3z8zbuqp3vYzezG+z+z M3dzvZnPe7vn5m3dVTvexm9mN9n9mZu7nezOe93fPzNu6qne9jN7Mb7P7MzmZndrvfd9vmZV d730zMW7MMz+zM5mZ1Xe99XnnvXfe9TMxmdmGZ/ZmczM6rve+rzz3rvvepmYzOzDM/szOZmd V3vfV557133vUzMZnZhmfyOc5r89++9cV6fvt5Xpe2vey7qvd7OZHP845bJvu7Wc25mIeiPR bsw33o/zv+e973dnvSt5+Lmf2N9Eei3Zhvvf3s+973dnvVL2Pxne/saiEZnZhvvf3s+973dn vVL2Pxne/saiEZnZhvvV/ld973djsuq2Py2VX07EQjM7Mcb737/ld973djsuq2Py2VX07EQj M7Mcb739rvve73Z71S9j79x6q+7sRCO52Y433v7Xfe93uz3ql7H37j1V93YiEdzsxxvvf2u+ 97vdnvVL2Pv3Hqr7ec45OTMzDcz+3Tvu92e9UvY+/ceqvt5zjk5MzMNzP7dO+73Z71S9/fzH u9+3nOOTczMw1m/5l7Sqjsuq39/LZ3v285z3JuZmY9rN/zL2lVHZdVv7+Wzvec2Ij0RcRHPa z+113O92e99S9/fzHu95zYiERcRHGs/tddzvdnvfUvf38x7vec2IhEXERxrP7XXc73Z731L3 9/Me73nNiIRFxEcaz+dzs89+V++u4r0/fbyvS9te9l3Ve72c59nPq9cVO9VN/fu76q5xEQiM iI5es/tdZM7Ez7qp37749VRzYiER2Ijl6/nZXEbCfdVO/ffHqqObEQiOxEcvX87K4jYT7qp3 7749VRzYiER2Ijl6/nZXEbD0uxv33xnfRzYiGzNTMxkuyuI2HpdjfvvjO+jmxENmamZjJdlc RsPS7G/ffGd9HNiIbM1MzGS7K4jYel2N+++M76ObEQ2ZqZmMmldZM7s7vbqY++J993ecbEdi I3N7td3JmdnXdqY+++J9z7ecbEdiI3N7e3W+73uzu9upj74n33d5xsR2Ijc3u13cmZ2dd2pj 774n3Pt5xsR2Ijc3u13cmZ2dd2pj777d3qOc+bznediNza262ZmdnXdqY+++3d6jnPm853nY jc2tutmZnZ13amL5zm7tRHOfN5zvOxG5tbdbMzOzru1MXznN3aiOc+bznediNzaysrv3vy/2 7uNt3nPRcy9te9l3Ve72c59nPq9czW9VMXznM3aiPv1v33Z5zc3u13ZmZ2Xu7UxfOc3dqI+/ W/fdnnNze7XdmZnZe7tTf3327vYj79b992ec296rqZmdl7u1N/ffbu9iPv1v33Z5zb3qupmZ 2Xu7U3999u73n7+N79H323s/jvkzOw9O9mvvvt3e8/fz29+j77b2XfJmZ2Xu7U3999u73n7+ N79H323s/jvkzOw9O9mvvvt3e8/fz29+j77b2XfJmZ2Xu7Xe3znN3cuPv1q+d5z3t73rZmZS 93a72+c5u7lx9+tXzvOe9vU1X5ve96lO9mav7d3L59+tVzvOZm92ar83ve9SnezNX9u7l8+/ Wq53nMze97uzMynJ3vu9uIhCL2efG76LiGd73rZmZTk733e3EQhF7PPjd9FxDO971szMpyd7 7vbiIQi9nnxu+i4hne962ZmU5O993txEIRezz43fRcQzvbn2d+9+X+3dx6/d5z0XMvbXvZd1 Xu9nOfZz6vXM7M7M1zm5HK9H2m76LiEzMtiEpyZyZrnNRytj7Td9FxCZmWxCU5M5M1zmo5Wx 9pu+i4hMzLYhKcmcma5zUcrY+03fRcQmZlsQlOTOTNc5sJitnTdcqI2ZmdRHp9OTOTNc5sbM Vs6brlRGzP+TOo9PoyIyp9cRs72b7Om65URsy/O93ZdR6I9UriI2YqY33te5UQmZkiPT6cmc mfXEbO9m+zOm7zLiNmXdupl1Ppn0yuIjZipiN97XMuITMq7ERkXEXHvXEbO9m+zOm7zLiNmZ 2uxEZFxFx71xGzvZvszpu8y4jZmdrsRGRcRce9cRs72biNN265zYj+w72Ivl85fM2ojZ3s3E b5u3XObEQ72Ii4uIuM24jZ3s3Eabt1zmxHZVUzNxzl8zauNnezcRpu3XObEbRP3vyv2qR697 znouZ32172XdV6qrubMejmZMc5sRvqufd9UvTO+3nNuojZn+wrsRXL5y4jNqZ3u1L0zvt5zb qI2ZhXYiKi4i5nNuZ3u1L0zvt5zbqI2ZhXYiKi4i5nNuZ3u1L0zvt5zbqI2Z9K6mZvOcemW3 3ve9mVzO5z0Qy5m5nkev8iIrOc9kz5fezMR64hfPRBczczz8j1/sRWffeyK8vvZmI9cQvnog uZuZ/yPX2IrPvvZFeX3ve9mfXMs56IZczczHr7ERWc57Jny+972I9cQvnohaZiKj19jJuec9 kz5czPOeu4Xz0QtMxHPVPMis5z2TPlzM8567hfPRC0zEc9U8yKznPZM+XMzznruF89ELTMR2 Pf5PMis5z2TPlxH33ru4XHplERzk9jPyYua++xEeVEffer1wuPTKIjnPs7HLjt85iZ9bO97E ezIhkJn0RHOfZ2OXHb5zEz62d72I9mRDITPoiOc/nq30V/m/nXq9e95z0XM77a97Luq9VV3I 5nPruN5zuzO37O97EMyI3ITPtmZiLj1zEVn33til7ne9iPZkQyEz7ZmYjnqjnO3997YL3O97 EezIhkJn2zMxHPVHOdv772wXud72I9mRDITPtmZiOeqNiKznEQXud72I9ncmWS73uzMxHPVG xFZziIL3O97EezuTLJd73ZmYjnqjYis5xEF7ne9iPZ3Jlku97szMRz1RsRWc4iC9zvexHs7k yyXe92ZmI56o2IrOcRcmb6qqI8U733u9mdiI5XPVGxFZziLkzfVVRHine+93szsRHK56o2Ir OcRcmb6qqI8U733u9mdiI5XPVGxFZziLkzfVVRHine+93szsRHK7Hv8jYjPvnKgvc72IjPbR Xq72Z2Iip56o2Lz75y4VtzPOZntor1d7M7ERX3q5vKz75yoL3O9iIz20V6u9mdiIqJ+/an1/ b/n+Py5TvY++vPb0ervZnYiKXz3Pcr937vPRl73nEXM77a97Luq9VV3OT/djmZH5v737a9fu 84i5nfbXvZd17vezmbz7feyfvvu85lZP2ouN9vfeuq97vezmbz7feyfvvu85lZP2ouN9vfeu q97vezmbz7feyfvvu85lZP2ouN9vfeuq97vezmbz7feyfvvu85lZP2ufc/X8/r5+fz977+fz 5553+PhVNiqf0FQAR/uKpkCBUFByD/cRVUH+wiqoPiKABkqqKKqiqqiqoquVVVyq5XlV5XK5 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 8TwCF7QvJDu9Ol8xTNXBXHjoius3ZYV9mu4jsfBniamkmTTmcILyljvDTm96km+3rlmzdPst Va4zKRq+EPOJp5x5l31aGb3aSzSOQQmwWTTIOu3kGZDOUM5qDCUXW4BfGZi1OczgxnZxebG+ kQ7DtPaerYDbrNF2JWAJ9a6i6TSxs7xO6bV0+Z4Bxm6B2pi6nJZMJgqu45zwo5U6+63aS3Wu OL1bWEdjfzhemjwNUCpjrrVHjtx03riXk6IbXYu3WIcGITq6ZdPMHVczjjqmO3COgzopRStW gTLJfXW+sla4Rljeb3ZI8292OA6cbwvqu7SK4sVnapmWzRky11caBwPFd8SYe3rPZdTOfTNl sYN3aeYWeqntTtq+knKKI3kTtPmuJJ2u1Cj0RHNiuzqR52Nx44KrTwrd4WibNXE3Rjzt6ZIB B0zuHzUw6Z3XcVl9lB2aZ7q0GcEaLCm/awVm231aO2LsbeXm4iIdfy4Oz3x+42D08dUp/Cjt 6WytGxX0XsFbueOqVl70DxY7m3lxu+OVXSdtrTNWlZttuiTT2y01jZRyGoszllblnN6AvD1y W6qQ2RYVOZsrnxljWo1m2XlO6zO5tY9malkJ1u1mZV8YBtSu3BgEV9Ckjsq5vDZjLuMrpbrs 0MGhbeAuukl7ZnDg1xT25LXmh0WYGhmVtpLmLJ0QY6Zs07u8pwmtwG0YnVIy+Njd3FxDuqGG lh69XLjcRTOmXbVBlUYAdc2cBnN8dPCc9093RHuut3Jd3aN3l3rn2YtKxy0KfDJEnN5461jr abOaijKfTtNrs4cLvjz0dfuVZzkqZLMUFBA9sDzbolbH3cKFg7vcKMgrjmRSlQ23yZoZe7nx JyvedE7vVDpnLfu/cuWpjko1arOcnTMiBWWaPza3HbQW6W85ubryJPvXnddZB3SJ47lP3dZz lIZw0PqlLIlpObfWhQvTdsUTDMFbTLw2ZON9bw7DSsrpx26B2Cs7ZXO+pImLahutnXsazdra SxXJ0Z2lCnA5vaJDVzipweSj1rOuVmRGsojhvWZmmYVydp/O1EiK7q64bq9nTO0svrrZbJpL gbw0Az3bs6u5UtoFDtxBkJzby8Ho+uC53qNqT3p58trNQmjhuS97ZdjAu4WJpoxNH7LjrSpJ Kwy9Z2+0HdZNvN6sF0DzDuc75DG65zb4CsyuB4iCVnMm3Dronq6LYmR2G1eDa2t4N1LrsoJ1 kKriiu090qPbe0No+Kk43vV3otwu2OJLya4z0yrN9ZY7jpfChWTZr4ZuIrLW8sC6IRicsB7t c64eaDsWMy290dtaMCgNlQ9S2WymeTl8zpC3pcEvOE29ZFTrVO5ke3Y3Hi7KLpU+tcLeUM4l a8NDYukEfsNgrH3DhO42xwebhzu6F3y6hGmCbFaszngy7GzqsEpLnldlLtum74mZrKKgCh5e SpFyZfA8+HW0eU3e59hgPK48u3rnXXmd76515vrw83gCHCggCP+BFVQf0EVVB/YAQET8jCAo EMAIaVVR9UqkSqQaoAKKVqlaoSYEDgLiBGgoAI4JRSRgEEMooYqBKpGIQgDIVQqmVBRMkwQq C5yQRRCNUgFUrAQDRSLRSkDkQqkGCAUECFVgAECUX9FFBQf4VRFB/zUUFBh8885+Hew+v3/b 7bbbaqqqqqqqqqoYqqqqqqqqqqxiqqq88xvtznOd73vecqqqqqqqq73vedqqqqqqqqqq73ve dqqqqqqqqqq73va6AAAAAAAO972ugAABVVVVV3u7ttttttttts33Pl9/d8Ph7fh+j3qqqq96 qq22214qAcBVV3d3dAPe94N3gAUB0BA+++LuyaBbbugG7qqAWSd7LQDMA0ALvNUAsk3QZIof dAJySySFBkigyRQZJ3stANwDvTM1UA4CqgAKgFkktQAoAVVVVVVW23JIocCgBwVX3veQDMA0 DEAzN71UABZJLQySd7LQAMeK+9705+cF4qiCh/uKp/uIqqD/0P1/X9cYx+vPzjGAAKqqqqqq +oMYACqquc5ttznObbc5zm23Oc1VVVVVs1XnmqqqqqsVVVVVVVVVVUPqAAAAAAADGAAAAAFV VGAAH4PX0+e303tvb39/b6/Gvj8VVVe9VVbbba8VAOAqq7u7ugHvvg3QAwB0BA+++LuyaBbb ugG7qqAWSd7LQDMA0ALvNUAsk3QZIofdAgcCySWgyRQZIoMk72WgG4B3pmaqAcBVQAFQCySW oAUAKqqqqqrbbkkUOBQAFV973kAzANAxAMze9VAAWSS0Mkney0ADHivve9Of+vz85+fnOfnn Oefz55555z6fT6cPl8q+d8wAAAAAABmsAFVVVVVVVbbVVVVfcAAAAd736evW222222222222 222222wAAevXe9ABVVVVVVVevXrvaqqqqoAAAO9d6AAAAAAAHeu9ABVVVVVVXQutgANttttt tttttttttttttttttg+++73ve977p+/Utv7/pz+iqqq96qq5mZmZj3qoBwFVVVVAPffAvADJ JugyT776W4gAZmZmgBu6qgGYB3rxJKRvUkpMre5tuJLdb5JdzYAJJoKAFAxAQMQEDEDvTJJL Q4FzVkk72KqgAKgGYAZiAWSS1VVVVVW23dAQOBQAFV973pJLQySKAXd71ZJIqAFA3QO93zWt a1zvw888znOf3VRFB/P5/OMY1+Px+M5znOc4wAAA+W22222222222222xJJRJRJJJJJJJJJJ JJJJ/mkkkkkkkkkSSSSSSSSiWyWSSQAAAAAAAAAAHru9enoAAAAAAAevW9enoqqqqqqqqqvX p66qqqqqqqvOd67c8VVVVc5pnOc5rZznOa25tgfffffffE+7+i0L/P88/lVVVe9VVczMzMx7 1UA4CqqqqgHve9F5JhZJugyT776WoAbczMzQA3dVQDMA70ySS0Nkluc10AZJugyRQ+++973u BQAoGICBiAgYgd6ZJJaHAuasknexVUABUAzADMQCySWqqqqqq227oCBwKAAqvve9JJaGSRQC 7verJJFQAoG6B3pk1rWud+Hnnmc5z6ooKD+RVP/J/sEQkQBEjhRQUHAGFUiIjAJ/9QOec5zz nn159r4D6/SvsAD7ttttttttttttsAAGtvtttttttttttiSSSSSSSSSSSSSSSSSSSVaSJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJKtJEkkkkkkkkkkkkkkkkkknbbbbbbbbbbbt3vdttttttgA AAAO7bbLNtttttttgAAAAAoAAAAqqqqrgqqqqqqqqqq4KqqqqqqqqquKqu9739+IH9f6/15/ VVVVe9VVczMzMx71UA4CqqqqgHve8C8ALJN0GSe970txtttuZmZoAbuqoBmAd6ZJJaGySW53 uqAZgGgYgIH33xJJyFACgYgIGICBiB3pkklocC5qySd7FVQAFQDMAMxALJJaqqqqqrbbugIH AoACq+970kloZJFALu96skkVACgboHema1rWud+Hnnmc5z8Cig7X8gn/sVT/CigoP8KKCg6A /1UUFBg/0FU0KpoVSFU/+AnaigoOQT/mgCAjtFABHIqn7xF++LH4/apX96iqqqqqqqqqquVV VVVV+IAAACqqqsAAB/SSSSSSSUkkSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSkkiSSSSSSSSSSS SSSSSSSSSSSSSSSSSSUkkdttttttttttttttttttttttgB3bAAAARVVVVmKqqqqqqqqqsD+T pQD9w1f03cNu/2c/sVVVXvVVXMzMzMe9VAOAq7u7u7ugHve8G8kkJJmBsk973pckkwczMzQA 3dVQDMA70ySS0Nklud7roBUDQMQED774kk5LJJaBiAgYgIGIHemSSWhwLmrJJ3sVVAAVAMwA zEAsklqqqqqqttu6AgcCgAKr73vSSWhkkUAu73qySRUAKBugd6ZJJM14rnOc6FdAooPqigoP +YqmQ4oB/wooKDlFABH/RRQUH9wTAKgoOxUAEekUAEf9RVP/wVSBUFB/3FU6FU0qiKD/zQRF Qf6gkCf8lREEf8kRQEYE/sCbBUFB/yFU/4UUFB6FUgT0VT/QVTQKplFABH+SKACP4RQAR0Kp /0FU4igAjsFQUH/6Cf7Koig9iqaFUlURQcqiII/0BOgVBQflFABH9gTpBOxIQVEGFYVTgqD6 ooKDKCIgwJlRQUH+YqkKpkE4KpgVT+yigoPiqIoPBVNooAI/9gTxBVUHwVT/sKIqoOxUAEe0 RQEf/8xQVkmU1kANqNlBAYa24B0kEAD//UACr/t39Bgzb98hQAAAAAAAAAA7gAAAAAAAAAAA AAAAAAAAABYcAoAAoURH1QZ4AAAAAAAAAAAAAAAAAAAD59C4+bYFGrZqaagASESilRSgkz5y DvAXBQUBeGUqJbBlVtZTBAprFUaQqpYecRvAIA9eBbAFAWGykAFABIlDPA8B3hQL20ABLRrI tqACRECpZ4F4D3iihVAuwGQkAqUpEBJTPOC3gHvCXAAUgSAADQBSSgUUhUY9oO8BOUEJ61LS trUNFLZQtgbYZRQpnuBvAe4F2ADQCgDZmg0o1lSQqpQseYB4D2Kpeba0pNBioFUUq2DQKCQW MeXgPZFQ9bZq2BtjRQaZW2ottElSKSlZa6aIURKqkhJKqBIqVSKKSIICEooSFKlFEcAPKchH eA88DAd3HngPcBxwDxzgDgPeO8C8B7wAAtPPbZhN+qVVVUAYjQGQAYiehpipSSelJtT1GRoA 0ABVVU//9VPftRtVVVD01AANAAABqn4QJSklT8lH6hGIyMgNMDT9KkqpinowmqemoDQAAARJ ACogjKaKZlD2lPU2ptT0dURUAf1+vz9Prj7FZ+81J+m7W+qK7QVAzdt23du3e6gRJACAEkgX kmvAQAlvbubsIMQi1Ui0Wq0UtIxYxkQiQCACpUUQbWpSSRVEtEVAkFVkBQqDIqiFQBAkUUCQ BFCQBWiASAgqBaNoLUEJAMbdjG6bw445m7cG7jbbsjUtFSRKgCtiKskgAQiLCIsIEIiySABJ CEIiwgAQiLIKACj/gQBEGCIAKOAAsi/ZVD8qAMFFFB2GA/uCL+4Iv/4VU/qgiiD+6C0IgKD/ wMRCAxFQCCiQVFAiCKQVVFiiAgkRFAYgoLBAFbAJZRaBClAGxQoQICjBgIQP3BFpUP/SIACP +UQAEaAT8qC/gFT9UAPyIfgVT8gqf0BA/IIH5AQ/UEA4CBwFDgKnAQyAgQAA4ChwEDgIFwQO AgcBA4CpxQHQOkQNIg8UB/UMABSCvEB2KhAXKLlUSgVOAqXUA4AvQQOggaBA0ABkFTIKmQVO AqcABNgibBA2CrsFTgC8BA4AocBHgIBwFTgA8AQOAqcBTgCBwAHgCcAEOArwFXgKnAVOABwE DgIHAQDgcAF4CJoBA2gpEEyqH7K/xIgblQJCQAJFZFZFZBCRWRWRWRWRWRWRWorUUkVkVkVk VqK1FZFZFZFkEJFZFZFZFZFaitRWRRkVkVqK1EJEZFZFZFGRWRWRWRSRWRWRWQRkVkVkVkUq K1FZFZFZFZFZFZFZFJFZFZFZBJFZFZFZFZFKitRWRWQSRWRWorUVkKgtRWQCorUVJFZFZFZF JFaitRWRWRSRWRWorUUkVkVkFkVqK1FZFZFZCRWRWQWRZFZFZFZFZFkVkVkVkUZFZFZFZFkV kVkVkUJFZFZFZFZFZFZFZFZCorUVkVkVkUkVqK1FZFJFZFZFaitRWRWRWRWRSorUVkVkUZFa itRWRWRWRWRWQVkVkVqK1FZFZFZEZBkVkVkVkUZFZFZFZFZFZFZFailRWRWRWRWRWorUVkVk WRWRWRWRWRSRWRWRWRWRWRWRWRWRWorUVkVkWRWRWRWRWRWRWRWRWopUVkVkVkVkVqK1FZFS RWRWRWRWRWRWRWRRkVkVkVkVkVqK1FZFSRWRWRWRWRWRWRWRSRWRWRWRWRWRWorUVkWRWRWR WRWRWRWRWRWRWorUVkVkVJFZFZFZFZFZFZFailRWRWRWRWRWorUVkVkUkVkVqK1FSRWRWRWR UkVkVkVkUkVkVkVkVkVkVkVkVqNRWRFkFkFkFkRqAlRWRGQWQSRWRWRWRWRWRWRWRWRWRWRW RWRWRWopUVkVkVkUZFZFZFZFJFZFZFZFGRWRWRWRZFZFZFZFZFJFZFZFZFKitRWRWRWRSRWo rUVkVkVkVkVkRkFkEkVkVkVkVkVkVkEJFZEZFZEZFZEZFZEZACRFkVkEJEZFZEWQWUoA/sIA iDSqGEQAEbiAIg9/efG+PPVn8fn6fT68l7fNp/b/53fyaz8fN/pz5+nSqxCvn3vpv5586zX0 +n0+fpM7q2sZxp+Pa+NAi/YEWIHqr3qr36dffiX7nySUP6JMk/t+/p+/3/Ekndmb/P7/e7vd 73dzGK/aIi+973uZ3UzMzd5/n+ZuZmae973P7d3ef5v2lVcz/d3vbiIuIrnOcvtV7Mjl83ee v9+69G7PtiM5znPdqt3Y5fN3nr/fv3Xo37a9vqrIiIiIr2z367d7/f39sd7tb9u5u1SIiIiK zZ79d73v9/f2x3u1v27m7VIiIiIrNnv13ve/39/bHe7W/bubtUiIiIis2e/Xe97/f39sd7tT vN3N272IiIiLenveXexH9/f2zzbjft03b2IiIiLenveXexH9/f2zXdjft03a2IiIiPPT3vLv Yj+/v7Zruxv26btbERERHnp73l3sR/f39s83u/t3M1SIiIiNemYjt3sz/V+/bfdjf2abu973 ve91czEdy9mf6v37b7sb+zTd3ve973urmYjuXsz/V+/bfdjf2abu973ve91czEdy9mf6v37b 7sb+zTd3ve973uruqmYz21W/fe5z6+bGfs1pznOb3uruqmYz21W/fe5z6/+c2M/ZrTnOc3vd XdVMxntqt++9zn329zM1pznOb3uruqmYz21W/fe5z647vczSIznOc3tVuZHL5u89f79+/497 f2zlZl973uxBPvXdVLKneffe57n2xmZrde73vdiN2feu6qWVO8++9z3L5s5+zW693ve7Ebs+ 9d1Usqd5997nuW7tPjde5y+7Ebs+9d1Usqd5997nuXzZz9mGXzm92Ijdr3veu6Wut7zmcznu TOfswy+c3uxEbte9713S11veczmc9yZz9mGXzm92Ijdr3veu6Wut7zmcznuTOfswy+c3uxEb te9713S11veczmd77s/s++zDL5ze7ERu1me9d7W1O85z3Pd7fez97nPEV99u7ERu1me9d7W1 O85z3Pd7fez97nPEV99u7ERu1me9d7W1O85z3Pd7f+d7P3vueIr77d2IjdrM9672tqd5znue 7fOT996u+Jj7473pPvXdJTDnOXy+9r/MiK733Y9OTH3x3vSfeu6SmHOcvl9qsiL733pmcmPv jvek+9d0lMOc5fL72q/5kzcR6ZmcmPvjvek+9d0lMOc5fL72vRUe9uohznOb2qzMjl83eev9 +/Z+R97ciI9CecbERqcypRkdd73vaiplkzznu99Hbj75nUE5lSjI673ve1FTKv+ZVd76I7y+ /pZ1BOZUoyOu973tRUyrKrvfRER24++Z1BOZUoyOu973tRUyrKrvfRER247zjISVUw77rqIu Zm6u6XlV3uRER247zhCSqmHfddRFzM3V3S8qu9yIiO3HecISVUw77rqIuZm6u6XlV3uRER24 7zhCSqmHfddRFzM3V3S8qu9yIiO3HecITkzHc5eczvaiIXd0vKrvciIjtx3nCE5Mx3OXnM72 oiF3dLjK73IiOxcd5whOTMdzl5zO9qIhd3S8rnM73vbuO84QnJmO5y85ne1EQu7peVzmd7y7 7z6SHqyqmOXn2c5Xahd3S8rnM73l33n0kPVlVMcvPs57txcve9byucd7y77z6SHqyqmOXn2c 924uXvet5XOO95d959JD1ZVTHLz7Oe7cXL3vW9VTOfaRDnOc3tVnu/V9u3X379H7P6m85Gd5 9rq59MxsdvOZ30ej07met7/H3zn31V3n0O5k+mYR285nfR6PSzPXefv2fPqrvPodzJ9Mwjt5 zO+j0elmet7/H3zn308+/dczM9Mwjt5zO+j0elmeuznOO85PPvz7My4j27MedRkZGTuXVeff ZzeTz78+zMuI9uzHnUZGRk7l1Xn32c3k8+/PszLiPbsx51GRkZO5dV7rnM7va59+fZl3Ee3Z jzqMjIydy6r3XOZ3e1z78+zLuIr27U4iIyMiN9Uz2zvcjb+/fycqu9n27M+yIj0IjfVM9s73 I2/v38nKrvZ9uzPsiI9CI31TNnOZ3a+/fycy7iK9u1OIiMjIjfVM2c5ndr7778nMu5i/btS7 3vu99Ebe1UHOZ3a+++/JzLuYv27Uu977vfRG3tV/n+Qc5ndr7778nMu5i/btS73vu99Ebe1U HOZ3a+++/JzLuYv27Uu977vfRG3v3331167uZd73ve1V736vtXX379HvvvvqbGffffsnNubq b9m3U7EZ3uREXs+mTvcjb+++/JLm6m81dTsRGRGTM3tVMne5G3999+SXN1N5q6nYiMiMmZva rsyRGTvvvvvyVRUxWblVOxEeiNmZvar/kyd7kV+/ftTlRUxXtyqlEd9EbMze16ZO9RX79+1O VFTFe3KqUREemdqqvbuZO9RX79+1OVFTFe3KqUREemdqqvbv66omVf39/bsJ9UxWZlVKIj0R szN7VTJ3O1/T+2PT2Y7N76qnIiI2Z2qq9u5mSEX/V+2cnsx2fblVKIiNmdqqvbuZkhF/1ftn J7Mdn25VSiIjZnaqr27uqolPv6/2ynsx2czKqURGxGzM3tV6qpKle/vftpXZjsiqnIiNiNmb 2ZiIeTk+9+99t8rsx2c1VTkREbM7VXtVEQxKfe/e+2+V2Y7OaqpyIiNmdqr2qiIYlPvfvfbf K7MdnNVU5ERGzO1V7VVURHvd770Q5yu97Ve3v1fbs/v7+7X3ed71u5+z7719qJmI3VVORERs zs3sz/d715kvV777b7UTMRmqqciIjZnZvZn+73rzmS9+999t9qJmIzVVORERszs7Ef85zizJ e/e++2+1EzEZqqnIjuxGxex7+73rzmS979+2+V2O9zUzGRERszsojnOZesl7379t8rsd7mpm MiIjZnZtM973PbOS979+2+V2O9zUzGRERszs2mbiIzZyXvfv21yex3ubkzCIiNmdm0z3vc9s 5K/7+2vpyO9zUzGRERszs2mbiIzZyV/39s/Rkd7m5MwiIjZnZtM973PbOSv+/tr6cjvc1Mxk REbM7Npn/O97ntnF/7W19OR3uamYyIiNmdm0z3vc9s4v/b2vpyO9zUzGRERszs2mf873ue2c X/tbX05He5qZjIiI2Z2bRPe9z2zi/9ra+nI73NTMZERGzOzaOc5ntjFf62vpyO9zUzGRERsz s2mfvc9773vemc73ve9qvO/V9u3X379H73v9nswZ/u3n0a710mMiIjZnZtM973Pbiv9rdrkk QhMxkREbM7Np5zme3E/7Oq5OZEbCZjIiI2Z2bTPe9z24r/a3a5JEITMZERGzOzaZ73uR7cX/ t7t8qkQhMxkREbM7aI5zme9ufL/r3b5dohCZhERGzK0R/znOZ7258v+vdvl2iEJmER3Yhbvo 73ue9ufPf3t9fLtEITMIiNiFu95zmXe++y73b+u1QhMw73uxFZ3vecZd6+e9vr+u1QhMw73e 9rOc++ZVa+y73b+u1QhMw73uxFZ3v3zLvXy73b+u1QhMw73uxFZ3v998y71897dv67yoQmYI iNmXOfv2ru8+y71f13tQhMwREbM27377XvefLvdv67VCEzBERszbvfvte958u92/rtUITMER GzNu933vZ973vTLve972qzNjl83vb+/fou55dQzjN897y+31FwREbM272+c1mYnl3u3dq7Xc hBERszbvf777XveTx72773l9vqLgiI2Zc5+/au7yOZd697232+ouCIjZlzn79q7vv3qrc973 t2PREXBERsy5z9+1d3371Vue9727HoiLgiI2Zc5+/au7796q3Pe97dj0RFwREbMuc/5+/au7 796q3Pe97dj0RFwR3Yh9XPvtXff3qrfru7vdmIiLjNiNiPnOffaqufrmd+y7u92YiIuMREbM 8d799q75+9M79l3d7sxERcYiI2Z47377V3z96Z37Lu73ZiIi4xERszx3v+ffau+/vTO/Zd3e 7MREXGIiNmeOd++1d9++9M7zLi73ZiIi4xERszxz9+1d8++9Ht5lxd7sxERcYiI2Z473/n32 rvn33pneZcXe7MREXGIiNmeO827v3ue96Zd73ve1TNjl83vf39/dqo5U+++zZ+V2qvZiIio9 kRGz9vOfq1d8++9G/ZXardmIiKjyIjZ+3n/P6tXd/fejfsrtVuzERFR5ERs/b/tau6++9796 eTJERETF5EQn5/tF3X33vfvTyZIiIiYvIiE/P9ou6++9796eTJERETF5EQn5/tF3X33vfvTy ZIiIiYvIiE/P9ou6++9796eTJERETF5EQn5/tF3t85mfsrlVuxEREx5EbH7f9kqtrnPe/ZXK rdiIiJjyI2P2/7JVbXOe9+yuVW7ERETHkRsft/2Sq2uc979lcqt2IiImPIjY/b+/pKrux3vv fsz3fe3Zme11vfe/t/2CZ5ud7737M933t2Zntdb3vvft/2Sq5td7737M933t2Zntdb3vvft+ +/39JVc2O99/Zl8u91M9rre+9/Z3vbu5m5nO973varN2OXx3t/fv0b9C63eZuzL0RERF3m1H L5ve/v7+7zJgeJnLiIiIrye/U5yv379sdzb3bzdmVxEREVmz36t5yv379sdzb3bzdmVxEREV mz36t5yv27+2V/H7/P3++/j9/uT+n42239/H7iP377szP2v4qvV7xqkX9EQAEfsH7gi3FggC IN0V/cUUUH+ooooPRQ+ghEUkkgAwECAgQECAgQECKLAUkISSRQikiqMiyMkQAiiE23DAZgGA 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 SPAd1i0VOB4c8RvXay3xR3sNuIdVQTQMk3CVu6PFGKsOpyZLJfLgM5bqqcw4qy5KJyV13mqz fU5y3ulrttdhM0bj7IgeGjWYbO6g0azgaIx4ob6dUpV24ua010VztTOzdCuasF7yLRy3YxR9 g7jndsSMV0ctCxT2NKbQ3s2seE2stPXnBoYDz3t1PjOUIy9jts8CqrSFWjmksld110yHDJsT qbpmvMQwm7kaXccUMWOXVupeZa5S3T0NQ3qebY2cAqyBbpU7hkvFqQNu6EK40+muug3IKbe9 /Es08b3G1EmBlXr9XOxTb3axCaOtNKTtvOTmMmpuB3nVJFXOhV1q8XOpkkTRt9OW3nUdTj3u EXcss7EZOqaCt69pZQftNY9d4LizNXLGw+EEgRBJAETJYQ6CHQACwIGgROgDsFTKCm/xW+3v V7mObq979/wP4qqqqqqqqqqqqqqqo/L1VVVVVVVVVVV/Hve97zbbbbhkjbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbhkjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhkjbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbhkjbbDbSTDRKSSSSSSSSSVVVVfIAAAGYCpIRWqpAqqqqqqqqqqqvui+BU+d/Px8 fPzu7u/skkl/V9bbbaAGgNAQOQEANskm6HSSoZh+fmZ+GgDwFADb6rJJ6KAGYNtttrbWSboB qgHcAdyqqvlQAFQAFcxZJIqq+VVZJIr5VVAAVzFVUABXMVVVXMVVQAFQDwOYqAAu7u7uoAaA Fvd3d1AO4CgcgZh0km6DJJu9ZJIttttrbfW22+971caYZ/Cs+++cm2Y3aLOAbxvHmf3YPZJf jW0H2M8cGLeX2m+KwowjfDzH1EUR8nfMoYzQFkMjDmqEZahlTEKCu1yGHKQHH7vIUbr3tm2G fqi06/NkD19K8peUm0j948fjFyVEZeCt9fy7xYo8rz1eBA41m84csu+YlchY56R2DqVJ9lp9 vEmxgp/JuyIiAnVx2H120+fvVVV+er3qfu3WzXrVKiz7PODTkXv1kh380Q82TDp+swuVVXrX LlxUJMxQWUcsCpWtWzEAL8KURox2wKluUCpWqBAogIE5zNTVctkBDJ2gQCsYsCBYgKGSs2BU ogISIJM0i1FRM0XsCpi0m7YObrXMy2QVNRQCG6AWtVuxiyIGLUiBWqBAtqgEGu85itF7GQVM 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 hcdJBS3zwl0r0G2OzRpmzs5GleZxV3LI2skO7qQwumiT1Z2b11jVgWU7rT2UnzUtzmDyCQiC QgAJjIKnAQOIgbReAgdBVyCpwAOX+37WlrX5vdrWt9l79wGAAAAAMAP+F/httttttttttttt ttttttttthtttttttttttttttttttttttttttttttsNttttttttttttttttttttttttttttt tthtttttttttttttttttttttttttttttttsNtttttttttttttttokkkkkkkgkkmIyAEHwIHZ zVviVVu/T2c5zn63ve99/bhziqqAfffW0EBQEANskm6HSSoZh+fmZ+GgDwFADb637759FADM G2221trJN0A1QDuAO5VVXyoACoACuYskkVVfKqskkV8qqgAK5iqqAArmKqqrmKqoACoB4HMV AAXd3dH7vt2aFvd3d1AO4CgcgZh0km6DJJu9SSSZG222426bbbqq9S/mfG592gbdaN7MFKrT dTLTbyI5af+NxM0VSEumPERN4nfBfo7ojd6SyF5IiEouLDXzvtg0km0KaDis2aFaPdQog8EL B2kKONQiNB+xF+as7S8fvEUQL8n6AlN5HCdXHQYSbOAvE0mMetwm2ri+ZloEzKYJoo5HXXZ8 3pFuw/oYfE4oYaPnnHcqLNvPkc4HPuq1gvK3ZW6lW8m4ecieU7BPS2b5vrmN8yZN7N4AUPAJ 49ir91Y5DOKkodSiJtTwxj2LDF+ijN+dXizROj4TCI7rqncq2nvJtXkOupnxdu0qC6vPEjjF XIqc8vg5z+CaAk9g8Tzv7zWEaQBx+shNABQXlesI2eiBMIWI0hCT6vVmTM9aBIqIc2olywjy NWIm99NqtaqrUzLUprykjHaDL69EvNe2I5eTdqy+CKw1lAfD78APh0fX7vruXZ2nguhwu3eW mMTW7d05aLjrdpG9xon0l5+cX2V2JlCqogbam+YD5SP33V9DZs2Ta+WqtVHlXaN62sRs0X7n R2IUQiKs4mEVXT1CrWtCsVXXmzWHtdX2PY9fnW2o2KqrTN9curc5Nbz7eb0ggFGMUQ61d1gY FY4UjztJxE7SKCYKo5BsvpRnVlAfAAfgB8EjxXqSa1NL3qBu8n7CkELsWtgzFhH6j1UP1KwT B5afifUtvGMINIQhvhadUBmoU19h+oiEBWUzpFlH7noxJwC8Q9SAwjbQ04QBZRXZwiPHNTpa fHiKtVq3EOVtDLnud8biuYgrHO2mMXuRvHhdpZUvyZtdeLq6168WmKpFEIrdsqrUN+kF0Esw ipFMEnrpHywZguYO134LaTTsY8g21MpaYUykjnFUeuCop1X6Rt1XvfD8APhWcobxyiOHrXU4 7q/MTQtlM4kNq7mC2Xl7JS568qlkVrhbqBSToMR/VSRwG7vroAvGYve7LFD2mmax+Dw6umHz pSbz2yLvZiubEzho0IiJPQ2Hjw8nuLVlq9wzpsqUu7p3TkcuLy1mJbuNF77zk7WdmvhufZGd iqYlVEl5vJW7l7buC5e6eCIp91oAD798B8HPeucsNKXf6EZ+27/DrWBIKzpHHdCFYYxVqjWV aI29yEtBH7T9ph0/CiBjVkLj+B6zgscQKISIWm7U4jYhi9b33tw1ymbobSt12BjQUzl1LDjN 6IKqDxs4RW31JVsE1l/O64fZeMj50Fuy524Qds33Kj82m07dK9aZn2ptVSnqbBvfCiL9WUeq jkvq8TlvRpjOSQSIxA1RExDJqo5LJ3c1CvPFoV7c5kBA8gnrZrPa5DRCWo7KxRWu7z3eK/bC 83jVAeVIaoLtDx7Znrfm6h15mY/Ddzg8Ve73rFdeAIhooby+EBGOrszKuzcQ0/MEePw9Orcn sIPyIHahC7Qww/aRnuDJC1aUCMohfPVh6LPO8jC31cqFeF3n2ov7cWe69HXSeVu5EgpYQd7d g3bQHAnYYeMPHp1dMy9yhKr3vV+eqvVtOslhgu1O1VDVCTsH7PFM2bOy5k/e9ejDtFQ+I8QJ EEDcG5uXtL6yNtAbyJhy1wSrjPh86A+HiPglmQeI9k2+MHDbAFGvr9vvLfcrNyjtK155NFXc sKSBJaedoRVM1jFFdOlvUoSNrHZ8z97l8SGbIZ+osiJCdsF+wF6OYlR37q2747Oomkbw5y2+ JzWL55uXvmtVfW+WoFPCh5zDUMxxGTSixW3GftujyE1KEM5jmHK8S6nKGJGd+eVjbaKRtoTa FtrhcezoyUaWaMs0PZmDRj17WzkQqf0HgK4J18jqZ75wMWd5AH1OrXxPy7b0Lksv6Xvq9sAd YIsujPW87GhpsxcdBc5ZXZ2ruAJxY2NvJVzChpzL1ZljItq6SEaWnQB8APw++ArplX+/EYRH c/fjWYBR+TKCpD8d9wtkWK0isAc+VcwF7yFBFSTjJ1fWdubtq7YNux1LO7Ve/EVYKc8/uYgM q7ywKLmcxI5OQW4TgoxnMZMz16YVu+Eh4i8pRirNlOOVWzBTejONOdl+TjwjgT6MnjhZJ2LB 0Ni8WD0OHOFKajnsxot9z7L58M7OPKm0mhGLbOSwm2J9RPW72tUy9uzt4jcyUi7y5MAkAxDk hZCSkmPbra26VUjyB7KCJ0632aduXC1D0T5GUK150fateKnDlnmgRhkGTR39dzqIoLNUsNjx SmEP3jM9Lu7s0JWd2bdLLK3Et9y+GJzqV3Fps5lgrm4D1sXk0Vw7moJczF11yeUOmycJRG3f CEq9Vii4VmY70DVFKFO+ybwtbu4iK6FuHlSmPDewTLq7G9LvsOSdlTQ12Hd2JOwQN4dFhUUv 2Aw9KWXkysOJ8RG5t3S3F1rtN5WlSannS4ho9xK7K3LqC7tOOtnXy6OSpdBjFGOFnELIu1O3 rcs6QHxZ6uNDry2JqqWqe7rTqyGG9qkMmZwZoR6L5UbsXxfFrGMc5jGslZjuGJyc58ChtBFN oKC0IA0CBgEDKIOlRMgAaBU6CmwQPtvBVW3rVrWt9TgP2kkklVUgAH71VVqLUVXve9VVVVVV VVVVVVVVVVVVVUkkkkk22222222222w2220k22222222222222222222222222222230kkkk kkkkkkkkkkkkkkkkkkkkkkkkjbYbbbaSbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbYbbbaSbbbbbbYbaSSSSSSSSSSSSSSSSSSSfw/sAAPu/b/H+/n8u7u/6k km/24d3d3coBsktBkigySbvABoFoCBmH5+Zn4aAPAUANvq/fffeVAPA2222ttiBoAaySboBq qqr5UABUABfKgAKqvlVUABXMVVQAFcxVVAAXyqqquYqqgALJJmRcxZJIru7u7qBv3327b3d3 dJJuh0kqHg0ANA5AO6oAGRtttuNum22/e9VfzAPz8zhVigLF9dgmH6lmuTEyjaU8oWQd/LP2 67YW3XG8jenYSnHXqO1vZePpCc3V3WpV2sd+PpLmXMWuexpHp7Lvd5wwm2aRGeuE4uPlIKPC m0M+rtMKNW72D7PohmO8ZwqZXOUHuGXm483PC7OTOi9Xque0XeNeZKNKn1Pna1Cu7jQd3Odz uBWWqd4jthYHxdAfD9998BU6GtJC+0UC40p73nBu7FUe50MsrefQ/hl+E3OfrkbXndsYuHTt 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 LQEDMzMwJJLoMkm73q/fffeVAPAqqq22xA0ANZJN0A1VVV8qAAqAAvlQAFVXyqqAArmKqoAC uYqqgAL5VVVXMVVQAFkkzIuYskkV3d3d3774JId3d3d0km6HSRQ8GgSeJKhJKThJJMjSSSij pttr3q97zICgwgCD/iAgoQQBEH+wIv4/j+X4/z++979P0/aqqqqqqqqqqqqqqqqqqqqqqqqq qoBtJu79g9eeAAAAA8mWSSSSSST8A02AA22AA22AA22B8iSSS00kkkkkkl+A+AH9XnDo5/b9 d3e/sAAv6uKqrQDuAoHICByAd1ANkloMkzMzMmySXQZJN3vV++++zFQDwKqqttsQ2STdQA0A NVVVcxUABZJIr5UABVVzFVUABXMVVQAF8qqySRXyqqq+VVZJIqAGYPlQAFd3d3X774JJ1vd3 dwAaA0BA8GgGzdUJJ5vd3dkkkkkiSVJJRVVV6vV6v7e23bd23f234fH6/qAB+tVVVVVVVQFa /aqqqqqqqqqqqqqqr3t71VVVVVVVVVVVVVVXve8AAAAB73vftVVVVVVVVVVVVVVX33331VVV VVVVVVVVVVVX33331VVVVVVVVVVVVVVX3333ySSSSTbbbbbbbbbbbbbbbbbbbbbbbjhkbbbb bbbbbbbbbbbbbbbbbbbSSSSSiJJJJJ4AD4D+383l/H1f2/t3d3fqAAriqq0A7gKByAgcgHdQ DZJaDJMzPZNACgVAO6+X7777MVAPAqqq22xDZJN1ADQA1VVVzFQAFkkivlQAFVXMVVQAFcxV VAAXyqrJJFfKqqr5VVkkioAZg+VAAV3d3d1AO4A693d3cAGgNAQPBoBsk5ANtQAFW28DuZuv Pe97wifwEARBigq/YEX/gEP8QhCEIQhCEIQgEIQhCMWAKUIAiDQBYEClUP+gREEffYnuVVfb 7x/KAAAAA1QAAAH9aqq3ve9VVVVVVVVJJJJJJJJJJBtv/RttttttttttttttttpJJJJKNttt ttxqKNtttttttttttttttttttttttttttttuNRRttttttttttttttttttttttttttttttxoy NNttttttttttttttttttttttttttttuOGRttttttttttttttttttttttttySSSSSSNxKNttt ttttttttttttttttttttttttttpEkkkk/3/v/Fz/v7v8fzMzMz/SgAVxVVaAdwFA5AQOQDuo BsktBkmZnsmgBQKgHdfL9999mKgHgVVVbbYhskm6gBoAaqqq5ioACySRXyoACqrmKqoACuYq qgAL5VVkkivlVVV8qqySRUAMwfKgAK7u7u6gHcAde7u7uADQGgIHg0A3d1Qknm4SSTJJI0uJ AL7v7V71epVX795Q/5BF/uIAiD/JQBEH+wgCIOD9QRbgi3BFgIv/9VDYgCINlUP5giII4RAA RsCL9P5ST6/NVX+n+f8/6m222222222220kkkkkkkkkkqqqq973qqqqqqqqqAAPV6u3+AAAA fe98+AAAAA++98+A3fAAH3vvfAAAAAPvvvfAD6qqoAAPvveAAAAAPe94AAAAA82222222222 +++HwAn3+r/J3+/v8/5mZ/W5mZmgAfzLiqq0A7gKByAgcgHdQDZJaDJMzPZNACgVAO6+X777 7MVAPBbbbbbbYhskm6gBoAaqqq5ioACySRXyoACqrmKqoACuYqqgAL5VVkkivlVVV8qqySRU AMwfKgAK7u7u/fffAAb3d3d3ABoFoCB4NANk1Qknm4SSTG20kkkqSXVXV71er6vVVCIP+wIv lED/QgCINIgAI/zUARB/gqhQgCIOkQAEcogAI/cEX+gIsEARB/yCLkEW4ggoP+6oCKD+VUIq h/4ERAR/ioCIjFUP3VQwIAiD/IEX/SgCIOQRYqh0EX/YEW4CLZEABH7IgAI/CIACNwRf5gi6 RAARwIAiD/0qh/ugIKDsEW4IsQEFBsIiAj+iqGRAEQfCIACP6qoZUDaoRVQEGKiwEXQAodEA RBgIIIMVQsIAiD9wRYCLZVDQItAi/zEARB4gIKDoEXCIACP9FUOCiig8BF/qACKoOEQAEdqA iI/9mKCskymsjdU5dwMt5y3AOkggAf/6gAVf9u/oMGYvvgCAABAAAAAACMAAAAAAAAAAAAAA AAAAAAACYAAAABE+AjcAAAAAAAAAAAAAAAAAAABePj7iUANAaBuy2Kpt1wDttETbnwYDu8AX YDuwAFsu7ulbakR1Q03D3AHAOwEASAXsDIBoA0BoG6GQA6OihcbwXD1WBp5EjZqNNDrpytZQ AokoAHdijiHjeB6vAUAUAHQrSQGhIAqQpdnaqwjcONBwGu7oUYAGzRtpaHQ0o0AAGmiUlcvF w9Vm1lK9AabHc0oAkAW7nTiVRtzjoBwMwFAKUJKBVAKDQUqlFOT0BwPW2zRXqJ0AOg61IAFV sw7MAZNVrkenA9YaJCqooqgPRoKKonY0LbbddzWxRKq1lbDbRVRsza2gpWgyGmRZsbALatKr QCjTLniiWAeeBXuPIcD17jy4eq9wBh1Xnk9wPXj3gW4HsAAKVT9t7eJpn6qVVVHpMIxDAJo0 YinpmTaqqRGJAAAAAEU8bSEqUoZAADCADBqeECkpCptU0NBoAADDbVKaqoR6eogbUAAAABEi AUkKbQSRiaNplGm1MngQQQH+X6/pX6/n9M3qr/OM/nOr/W/5KYREA91tq1rXfl+n5w4HDnDh 3x9vm+biX1MiFiy0tkWUhIlg3d8vmrLRtZlUzVBGCqZrRtmaoLaZamW2NtjbQWpm2xtrW1yq 22K1tFbVaNqtrlotWNatmajaKplZm0FW1rc1rG21sauY2K1tWZaxaxq1c1trWNtaja1Gt81i wVEVQBf9wVEQYKKiI6XIfoin7iIkQUVB8K5Ff7Iq/0RV/+gqn+qgqIP9FVoFRVH/4RVRWCEB ERYogRQARiAIgEBBALFLFWhEoREgglqgKBARf6IqwU/8igAI/3VAARpU/YX8AqfhAD7Ki/wC p/CK/sor+6P7qg/wgHQQOqI9ReqKHQVOoPVVDqKdBA6qp1BOggdUB6iHVBDqC9VV6Cp1EeqA HQVOoDxUA5xQXiJxVTiCcVQOIrxRXqPQQOggdBA6CB1QA6Cp0FTqD1AeoHQQOqK9R6qD1AOg gdUR6i9VE6opgOiliL+oBEGDlQSAUqbBQ0IjQr0FToKmFBOAgdRV4qhoEDYIHURPAqdBU6Cp 1FDoAJ1RDoLpUX+Yf4EGQQkti0bW/JVy2Ki0VG1y1yotGrFoqLRaKi0aua1y0VFo1cq5UVFW KioqKioqKuVtyoqKioqKuVcqKKioqKsVFRUVFRVyrlWKioqKioqKioq5VyoqKxUVcq5qxUVF RUVFRUVFXKuVFWKioqNWKioqKirlXKirFRUVGioqKioqKuVcqKKioqKioqKioq5VyoqKsVFR UVFRUVcrcqKioqKuVcqKiioqKioqKioq5W5UVFRUVcq5UW0VFRUVFRqxUVFRUVFRUVcuVFRU VFRUVcq5WxUajUVGrlXKirFRUVFRUVFotcq5Wi1ioqKioqKirlbcqKiorRUVFRWKioqKsVFR UVioqKioqKioq5W5UVFRUVcq5Ua0VFaK3KuVFRUVGKio1G25VyKioqKisVFRUVFRUVcrblRU VFRUVcq5UUVFRUVYqKioqKirlXKsVFRUVirlXKiorFotcq5WKioqKioqNXKuVFRWirlXKisV FRVytcqKiorFRUVFaKioqKioqKuVuVFRUVFYqKiorFRUVFRoqKioqKuVcqKisVFXKuVio1FR VytyoqKio20aoqKuVcqKio2uVcqKioqKioqKirlXJZFZFZFSRGhET+aKiINoptUABHAKiIOP 6z9vd+fPvv9f3/rjecz+vJX2uvqvXrlb19fXtfX1vndV1FX7oqxBAUG/z/kzYje5mXz3zefy qyMn/LqY++++zP/O6vnKjzx2+LP3+Mv9P0z+5xKLM97px6qr3ve5z3vd732Zme8/v+3qqq97 2d7FmZ9EXdTEbMzyd69kRmd72ZZ3a9znOZ7d5VOVM9qqjfO92MzvezPs7te5zLv2XznOOW9f J+fXW+jm3O95yPRERHuVyqr3O887dR6I7zfW7DKqPRERDlcqq9z3Dt1HojvN9bsMqo9EREOV yqr3PcO3UeiO831uwyqj0REQ5XKqvc9w7dR6I7zfW7DKqPREf185PJmfXz1md5777Lv3Fwmf vffZ9vJ5Mz6+eszvPffZd+4uEz9777Pt5PJmfXz1md5777Lv3FwmfvffZ/X28nkz669w7ee+ +y79xcJn7332fbyeTPrr3Dt5XojP1+4uEz9777Pt5PJn117h28r0Rn6/cXCZ+999n28nkz66 9w7eV6Iz9fuLhM/fv3f2VFTLlObvbykRn63Fwmfv37v7KiIVKt28vOJn7763EIj9+/T+yYiF SrMtecTP331uIRH79+mvsqZlyVZdrzif379akIjv331fRu9vapVTPqqo8d7sZne9mfZ3fVSv ZUz7J9Xrv15xP79+v1IRHfvvq+z775UJy+27lqqIiOufPvq+++n7PvvlQnLXvctVRER1z599 X330/Z998qE5a97lqqIiOufPvs5ERUR998qE5a97lqqIiOufPvs5ERUR2IhyVW5t5zFVMzPX LhEZ2IjkRURDkqvebecxVTMz1y4RGdiI5EVEQ5Kr3m3nMVUzM9cuEZ3777nIqIhyVXvNvOYq pmZ65cIzv333OcnkzK6m8rOZWzMREc3bjdnciIu7m5mbupvKzmVszERHN243Z3IiLu5uZm7q bys5lbMxERzduN2dyIi/13N1VXdTzKzmVsffffc3eRuzuxEX+u5uqq5isnK7mbMREXO8jdnd iIu7m5mbmOZOV3M2qmZm6243Z3IiLu5uZm5jmTldzNqpmZutuN2dyIi4tQqs5Uz6qqB3uxmd 72Z9nd9Vf1VV7nKpMe2drvUzEbc7f27m5ERfLm5m/vuZGTl7MxGXOX9nc799t8ubmb++5kZO XszEZc5f2dzv323dzczcfcyMnL2ZiMucv7O539txy/8Td1EfcyMnL2ZiMvL/Z3L/byObN25M xezGWiEHadS1v7vY72e97yZi9mIy0ykymJ3W/u9jvZ73vJmL2YjLTKTKYndH2ZOZWZnJmLTE bezKTKYndH2ZOZWVmXVTEffZzIWo3jm8rdJ+zJ/ZlZ+zLqpiPvs5i0m03eVuk/Zk5lZWZdVM R99nMhajeObyt33vVG7X7drf27dVMR99vM9fpNpu8rd971Ru1u7O7yZ7MzEbzPd9IoL4er1R u1u7O7yZ7MzEbzPd9IoL4er1Ru1u7O7yZ7MzEbzPd9IoL49Kfsyc9znPe5zlVM5VVDXe7GZ3 vZn2d31VMyqqT6ZmI7w6kUF8elP2ZPex3tRk9qqmfTOe76hzgvj0p+zJ72O9qMntVUz6Zz3f UOcF8elP2ZPf67He1GT2qqZ9M57vqFDlPTs/d7Lsd7UZPaqpn0znu+oc4L49Kfsye9jvajJ7 VVM+mc931DnBfHpT9mT3+ux3tRk9qqmfTOe76hQ5T07ORmUycyo2cqqmfTO+6oc4L49Kdjdr MnMqNnKqpn0zvuqHOC+PSnY3azJzKjZyqqbr1Vvsc4tdjs+hG7u1mTmVGzlVU3XqrfY5xa7H Z9CN3drP6ycyo2cqqm69Vb7HOLcFx6Njd3a/tk5n0bOVVTyvVW7m8563BcejY3cl2LfbHZna rnPc5u1te4or733fu97OXFvsjsz6q5z3ObtbXuKK+9937ve5f1u5HZn1Vznuc3a2vcUV9777 sd73e85UyrcvlVvJ+3fcfXfN3tV7O7VVEbEOR6ZuqvnecKU4or7333Y73uR9buR2Z9Vc57nN 2tr3FFfe++7He9vJjrIjsz6q5z3ObtbXuTuz+999cXd9j6976OzPqrnPc5u1te4or7vojJzM ipi3ciI9M8r1Xu1te4or7vojJzG85U9juTEemeV6hSvcUV930Rk5jecqex3JiPTPK9QpXuKK +76IycxvOVPY7kxHpnleoUr3FFfd9EZOY3LvlZOR996I5PqFK9z1Ffd9EZOY1d8rJyPvvRHJ 5W7tbXueor7vojJzGrvlZOR996I5PK3dra9z1Ffd9EZOY1d8rJyPvvRHJ5W7tbXueor7vojJ zGrvlZOR996I5PK3dra9z1Ffd9EZOY1d8rJyPvvRHJ5W7tbXueor7vojJzG/4XfKyMj770Ry eVu7W17nqK+76IyczN5yp6yPvvRHJ5W7tbXueor7vojJysa3vb5VUXyq7yft33H13zd7Vezu 1VVOVtUj764i55Xver1Oeor7vojJysa72+VOR996I5PK3dra9z1Ffd9EZOVjfne3+qcj770R yeVu7W17nqK+76IzJxsru85WR996IueVuzs+r3ivu+iMycau+ZU5H33ojk8rd2tr3PUV930R mTjV3zKnI++9Ecnlbu1Pq9O7P1ojvZ81d8ypyPvvRHJ5W7tT6vTuz9aI72fNXfMqcj770Rye Vu7U+r07s/WiO9nzV3zKnI++9Ecnlbu1Pq9O7P1ojvZ81d8ypyPvvRHJ5W7tT6vTuz9aI72f NXfMqcj770RyeVu7U+r07s/WiO9nzV3zKnI++9Ecnlbu1Pq9O7P31pnva81d82p2PvvRHJ5W 7tT6ozI/etM97Xm845tTs/feiOTVbu1PqjMj960z3tebxfNqdn770RyeVu7U+qMyP3rTPe15 tL5tTv333ojk1W7tT6ozI/etM97Xmu3fOVVNvlV3k/Y9x9d83e1Xs7tVX91OVtQj764i55Xv eqdqMyPy0z3teyN5zmU2PvvRFzyt2Y9O5kfvWme9rzV3zanY++9Ecnlbu1PqjMj960z3teau +bU7H33ojk8rd2p9UZkfvWme9rzV3zanY++9Ecnlbu1PqjMj960z3teau+bUzsxHpmZ5W7tT 6qnMmY91VZnPO7d82pnZiPTMzyt3an1VOZMx7qqzOed275tTOzEemZnlbu1PqqcyZj3VVmL9 7He2qZTEXMzPK3dqfVU5kzHuqrMX72O9tUymIuZmeVu7XpmMyLj3VVmL97He2qZTEXMzPK3d r0zGZFx7qqzF+9n8d7b6ZTEXMzPK3dr0zGZFx7qq69695yt2Z2Yi5mZ5We2vTMZkXHuqrrnv d275tTOzEXMzPKz2+iPsztx7qq6573du+bUzsxFzMzys9voj7M7ce6quue93bvm1M7MRczM8 rPb6I+zO3HuzN7Xl5fr9dVXl8qu8n7fOPrvm72q9ndqqqcraqkxFzMzyve9sR9mduHZm9ry8 57m1M7MRczM8rPb6IzO397vZva8tt+tyqTEdmZnlbvvvu9vn3rubyvbftv1uVSYjszM8rd99 93t8++9d1ec9vb45tTOzEXMzPKz2+iMzt/fe72r3nnb57m1M7MRczM8rPb6IzO3997vaveed vnubUzsxFzMzys9vojM7f33u9q9553+r57m1M7MRczM8rPb6IzO/v3ruebXj+r57m1M7MRcz M8rPb6IzO/v3ruebXi+e5tTOzEXMzPKz2+iMzt/fe72r3nnb57m1M7MRczM8rPb6IzO3997v aveedvnubUzsxFzMzys9vojM7f33u9q9552r9zamdqIuZmeVnt9EZnb++93tXvPO17vNqZ2o i5mZqs9vojM73sR7M53b93vu3zamdiIuZmarPb6IzO97EezOd2/d7fPc2pnZiLmZnlZ7fRGZ 3vYj2Zzu37vbv1+u+c552+cqP2+73mxdxc53nPZXqqqnK2qpMRczM8r3vbEZne9iGZzu37ve 9v17yqqYi5mZ5We30Rmd72I9mc7t+71md91fOVMR2ZmeVu+++727uI93vO5fu97217yqqYi5 mZ5We30Rmd72I9md3nrv+7vnt3nOVMRczM8rPb6IzO97EezO7znOcpmVVVMRyZmeV1iIzO97 EMzu89d3fPbvKqpiLmZnlZ7fRGZ3vYj2Z3eeu7vnt3lVUxFzMzys9vojM73sR7t7Xuc5x7d5 VVMRczM8rPb6IzO97Ee7e17nK49u8qpmIuZmeVnt9EZne9iPdva9znOPbvKqpiLmZnlZ7fRG Z3vYj3b2vc5XHt3lVMxFzMzys9vojM73sR7t7Xuc5x7d5VVMRczM8rPb6IzO97Ee7e17nOce 3eVVTEXMzPKz2+iMzvexHu3te5z+uce3eVVTEXMzPKz2+iMzvfvvXzZ9Tn9cevx27vkRkzM9 rffv13zn728yPTtV7nrvnOHb5yo/He82LuLnO857K9VVVZ7dvbu/dvnKj9vu95sXcXOd5z0+ mZme+zLy7v3b5yo/e93vNi7i5zvOen0zMz33ed5znr5q+T976636s5GXVen0zMzfu87znPXz y+T976636s5GXVen0zMzfu87znPXzy+T9766+2efXdfXuc199a18RV+3z7Iq/kUABH7iv9EV dBAVEQcKf0QUVB/1QUVNfi1VrfsqM22xjRjBjBjGDGMrVloDDGAADBa0tsFrKqIMBgMGAwYM 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 I26zDVUjd3juDMxSq7UjBozqyrExisgZKW51qFmZmw4EWXDdXTTrrh9mI31Va1mWt0KKA0ZT poES9R59gKFGdS7cNqXLqsVuCr0FWWcq9Zr3auE6aW7gqPCl57PUknZbTOO7ae9ezZ5uM6HY srZFdzGCdWKsj2ev1ZCqtOV7c4u54cnc1JhfiZE71blZZt9wx0+TSt0Yt1Qqem0tcwzxI3OM p3AdwztWSpfeU5Uhx4pd1rHOCF7XuVq4bHjnGSi9XbudynrvdKfrUshWVqOWMkyI4Tmcqqt1 0Csrc5Uaij9g3a3ePB54GZrtYszlnp7pcitO/S8F2C9UsvOu8Fx0Yg+6U4Ctmck9R5FLjnoh SpbS7euIUdzsiTYfHHmXKWclopSrqDsXCsrht4rsLVVbhmksxiTKkie5tFzdYjha3nZvLaq5 hquWp1dFGKMpdUNXx3ONVee0i8DK6Vdadzu3dI5SNVqW3MXm5jygmSIJCKK1SAcVUwoAeVQN AqcUR0irxRD8H4n4qVo+7m222222222222222222222222/pJJJJJIJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJBEkkkkkkkkkkkkkkkkkkkkkkkkpJJJJJJJJJJJJJIJJJJJJJJJ JJJJJJJJJJJJJJJG2222G2kSSZEySSSUkkkkkkkkkkkkkgkSk0mkkkkkkkkkkkkkkkkkkkkk kkmgmSkkkkkkkkkkkkkkkkkkkkkk0mkkkkkkkkkkkkkkkkkkkm22223G3G22222222222222 22222222222222223G222222222257w94b+78/z/Pd0ZQAAkkkBdgADbbbKAuwAC7AAABJJX aAAALsC7AALsKAAKAAAAuwABJJIKAAN3d0AAA7u7u7m222NttsLsAAALsAAbbkSN3bvW0kkg 3d3QEl3d3BmZm22NpJBG222UBdgAF2HAGJN9z7M7uAGkt0OSXcAPdAMwDQIB7vcADA3QBJJZ m9ySS7u7u7u4meA8E8O1hec+/qhJdOzT3HqVh47e7VX1tm7sYpgxDCFcu7spdP7ax3m5MLHI Es8QMLxM8lCPpxuX8hhA4tJk6vFCdd3Rh8W5Ik3o7ZYnNNfCucN/WeVK711kouzmxcyoyabC 7aBpLW4dm5eFwHLF1erSKl3uje3mubQ94fvAeGZu0y0lefUrz7T8u5XxrsKo4ddLCOhI2Yn+ 6amPZqlZj5Q5p1Dc0XlwSDF6YzdifYga15GiSjZHF59UAs0Rp0vV7XuRllkZyrQvZJcw2Ydy iiOP2m/bNdkHVRE3n1LCiTl2xRo4fIu1Dk+DFl0EMoyH4rMQZsX12YlSykey5Ku9+I4wcNLn RvFawrmCF73h737wHhMv9UWVNoXJG62o+u6OEK/fpJLiUy3+nbxvYxtCbt2NxUelwaPo/hbf xclYQL5e+1URxyYipnT1JCNYlYun2W46uSm/sQRiQyPK+N8QqRWMm3V4+vOyJwezDV2tpBcn EsyRlLHMVMTxznOy7uz1yjZWWYFdNasIl2MV2cG2qcultKgPe8P3gPDvmZtz6dSg+ce2ae3O 7OF0liQ7mGyqjceJzdt23lY4w9VZdRot21N15UxhzMeFQ5IuWSGyZtsdakrMqc+wXV1i0r2q JF2sl2tzMCnVvUqpy26pNJnGEOUGvu6hWbjc05272BUOIfawpuXmSkKwpUsPVViNZku8A970 e+iPoWNdxUUZWw5bqs9drdZIPfN0NVOFpPRcQ6VlFwcoeN1LugmnFPoSXOaJRZZ7SXLpcpq/ HIX4WdIokgM+5LzVjN347lFWlD5IZHGvvusFq9zJqq518MgqHdIYpNmbXfVubd3m5K5R3fzc NDPccdiu3W1LfvAeH8A94H9q+ZGrlX3TnTfw2Prjm5xsbLyQDFU2mJ/AIWRE5v0+zwVFroCD D3y4/b0tisIRFEM+rEiGR0QQZvoGYDZJ8E1vKjS9xz5ODZQp/d9nrsP7Gu2dQ7koEzDxFbKV jutqdHu7w2E8k0ocVTTqzLCSJWCMobtp8RGu5VRb6lPUYqbvLbWtGKGle9Li1Vj7Fm3z4DwA /Ae8KV8U3svQ5ucMGvHhGVX2RCIJKraTMyTa2yj8qb0ZlJkt10/RUwz5Hhf2UPvsAfLj4P5Y QPqukJaQH1TH93Cjop4XjfxqjSH0sjacyrJ3XmA1DhwdmYllysNXgvM1Z7OLUG0o3lDtNjsH NDMpXpw1m9qcSvjs06pDSx5bHeHve9+8PeFc1rJbGA/N/Gp1fqPmrCd2vWK+0SyNIv9Z4Ud+ mDixa5ofGgRp9W/HGfmfpCrE1Qj42Znyizq7lnzDdfac7OMwZzut09p19jJCpdNPUSdksZ0w 9hDDKjEJzU6FZGnfbfXDjNeaKrUpLt6m7uG8WcSO3ESZfeO50pt9eEm3JF3trFXve8B+8PeF bnMofbQfIXFTP2ffKVV728eakXBt/tXKHGHQHx04fUffbWZ9KqrV8yEvAlm4vYtutzNpWfQj iNSok+r4bxz4X6EPPqVvZvxZxYol0dV83yeOoXOIcdrdp25IWPF69229mWWxPIHjH1nlu3ad 9kpPtW6zvDnMEnVQrnQvGXVAeAH4D3hevh3wNGtrbb+qZGd/USR2d2WcUz2bb9m2wOLu3iin 6RUAz6E7Uu0sTofUjkpCxT4t5gVR/I41RthotzKsxXzv1Cu5cEqfIy1CcpNbe8ZtYN3rqqzM BYnJurrd0pHTZpV0lyWbSsfVNdZZUcadBz6/VoD0tvt5bZSVZfqaDXBddvdwcKbzUlPQPtBI 2CemXjV5E11jRmbMduuuVarGa1boVZ2rve96CS1cuuu4y3LM8SVssku77BQyK3taSLpZiDIw UZTxBdgt5OHsXXDJe353UxeOMaUppcGlPO3UnK8EqiYY1mxEWzwvnm6SVhQp9eS6CwSlAo1H 2EUq7orqm1133SLuazb2oinVqZku1nmmzlU71+ZPIhRpfW7aeXl3cHMVbSVmltnHuXcGk9ov rEq9RvHOZophddPegTHTi5lXTPsm93PDtAjsnEaOxbkqFZbptq9MLjFWaN9kekYjw7q0z23E h+7rlHqz1zNMvLtJDXpfJ/Oyw6pDIb3VMhvttnW9exlOCsCV6I8L9j1DucIuLDVVMuxOpNlb 3fgPeBHgO8AAiAUoIxsXwIHkEyCpxFdoPUWKCdVQ4C/j8SE/Eqve7y7u7qqqkkkkkkkkkkkk kkkkkkkkkk22kkkkkkkkkkkkkkkkkkkkkkkk22ut+QAAA+977wAAPu5JJJJJJJJKRSJJJJJJ JJJJJJJJJJJJJJJJJSKRJJJJJJJJJJJJJJJJJJJJJJKRSJJJJJJKNySSSSSSSSRttttttttt ttttpJtttttttttttttltttpNtttttttttttttJNttttttttttttttttttttttttttsttJJp JJJJJJJMDwAa3+v6/n57uvigABJJIC7AAG222UBdgAF2AAACSVJAAAF2FAABdhQABQAAAF2A AJJJBQABu7ugAAHd3d3c222xttthdgAABdgADbciRu7d62kkkG7u6Aku7u4MzM22xtJII222 ygLsAAuwEksSb7n2Z3cANJbocku4Ae6AZgGiVJOQEkk0lIklu7u90Dd3dAAACZ4DwodY6tdY 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 eaOcxix3lOHMtLmVQ65U1zUhz7Y11bFO01L42++Lqhs10JNwbnveesYh+c9tze7eyG3Tki9U SnoY8y62g6rmZuHNtbdOKlC+yFjZGhbPb2FjGGK4HgrvZqZmXe1K3CLycpXrsc9l9K9r44wc l27sBR072eNuOuMd3586qZy3cF3ITVX2PNOrf4PAeGA+A8CAUEgRBIEUEP3VAARvBjnPmcYM 8CJy/KfuoIgm+vFZ7qlh5RrcUsKaltRtG3tgHaZOdJLx4i3oyYlb2RJM3N4jVuZdkdHre1ki I255Gt+aGsdT4ZReZPcXz7m375sJeFnr8XKzSr9r60vSXlnp1PN2lBIRnnHElfbp0YcMTOVu lVrZ61bZ6SeMtDldjeqTluGb1FTc+e9zTUbIntZu/4e90V1+mJyJMsufSRbzlB7dZJJRD2jW 9hJQ2mkayZUktvLDvXfihdhIdljhl8czMu/ZN28FAxB1KwaJNnScEJzEqBh5LVdVsRSnHOzv 63ay7AySZLjoeVc0U/VeBiSApe7LsqFGXG7DzHzxG6GVd5ti9x3HDHTGmZePXzfN6+oHtdQV FV1x0bo20E0XH3c9qSF5errFhh5nMLLO61Z7Lu5UUj1b0tks8de68rbH00q6hNzxUlN4Ulhv O5MzYzlChpWDkzsNq0uW5nStqooEjYapXkbmQgXNrn3Xe3vIobs3JlU5xLpWyeuBBJZVLKPs pzm9ldVXKvFnadLRGvVm4g1r7vuvu+7H8t0U1W0vjsIdcIrzZgyyMDx3V9aFXYXqzliIeODU OKLvrtuLyvpfN5ILHN5u9yWQRi2uuKpO3UNVWGLrRiHrLdStS4XV1cqEydRJW6tXxFHj2ZtD VtlGhhwR8JFVkWnxMWVSsIc6HVi2KNskqFLhQ5cWp6DQzadK8vo03ckKSjJ3sMIIRrs0ttu1 hEzM4oyZIvMqwdqsBUK2jCo81FdrFHevC5pHeu/uz5ewnKknc7ylU5U8XGQBDNzfL3nYrV2j pRX48N+t9E69R4Nsj9snjqlHr6vd3c9aVMZV3TbLrXHdxJTFpzKYR51SZu06kXb17hlLanFT Z3AlWyOeF5WIcD15yzZI4wcZPbhdbsJGPUQnSlqESqBfbfLCyfSm8y7xZtjY87QRUjrrxdrN ntljSmKmZnrfKuXMK3GZqWVKyaeCNjt6j1B6jlbjWVh1XUfGLlFUp065WqhQnZuRq1OvezL7 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 HomKrVrI57BK7ksy7b6wR2XuRg9hN5VmoQyScI46rFtBmAiLXqWEJ1QbmbhHYTsNh3ZLrGpN 0zG5eGlxody7ayN8ulMwbYddSuzcnY7rzHlYK/eSgE1a+fqlWpK6iHVXjubroYeWJnRK5dog t9fB4LbucCqyPLFb17JHczLJDlYlgQmVsq09p077iSZvNlvoqti4M4MSDRMV0RW32be4xBdB lziQ9l5UwjdB92RmyZWvX2NwbYutz1HVr47qFFb0Y7s6DqWLHTd0TuZH1vhl4L2k/UrLzHt0 MwPXlztBM88njr2HbDQzV3kMowm77klK3mQ49lSE5qXk6d7uVLvm6S695lZtBe+slytuajpU IoJucHxwZGcGZynVZra7Z2LuaLm53ew0vQ6KxUABH+yCioP4QUVB/gAUVT7REWEAUgQWqzb9 H6tTZazYzbbBVGNmRjbbBWmpbBVGNaDVBrZsts0toxqgtsW0IMGACBCAoMICKjB2IjVbVtzU 2arMrVsFTZabNtsG0FpmZtrWs0rWWtZqpGLbEbNrWrcKsybQUgptBWKAiQgio2pCCEiqRUAP wCoiD/sggKD+qKiW0tVfu7N+7u7v1fqLbGt/EAA4iSSf7SSSXNttttttttttttttttttuGSN ttttttttttttttttySSSSSSSSSSSSRtthtttttttttttttttttttttttttttttttsNtttttt ttttttttttttttttttttttttthtttttttttttttttttttttttttttttttsNttttttttttttt ttttttttttttttttttht/SSSSRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKEkqj4mI/Vf6/6T+f +hLNyZ9u93cABwXYAB3d3d3F2BdgAF2AAACSVJAAAF2FAAFAUAAUAAAFAAG7u6BQAAkkkAAA SSSSRtttjbbbKAAACgAA7u7okmJK7Xbu7vAkkkAku7u4MzM22xtJIJ3d3d3F2BdgAF2G7utp awJJAEkmkt0OSXcAPdAMwDQIB7vcADBSJJbu7vdA3d3QAAC72vq+r6trq+qrIgCIBBA/uir/ dBRUH7n4n4qq/Gvvm222222222220kkkkkl+bbbbbbbbbbbbbkbUbbbbbbbbbbbbbbbbbbbb bbbbbSSSSUjZiJJJJJJAAB73ve22973vW3gAD3vfeAAAAAe977wANJJJJJJJJJJJJJJJRRxp JJJJttttttttttttttttttttttttuNuNttttttttttttttttttttttttttttttuNtttttttt ttofL+D+f5/lf5O/BdkkgJJJAXYAB3d3d3F2BdgAF2AAACSVJAAAF2FAAFAUAAUAAAFAAG7u 6BQAAkkkAAASSSSRtttjbbbKAAAAuwADu7uiSYkrtdu7u8CSSQCS5tgbupNjaSQTu7u7uLsC 7AALsN3dbBPu7d3e7gDMA0DOA4AHqSTYZu7d630BJJ5kmtLd3dcgbu7oAAFdsBP9wVEQf9kV d+k/H3/FSvx8+fLqqqqqkkkkkvzbbbbbbbbbbbbbbbbbbbbbSTbbbbbbbbbbbbbbaSSSSSSS SSSSSLTaSSSSSSSSSSSSSSSS7u7u7u7u5933wAAAAHPvuMwANt8+bS3d1tu7rbd3QASSSSSS SSSYP9VPv6/z+f5lV26T3d27JOSAuwADu7u7uLsC7AALsAAAEkqSAAALsKAAKAoAAoAAAKAA N3d0CgABJJIAAAkkkkjbbbG222UAAAAAAd3d0STEEyYkks7gAO7gMbfdd2kdzYB3bnd3d3F2 BdgAF2G7utpawJJAEkswDQM4DgAepJNhiSmU3m9wA0tkSS3d3XIZmYAAAUb999VV99VVv31f yfAgKDjXft9sYvGPvMYl3fTQBIh95JJJPySSSbbSSSSQSJSSSSSSSSSSSSSSSTba+bbbDbST bbDbSTbbbbbbDbSSSSSSjbSSSSTbbbbbbbbbbbbbbbbbbbbbbbbDbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbYbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbDbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbYbbbbbbbbbbbbbbbaSSSSSSSSSSST8F7v4TPv5/df3dVmfi7Cd2Zmd1d3EBttthdhQAB QAAACSVJAAAUBQABQF2AAXYAAAUAAJJJAXYAAkkkAAASSSSTu7u7uG222UAAAAAA23iS7ggG AB3cAB3cBjb7ru1KO5pJIG223C7CgACgEkk0lrAkk7uAMwDQM4DgAepJNhiSmU3m9yST3dkS S3d3XIZmYAAAUZ999X8f1fffa1tNX8Fqr/fW/4zMzM1maZmZm1maZszZmzK2ZTNjYQIQYRAp FREGyIp/0oKAj5/T8/m5d/nf2+13d3d3VSSSRS5V0hcu/smMe97bb3ve9bwAAAe977wAAAAD 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 rIrUVqKyKyKyKyKyKyKyKyK1Faisisisisisikisisisisisisisisikisisisikisisisis isisisgtRCojIrIrIoSKyKyKyKMisisisikitRWorIqSKyKyKyKVFaisisisisisisisikis isisijIrIrIrIpUVqKyKyKMitRWorIpIrIrIrUVqKyKyKyKyLIrIrIrIrIrIrUVqKyLIrIrI rIqSKyKyKyKkisisitRSorIrIrIqSKyK1FaikisisisitRSorIrIrIpIrIrIrIrIrIrIrUVq KSKyKyKyKkitRWorIrIrIrIrIoyKyKyKyLIrIrIrIrIrIrUVqKyKSKyKyK1FGorIrIrIrUVq KyKyKyKyKyKyKMisisisikisisisiMgjILICyAsisisisisisitRWopIrIrIrIrUUqKyKyKy KSKyKyKyKyKSKyKyKyKyKyKyKyKMisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyK yKyKyK1FaisisisisisgNCqH8kEUQcKKfKgAI5ERRD78/6fj/e/5R+9/x7P27P77f4ZT/Rvy 9X+Pb/fdZ+O/0X/f5g/z2/vV3v0Cf12/wnf5P4vz71defzl+n79Xxz76qqv7fIBEQFQf09fc /u9+O/jv55+Pvz+v57vV3f7Pz+fz+fz+db/z/N73vvZ9Ws3nMzKqOb3vMzMzWv6+qpn3uZzj ep1m8n3OVuuXxvsz/JF8jnL33dbcVzdarbbddn78LqJ4DjnObvm51q+tV2Pv1cJieX5biIiO XHOc3u+t77H36uExPL8txERHLjnOb3fW99j79XCYnl+W4iIjlxznN7vre+x9+rhMTy/LcRER y45zm931vb06+7G0xlQvGRGTMzCd71p7N7y/a+7G8mFQvGRGTMzCd71p7N7y/a+7G8mFQvGR GTMzCd71p6s5zLvX3p3lRVQvGRGTMzCd71p6s5zLvX3pyuVXF4jJlVVU3rX319lzme9r7s5X K3d45kReVVTetffX2XOZ72vuzlcrd3jmRF5VVN6199cN7rO6+qMRW7vHMiLyqqb1r764b3Wd 19FTie8u8qYyZvO97V61992G953uvoqcR3l3lTGTN53vavWvvuw3vO919FTiO8u8qYyZvO97 V61992G91X8iYzORzmbbrbiubrVbzbde9WvoL7GczMqYyZvO97V61992G953uvoqcR3l3lTG TN53vb++/d+7DnM73X0zOI7y7ypjJm873t/ffu/dhzms73epnHO7u8mYyZ9ne9z77937sOcn 2e3vdVWc7u7yYvJnL73t/ffu/dhzmd+++iIxFc97KmMmcvtX+/V+rje8r776IjLiuZ7KmMmc vtX+/V+rje8r776IjLiuZ7KmMmcvtX+/V+rje8r776IjLiuZ7KmMmcvtX+/V+rje5z2tamZz k1MZ7O1OVWde6/fu/uxze5z2tamZzk1MZ7O1OVWde6/fu/uxze893WtTM5EVMZ7O1OVWde6/ fu/uxze893WtTM5EVMZ7O1OVWde6/fu/uxze893WtTM5Fz2py892qnKdpv76vq1ze861rUzO Rc9qcvPdqpynab++r6tc3vOta1MzkXPanLz3aqcp2m/vq+q9xzn0/yYjM5HON3ut5xXN1qt4 1X8j2vb3wvnM7GHalOU7Tf31fVe45z+Z7etTObvlVGXnVVOU7Tf31fVe45zPb1rUznLipjLz qqnKdpv76vqvcc5nt61qZzlxUxl51VTlO0399X1HJiMvetaqp5dRzLykzOVfavf31fVbkxGX vWtO9qHZjFVSqrO37szzWq1q3JiOZfN727XHY5iZtVVnb92Z5rVa1bkxH2XrWne1x2YxVUqq zt+7M81qtavOTEfZetad7XHZjFVSqrO37szzWq1q85MRl71p3tcdjuKqlVWdv3e1Ub33Wrcq IxvWu97XHY7iqpVVnb93tVG991q3KiMb1rve1x2O4qqVVZ2/d7VRvfdatyojG9a73tcdjuKq lVWdv3e1Ub33WrcqIz/P8b3vfe9qERiZlMzleqpnms97e7R2ZzN73v3e1GRHbVVKqs7dVM81 73t7xk+qt5ve9+72oyI7aqpVVnbqpnmve9veMn1VvV/rqt1yOctqtNp5udTvGq997N7iMuLi OrqqyqrO3VTPNe97e8ZPqr7e85znu95zIyfM73ud73vbqpnmve9vZk+qt7ze9+73nMjJ6zve 53ve9uqmea9729mT6q3vN737vecyMnrO97ne9726qZ5r3vb2ZN33u+f5nN7v3t5zsMmZyqqq 7VTPNPe3sybvveczm9372852GTM5UzPZmIyN573OZkzd97zjm9372852GTM5UzPZmIyN573O Zkzd97zjm9372852GTM5UzPZmIyN573OZmVR70RnN7Xe/c7DJmcqZnszEZG897nMzKo96Izm 9rvfudhkzOX2qr1VM3k8wiE5VHvR+/yM5td69vtMmZy+1Veqpm8nmERGTN33rPv8n9za79rt MiIy/VVeqpm8nmERGTN33sZORzi7vfuMiIu/VVeqpm8nmEIyZO9iM5veZd3z0IiIy/VVeqov I3gRkyd7H9RnN7zLu+ehERGdmZ7M89kby7vIyZO99M5HOZg5cZERF36qr1VF5G8CMmTvdffx V97yOce1Wm29R9Gsan1/5e85yqrL5cIiIu/VVeqovI3g5kRd1W+5OTEZhu+ZznOe92qrs89n NY5d3OVV3727mUxGDd8znOc97tVXZ57Oaxy7ucqrv3rmUc5gcuMiIi79VV6eXnNY5d3OVV37 0X/ko5zA5cZERF9mZ7G/ZzWXz3snKq7965lUxGDnLjIiIu/VVRu82vfvehM+93LmVTEYOcuM iIi79VVG7za9+96Ez73cuZVMRg5y4yIiLv1VUbvNr373oTPvdy5lUxGDnLjIiIu/VVRu82vf vehM+93Iv/JVMRg5y4yIiL7Eb+9nd37nepVVe7lzKpiMHOXGRERd+meavPbXz3vSqq93LmVT EYOcuMiIi79M81ee2vnvelVV7uRf+SqYjBzlxkREXfpnmrz21896EzPaxf+SqYjBURc5MzN1 Eb+vue5dx70zMz2s9c5UxGCoi5yZmbqI39fc9y7j3vVVVXu5czlTEYKiLnJmZuojf19z3LuP e9Tve9v2a+/mdz3uRzj2q1m83qPo1jU3d77kR3vcqIuUzM3URv6+57l3Hvep3ve37FVVTEYK iLnJmZuojf319z0Xc+9VO972/ZtVVMRgnsXOTMzdRG/vr7nou596qd73t+xVVUxGCoi5yZmb qI399fc9F3PvVTve9v2KqqmIwVEXOTMzdRG/vr7nou596qd73t+xVVUxDMzOzKpmIuecr76+ 56LufTKqqvdzd1VTEXhlelUzEXPOV99fc9F3PplVVXu5dVVTEXhnZlUzEXPOV99fc9F3PplV VXu5dVVTF4ZUQmZiPTzlffe7noy59Mqqq93LqqqYvDKiEzMR6ec5Wte7npybq6p3ve37Nqqp gMnsJmYj085yta93PTk3V1Tve9v2S/yqqYDKiEzMR6ec5Wte7npybq5VVVfc5+KqdBkxCI5z sbrla13uenJurqne97fsVUxwMmIuI5zsb3P33adiOz2Zyqqry5mObu7tMR6I5zsb3P33avsR 2ezKqqrXMxzd3dpiPRHOdje5++7V9iOz2ZVVVb79nsz3uRzj2q1m83qPo1jUxd3+zl+97J45 ze+83uPvu9zsR2ezOVVVeXMxzd3dp57nN77ze4++72+xHZ7MqqqtczHN3d2nnuc3vvN7j77v b7Ednsyqqq1zMc3d3aee5ze+83uPvu9vsR2ezKpm1xHOb973k89zm995vcffd67EdnsyqZtc Rzm/e95VR6I5znN7j77t+emfV6qqpm1xHOb973lVHojnOc3uPvu356Z9Xqqqmbc5veu970qP RHOc5vcffdvz0z6vVVVM25ze9d73pSbmYiI3ufvvL96Z9Xqqqmbfc5vXe0Qj0RHOa0/dX3sR 2e1VVM25ze9d7RKPREc5rT95fexHZ7VVUzbn9c3vXe0Sj0RHOa0/eX3sR2ezMxFvf1ze9d7R KPREc5rT95fexHZ7MzEW9ze9d7RKPREc5rT95fexHZmZmItzm96qrJR6IjnNafvL72I7MzMx Fuc3vVVZKPREc5rT95fexHZmZmIt39nce96JiLvXdN5vUfRqWp9/Xqzfu1mTkZERzmtZ+9l9 7EdmIjnLzvN71VWSj0RHOazefXj3pj0zMzEM+5zeqpmQj0RHOazefex70x6ZmZiGc5veqpmS j0RHOazefXj3pj0zMzEM5ze9VTMlHoiOc1m8+vHvTHpmZmIZzWvqpmQjnOb3ms/Zl97ibqqq pmc+5r6qZnEc5ze81n7MvvcTdVVVMznNa+qmZCOc5veaz9mX3uJuqqqmZz7mvqpmcRznN7zW fsy+9xN1VVUzOc1r6qZkI5zm9zm8+zN1iPTMzMzOc1r6qvEZHOc3uc3n2ZusR6ZmZmZz7mvq q8cyOc5vc5vPszdYj0zMxEZutfVV4jI5zm9zm8+zN1iPTMzERm619VXiMjnObnNZLUr52IyY iM3Wvqq8Rkc5zc5rJalfOxGTERm619VXiMjnObnNZLUr52IyYiMfvYqq5HPezN+3nN3zc6nd 9b7/FZfavvOoiI5PdXValfOxGTERm619V45WRxus+yZ1C+VEZMRGbrX1ZjlZHG6z7JnUL5UR kxEZutfVmOVkcbrPsmdQvlRGTERlfzmqzGqznG6z7JnUL5URkxEZutfVmOVkcbrPsmdQvlRG TERlc19WY3WRxus+yZ1C+VEZMRGbrX1ZjlZHG6z7JnUL5URkxEZXNfVmN1kcbrPsmdQvlRGT ERm/v05jc5HL27msqtyc7EZMRHd/fpzG5yOXt3NZVbk52IyYiO7+/TmNzkcvbuayq3JzsRkx Ed39+nMbnI5e3c1lVuTnYjJiI7+/k5ipzd6V3N5Vc5e65zI5kd/fycxU5u9K7m8qucvdc5kc yO+/n1ZmqnN2nuayZ5y9zzmRnO+/eJmeRzvczftubvm51O76330/zvCeRz3vXv23N3zc6nd9 b76f53hPI573r37bm75udTu+t99/U/fu8Jna7sc5zd83OtX1qu/1H36uEzu/LHOc3fNzrV9a rsffq4TE8vy3HOc3fNzrV9arP7/v+v6/r+o/v+wD9wCACNqIfzRRFBwAfzRRO7bv8e3du3dt 3579+7GYABgEkgMUAgCRQCBJIAxACMAxxjjGN2dtwx2McY2BxjgxjgxxgMYxjGMcYOMbGDjB jGMYxxuMYxjBmbu3Y4w2G4xjGGzBjYwGMYxjGMY4wcZhxjG4ztuMxjBxjGMYwYxxjBwY7t3N u7O7u527ZgwYxjYdhgAMAGADAGABhsDmAADmAZ3bNud3bgADMYABwAAYYAAAcADtztm27t27 fw23YqxGIhFFYCRQkkkkkkICwGGzAADu3Nm7Z3dsMYx3HGGbts7ubG5t3c7bYY4G7tnbsABn bYAAzDAYMABwcA4BgA4AzMOG7s27udhSRkJGQiMRCKDARCRJCJuNxm4AGHNgAAAMO7tnbbm2 3MAAYO7ooxVgSJIkiRhIwjIyEEYnds7dtjMwcDt3c7u4wGBwDAGYGAG3bYYAGAAAYwAGYYAA ADtztmAAcwwd22xzAADNgADAA4A4cBhgAAzhgDAAGYAYGzdtmzcDMwZhu3bO7dnbdm7bGDDA AAAMMAzAAMAwAADDAO7bYxjO3Ns7bG2GMbjjBjGMccYMYxjMMYOMYxjGMZuwRkBZJASEAIwg BCAwgQgQgQgQgJJIoEIEZERgKEDdnbbndtmOMYwGd3djAAGd2ztxmAAHdzdu527cZwNmABnb tzuDbu5kTCKIoP/KinkBEUH+SgFgH7gQMIodAQPlAD9QVP1BU0ir4AE/6FQ2KnVAO/xkpQDI qCm3fN2O7bO27bvy/I/T7B9qqqqqqqqqqqqqqqqqqqqqq/Hzbbbbbbbbbbbbbbbbbbbbbbbb bbbbbf0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 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 lLTdCrxd13xnoieaY3blA6jaXVcVZuWonFV3tdhO2Cc8pz48E7h6njNpu7zbKXutYXjmTtwS 1XOGVk4bHVmMWphJvroi4XLD+sVt93Zzw7Xc7i+55i5r+iiGBUCw/CIdCiFAhQQEKFoKFCEF CBBQnAQMqAHgQOoCfKC/AgfCo53+79JjGKqT9N9wAAAADAAAkmfxtttttttttttthttttttt ttttttttttttttttttttttttsNttttttttttttttttttttttttttttttthtttttttttttttt tttttttttttttttttsNtttttttttttttttttttttttptokkgkkkkkkkAADAA+tVVVVVVVVVV qqqqqqqqqqqqqqqqqqqqCpJJ+1RD5QA2Z14rmb+u710AKAX+f8O7u6qveqqttqtVu6DJN0Au 6qqqrJJaAVfvvvj3ttpmffY65gAUBe9bfvvvrd1VVVVVUABZJLQCqAbu3EBA4FAAVAMwDQMQ EALvNVV4rxXvVQDgIBZJugF3QDgKqAHeiqoBmAGYqoAUDgVQAFACgboCAF2SSaqqqqqqqqt5 +/c5+czpM9rPq3NSc6CiIGNyUqiItXSPeHh4UzNY21QVfLnL7Azh1qzf9qgqu5fRV8tKIebf oSEo+LTYopqC1poyl8++qwpY5IGubSDNGUvXhWHUhNXEYQvqZIs99nx/oHs/UPj+8giLwK8q 1uT100di2ttHKY/NTuZKyN+zOfVZfCB4nzwHxvcN5Z585dWSbfdovOIq95MrFdHGOYyiFL2s dpS05FN7dK6HJR+94X4DwHwQ/g94B8PyrfqgrbH6Xg4aNm3sr9P33xGfAfKUL2VqHfZhNXw3 T9eNyRzyoD6+xfKdkImC+r5/z4hNDTLL/YIZoFz9rGn2lH0/cx9qsUib/J6u935nUnfSuzI8 9h9VFFp6QLIv8z0++qqqU0zzyro5pnojZzuruXJd4m7zdp6Y3lF3WR70W2Tsud0xJ6SW8UQW 9vwJpIfoKH7QEAEdZ/SvwdrGckmK778Qr+s/DQjYPavM8aLI42UIOvQKwk+J0kitUOaukw6K 9x8zp8iycQ5Z/TNaBmw8c0b+/zeawx26xKU30zt3ZPzxr2T1VeYfFBfZd3gElJU327ywXaE+ W8Afe8APj4BBxFENwFSoCpvtICZioNRAMwEDBt7MztgKD0iKDqKPIij2AgbigPICpd0goyAg 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 oeRFbexW95PpK5QGE0RSmculXiJ5jqSTQqXqVRzDl09G3ubvJbrHctmbqCsbjnNb7wAiiEVA AR/oiiKD+UURQf3ggoA/gWCihCCqfAKheiRSMKFqBUCorIhIFQkaChdtMZ0zbjbYNuDtwds3 UAgQgISSIMkiIEgSKSgQKBRGooSCgpFpFkVCBACgqIBJIKwEoWSRFCgBAgilQaVBUqJAgyDI kiqqIRT0iMkiQEgMkgsIASSBEirSoKv5ERRB/2RAVB/xERRBndtt9vn31B+/fsAAAA/WqqtV VVVVVVVVVVVVVVVqAH71VVVVVVVVVXve9VVVVVVVVVVVqD+FfPe9VVVVVVVVVVVVVVV73vVV VVVVVVVVVVVVVe971VVVV73ve96qqgAGAAAAAPiAAAAChVgAAAAdVV9VV/ky77Fv7JKbJJSJ IK/ucy5mO7xd3d21xRVySKGSSW4qqqqgFkktfvvvk95czFZFXd0AzAHjb73rbiqqqqqoACoB ZJLUAN3cxAqB3pkkkxQAoG6AgYgGZveqqveq96vFQA70ZJLQySS3AA70VVAOAqoAUAKqqAZg BmLbbbVAMwDQMQDM0ABVVVVVVVVW8/fv37nD9z9+/cecGAAkEF2UigEP7KAf2RRFB/Z9+n4/ vMYxnnCfekifpJJJIsqgCqpHkJF73gAAetVRVKV57xVVKVVVUpVWqveq973vXnveb2SSSSSS SSSSSSSSSSSSSSSSQSSNtySSSSSSSOGSSSSSSSSSSSSSSSSSSSSSSSSSSCSSSSNtySSSSRmK RtuSSSSSSSSSSSSSSSSSSSSSSSSSSSSRtttttMtttttttttttttttttttttttttpJJJJD1j9 1fHO0r+ElJkkpEkA/yJJJSSVI22+riirkkUMkktxVVVVALJJa/fffTquZisiru6AZgDxt971 txVVVVVUABUAsklqAG7uYgVA70ySSYoAUDdAQMQDM3vVVXvVe9XioAd6MkloZJJbgAd6KqgH AVUAKAFVVAMwAWSLaySWhkkUAu6AAqqqqqq973ve97/URFEH/ZQDf6clVJJf0kQJHbG31AAA AS+lVVKAHqqqqqqr3veqqqqqqqqqqqqqqq973qqqqqqqqqqqqqqqve96qqqqqqqqqqqqqqr3 veqqqqAAAACqwVVUK+/PH9bTy7f64npCSUiaJXd1tuLxVVczMUVckihkkluKqqqoBZJLX777 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 BCIsgkiMIMikihJIKySAyEIhCAKKC/+AVFAYKCIo/AWgn9EUD+VAQggqIPQFMgKf7CiH+ooh /+gIB/0UBBB/1UQoFEFX/uCEVEEYAEQBEYCMARQLVAtRCkUpQEIApaqEAUiCoIMBT/UUQgoH /NVVUH/cAABGlQP7gqf0U/kVH+ioH9gf8AqGAATKCn7gKfwKf4EHgAJoAE0ACf4BU6qh/KIb UB0goeABNqqeBU2CpsATYIGwV6CpwFTgKnAEOggdAQOgAnQAToKnQVOgqdAegqdBDoAnQF6A AdBQ6Cj0F6CB0AXoD0EDoIvQFOgA9AToIHQQegh0EDoCPQA6AodBHoIHQQOgC9AeggcFF4KJ wEDQIGhQYIYUVyitIrtFLBAx/n/m1BJBGQUqAkiyKyKyK1FaisisisisisisisisgjIrIrIr IrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisgsgsgsiDIDIJIrIrIrUVqKyKSKyKyK1 FKisisisisiyKyK1FaisisisisislRWorIrIiSKyKyKyKyKyKyKyKyK1Faisisisisgsisgs gsiKSIyIyCyIFRWorIrIpIrIrUVqKyCSIsgtQSorIjIrIjIhIrIjIrIISKyIyC1AGorIjIrI rUVqKyKyKSKyK1FaikisisisitRSorIrIrIpIrIrIrIrIpIrIrIrIrIrIrIrIrUVqKyKyKyK yKyKyKyKyK1FaisisisisisisisisitRWopIrIrIrIrUVqKyKyKMitRWorIpIrIrIrUVJFai sisikisitRWorIsisisisijUVqKyKyLIrIrIrIrIrIrIrIrUUqKyKyKyKMisisisisisitRW oqSKyKyKyLIrIrIrIrIrIrIrUVqLUVqKyKyKyLIrIrIrIrIrIrIrUVqKSKyKyKyKSKyKyKyK yKyK1FaisiyKyKyKyKyLIrIrIrIrIrIrUVqKyLIrIrIrIqSKyKyKyKyKyK1FaipIrIrIrIrI rIrIrIrIrUVqKyKyLIrIrIrIoyKyKyKyLIrIrIrIrIrIrIrUVqLUVqKyKyKyKyCyCyCyCyCy AkisiMgsgsgsgsijIpIrIrIrIpIrIrIrIrJUVqKyCMisisisgkisiMisiMisiNRGoFREqIyK yIyIEiMisisisisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyAUoCH+SKigNooHAAAE cAqKA6/1/645/b2IT9/+2uZ/j/H7fvz1c3+d/j+np2/8p9ia79z8n64wtH1exn1+fNivz9h/ tf1efquz4/sirv7/Rv6+fX4fqpnNtnq7XP387HLr+f3+c+3O7D731t72Xz73P39/z/X+hD+g ohBEUQfvffvjX7/x+vz9/2/b+P3++73ve973//bu5u/3+/zMqqje8Z+/b+37d2N2d3f873tl 3bHve2ru7u7vdzMy7u7u7vdDdyIj77dnMzvfVXN2o/v93d3d2P8jIjvf3MjPs969czvPd7ze 5nvez1VXeIj7379vPqpCt57Nbfve9We973vZ6qrvNiPvfffbyOVSW85dpmIj2zbN2q7neczK dd5P3o/mVse+maz2c5MzOzeY2q7neczKdd5Pvoytj30zWeznJmZ2bzG1Xc7zmZTqY9+/md2u zPczPcmZnZvMbVdzvOZlOpj977O7FTM9zM5yZjYvMb3t8mbvriY/V9/b7v9qZnu5nOTMbF5j e9vkzd9cT/a/TfdqZnu5nuTMbF5je9vkzd9cT/a/TfdqZnu5nuTMbF5je9vkzd9cT/a/X3aq Znu5nOc5ydm8xvMmIzOYj+Kvu1UzPdzOc5zk7N5jeZMRmcxH8Vfdqpme7mc5znJ2bzG8yYjM 5iP4q+7VTM93M5znOTs3mN5kxGZzEfxV92qmZ7uZyZmNi8zZ9H33s3mJ/j11vvTM905MzGxe Yn0ffezeYn+PXW+9Mz3TkzMbF5ifR997N5if49db70zPdOTMxsXmJ9H33s3mJ/j11vve5yt3 dv3verPe973s9VV3iI+9999vIqkNmfZbkzMbFsxy5iGzmx/FX299Mz3TkzMbF5mOXMQ2c2P4 q+3vpme6cmZjYvMxy5iGzmx/FbWeyZnuqiI+33ru85cxG7ObH8Vfb+++lmxEfbt+9k+j7di1 fzK3924iJZsRH2773sn0fbsWr+ZW/u3ERLNiI+3fe9k+j7di1fzK3924iJZsRH2773sn0fbs Wr+ZWb9WTM8zfvvqVVXH34+rO/z3X7voiJsiI+VVXH34+rO/z3X7voiJsiI+VVXH34+rNr+3 V797Jme7v331bVVkfft36s2v7db+q4iOZuxEfbVVkej7dj0bX9ut/VcRHM3YiPtqqyPR9ux6 N/l926uIjmbsRH21VZHo+3Y9G/y+7dXERzN2Ij7aqsj0fbsejf5fd7573OU9q/e96s973vez 1VXebEfe+++3kV9TYir970zMZ73ucn0xqZ9O/3+926uIjmbtzMxvve5yfTG7M+nf7/e7dXER zN25mY33vc5PpjdmfT7f36tz2REd7u3MzG+97nJ9Mbsz6fb+/VueyIjvd9ER8qqd7z3JiIqK z9+7l1cRHe56Ij7Kqs73nuTERUVn793Lq4iO9z0RH2VVZ3vPcmIiorP37v7Lq5me57776sqq zvee5MRFRWfv3fZ/uriI73PREfZXc5yan0zM1NZ+/Vl+9ER3uc9MzGR3Ocmp9MzNTWfv1Zfv REd7nPTMxkdznJqfTMzU1k/fV9l+bbO/O+m3v5p+dz+P6bb+P83MPr8+/pts34khT6Zjl+9z nOe565++9V+iPu9ivux99PpmOX73Oc57nrn771X6I+72K+7H30+mY5fvc5znueuuRHvXcR9V R77sffTczHPe9znOe5665Ee977b3nLu9y/e93KqqqsrHvV3ZnYyIjsdn0e2PquO/dj9OxH3N 2773vfduq5Ee9dxH1VHvux+m4j7l3d973vu3VciPeu4j6qj33Y/TcR9y7u+9733bquRHp9dz MRUe+7H6biPuXd33ve+vvZ++9V+iPrqPfdj9NxHLu75znPX3s/fXV+iPrqPfdj9NxHLu75zn PX3s/fXV+iPrqPfdj9NxHLu75znPX3s/fX9V+mYuo99UfpuI567vnOc9fI/fr7dRH19jfRU/ cv7uZmTPvZzkV9dX6I+uoy4qfuZ93MzJn3s5yK+ur9EfXUZcVP3M+7mZkz72c5FfXV+iPrqM uKn7mfdzMyZ97Ocivrir9Mxf37LipiCOmZybtzkV9kRWe5yb5Hy59yIIrBybuP3f7fL7EfeR 89NciGRQcm7c5FfZWehMZ6Yi5rkQRQcm7c5FfZfvR5zmXe56r93KqqqsrHvV3ZnYyIjsdnbm /76Y9fORU1zvt+9u3MVWTMd+9/e4/qYz3ORc1zp94uYqsmY797+9x/Uxnucmb5Xfj7xcxVZM q+un3kxnucmb5Xfj7xcxVZMpqL/tI/qYz3OTN8rvx956Pu9uCvre/395MZ7kRc1z4+pUfd76 GTFTdJlMZfOTNcrvx956Pu9uN3eT7mbf+5nZhnIiprn279W1H3e+jdcn3Muqvara7yZiPT7n o3Y/ey5iq3dj70Z3ZnZg5yZrld7Go/e25iqiN3eT7nK2Z2dTMRU1zkbsfr25iqiN3eT7lbEb Gs5yZrld7G7H723MVURu7yfcrYjY1nOTNcrvY3Y/e25iqiN3eT7lbEbGs5yZrld7G7H723MV URu7yfc5WzOzqZiKmucjdj9e3MVURu7yfcrYjY1MxHZ7zkbsft25iqiN3eT7k/yoi/I5mZnq quO9yqrKx71d2Z2MiI72Pfe33o9Mxs1yu9n3I/ZtzHfvm7Oe5WxGxqZhNcrvZ3kft25jv327 s57n+62I3UR8iu13s7yP27cx377d2c9ytiN1EfIqq72d5H7duY799u7Oe5WxG6iIhNVVVO8j 9u5Md++3U57lbEbqIiE1VVU7yP27kx377dTnufq3+Ruoj5FVXezvI/btzHfvt3Zz3OfVv8n2 6mYiPe93s7yP17cx39u7Gen+/3uxnt3b5zlc5V3703yP27kx377dTUx3Yi/aX3ve85uZ703y P2smO/bqM9P87sRnt3b73vecq796b5H5uTHfvt1NT3/N++v2nuc5M7d1U+5H7dTHfvt1Oe5X +bEZe7t85yZu7qnL7P2wmO/fbqc9z6tmcvd3ve97zl3fvOZ2ftjJjv326nPc+rZnL3d73ve8 5d37zmdn7YyY799upz3Pq2Zy93e973vOXd+85nZ+2MmO/fbqc9z/f9r7+X5EjMuq5znHe9yr e9XdmUZER3sXcXvNzl973vec9l+9vM7P2xkx377dTnufVszl7u973vecu795zOz9sZMd++3U 57n1bM5e7ve973nLu/eczs/bGTHfvt1Oe5/fq2f2Xu73vezN3dUzOz9sZMd++3U57n9+rZ/Z e7ve97M+93q75P2xcx377WTvuf36tn9l7u973vec96qTfJ+2LmO/fazfT36tn9l7u973vec9 6qTfJ+2LmO/fazfT+rY9l7u973vec96qTfJ+2LmO/fayd9zmz7+c5l7u97znOcu6rec5P2R6 Y7+3MjfTMd3nM9u73ve973t37185yfti5jv2sjfT/div5Oe3d5ye85z3qrec5P2x6Y799uZO +5se/kzl7W7Vd73vbuqc5yftj0x377cyXufVszl7W7Vd73vbuqc5yftj0x377cyXufVszl7W 7Vd73vbuqc5yftj0x377cyXuej285mb7e95znOXfbc5yftj0x377cyXufVszl7W7Vd73vbuq c5yftj0x377cyXuV99fkyMy6rnOcd73LVXebmcSmZqKnP8yc3uZ7uZXe973Mqtd73kbNzFff ZWS9z+/f5Wzl7W7nee73uZVHe95GzcxX32Vkvc+rZnL2t3Peqqqsz3nu97yNm5ivvsyFTdbM 5e1u571VVVme893veRs3MV99mQqbrZnL2t3Peqqqsz3t26quzM3MV99mQqbrZnL2t3Peqqqs z3t26quzM3MV99mQqbrZnL2t3Peqqqsz3t26quzM3MV99mQqZut5zL32696qqqPebdVXZmbm K/Znyo/X3f7Oe2t3Pe73vcyq3fVVdmZ9MV99aFTH9+ut/vMvebr3u970qt31VXZmfTFfW+79 7mxF03dz3qqqrM95t1VdmZuYr77MhU/zt/72Zy95u57ve97mVW76qrszOzFffZkdjnv97EX5 u7nu973M73drve9mZ2Yr767jKm62Zy9rdz3qqqzKrd93vezM+mK++u4yputmcva3c96qqsyq 3fd73szPpivvruMqav285mb7cqu973M7m77ve9mZ9MV99dxlT3771JlmWuq5znHe9y1V3m5n EpmaipzJze5nu5nvVVVmVTfd5yIj0R3767jKn++rZXtbuVXfVWZVbvu85ER6I799dxlT6tmV 7W7nvVVVmVW77vOREeiO/fXcZU99/vZlfS65znLvvSu85EQiO/fXcZU/31J/L6XXOc5d96Vl d7MyiK++zFR/bq/75fS65znLvvSsrvZmURX32fOx/fd8X0vs1zl33pWV3szKIr77PnYj3fOL oyuc5zM73FZXezMoiv2fnfv7/fc8egvs1zl33p72equc4iPffV9z79XKyc8MrnOczO9Pez1V znER76v3P1TWRlC65znLvvce9nqrnOIj3336f3Z7kZRiuc5y77097PVXOcRHvvv0/uz3IyjF c5zl33p72equS++9X36f3Z7kZRiuc5y77097PVXJffer79P7s9yMoxXOc5d96e9nqrkvvvV9 +n9/P7/vuf75X9yjFRGZMnWequS++9U/z5GTsy9RdVznOZ3vcvarvNzOJTM1FT/b/y9m+c57 Lc5MzO85d6qu83M4lMz92PrvZ9znKunOTMzvOXmN96uzOZ1xMfq+/t93+1Mz27c5MzO85eY3 3q7M5nXHOfq+5db/fTM1fnOTMzvOXmN96uzOZ1xzn6vrrfemZq/OcmZnecvMb71dmczrjnJ+ qI/z/X+v8/1/n+V/iiH9VVVQf3AU/1FEMBAVFAcID/qIKiD/0EFRB/soKv8QgQikIMIkCSEk JCQkJGQkhIoy+6qqqu6qqqqq6qqq6uqqqq6666qqqqqqqqqqqqqqq+qqqqqq+7u+rqrq7qqq qqqr6qqqqqqvvu+67vvvuiKREQiIEGRkQCEBJCQAIkkAIQGSRGEBhAIRQkkEISEgKSApIqSR CEYySKQiEIEZJFZJESQkISDIRGEQJJAIEUGCEACQkRkJCSQkJIIEJJAkhJJIqhISEkkkhCEr ruqqq66ruqqqqqq6qqq6qqqrqqqqqqqqqqqqSSSSSSIishISEkhISEISEkurqrq6q6q6uquq urq6ru7vlAChBUQf/KKBtQURB/yFEP7oJlENAgfuCpkFHoIHwAv9BQf+BBcKgdFEP5zzfrxW MZFENiKAA7VAiCAfz/P88zjFYxd+qqqqqqqqqiqqqqqqqoVVVVVVVVfkADGAAAAAAABjAOKq qqqqqqrZqqqqqsAAABjAAAAAAAAxgAAAAAAAYwAAAAAAAMYAAAAAAAGAAH6lVVVVVVVVV9Vd VVVVVVVVXVX1V1dVdVVVVXV1VfVVVXVX1VVUyMkhJJ/UKUFEQf8AowVA/QqkFVUQf7oKP6/i YOV/Offwfv+/Mf456Q7W/3jvn7qfP+ERv2/z9qKXfa/Pn59XZ9/n3+q+3H6mc766vrfmfvd/ tdf0iEznu+9mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmZmGZmZd3d3dszMzMzL973vee955d 3d2zLe973ve973e973ve96uwAAAAAAAAAAAKqqqqqqoAAAAAAAAFVVVVVVUAAAAAAAAERERE AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAA++++++AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADMzMzMzMzMAAAGZmZmZmZmYzMzMzMzMzAAAAAADMu7u7u7tdru7u7u2ZmZmZmZmZmWz3ve9 +/fv373veXdgAAAAAAKqqqqqqoAAAAAAAAd73ve973oADMzMzMzMzMAAMzMzMzM73ve973vc zMABd3d3d3d3YAAu7u4g5znOAAAy7u7u7u7tgAAZ+/P6ALsAAF3d3d3d3dgMzMzOc45znOAz MwAAF3d3d3d3dgAAAAAAAAAAABVVVVVVVAAAAAAAAAqqqqqqp4ABgAAAAACqqqqqqqAAAAAA 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 zuhJX3A2wAAAAAz3o9Gv71ZOR8efM2rtG11/L4K0ciYZvZK0m3kZM6taOVsJzYgdsKiHICws s7WnphUqUUH1rFT2TreIZelViNpixQu7tEzhfH7KdrbdzGV9Z2U4blop+Gyrbe81cw8ix1fh 5ferbztG73rfbxcnK5nHOdO92CpepPKJ6vEzDnfXBVC+lU/QFinXlWo3bCTswKJhRklTspzW O73odkw9rJWbamtTl9ziQerxT1axdXmgt6xzvM6WdlWZdr6k5JnTIlWNOJ7T4V1dt6bR26qp TxjWjYY6WeazOeY83FWdcKl93eeqm722Zop1QD0pVWTuN9gKkPKJ68azv19l6rGK8Yc2VWqu rk1U92SetMJQaXJfNmx2f24/US5e/b6VGVhtCHD9KQHaq5r5jxEy8mkb23PlEIRh6VPes0rI 4/IH4X68N+qxx1r5H6HIEPEh3aESQ2UxmI4sIoHoiZfPDmuUfc9h7p3OuQRu5MmD0o2OhEbr 3nK6dQbHTH1PORUHCg6g3KrI+tTaZOGXSAHxH4fD4Lz7Z4o1VdHaG9tmas2Cj5l7nVcyupYp dtdbDbddIiKwHXKUmBSlffVdjFtSVHaK/VAhR7zyYfkda20FLko1q+qtrzNjMpIYRRCIJZ9Q 7L7PshsjTFfhBCKsL6s7riy2Vy8dIzlh+hxoZlru3sJs9yJsohrX61pu12qvbM3EO7LsYd9e nXb9n2LaFb72VJdXrVbxr6V1HeGM2YJvM5krAKnwifG+7vc3PiNmcX2Z1JdLAz+o+2jnZ+C6 6tuSdFXYuXO9JPbJVzb03t8Mmvn3Ho6m6g/Dj3rbfdPvCk7QJFTrUh20KIrVCcWbbvtbIir2 1eLOVmj8OxI3nmCRmDB6i6wjx8R7xVEWSRebTjvfuzNs8mfcmeBaNBT8TFHmpeiIdwGdl6nS 646U3Fvc9o5bNblW90OxtWJusZGrdbx28eAfAUPw+HwetQo+geHUvYcoVHad9eCtfmDDMGTN 3FCHmjqrUYnxNLoht3Be7Z27J2acvWe3uvTdzlHQ6yMp27TYoawvavI3pJpc4Xu7q1p87Z12 PUjklRScifnXS7SqueEsPNKEuK71ctVaQ9lmOqFxjV7ae1hPLsjIuZJitdzVy+YxFQIAJo8g nsXjWNY6YK2eOiYC5Ud0pr2a0RVv2nEDTN5dMUYMjN7zym19RNjMMFFlKlUu86XyvY4DvSgl 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 AAAASSSSS3MyZzdAEkru7SAAAAAB3dpJbobkmPybAA7oANJdwRJSAD7gAAAAAAEkkgEkm0lM p5mZM4xJKEgASSWpJLSAIAAIAmQABJLczM3SAJkAAmQJkAAmQAAAmQEkoSACAIAAbbbbzMxZ mAJJnJJAklgB3dwAAAABnve9EfxiIog45Jv9ffq5fMW+2VVVUlVVVVVVVVKm222222222222 222G2222222222222222222222222222222w/wJJJJJJJJJJJJJJJJJJJJJJJJKSSSSSSSSS SSSSSJKSSSSSSSSSSSSSSSSSSSSRttttttttttttttuJSNtttttttttttttttttttvbbbbbb bbbbt6972222wAAAAAA7e97wAAAAAAA957wAAAAAAAe894AAAAAAAPeAAD8e/P9Pz/PrG/zv sAbbbbAAAAAAAEkkkktzMmc3QBJVVJIAAAAAAEk3ikDUlIHgYAHdABpLuCJKQAfcAAAAAAAk kkAkk2kplPMzJnGJJQkACSS1JJaQBAABAEyAAJJbmZm6QBMgAEyBMgAEyAAAEyAklCQAQBHd 3du7u7vJJGZiMzN5pJdmZncB3dwAAAABce/jiPe9CgMH9hRD/MAA/8QgQgEIJCCEIDIsIoUo MIACQiisIACQgAJCAqQgKkIqhCIhCKAwiKwiChCAAkIqpCLCAqQgKkIAJCAgQgKwgKkICpCA qQgCEICBCAIEIACQgAJCAqQgKkICpCAMICpCAhCACQgCyIoID/6R98APh8Pv7/47P8f1+buX V/1T/v/iGSN7/Zttttt7bbbbbbbbbbbbYAAADbYAAAAAAADbb89ttttttttttttttttttttt ttsANvZ4AAAAAAAPb2eAAAAAAAD29ngAAAAAAA9vZ4AAAAAAAPb2eAAAAAAAD29ngAAAAAAA 9vbbbbbbbbba7/fv7/4X+fWfH9/YANtttgAAAAAACAAAaSqk3JIBd2BJJJJJO7u7uSTaWwIk pA8DAA7oANJdwRJSCS3uAAAAAAASSSASSbSUynmZkzjEkoSABJJakktIAgAAgCZAAEktzMzd IAmQACZAmQACZAAACZASShIAIAgABtttsSSbSWmZjbSS7MzO4Du7gAAAADIEUFP2RQP/Ioh/ siooD/kCooD/1BUUByiAAv9RRDAohgUQgoh//IoH/IFRQG0UD/RFARHIAACNiiH38fr+JLv+ P5/n+n98YxjFfz/f13d6xJJJJJJJJJJJJJJJJJJJJG22222222222222lHJG222222222222 222222222222222222lHJG222222222222222222222222223ttse3ve2222222wAAAAAW9v eAAAAFVVVXe973qqqqqqqqqqq973vVVVVVVVVVVV73veqqqqqqqqqqr3ve9VVVVVVVVRJJMk kkkkkkkkkkkkn74D74ffu+H+j83/Bv8/PwAbbbbAAAAAAO7MwSSSbSUymwBJVVJIAAADu7u7 Mw3M7lMzJA8CSS7ugA0l3BElIAPukkgAAAAAkkkAkk2kplPMzJnGJJQkACSS1JJaQBAABAEy AAJJbmZm6QBMgAEyBMgAEyAAAEyAklCQAQBAADbbbMzM3UlpmY20knmZmPu7u7gAAAAD+j0e iIiI976gVFAf/cUQ4go/8AqKA0AAAj/oCooD/hFAoFRQH5VVUHQAACP9RRD/5FEICooD/uKI aFEMIIog/6AqKIP+EUCIoH/L/4AQAR/9hFAUYigf6ooGgVFAf4FEP+AVFAdiiERQPhRD/QUQ wCiFgAAI/0AAAR/QAACOBRD/6FENgAAI5BUUB/9IoH/cRFEHgohgUQiCKINgIAI/2RQNAqKA /KqqoP90UDQKcFAiAogMBEYKIbQAXyKigMBQUBiKBaKigP9RRCCiFooGxRChRD/kCooD0RFE HYohkAABH/migdEFRB6KIf8xEUVByqqqDwRQFH//MUFZJlNZYxky7wD379uAdJBAA//1AAq/ 7d/QYMg/AAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAQ+ESBAFgAAAAAAAAAAAAAAAAAAAB4Pk7 Nm1IqqaNtpKlUIkmtTY0qEpZ4dD4B7gpRQo9aoCVFAFSVVVQJVngDwDe9TQzbVJBk0LZpqNl iaIAZ4DwDj3mzQCmDbTKU2sKoFsBohrBZjS0qqUrDwLwDvUldZU2tFtZLLYszVphtttqVmsq tYSikqrHgG8AvFXs1sNqmygASshtiWimlrRUCJY8AeAPPEoHrRagajWhNmsmzLWkIgkbwaKe Ab1HtpQiADYMJEtmUElSibwB4Bw89tTWCgFLZoDWkiSqqJJLR43gHeh1m2iKkmtKBWtAqRUC hKgbNUFKqhBEIVCSgSqoqUSkgVElJUFKglRCMDwA8A2AYBsDAIHsA7gDAMYGAYAApKP97YyN +pVVVDQAAAACqepT/3qh/qqpSQ01MmARkYEYETyGJSVUAgYRgTT0TIwin4IJSkqA0AaA0NBo FP2pVVNpvVHqo/VB6gAAAAESIBKiInppNTJiGammTTJ5ABBB/X9v1/h+uM/tV51g1WPztUQc UCKAj/ZGwkixSSqFFFWoAlwGQW4giLcCQYQVhAAkkVkCQBQAA/2AFVBgoKAjr9U/dAICgAj/ 7Bf8wX/dUD/0oKqD/mLQqoiDRQtCJSAQBE/+ICAIwRP8wWH/hAQBH/hAQBGn/FUD9gAT8gAn 8AAT9gAT/EAE/cAE/cAE/mACfzABOgAnQAToAJ0AE6ACdABOgAnQAToAJ0AE4ACcABOAAnAA TgAJwBHQbBAICB0FDgABwEDgIHAQOAAHAUOgJ0AHoCB0AXoD0EDoIvQVOgqdBU4AbBA0CrFi jkVwIoYEG+gAJ0VgokBX+0U/pFZFZFZFfRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKy K1FaisisisisisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1Faisisisi sisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1Faisisisisisisisisit RWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWorIrIrIrI rIrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWorIrIrIrIrIrIrIrIrUV qKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWorIrIrIrIrIrIrIrIKVFaisisisisis isisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWo rIrIrIrIrIrIrIrIrUVqKyKyKyKyKyDUVqKyCyCyCyKyKyKyKyK1Faisisisisisisisikis isisikisisisisilRWorIrIrIrIrIrIoyKyKyKyLIrIrIrIrIpIrIrIrIpIrIrIrIrIrIrIr IrUUqKyKyKyKkisiNRGorIjIrIjIgyKyKyKyKyKyKyKyKSKyKyKyKyKyKyK1Fai1Faisisis iyKyKyKyKyKyKyK1FaikisisisitRWorIrIoyK1FaisikisisitRWorIrIrIrIrIrIrIrIrU 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 CSSSAzO3dyq5zK5vV537uszKqEkkkBmdu7lVzmVzer737uvfe5yZkJJAD03rX0m5Pe5776RK lzvZJJJAZnbu5Vc5lc3q8793WZlVCSSSAzO3dyq5zK5vV537uszKqEkkkBmdu7lVzmVzerzv 3dZmVUJJJIDM7d3KrnMrm9Xnfu6zMqoSSSQGZ27uVXOZXN6vO/d1mZVQkkkgMzt3cqucyub1 ed+7rMyqhJJJAZnbu5Vc5lc3q8793WZlVCSSSAzO3dyq5zK5vV537uszKqEkkkBmdu7nbuqy 65rue+9r2ZVQkkkgMzt3c7d1WXXNdz33tezKqEkkkBmdu7nbuqy65rue+9r2ZVQkkkgMzt3c 7d1WXXNdz33tezKqEkkkBmdupdVzmV7mu5772vZlVCSSSAzO3Uuq5zK9zXc997XsyqhJJJAZ nbqXVc5le5rue+9r2ZVQkkkgMzt1Lqucyvc13v7v3fe5yZkJJAD29618bK7zv3xJUud7JJJI DMrkrnN7zN/Xnc9r2ZVQkkkgMyuSuc3vM39edz2vZlVCSSSAzK5K5ze8zf153Pa9mVUJJJID MrkrnN7zN/Xnc9r2ZVQkkkgM5uc3vQc115msKqSSSSQGc3Ob3oOa68zWFVJJJJIDObnN70HN deZrCqkkkkkBnNzm96DmuvM1hVSSSSSAzm5ze9BzXXmawqpJJJJAZzc5veg5rrzNYVUkkkkg M5uc3vQc115msKqSSSSQGc3Ob3oOa68zWFVJJJJIDObnNfBvVuva8VUkkkkgM5uc18G9W69r xVSSSSSAzm5zXwb1br2vFVJJJJIDObnNfBvV3nfu5nOQEkgB7e9a+Nld5374kqXO9kkkkBnN 7+/ZmZNW69rxVSSSSSAzm9/fszMmrde14qpJJJJAZze/v2ZmTVuva8VUkkkkgM5vf37MzJq3 XteKqSSSSQGa1+/mZmTVD2vFVJJJJIDNa/fzMzJqh7XiqkkkkkBmtfv5mZk1Q9rxVSSSSSAz Wv38zMyaoe14qpJJJJAZ3e/v2ZrJqh7Xiqkkkkkkkke5v78ad1XB7fxVSSSSSSSSPc/fw+d1 wd0KqSSSSSSSR7m/vxp3VD2vFVJJJJJJJI9zf3407qh7Xiqkkkkkkkke5v78ad1Q9rxVSSSS SSSSPc39+NO6rg9v4qpJJJJJJJHufv4fO65mX9mZzkBJIAe3vWvjZXed/EnJUu5JJJAD2961 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 aZMU8SfQIHooqAD8/X5z6/KpeJ+KK/LXJ9IoPUQUIgKIjFIsYxiRiRSIXr169+LPlVVVVTFP VVSvVKr1UlVVVVVVVVVVeqpKqqqqr1YypZZV6qpVVZZkqqkRVez2Z6s9me9nsXveyswKiiAJ UJFZBKqlkEkWRkAkAJFJBZACQWqoZGoqYICySCskhIgwgrCAskiDILCMghJICySKEiBCCsID GCMkgAQgLJIqSDCLILJICyKIojiISCSDiAgqo/2UABBgqKijkcgK/dRV/VRVigAIPqqH9FUP 5Kof3UQf+UFEQf5KhQgCIDQolAJSCUoqwQT+oAkAEgqIoMQT+SqEFE/iKqqD/gVVUGhRPuIf +0V+yiv6I/mqDYL+wfmqhQqfmigfsqv5IK/srpEHxQMoCeAqaBU8BU2Cp4o8BA6CB1EDoKnV E6nQVOgqdUE6CB0VeoqRRIgh1QA6CB1FDoKnQVOqodBA6CB0EDgIHAQOAIHEBeKKcRU4CpxU T9wIHgIHQEDoIHQQOoCdVHoIHQQOoo+KPQQOoC9BU6oB0EDoIHUAeqh0EDoIHUVegqQAB6A9 BA6CL0FToAHQFegqaUHSi+bj++CASKyKyKyKyKyC1FaisisiDIrIrIrIrIrIrIrIIyKyKyKy KyKyKyK1FaisisgtREqKyKyKyKyKyKyCkisisisisisitQWRWorIrIJILIoSKyKyKyKyKyK1 FaisiyKyKyKyKNRWorIrIpIrIrUVqKMisisitRSorIrIrIrIrUVqKyKyKSKyK1FaipIrIrIr IsisisisisikisisisilRWorIrIrIpIrUVqKyK1FaisisijIrUVqKyKSKyKyK1FGorIrIrIp IrIrIrIoyAyCyKkgsgsgsgsgNQkVqIkiMisgJIrIjIrIjIrIjILURqCSIyKyIyC1FaiMisgh IrIjIrIjIrIjILUAaiMisgsitRWorIqSKyKyKyKVFaisisisisisisisikisisisikisisis isilRWorIrIpIrIrUVqKyKSKyKyK1FKisisisisikisisisikisisisisikisisisglRWorI IyKyKyKyKSKyKyKyKMisisisisisisisikisisisisisisitRWopIrIrIrIoyKyKyKyKyK1F aisikisisitRWopIrIrIrIpIrIrIrIrIpIrIrIrIpIrIrIrIrIrIrIrIrIpIrIrIrIoyKyKy KyKSKyKyKyKNRWorIrIsisisisisikisisisipIrIrIrIrIrIrUVqKkisisisiyKyKyKyKyK yKyK1FaikisisisitRWorIrIrIsisisisijIrIrIrIsisisisisisitRWorIsisisisisiyK yKyKyKMisisisisisisitRSorIrIrIjIjUVqKyKyLIrIrIrIlKKv7lAAQcAongqqoNqAAg+e +fpJ/L/r3le/zv7Y55e9fu+83z8bnz3uDm77+19/6Gv7+RuPntTrlcfYqe/5+7+/XHf8vmsz /O/dezWvnGZec98+v7UKya1Va7359R/fufuRk679qft7+73+z3O8nv25WsefN438+H19vms/ Xxz65zX15zuFUPwqhABRQfrvz79b1j6+3n3+vfvX23ve/v9+c536+vrnPrvPrnMY7+/ZUxHv c5mZF51P793vc1rmZrIzWfv36/2XkR73Z97O9O97WXWtVbP3f3P81GuRB73a97O97me96l3r Vwz939z/Nb9rznLqphzbe8u+S5ydzyeVneZL5yb3vK5VKhzetZVbi+cjccjk53ic+cm97yuV Soc3rWVW4vnI3HI5Od4nnz5yK3tPezcxfM03hys7zUbvdzye5P+d6ve8rvaVDmazeHKzvNRu 93PJ7k/53q97yu9pUOZrN4crO81G73c8nuT/ner3vK72lQ5ms3hys7zUbvdzye5MfPeXzmX3 vbXPM/ZrDlTv9mr1e/cz3+c4ne8nveyqeZ+zQ5U7/Zq9Xv3M9/nOJ3vJ73sqnmfs0OVO/2av V79zPf5zid7ye97Kp5n7NDlTv9mr1e/cz3+c4ne8nnJVG8/Zpd8dnms3d6jeRv588re8nnJy o2/Zpd8dnms3d6jeRvn375XOZ3nJyof2fl3Ls81m7vUbyN/Pnlb3k85OVG37NLvjs81m7vUb yN8+/fK5zm9wn1/z9dUp6u73vd3uON7+e5xXMqvdz3r73tPe9S71q4Z+7+5/lb5G45vczHt1 +rWVTr1d3ve7vccb38+eVvcb3Cfbv81dU69Xd73u73HG9/Pnlb3G9wn27/NXVOvV3e97u9xx vfz55rXta8ju6/NUcdnjOc4cnud5z58jN7jWoye7v9mrxx2eM5zhye53nPnyZznJ3qcru/fs 1eOOzxnOcOT3O858+TOc5O9Tld379mrxx2eM5zhye53nPnyZZ3tc3XK17+z9F469Pds73p2c 5vc/ftf2L7XN1yte/s/ReOvT3bO96dnOb3P37X9i+1zdcrXv7P0Xjr092zvenZzm9/PlVi+1 zdcrXtfs1F48iO7Z3vTs5ze/nyqxfa5uq/e/Z+9eOve1ec5y7qqd5z58u87fa5uq/RGs1F49 73tXnOcu6qnec+fLvO32ubqv0RrNRePe97V5znLuqp3nPny7zt9rm6r9EazUXj3e/rze5u6q nec+fLvO32uc5VajWs1F493savOcq+Zd3nu9j7ce9fuer0eqIrveO97S6b3c/vZr2u/5VdiO T3nOTGo1qdQt7vY1ec5V8y7vPd6+/fr3b7XOcqtR+z9F47HY1ec5V8y7vPd63/f389fa3vdV r37P03jsdjV5zlXzLu893vz4evmtama9rWau8en3p3ed7fvdy7vI77556+a1qZr2tZq7x6fe nd53t+93Lu8jvvnnr5rWpmva1mrvHp96d3ne373cu7yO++eevmtama9rWau8en3p3ed7fvdy 7vI77556/379M13Ws1d5iKiK5fe33vF3ee7756/V+/fpl3Ws1d5iKiK5fe33vF3ee7756/Ze taqs9rXdXeYioiuX3t97xd3nu++ev2XrWqrPa13V3mIqIrl97fe8Xd57vvnr9nb3vdUyd7ja cer3qq89573cERHvkfYuM9e97u2TvcbyT1e9VXnvPe7giI98+ev2dve91TM3uN5J6veqrz3n vdwREeffsIzze93eZrXtZC1e9VXnvPe7giI9779+9zla0pmfvZknar1cq8iER7CqmZibmI97 3no9URXe8vve0um93P72a9rvy7ueu61Mp/u1cZaq9XKvIhEewqpmY+fI9nb1pc5n72ZJ2q9X KvIhEewqpmY+fI9nb1pc5n72ZJ2q9XKvIhEewqpmYffsxnmtZM5/dIWqvZHbJlMxiZiI9f37 Hr9etciL7lxd5VVkdsmUzGJmIj0ffser1a1cz95l+usmfZHau5nJmMTMRHov+/pi4vWuTPMv 11kzOR2ruZyZjEzER75892u1+uIv+5l+u8V7I7ZMpnER73u/Pnez2f1xFf3Mv13ivZHbJlM4 iPe935872ez+uIr+5l+u8V7I7ZMpnER73u/Pnez2f1xFf3Mv13ivZHbJlM4iPe93++/e9ns7 1cV95l+v1R17k0iLhfvd72/nzvZ7O9XEV/dXFxc9e5V3EXC/e73t/Pnez2d6uIr+6uLi569y ruIuF+93vb+fO9ns71cRX91cXFz17lXcRcL97ve38+d7Pdfr96f7ivbqKnyO0iL8vvecvEGT EREej1RFd7y+97S6b3c/vZr2u3dz1r9J7+5T28ip9kdrIi/L73nLx9+e9XtfkRX9zL9u4qfZ HayIvy+95y8ffnvV7X5EV/cy/buKn2R2siL8vvecvH3571e1+f0RX7mXq4qe56qyIvy+93eP vzva7r8/vVX53G03XveqsiL8vvd3j7872u6/P71V+dxtN173qrIi/L73d4+/O9ruvz+9Vfnc bTde96qyIvy+93efHe13X5/eqvzGkXPe12qyZuHeavPjnKrX5/eqvaY2nk97XarJm4d5q8+O cqtfn96q9pjaeT3tdqsmbh3mrz45yq1+f3qr2mNp5Pe12qyZuHeavPjnKrX772Z6Y2nk97d+ u8qk+97u7z3173q1+++nhik8nvbv13lUn3vd3efHe9rX772Z6Y2nk97d+u8qk+97u7z473ta /fezPTG08nvbv13lUn3vd3efHe9rX772Z6Y2nnOXfarJm3ve7u8r1/c72ve97PVEZ3vHOVl0 3uo/Xmva7d3PWv30727tvJ5zl32qyZt73u7vPjve1r997VV4zN5XOcO3dzNve93d5X173r1+ ++u78zNZO9jt3czb3vd3eR9e96u71/eqvGZud73d8mURfe95pk/b971d3r+9VZDM1OtDlVUR fe95pmfXveru9f3qrxmane93fJmYiu97zV5n173q7vX96q8Zmp3vd3yZmIrve81eV9v3vV3e v71VkMze524dqoi+c5uWV7+uIivb1/RWeZmrnbh2qiL5zm5Z8vvezzev7szkGZzlc5w7VRF8 5zcsv7873s83r+7M4Zm9y5w7VRF85zcs+X3vZ5vXv3pnJM3ut72VXvXve7ll/fne9nm9e/em cM1qW9lV7173u5Z8vvezzevfvTOSZvdb3sqveve93LPl972eb1796ZyTN7re9lV7173u5Z8v vezzevfvTOSZvdb3s7VRF85dMrH07Xu9zte9ld45ysvlOcrUavNxv19ues3q/2TkzmZvdb3s 7VRF85dM+Oc5HN6n96ZyczN7re9naqIvnLpnxznI5vU/vTOTmZvdb3s7VRF85dM79d72O7n+ icjMxud73d9qohzl0z45zkc3P96ZyczN7ne93faqIc5dM+Oc5HNz/emcnMze53vd32qiHOXT PjnORzc/3pnJzM3ud73d9qohzl0zn13vZn3Pfv0Tk5maytaOVXvZzlzmfHOcme87+/emcrMz e61o5Ve9nOXOZ8c5yZ7zv796ZyszN7rWjlV72c5c5nxznJnvO/v3pnKzM3utaOVXvZzlzmfH OcmY932tRPMrMze/343M97nOVmZ8c5yZj3fa1E8yszN7/fjcz3uc5WZnxznJmPd9rUTzKzM3 v9+NzPe5zlZmd/fzvezMz2da1kZmZv9+u9xHeuczMzv13vZmY7GtayMzMzmtHJnub3Aqqrl5 3udr3srvHe9rL7TnL1Oozcb9fbnsrzsa1O5kZzmtHJnub3BH2+c5EXnY1qt5OZm9/sOTPc3u D5e9796877Wp3k5mZzmtHJnub3A+fXOciGd9e93yczNa/fruI41r1/5Ota5VOq3uuZWZm9/v xM8zWvFz/X3vYM7Le3JzP35+u4jjWvXfyt7327d9W91zKzM3v9+Jnma14jn9Xe98vOyc5zK3 jWfiZ5mteJ+1znPOZ313zl5eczVfvxM8zWvFffm976vO+u+cvuZzNa/fruI41r138ze99Xnf XfOX3Lzub3+/EzzNa8V9+b3vq87675y+5nM1r+u4jbWu3fzN731Wd9d85fcvO5vf8TO81rp/ nyt731Wd9d85fcvO5vf8TO81rrfyd73c5zLueX3Lzub3/EzvNa6fK3vfVZ313zl9y87m9/xM 7zWul1Mzys712veyu8d72svtOcvU6jNxv19ueyvOxd85fbt3N7/iZ3mtdPlb3vqs7675y+5e dze/4md5rXTf2uc51Wdi75zmVnMzf8TO81rp8re99erPRd973uXnc39JnV5vffz5O9768z0X fe97l53N/SZ1eb338+Tve+vM9F33ve5edzf0mdXm99/Pk73vrzPRd973uXnc39JnV5vffy/t c5zyO56LvvMvNzm/4iKzWu/rz59vnOdqvZ6LvvMvNzm/4iKzWu/v8nWtbiMz2Xfecy85Oc/i ZvNa7+e+1znOzxnou+7y83OV/Ezea138+Vve+TLPRfb93uXne1nfzU3n79z8+Tve0yz0X2/d 7l53tZ381N5+/c/Pk73tMs9F9v3e5ed7Wd/NTefv3Pzv2ec4njPRfb9zLznKy/zU3n79z8qq ab1EQcz3pzuX/f0ZP79v13+5+ye9nY7na97K7x3vay+05y9TqM3G/f5veuzyc96fVEZneZ3v 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 WUaj24MSGWhkVVSaaiCwmTG1tSDWamTNV46lSMQ3uWKKmkVd9iovSefPN301dy7UxgjmRmVm nRhtyHXTN3MfpN2/YS5Vzdz0tbWZx2veAAsQfADwzpM+5Pc/BSVa+F2bIMXZM6hxxJRDjdoN VwMJJR/A3AgKIR+uMKkCSRCxqAn31e3Nv7QKIHEKU/MikwvnPcKKdonyM5WcI285UX23dd9Q y8ltliCLHeU4ryO/qszLXJ2JsFLqOX1YzBOl6HfQXo46cvEddXKuQ0KuKbIpgk08c3hs1B7k N1l+djuS13eF85amDYKLmme7jt9j4ABVe7MXRDu3q6IEUnNSmyEGg+ENzFM5ITueKXVU0X1R qa8a7jOeGhfDi+FKiUaQfLGpc0bMgs4xgD9GLDACDoJ5YtRF7xyjhrQiYHpvlbsPlustunzG 2Tt3j9kOvKQb2xsboYz021kkoFujlvCly6pwsZhWUu0tXbXOwevz4neGurNhOSXEV2Z2FJkX nbl1yiN6YjXGPkH3J6VUu3dV21Ozos7QVZjp7eXcWFs5W6C1V46U1IVVVd65a6qjdq4o11HV YuVpwXu3nSqtBXeIWAKsxCsIYEgi5S+5EPgZeXvZN5Wa2849rR7lHQnWM3GlVw4IvBbsPc9c tXprqy1OwyV0q6D7EMsWiizSV5CnSpQfQEoopUKKVWlQiqBFQopFWlQopAClQ0YDKIPEQMqA HgIHAEDiAuwVMY+1+Vd3cqSv8k2rbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaLTbbbbbSSSSSS RJJqqqrd3aqqqqqqqqqt3dqqqqqqqqqs3WZmD8tVVVWgAAALdaAAAAAAALdaAAAAAAALdaB2 7u7u7u7u7u7oEQBFZwAB2/Mr1VT970b/Ik+faTy/Mu7kkkSSSSkky7VVAA6lA7uA7q5QDJJ3 AySZmgBdjSoAYB3Ae94AGSagyS7ySGVq1u68skkVpe3z8xW7WSSKgBgHcAgagIGoCBqBJJDZ JMwAzeAAWSTMAMUA3QOA1AQAzpJMwNknIUGABdncq3a0qqySRWlQCgVWlaVAAVAKruHdPe8B /P4crh+lbfXbHajfzczNbu1FWp6ZTLm8ReS3yT0YsSW6xhkuEh71usTdY5MVl4V/ik7n1oQw 99yv4gKUOpb06CqbF8WqH2fERq3KN7548ggX13LsfOpjpdIyrvJlX5uqpnUbaMuqlXN1BLJu 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 AgQiADCKoEIosP7qAAg/zVQ378fHLxi7lSqPjPzjGMYbbbbbbbbbbbbbbbbbbbbbbSSSSSSV tyNqNtttttttttttttttttttttt/4kkkkkbbbdU3VNtttttpAAAAKqnz58+fKqqqqqqqqqvn z58+fKqqqqqqqqiTVVVUSSfD1VVQACSSAASSQACSRtttttttttt5+1O8z/H+P8cku7u7szMz MzuX73lVczMzM6lAVczFu1QDdA4DUA3eAKBpUAySdwe94ADUBA1AuzSSTa5bvlVSSRW7eVUA BpUABUAySdwMkUGSKDJFD7774MADAAzpJJygBgAYySZgbJFBkkzNADAO4BAoMAKDuVpWlVUA BW7VAKBVaVu1c5znOe9u7u+97J3tgCfoqiKDznPfaq7v7X5MNzr8oF83QAAAPrd3W222225J I222222222222222222222222222222pFI22223kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjq lVVJJJJJJJJJJJJJJJG2293d3d3d0AB3zu4AAFWgAABzbQAAABERAGvnOAAAKqqqqrrtVVVV VWWWWVVW26qqqqqqqqqstaAIXf5z8SJF/h/kCSSSJJJJSSASSSd3d3c0oCrmYt2qAboHAagG 7wBQNKgGSTuD3vAAagIGoF2aABtPXfd3d3AAK3aqqAA0qAAqAZJO4GSKDJFBkih9998GABgA Z0kk5QAwAMZJMwNkigySZmgBgHcAgUGAFB3K0rSqqAArdqgFAqtK3aoACyT5W77381AAQflV D+wKJ/dFaBBgRFYRFAhFFYRVYRGEQVhFQYQRRRT/wRERH37/P2+sXd3XmKqsD789VVWVVVcA AAACVNltMttttJv/WSSSSSSSSSSSSSSSSSSSSSSSSSSSKSSSSNtttttttttttttttttttttt tttttttySRttttttttttttttttttttttt7u7u7u7rt3QAAAAAABu7oCqqqqqqqq0qqqqqqqq qqFVVVVVAAAAAAC69+37rPDW3vcv3fuAkkkiSSSUVu1VczMzMaUiqOLdqgG6BwGoBu8AUDSo Bkk7g97wAGoCBqFT774m7XNKqskkVbtVVAAaVAAVAMkncDJFBkigyRQ++8GTAMADOkknKAGA BjJJmBskUGSTM0AMA7gECgwAoO5WlaVVQAFbtUAoFVpW7VADPe3d3fe9k72xRPgFE/wqh/2o ACD+qgAIP/SgAIOQFEQf9lULVQtVCKof6UVf4qAAg4BRP4CIiI5FVVBwqh9e/j8sYxipVVR+ ck/Kkkkkkkkkkl/ubbbbbbbbaSSSSSSZbSSSSSSSSSSVttttJtttttttttttmKSNtttttttt tttttttttttttttttttpJmSNJJJJFIpFIpAAAAdd3aAAAABVVVddqqqqqqqqqqrbdVVVVVVV VVVbbqqqqqqqr2a3czM7u4AAfbM9nq9/Fn6H7xYQ9n30Pyf8QDbbcSSSSklSSSOZmZmKgqgr drJJmBskUAzuAKBu1QDdA4D3vEkmoMk5Cp998R1EAkkszMUdNtt5mZJKkhJJMkJJWgcBqAga gIGoCB994MmBkkmZwAHKAZJJmIAYB3AIGoBu8AZJO4GSXczACg1VpW7VVQAFbtZJLuKq3at2 skkVABW77z94CiIPqgAIP+yqHwCI/xUABBoVVUH+CgAIP6AolAgAg+iqqg6FVVB+6qH/CqEU ABB/wqhpVC1URQf4IAAoP6AokBRP3oAig/sKIijFFX+wKJ/FVDSgAIP3VQn+lAAQdqoQFE9V Q/3VQyKoYFVVB/AqqoPyKqqDaqH/CqGxVVQcggbiqogP/iir/VVEUHqqGVUIKqqDhAEUH81F XagAIPoKqqD+gKJoUOCiRFRQGCABFUNoqD6oACDEUAQYCiYUABB/JVCKoYBRNqoUqh/VVD/6 oACD4qiKDxVDQqqoP8VFXwQREHxVD/pBEVQciqqg9FERR//mKCskymsgINIhwKXjW3AMkggA f/6gAVf9u/oMGMPgAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAACAB8+1OAAAAAAAAAAAAAAAAAA AAFgfNbZJq20I00bMKKigKkq0DClFjwBfALvKbMWgZU0a002ZJUgSqVQqVN4OvAN08rWVaA2 mrFtVtsmmi20lKhLDwC8A416NCtSWzIhE2CmhJEsPDieAY8r1k21rWtNKA1EpQSqipKpmx47 wDvSkoO2NmKmFAC1QWlKWwAVUmeB4B7wj2qsllBQG2Blmas1rUi1TWzREFnnB3gGPXTUrKZZ GpAUKRrbVitmampqlKjeHZ4Bj1cbKBFJGtFVKWtICIDYaREix4B3gEeK9gzWmxq0swaxLQqj NWyKRVClFtqglCEpCqpSlJKUJCqUEQkkooqUqVSKipRGBi4BeAO4Du6A4B3dUcA4cFgEN0AO AcAAQqqf+p7e8TI/1SqqqYCZGExME00Kqfqqb/3qSf+qqqkxpqj1AGgAABqeQyKSqp+pMEaY EDTBNNCKfgglKlN6lRgAAAAMn72pVSmhHslPUAAAAARIgIoQgRE8Q9TSYMTqqCCD+D7fip+P r8XivgR2igOaUEARpgRIxjGKiiiSAqISAoEipJICSBJIqyIwjIqICj/0qKqDBREBH5Ef0EYq KqD+Yj/wI/uI/9ggf7Ciqg/ujQoCiDEYClCMARP+QBAEYAn7iP+gAgCP/oAgCP5oi/KfyVH4 BA/JBQ/VQcggfqiofqCp/MFT9VAP2BA6igdVXqCvQHqi9RV6p1BHqr1ETqg9RAOqgdQF4Cpw FTgKnFROAgcBA0gvQVNqjsEDaChtQdggbBA6gL1U6ip1ROooHVV6gr0FToAJ0FTinEEeKu0R NqDtEA0A9VTaCBtQDqIuwVNqrsEDoAUIhQKlKpwEDiKnFE4igdVXqCvQVOgqdUDqIhwUciAF DoVHxEr+Ap/GKyKyKyK7ilRWRWRWRWRWorUVkVJFZFZFZFSRWRWRWRWRWorUVkVJFZFZFZFZ FZFZFZFaitRWRWRUkVkVkVkVkVkVkVqKNRWRWRWRWorUVkVkUkVkVqK1FZFkVkVkVkVkVkVk VkVkVqK1FZFZFkVkVkVkVkUkVkVkVkVkVkVkVkVkVqK1FZFZFkVkVkVkUZFZFZFZFZFZFZFZ FZFaitRWRRkVkVqK1FJFZFZFZFaitRWRWRWRZFZFZFZFGRWRWRWRWRWRWRWRWorUVkVkVJFZ FZFZFZFZFZFaipIrUVkVkVJFZFZFZFZFZFZFaihUVkVkVkVkVkVqK1FSRWRWRWRSRWorUVkV kWRWRWRWRWRWRWRWRWopUVkVkVkUkVkVkVkVkVkVkBJFZFZFZFZFZFZFaitRSRWRWRWRWorU VkVkVkUkVqK1FZFJFZFZFaitRSRWRWRWRSRWRWRWRWRSRWRWRWRQkVkVkVqKVFZFZFZFZFai tRWRWRZFZFZFZFZFJFZFZFZFZFZFZFZFZFaitRWRWRZFZFZFZFGRWRWRWRZFZFZFZFZFZFZF aitRQkVkVkVkVkVqK1FZFSRWRWRWRWRWRWRWRWorUVkVkVJFZFZFZFZFZFZFaijUVkVkVkVq K1FZFZFZFZFZFZFZFZFaitRWRSRWRWRWorUVkVkSooVFZFZFZFZFZFaitQAkVkVkVkVkFkVk VkAZFZFZFZFJFaitRWRWRZFZFZFZFZFZFZFZFaiSLUVqK1FZFSRWRWRWRWRWRWRWRWorUVkV kVkVkVkVkVkVkVkBJFZBZFZEZAZFZBaiNQSRWRWRWRWorUVkVkVJFZFZFZFJFZBaEf4Ciqg6 AEARsUVUGxHAjBRVQfz/T7e7+Nefb7fX2/f4177v3fv9fe97v7n7z7nuc9XZmf8/adrsdj79 5z/nM3V3zNqq0qivbXpme9p2ux2Pv3nNmbq75m1WkJVVd2+8mT0Psy4+vcqZvdiM/IyLnaqr 23Jnfejfsy4+vcqZvdiM/x/IyLnZqr23Jnfejfsy4+vcqZvd+z8++yLnb5y9y11W+iP2759r N7yqyd+z8++yLnb5y9y11W+iP2759rN7yqyd+z8++yLnb5y9y11W+iP2759rN7yqyd+z8++y Lnb5y9y11W+iP2759rN7yqyd+z8iIybrbu7vnuTL77+1VO2yplMov8mZ7VUu7u+e5Mvvv7VU 7bKmUyi/yZntVS7u757ky++/tVTtsqZTKL/Jme1VLu7vnuTL77+1VO2yplMov8mZ7VUu2Zlr qqqI/f7W832b3lTvarZ7+VVVVVt3uZl7dVVRH7/a3m+ze8qd7VbPfyqqqqtu9zMvbqqqI/f7 W832b3lTvarZ7+VVVVVt3uZl7dVVRH7/a3m+ze8qq3vObXfzlVVVW97m973NyZn779/f2Vav vbmd9VbPffyp7VbTtbMy7TtdjsffvObM3V3zNqtpxThmO97jJmfvv39/Z2tX3tzO+qtnv52q qqre9x3vc3Jmfvv39/ZVq+9uZ31Vs9/O1VVVb3uO97m5Mz99+/v7KtX3tzO+qtnv52qqp3vb ZmXvsqqiP39/ac1nuRG9mfTn5lVVTubbMy99lVUR+/v7Tms9yI3sz6c/MqqqdzbZmXvsqqiP 39/ac1nuRG9mfTn5lVVTubbMy99lVUR+/v7Tms9yI3sz6c/Mqq9yt7ub3vczXec5Mx999zbt WeuZ31VU97+d5znr5vt73ve5mu85yZj777m3as9czvqqp7387znPXzfb3ve9zNd5zkzH333N u1Z65nfVVT3v53nOevm+3ve97ma7znJmPvvubdqz1zO+qqnvfztV7lb7czM93vdeu75UfffX s7PHIj2VVVWZ+Zznr5t7mZnu97r13fKj7769nZ45EeyqqqzPzOc9fNvczM93vdeu75UfffXs 7PHIj2VVVWZ+Zznr5t7mZnu97r13fKj7769nZ45EeyqqqzM5z1829zM9mZrvOc2+TERszm1a 5mcmZnMqe5zan3uKqt7vp997uR9dqrOZndmYjszN3zl6zMO85zb5MRGzObVrmZyZmcuZ9lbz bt7MzXec5t8mIjZnNq1zM5MzOXM+yt5t29mZrvOc2+TERszm1a5mcmdqu5VO85zePXd6xW8q PriItPPcmbiEzm5TvOc3j13esVvKj64iLTz3Jm4hM5uU7znN49d3rFbyo+uIi089yZuITObl O85zePXd6xW8qPriItPPRF/fIzNyneVtPc5zV37m3yc+++z0XczPIjZzN7T3K2nuc5q79zb5 OfffZ6LuZnkRs5m9p7lbT3Oc1d+5t8nPvvs9F3MzyI2cze09ytp7nOau/c2+Tn332ei7mZ5E bOZvaVOz7tVW85lOUz777Ni7mZ5EbOZvaVOz7tVW85lOUz777Ni7mZ5EbOZvaVOz7tVW85lO Uz777Ni7mZ5EbOZvaVOz7tVW85lOUz777Ni7mZ5EbOZvUxse7PdqslU7uREZF3ERzkbN1M9v ldne82qre76ffe7kfXaqzmZ3ZmIj6orUlVk7U+3IiMi7iI5yNm9zY+2O5ObVbKp3ciIyLuIj nI2b/u5v9+2O5ObVbKp3ciIyLuIjnNi9nNyNnsZszsW3c+++z03czPb2M2e9yNnsZszsW3c+ ++z03czPb2M2e9yNnsZszsW3c+++z03czPb2M2e9yNnsZszsW3c+++z03czPb2M/NnvcjZ7G bM7GY3ex91GZEc9exn52e9yNnsZszsZjd7H3UZkRz17Gfz+dnvcjZ7GbM7GY3ex91GZEc9e5 +djvczZ7GbM7GY3ex91GZEc9exn52e9yNnsZsz9d+Mj7PRdxHePr/OxmXCcjEz9djI+z0XcR 3j6/zsZlwnIxM/XYyPs9F3Ed4+v87GZcJyMTP12Mj7PRdxHePr/OxmXCcjEz9djvZjvpzIj1 vrjsLqtnc56qre76ffe7kfXaqzmZ3ZmZVU8qdgmfrvfb3sx305kR69+v89GZcdnIxM/XY72Y 76cyI9b6/z0Zlx2cjEz9djvZjvpzIj1vr/PRmMn1dnszP12O9mO+nHZln31/nozGT6uz2Zn6 7HezHfTjsyz76/z0ZjJ9XZ7Mz9djvZjvpx2ZZ99e/xPe72len0zP13u73sx305vZln317/E9 7vaV6fTM/Xexu97U99Pd9Ms++zN/m17z3OV6fTM/Xexu97U99Pd9Ms++zN/m17z3OV6fTM/X exu97U99Pd9Ms++zN/m17z3OV6fTM/Xexu97U99Pd9Ms++zN/k977tVPartVUbO1O73vKn09 30yz77M3+T3vu1U9qu1VRs7U7ve8qfT3fTLPvszf5Pe+7VT2q7VVGztTu97yp9Pd9Ms++zN/ k977tVPartVUbO1O73vKn0930yz77M3+T3vu1XZnszMbO1O7nuR6O76Os++zJ9Ps5zZ3vFVX e76ffe7kfXaqzmd2I/IQ7N1symZjs7U+3Pcj0d30dZ99mf43/E977s12Z7MzGztTu57keju+ jrPszf5He+72uzPZmY2dqd3Pcj0d30dZ99mf43/E977tdiOxFxs7U7uV937N7Gev62/yO992 ciMiOxs7U7uV937N7Gev762/ye992exHYi42dqd3K+79m9jPX99bf5Pe+7PYjsRcbO1O7lfd +zexnr++tv8nvfdnsR2IuNnandrOR2M2ZnPXEQjf8f4733Z7EdiLjZ2p3azkdjNmZ9z775v8 d77s9iOxFxs7U7tZyOxmzM564iG/ye992exHYi42dqd2s5HYzZmc9cRDf5Pe+7PYjsRcbO1O zdfZ9aZm+7ERuz3vuz2I7EXGztTs3X2fWmZvuxEbs977s9iOxFxs7U7N19n1pmb7sRG7Pe+7 PYjsRcbO1OzdfZ9aZm+7ERuz3vuz2O/fX9sbd1tZyI+tMzfdiIjsduqnaZfuc5zm76vRHvdm Mxznec77Zn8nY30zsb99770eu69WciPrTM33YiN2e992ex376/tjbutrORH1pmb7sRG7Pe+7 PY799f2xt3W1nIj60zN92Ijdnvfdnuz6IyIjbutrORH1pmb7sRG7Pe+7Pdn0RkRG3dbWciPr TM33YiN2e992e7PojIiNu62s5EfWmZvuxEbs977s92fRGREbd1tZyI+tMzfdiI3Z733Z7s+i MiI27razkR9aZm+7ER/N2e992u7PojIiNu62s5EfWmZvux9ux3vuzmz2I9ERt3W1nIj60zN9 2Ijdnvfdnuz6IyIjbutrORH1pmb7sRG7Pe+7Pdn0RkRG3dbWciPrTM33YiN2e992e7PojIiN u62s5EfWmZvuxEfzdnvfdruz6IyIjbutrORH1pmb7sfbsd77s5s9iPREbd1tZyI+tMzfdiI/ m7Pe+97ntpMdiI3MrKzkR9aZm+7H33fu3MztLv3Oc5zd9Xoj3uzGY5zvOd9sz+Tsb6qrcrZj 0RHsysrORH1pmb7sRG7Pe+96vbSY7ERuZWVnIj60zN92Ijdnvfe9XtpMdiI3MrKzkR9aZm+7 ERuz3vver20mOxEbmVN199lpmb7sRG7Pe+96vbSY7ERuZU3X32WmZvuxEbs9773q9tJjsRG5 lTdffZaZm+7ERuz3vver20mOxEbmVN199lpmb7sRG7Pe+96vbSY7ERuVnKvkfZiZnL2Ijdnv fe9XtpMdiI3KzlXyPsxMzl7ERuz3vver20mOxEblZyr5H2YmZy9iI3Z733vV7aTHYiNys5V8 j7MTM5exEbs9773q9tJjsfbk5U3UfZaZnLvZmd2ve571e2kx2PtycqbqPstMzl3szO7Xvc96 vbSY7H25OVN1H2WmZy72Zndr3ue9XtpMdj7cnKm6j7LTM5d7Mzu173Per20mO9mN7XeVlR93 EzOZmbVVUzN1U+pl+5znObvq9Ee92YzHOd5zvtmfydjfVVblbMe7Me7XeVlR93EzOZmbVV7e HCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN7XeVlR93E zOZmbVV7eHCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN 7XeVlR93EzOZmbVV7eHCm0mZ72p3vO3Xaj7MTM5mZtVXt4cKbSZnvane87ddqPsxMzmZm1Ve 3hwptJme9qd7zt12o+zEzOZmbVV7eHCm0mZ72p3vO3Xaj7MTM5mZtVXt4cKbSZnvane87PZ+ /btMzd33aqvbw4U2kzPe1O952ez9+3aZm7vu1Ve3hwptJme9qd7zs9n79u0zN3fdqq9vDhTa TM97U73nZ7P37dpmbu+7VV/Pbw4cbSZnvane87PZ+/btMzd33amYiLmZ9S79znOc3fV6I97s xmOc7znfbM+j3p9Xuc5m5t3VCX3e5H1+3vKrPbEdjvZ7Xec5m4u6rSX3e5H1+3vKrPbEfzsd 7Pa7XOZuLuq0l93uR9ft7yqz2/R2O9ntdrnM3F3VaS+73I+v295VZ7fu/d+yMuqvbcmd96N+ zLj69ypm92IzYj9CP5ACAIwR/dUVUH91RVQf9lRVQbQFRTKKERJJISEkhISEjISEISEgAsFC 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 pUHQIGkVcKeBA8goeFF8CBkEDoguhFMiqZBUyKJwEDgIGwQPCg8BU4Kh0RHor0BA6Kj0FToq HuogZUFygpwEDCjlTIIHFXbfzbb+dW2KioqKioqKxUVFRWioqKioqKjV+8rcqKio23K3Kioq KirlbcqKiorFRUVFRUVFRrYqKioqKioq5VysVFRUVYqKioqKioq5VirlRUVYqKioqKioq5W5 UVFRUVcq5UVFYqKuVcrRUVFXK3NRtsVFaKioqKioq5VysVFRUVcuVFRUVFRUVcq5XKuaiorF RVyrlRRUVFRUVFRUVFXKuVGooqKioqKxUVFRUaioqKirlXKjVioqKi2KioqKioq5VyooqKio qKjUVFRVyrlRUUVFRUW2KioqKisVFRUWioqKirFRUVGoqKuVcrRUVGrlyoqKiorFRUVFblXK ioqKKioqKsVFRUVFRUVc1Yq5UVFWKioqK2KioqNtuVcqNsVFRUVFblXKioqxUVFRWKioqNo1 cq5tua5a5VyoqKioqNRrFqLRtcq5qNRqKio1Go1FbmrcqKiosVFRUVGxUVFRUVFRVyrmsVFR qNaKioqKioqKi1FRUVFRVyrlRWKioq5VysVFRUVioqKiorFRUVFWKioqKxUVFRUVFXKuVFYq KirlblRUVFRWKioqKioq5VyrFRUVFRUVFRWioqKioqKuVcrFRUVFXK3JZFZFZFZSKh/EBFEG gAeIgAI4ARRB/03/D9/4Vj8fmV8/rn8335+d+5z9P13+ft9/5bpvUTe5+zFLzv97915eZzNx njPf7Xvu4pGvm+Z99/r6/FzPftr5X39+PnUV/KKwBBUHs+q5rEe++eR39rd19zvfv+f8/599 9+N0qL7ERETve973uu95/Y7n3e22Zmc5nczsd8Zftd1rm+Zm/e+zrWo1HbiL70b75U+ceub5 fd+99nURXlGbqJiXI175Je6jtb37ftbz4/WzNzExjka98kvdKje/b1OW/YNzEwcjXvkl7qFc j2/ayH7GZuYmMzka98nF7qFcj2/ayH7GZuYmMzka98nF7qFcj2/a1t+uqTuZibc7GvbdRkXG /M8nXftTPeb5yO33nY17bqMi435nkxvv6p7zXOb7fedjXtO9jIuN+Z5Ou/ame83zkdvvOxr2 3UZFxvzPJ3vv7nnY1Eb7XedjXvXWbvevM85rv2L7Gojfa7zsa966yIuN+5572uX2NRG+07Lm 9adZEXG/c8/ve1y+xqNdp3iN607lxHY37nnvYvu51EZ23YjXvrq4io37fnvY73c6iM7bsRr3 11cRUb9/a97973XNdjO27Ea99dXEVG/f33eb372svM7nd98qfOPXN8zOxruqcz7dxGovlnYj XvveriKjfv75r2+/u9nWoztuxGta07Gdma5Hv7Xt9/d7ud7jvb6iNa1p2FzNcj7915ffznNa glkRrWtYjLma5H39+19t+c5rUEsiNa1rEZc1G/v332rePea1GczMiNoiHOZdVXI+8/b3q3j2 da5nJzIjaIRGXMzEa/fvuvbePea1F8ZkRtEIjLmZiNfv33XtvHvNai+MyI2iERlzMxGv377r 23j3mtRfGZEbRCIy5mYjX79917bx7zWovjMiNohEZczMe/fv33y3j2Nai+LuI2iERlzMx79+ /ffLePY1qL4u4jaIRGXMzHv3797r3Ozrup3OV3mRER3nO85czMx798/fu613s67rm5yu8yIi O853nLnnOR7+/fv3da72dd03Su8REQ5zvOXMzOVO/JnOc95y8yuu775U+ceub5mdjXdV9+Yv Vbc1mp3mU52IiHOd5y55zJ5rz9+/d3vsanfdopHeIiIc53nLmZnKnfn79+7G+xqt93UUjvER EOc7zlzMzlTvzzzzzsb7vVb7uop2G972iu85czM5U7888887G+71W+7qKdhve9orvOXMzOVO /PPPPOxvvta7Wqd2re95Fd5y5mZ7U7888887G++1rtap3at73kV3nLmZntTv333777Gu813V a7erd3cVERnK7MzM87PNV7777Gu8juq129W7u4qIjOV2ZmZme1O/ffffY13nfa97d27u4qIr nK7znOcjveb99999jXeX7nvbu3d3FRFc5Xec5zkd7zbWtarcx2s9XmZXdXdRFc5Xec5zkd7z bWtarcx2s9XmZXdXdRFc5Xec5zkd7zbWtarcx2s9XmZl97BkzlTk85znIvvNta1qtzHaz1eZ mX3sGTOVOTznOci+8iG973URHaz1eZmX3sGTOVOTznOci+8iG97nPZ1rU2quu775U+ceub5m djXdV/azvcjfvMnM7fewZM5U5POc5yL7yIb3vdREdrPV5mZfewZOTzORERcX3kQ3ve6iI7We rzMy+9gycnmciIi4vvM5xERF8iO297bMy3YMnJ5nIiIuL7zOcRERfIjtve2zMt2DJyeZyIiL i+8znERHyL5znO213DGZ2DJyeZyIiLvsZEN3EXznOdtruBmdgycnmciIi77GRDdxfPnOc522 u4GZ2DJyeZyIiLvsZEN3FzP2Zme211QzOwZOTzOREXfd5vbdRWT9mZntt76obzsGTk8zkRF3 3eb23UVz5znOdrN77nRvOwZOTzORERd9jIhu4vnznOc7be+4G87Bk5PM5ERF32MiG7i/efec 572299wN52DJyeZyN7u+7zdt3F8+c5znbTEdw03nYMnJ5G9aqus3bdxfPnOc520xHcNN52DJ yeRvWqrrN2iL5c/JmZ7aYjo03nYy+XyNtaqus3aIvl+2+73vd1VdR3fffOecz2NRXe701P9q 6gyeXzl9xruyMvl8jbWqrrN2iL5c/Jm6ruK5zve913ZGXy+Q99qus3SIrlT8mVV3Fc53ve67 sjL5fIe+1XWbrvecub/V9qu3d4vnO9773WZu6iuRnvva6zdd7zlzdfKrt3eK5zve913ZGXy+ Q99qus3Xe85c3Xyq7d3iuc73vdd2Rl8vkPfarrN13vOXN18qu3d4rnO973XdkZfL5D32q6y4 vvZnKy/l327t2uc73ve6N5cXcPfarrLi+9mcrL+Xfbu3a5zve97o3lxdw99qusuL72Zysv5d 9u7t25nuu97o3l3e3lVXWXF97M5WX8u+3d27cz3Xe90by7vbyqrumXy+9qsur+Xfbu7duZ7r ve6N5d3t5VV3TL5fe1WXV/Lvt3du3M913vdG8u728qq7pl8vvarLry/t327u3cmZ7vO93pvL u9vJnvq6iu97WXV/Lvt3du3Mz3fe93pvLu9vJnvq6iu97WXd/Pl327u3bmZ7vve7ay7vTznO +lRXe9rLu+1ERERd3aO7775zzmexqK73emtT/buuGduqmZzeO7ay7vTznO+lRXe9rLu/ny77 d3bt1VV2DT3MzM28mXpcXbtZd38+Xfbu7duqquwae5mZm3ky9Li7drLu/ny77d3bt1VV2DT3 MzM28mXpcXbtZd3n37mdzMznbqqrsGnuZmZtMvC93btXd38+Xfbu7726qq7Bp7mZmfecycyl 27WXd/Pl327u3bqqrsGnuZmZ95zJzKXau3mZn98+ZnczMzt1VV2B5mZmfYjMzKXau3mZnn37 mdzMzO5VVXYxp7mZmfYzmZKqT3uZmfPmZ3MzM7dVVdg0zMzPsRnMzF2rt5mZ8+ZnczMzt1VV 2DTMzM+xGczMUntXd38+Xfb7mZ26qq7BpmZmfYjOZmKT2ru7+fLvt9zM7dVVdg0zMzPsRnMz FJ7V3d/Pl32+5mduqquwaZmZn2IzmZik9q7u/ny77fczO3VVXYNMzMz7EZzMrFq7eZmfPmZl 9zM7dVVdg0zMzPsRnMysWrt5mZVciIiLvuZHd99855zPY1Fd7vTWp/t3XDO3VVVVkO6ZmZn2 IzmZWLV28zM+fMzL7mZ26qq7BpmXeRGczKxau3mZnz5mZfczO3VVXYNMy7yIzmZWLV28zM+f MzL7mZ26qq7BpmXeRkZk4pPavuZ8+ZmX3Mzt1VV2DTMu8jIzJxSe1fczX37mZfcznbqqrsGm Zd7vd3y047V9zPnzMy+5mduqquwaZl3u93fLTjtX3M+fMzL7mZ26qq7BpmXe73d8tOO1fcz5 8zMvuZnbqqrsGmZd7vd3y047V9zPnzMy+5mdu7u77xvTMu93u75acdq+5nz5mZfczO3d3d94 3pmXe73d8tOO1fcz58zM7d32qqqrvM3rMy73e7vl9nHavuZ339+Gru+3dVVd5m9ZdVXtVuu8 vOrZnz5mZ27vtVVVXeZvWZlarVVFd5btWzPnzMxd32qqqrvM3rMytVqqiu8t2rZnzMxd32qm qrtTkbz3K1WqqK7y3atmVXIiIi7Zkd333znnM9jUV3u9Nan+uoy+zzicqsqUbz3K1WqqK7y3 atmfMzF3faqaqu1ORvy59n2Zyu8t2rZnzMxd32qmqrtTkb8ufZ9mcqKxNZd/Lu8u7VU1VKnI 35c+z7M5UViay7/vl3eXdqqaqlTkb8ufZmcrdY5OVny7vLu1VNVSpyN+XPs+zOVFYmsu/l3e XdqqaqlTkb8ufZ9mcqKxNZd/Lu8u7VU1VKnI35c+z7M5UViay7+Xd5d2qpqqVORvy59n2Zyo rE1l38usqqTPJkqcjflz7PszlRWJrLv5dZVUmeTJU5G/Ln2fZnKisTWXfy6yqpM8mSpyN+XP s+zOVFYmsu/l1lVSZ5MlTkb8ufZ9mcqKxNZd/LrKqkzzhPM3nlz7PszlRWJrLvz7dZVUqucJ 5e88udT7M5UbxmVXypyZknnCeZvPLn7rU6mcqYxOVSZ5ERFdZm7298555y+b5He936zV/17q u8iHOLnjby5+61OpnKmMTlV8qbmZJ5wnmbzy55+3ud+zlTGJyv6eXznDnOZk8vby55+3ud+z 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 tQjToMNnCL1fCgvdIWSQqQFlxfCpfuoQ+1E6fgj80gCTfMknN5HZA7HsTMDsQK77Wb17G0fR DUGRdxDN45fObmzkLnp2MyXz1Y5m8COONjyu+ujonRakKnbFEOo9B7JlhRk8QuVu2LF2Msvv GOrx2NfGj5bi2h6hdZ4VO+1fpneyub5NaoPR92jUD0TmjuzOTsE3OTkMQJH0M63nnNJuFRDm bsKg6x3eq7nnuDyFROx1dE9SZhkNb8bvGq2ya9716L+YAH2xsoqI2Xdmo62A3xqLjTM66DxT Dpq6y7smoBj1x9pzxjplxPhzyYB3Y7dDu7l1b0pcV6LcM6yRitd3UcrdlltZW7J5cFsS5G93 aBpOpyKsO5lSwmrG7eMdmXcUWFOTPsd3lVm2Lu2NVZajzMpu7IVNuPu470W48vg8RmhdKu7X M6cgeHb3lqq1Yxu+6IdnQNdN3t7tuU+rkdb5WxmkPAOUtaxy6LxyOtBlSVC2hEBSmggat4LI EKY5DpINuFcuY2ucwmlDahJ7HjhKzGbfF5y27aw405zq2+zYVu1Jj7O9NFNXbkAOLtzcq9RO C9VVn1zEypGXFgv7RhvOpxkW8r19UinTp1R3ZjtV6K2jfA6HeHMrGtE4Z1LhSbjXbMo90Lld 15Fyo7ZA6+uY3lJ9w5PJvThFqEFzcZZN09E9axoQ80WWIoNXbZ10yC8OKtuWk9y5hnURSpnL uTQeStd19danWFaJkGpXkOMqVfNX/YDIgofuqIqoPihVgmgATKivNiAZBUyghxUHoIHwPvvh /u/yD/pfj/f2E/xJJJJJJJJJJJJJJJJJJJJJBJJJLW2222222222222222222222222mW3sk kkkjbbbbbbbbbbbbbbbbbbbbbbbbckkbbbbbbbbbbbbbbbbbbbbbbbbbSSSUbaSSSSSSSSSS SSSSSSSSSSSSbbSSSSSSSSSSSSSSSSSSSSSSTbaSSSSSSSSSSSSSSSSSSSSSSbbSSSSSSSSS SSSSSSSSSSSSSTkkSbbbbbbbLbSbbbbbLbSbbbbbu7u7u5d3jEkkkkn2RX8qifEAVTJX1VU9 3dz/P5AGkk2kl/GkkDbc4A7m2230AO7m2+rpLuSSSAASQA3QOA2AG7wB3c233XcgAXZJJJJ0 uTd3dkkklSQCSSSASSSSSQCQCTd1NhQOSQA7ucSUgA4kkpJUku5IAboXYJJXa3QDdL9fgN2A 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 h7VpHsZx8qHj4ryhDPnz8X5XPMUdrY+ixT2JoWWWfdLNak/j9lS6VpXpT3vZdq1Tp8aTS1+G g3L1MvLx3Cqe1njmJVuTsdODVmywUT1X203LehUVnGG1xWSjjMS59OCosciQK666nlZWl0Vk ZwcIVfLGrnWO7bMXPAKPsJEi2VlAoclEdm7DitMW7Du+zaWWjuLCIdV19Ea2c95B6Kmr2tVS YF1ob5r1eyn4mT2GVTy01ZUMy4Zm9qrrPRtw4tyYHdaKgFoNNbbUJo6mnzxm+EGqksv14Lsi zt3UUNXlkUy9dasVxBvlvQ5xrnmPvOrvp3FM9oL6mVmnHwioEXF3NbworGCFoKb6geLvEdWm AFhxA5KR20xbx8Tc0o1TXnqE2+5ybTd7k9saoXZMAXCj6TGSbvs6w5ivtHOZtccllQ1seK+2 bw3f8eo7vMe2iV67lum689uqwR0PDSZeUxOaeXDEJaFPu7E3t93RVXqqv0r3vUPIoQVIikFT JQgFIpRSgNCpEQiKZBU4Cp1QOKDxADoIHhBegqfn9CfofT9pJJJAZD6kkkAAADu4AD8e7u7u 7u7kkkkkl/G25JI22222222222222222222222222220o20kkkkkkkkkkkkkkkkkkkkkk22k kkkkkiSQAAe7gAADXM18AAAH769Xr96q9Vfs/Wr/Tlie/sRJP6oklIkkxJJjbfcAdzbbb5JL u7t3d67kl3JJJAAJEkmw1JSAD7gDu5tvq6QAoJJJJJUkAAkkkl3JLuSSSpJJJJJUku5AAYFA 5JAO7hwDgAfAAdJdyS7kSSErtJgF2NJJs97wDiSTYA5JKklSTMzJJEkpJJ3dwAEkAGku4Ikr tNgAbEkmw1JJvakkkgAEkAGknX331XN388ewrK/HsFnw9SXtNXrcLBkzqFFSpBdQ5kqz8cph RQ3k2qdS1BKt4XpqQMFVd2KHBTdo0u5QGljvNeBXU3ZRhN7ThRKQVhahCOiwVLKhl9rmQtX1 7BHv/zXsuhb1fi78d5dis8bSDB0wiyYvSux5aYj+zKYXryE5z3b7EbIqkvH2nr311alNsyUf PKbo79kOGibZKLx5ehqha1+11GMuusd1QfiKfHHNFzxiVr3M95ordfM53nlXgzr5cYRKs4ZD p3WlnZjStYxe864p6Ct7FcKXoXW+7HMya5GQI6eGzRFn59YrqAq/MYWePGEdq3nQ31Y+TuWx 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 9n/ZuZk/uqqq/2AB6Ae94G29SS3dbbbcADu7d3d67kqSSSJJKSAAwO4CAA+SS3dbb2uiSV2p JJJJKkgAEkkkqSpJJJUkkkkkAkgEhJKRJAKkb2EtvlAiSpNwACSpJUkbbbSpJAFAwBqkk3AA YAPu7u6u7szMkkACSTu7uAAkSSbDUlIFAwAO6ADSXcAPuu5JJIABIkk2Bv1V/Cqr6q+++qvr /v+tbb/tf2ksHvEkkk6kkkkkkkkkkkkkkkk0y0kkkkkljbbbbbbbbbbbbbbbbbbbbcUijbbb bbbbbbbbbbbbbbbbbbbbbbbbbbcUijbbbbbbbZbaSSSSSSSSSSjbbbbbcMkbbbbbbbbbbbba SSSSSSSSSSSSSiTSSSSSSSSSSSSSSSSSSSSSSSTSaSSSSSSSSSSSSSSSSSSSSSSSaTSSSSSS SSSSSSSSSSSSSS7j3veAAAAA94APfojA/QAP2AB6Ae94G29SS3d3d3d3f2AO7m2+rvzKkkkg AEkAGku4Ikk3oAd3bu7vXciSV2pJJJJLuSAASSSVJAJJJIBJJJJJAJJd3ISSkSXZuyRJLu7t gDgFG6kkpJUkqSNtvMu8xgFAwBq7STcAGkk3JJJKkmZmSSAEkm7uwACRJJsNSUgUDAA7oANJ dwA+67kkkgAEiST1nOdi+QRRBgn3RX/cQP+IKSEYKbbMzMzNmaZrM2ZszQgQiUAiiDZAAf/E QUEf5/n6/XuPe++/R27v1fmLbG235ucH593d3AAkkk6kkkk5JEkkkkkkkkkkkkkkkkkkkkkl JJEkkkkkkkkkkkkkkkkkkkkklJJEkkkkkkkkkkkkkkkkkkkkklJJEkkkSSSSSYkkkkkkkkkk oW0kkkkkkkkkkkkkkkkkkkkkkmW0kkkkkkm222222222222222222222iQR9/n/ZVLuqqqq6 qqq/8Ek3dk93ct3dSSSSSX7iSW33dzp/vlSSSQACSADSXcESSb0AO7t3d3ruRJK7Ukkkkl3J AAJJJKkl3JJJLuSSSSSASS7uQklIkgFKSbu622oSOAUbqSSklSSpI228y7zGAUDAGt94Ddgk 8aTc7u7q7uSSXSQAkk3d2AASAAwO4CAUDAA7oAboHAA+rpJJEklJAAYBv31V+6qqq+/6+pX/ VBFEH+KCKIOBf6oIogwfpEABH8orlFcorEV/7RUP1QRRBsAH+SIKCOUQAEbRX95IP9zCXf5/ z/htttttttttttttttttttttttpJJEkkpJpEkkk/fD/P/QlUdUqSSSSSSSSSSSSRJJJJJJqp VUSSSSQAAB+H4fh+H4fgAAAAkkpJVVOqSptttttttttttttttttttttttttttttVTqU22222 22222222222222222222222221VOpTbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbVU6lNttttttt tttttJJJJJJJJJJJJJKqbbbbbbbbbbbGfffffffvqtxvd/eANJJvQD3vA23/DgDu7d3d3d// gHdzbfV0lSSSQACSADSXcESSb0AO7t3d3ruQALskkkkku5ISSTJJJUkAkkkgEkkkkkAkAkhI boUG7JEku7u2AOAUbqSSklSSpIAZl3mDAoGAartJNwAaSTc7u7rvu5JJd0gBJJu7sAAkABgd wEAoGAB3QA3QOAB9XSSSJJKTuc5znWc5zsA+IgAIwU+IIog/3orQdVV/yQRRBtEABH+SCKIP 8AAaARRB+woACO0QAEf7Ir/gisARRB/5RXSK4QQVB/+IoooP8AAYAD/eoCqD/FEBRGIqH9AA f8kV0AiiD+UV/7QRRB2isAB+Ir/JFcCK2iAAj+UQAEfsiAAjhFf8EV2iAAjkBFEH/xFQ/mAg qDxFcIrBQAEbUBVB/ZFQ0AiiD8UQAEf4AA6VDgAxABEGACERXYCgeARRBiKCIMABtBFEH9UV iK2ADtFaRX/ZFf/qCKIPgEFQeIrpEABH+aKh4UEUHyK/6KiKqDkUABHqICiP/8xQVkmU1kPi puDAN2724B1kEAD//UACr/t39BgyP8AAAAAAAAAABKAAAAAAAAAAAAAAAAAAAAAEAAHwB9n3 gAAAAAAAAAAAAAAAAAAAJ9ej213ddm2lrVETQyEoSUrZikIigTPlJd4DvOpKSlKkgqqFUqqS JAltkpIQzwUd4D2SlIemVNjbKjYBm0ogolCojHg96vYCxQpIkK9G2GqAoAUiopAx5O7wExSi kgpIRUoCjsy0ZAihh7zs57wF4kqilSK6DbDTTLAKMygoiFMDcBwa6xGgoi0W2VAKEqlRRLPA DvAeGqSkCj1WUKqm1bZjU2okVqimpVRM8KG8AvHrQyNmC2LWbbLDbVQjTSVBIpAseq3gHsqg hJ21UQhNgmVWo2xqjSUpIzYKISSVElFSKFRRQkhSShCFJAJJUKlJVKWAAOAXnQD3gPHCXcBe 6nk7wHBzAMYCwHYAAIU9qe9kYn+qlVSmgA0AaAAZVP/0qf+1G1VVRGR6jUBgAATTDU9BiUlE lBMgAAAANU/TEEpSiRp6gAAAAGU/96UqlHqMNUYRoNAAAAhSICUmQ0JqmnoTT2pPQDKfEFVA H8Pr9vvX6cazPy3r6iBsQACVUQRpmmDjPvOkJtawzVqtJZVZTTk1hmNWVVWVZVVVVljRZlVV VlVZVlVVVVVVqzSqBShSBkoKAZZmGSmStNOSqOTStAFC0gtAFA0DQmSiIJqFqgTUJqQEQyBM 1gDVAkQpqyCqFaoUqlUDUIoJqcg1VSIAGSqoahVRoQpQyFBUF/4EARBgAARH8VVD9lVCEARB 8AB9EDYAP9RA/gQP+RED+iAAoP8IGCgigOCriBiCYqoSgJ/ugCqDKh/AgSq/6AAqg/9oAqg4 Kv3UT7ooH3VX6ggfmgGwASD9B/EVHD/IB4AQNggbBA/VETag8Agf5oKdAAn3A0BAQEDBDMCp io+oAHq8qi8IHKgPAKnCPAIHqqvQdp2CB2oB2Cp2Cp2gp2CB2CB6oh6Cp4Cp4gJ2qr2A9gqd gqdoIdggdggdqqGC4KmAgdiqeCJ4IhsFTYAJsAE0Kr2CB2CB2Ij2K9AgdCo9CPYqh2KnYiB2 Cp2InICBsRXYDsFTYKnYqHYocgqYIh4CugQPBQP5AfvIHco0rkrStK0rStK0jkLkrQtC0rSt K0rStItK0rStKUrStK0qUrStK0rStK5K5KlK0rStKlK0rStK0rSuSuSpStK0rStK0rStK0rk rkrSOSuStK0iUrStK0rStK0rSuSuStK0rSlC5A5C0OShkrStK0rStKNC0LQtK0rQtC0BkLkA UrStK0rStK0rkrkrStLStK0rStK0rStK5KZK0rStK0rStK0rSlK0rStKUrStK0rSlK0rStKU rkrkrStLStK0rSjStK0rSlK5K5K0rStK0rStK0rSuSpSuStK0pStK5K5K0pStK0rkpkrStK0 rQ0jQuQuSjStK0KUrStK0rStK0rkrk0rStK0rStK5K5K0pStK0rkoZK0rStKNK0rStK0rQtI 5K5I0i0JSNK0jSNmKGStK0rS0rStK0I0rStK0rSuSuStKNK0rkrkpStK0rSjStK0rSlK0rSt KNK0rStKZK5K0rSjSuSuStKUrStC5KmStK0rShStK0rStK0rSuSpSuStK0pStK5K5KNK0rSu SmStK0rSjStC0rSlK0rStKNK0rStK0rStK0rSjStK0rQpkrkrSpStK0rSpStK0rStK5K5K0q UrStK0pkrkrSpStK0rQtC0LStK5K5K0rSpStK0rQmSuStK0o0rkrkrStK0rStK0rStK5K5K0 rStK0rStK0rQBStC4qoff+SACIO0VfwQBVB4EAR/Pz+u/P7ucz6f88/w+R/Ic9Xzf39v/CL5 zP3Pudr/PvM/nz5n3+787+Z7ke5H2dV75Fb5Pb3nz957XNfs1Xb+d1+3+XH5ydb39vfPe/wv w5/D7fPt1rO93vzXf09uRA/IQJVUX8/P61Nxzu/br+39v7e9/bmV7vre5vnve9733IrVV73u Tfft3HpnuXyPIiOzl3e+73+T2btOZGX9qoTPbrkOxEJzd3fO85vvN+7zvqru51mmTK677PtV rXOcm65+eyt+7z3q7Mfcz2TNcz3s1VRHObm657K37vPequd5uMj0zNcz3s1VRHOOby692+c7 z3qrnebjI9MzXM97NVURzjnOZd+7lVznvVXO83GR6ZmuZ72aqojnHOcy793KrnPequd5uMj0 zNcxf3nNe5xznMu/dyq5z3ru67XJmPTM1zF/ec17nzjnOZd8927uq97MyubiNejs1zF/ec17 nzjnOZd/vu1Vc5711dc3Ea9CaxX83vXt/Nuc5fb92qrnPeu7rm4jXoTXMX95zce+fOOc5l3+ +7VVv3q5XN3Ea9CaxX83uY98+bc5y+37tVW/eqq5u4iI9LdRi/vObj3z5xznMu/dqq371VXN 3ERHpbqMX95zce+fOOc5l37tVW/eqq5u4iI9LdRGL19nXvnzbe95VeyuT73Oc3lxER6Va1it fY1758xve8qvZXJ97nObzd73ve/cXrWL19jXvnw3veVX57OTPvb8nM+3cJm7rke7EQnN3d87 zm+89Oe5zm723ve9uL1rF6+xr3z4b3vKr+r9+1yfe5zIuIiL9a4jF61yY98+HOc5Vey7rfvV Vc7vN73vfuVrWrVEa7Hvnw5znKr8v13W/eqqru83ve9+5WtWrWt9j3z4c5zlV7Lut+9VVzu8 3ve9+5WtatURrse+fDnOcqvz2Xdb96q32cmZnPc+/ftua+9175873e3Kr2Xdb96qrhzvOc5z 1ffv3Pc19a78+d7vblV7Lut+9VVw53nOc56vv37nua+td+fO93sq793MvnPVVcOd5znOer79 +57mvrXfnzvd7Ku/z3cy+c9VbN93ve++retaz76o0jvz53e9lXfu5l856q2b7ve999W9a1n3 1RpHfnyZl3lV7Lu+cVW++33e9776t61rPvqjSO/Pkw7uueyqrnFVvPb7ve999W9a1n31RpHf nyYd3XPZVVziq3nt93ve++reta/nua+nfnyYd3XPZVVxzk56e93vffVvWtfz3NfTv7MO7rn7 7LquObnPT3u9776t6+/Pc+/Tv7MO7zn89nt717e/N+zWsyW95l8jyNZGTd3vvOfu+757fubl kvb3vvq3r789z79O/sw7vOey6rjnJz097ve++retaffVGp95+7nzmVWft1WUqud9s3vb3t61 q/vajU+8/dz5zKy7qspVc533Dm3uTetX97Uan3n7ufOZWXdVlKrnO+4c29yb1q/vajU+8/dz 5zKrLqspVb533Dm3uTetX97UT7z9mPN5mXdXeWu6rfuHNvcm9av72on3n7MebzMu6u8td1W9 933m+ubvWr+5cSP2YN5mXdXeWu6re+77zfXN3rV/cuJH7MG8zLurvLXdVvfd95vrm9XEXrLj Y/Zg3mZd1d5fbuq3vu+831P29avWVGD9mDeZl3V3l9u6re+77zfU/b1q9ZUYP2YN5mXdXeXV c5M5Od31P29avWVGD9mDeZl3V3l1XOTOTnd9TOriLjNYP2LN5mXdXeXVc5M5Od31M6uIuM1g /YszMquVWVlc5M5Od31M6uIuM1g/Yvt3fPR6W9+7v3tazJb3mXyPIiMnN7u7rtVzu6r1VVc5 Mpe330zq4i4zWD9i+3e7/eb5y2VyIyM7PUzqoivTke9737GMz8znN85fs3uIyMd76Z1cX6O6 773v39i1s5znOX7N7iMjHe+mdXEX6ex33vfv7GMz8znOc5fs3uIyMd76Z1cX6O6773v39i1s 5znOX7N7iMjHe+mdXEW9tLXvfv7GMzWc5z7y/ZvcRkY730zq4i3tpa9+ejGZ+5znOcv2b3EZ GM9EfaW9KGve/f2LMznOc5fs3uIyMd9Efa0t7aWve/f2MZn7rOc595fs3uIyMZ6I+0t6UaR7 89Nmc5znL9kzrMjHfRH2lvSjSPfnpsznOc5fsmdZkZnta9S3pRpHvz02ZznOcv2TOsyMz2te pb0o0j356bM5znOX7JnWZGZ7WvUt6UaR789Nmc5zd+yI1dxd+7Eetj0+jXor89Nmc5zd+yI1 dxd+7Eetj0+jXor89NmfnOZHpb92fezWZPt7zL15rWsyZqq53nO93ze9xGvIWRHrY9Po16K/ PTZn85zm79kRq9xd+7Eetj0+yY9N/ntyve9zXriNUi792I9bHp9kx6b/PbzbOc5u/ZEau4u/ diPWx6fZMem/z282znObv2RGruLv3Yj1sen2THpv89vNs5zm79kRq7i792I9bHpuNIr8Te+3 znN+9kRq7i792I9bHpuNIr8XPb3vc+9cRrLi792I9bHpuNIr8XPb3vc+9cRrLi792I9bHpuN Ir8XPb3vc+9cRrLi792I9bGe3kwm/zdz253+7n3riNZcXfuxHrYz28mIqajK/Jbn3riNZcXf uxHrvt+m4js1upz297n3riNZcXfuxHrYz28mE3u57f5ve5964jWXF37sR67vue3kzNTUZ6Zu feuI1lxd+7EetmO+53czc3Hbmbn3riNZcX7utert33Pczczc3HrmaqW+853fn33ez7e8y9ea 1rMmaqud5zvd83vcRryBrXq7d9z3M3M3Nx65m5964jWXF+7rXqqsv27m97vdz70zk+9kRrtx feoj13fc3u5ve73c+9M5PvZEa7cd61r1VWXvfpve73c+9/JnJ97IjXdx3rWvVVZe9+m97vce 9EXHvXEaz0d61r1VWXvfpve73c+9Mx7161rKjHUR67vd736b3u93PvTMe9etayox1Eeu73e9 +m97vdz70zHvXrWsqMdRHru93vfpve73c+9Mx7161rKjHURHru+Xzm/bznM5k+9Mx671rWVG OoiPXd8vnN+3nOZzJ96Zj13rWsqMdREeu75fOb9vOczme9Ea9da1rORbERHru+Xzm/bznM5n vRGvXWtazkWxER67vl8n05vebv3ojXrrWte5FsREeu75fJ9Ob3m796I1661rXuRbERHru+Xy fTm95u/eiLRmOcb+vrMlv2ZmvNa1mTNVXO853vJmda15Hc72Ij13fL5Ppze83fvRGvXWta9y LYiI9d3zl1v285ze796I1661rXuRbERHru+cut+3nOb3fvRGvXWta9yLYiI9d3zl1v285ze7 96I1661rXuRbERHru+cut+3nOb3fvRGvXWta9yLYiI9db3XJ9N5M372s1661rXuRbERHrre6 5PpvJm/e1mvXWta9yLYiI9db3XJ9N5M373zWa9da1r0xbERHrre65PpvJn3vt/fVzWte9FsR Eeut7rk+lnd7z0azXrrWte5FshMz665znJ9LO73noyP3XrrX33LZpEc9Wc5zk+lnd7z0azXr rWte5bNIivXXOc5PpZ3e89Gs1661rXuWzSIqub3vcJ7eb3aM+rrmtOX9ZCZqt73vcJ7eb3aM +rrmtOX9ZCZqt73vcJ7eb3aI3OX3eR6qb+vuZkt+zM15r7mRFVW+85m4iO617vfudjszVb3v e4T283u0Rml1WtK39ZCZqt73vcy3285zaIzS6rWlb+shM1W973uZb7ec5uEzkLmtaVv6yEzV b3ve5lvt5zm4TOQua1pW/rITNVve97mW+3nObhM5C5rWlb+shM1W973EJ7eb3uEzcLmaiO1z 73ITN3ve9xCV5ve47M3C5mojtc+9yEzd73vcQleb3uOzOr/VzNRHa597iIu5meRCV5ve47M/ y4X9mojtc+9yEzczM60xeb3uOzOr/VzNRHa597iIu5meRCV5ve47M3C5mojtVWu5Le8ze97i E3eb3uOzN/kLma12qqu5Le8ze97iE3eb3uOzNwuZqI7VVruS3vM3ve4hN3MzrsRUKmUR2qrX clveZve9xCbuZnXYioVMojteu4d37nO93ve4j03czOkQvvd5iqb+59zMlv2ZmvNazIiqrfb5 m4iI7EeepHW3Od7ve9xHpu5mdIiKn1b36I7fsyE+3vMmW4j0szdc5MzMR6pn0R2vXcJ9veZM txHpZm65yZmYj1TPojvqrSPT3MmW4j0szdc5MzMR6pn0R31VpHp7mTLcR6WZuucmZmI9Uz6I 76q0j09zJluIjt3PN7mZmIcmURiqiOy33MmW4iO5k83uZmYhyZ7EYqojst9zJluIjuZPN7mZ mIcmexGKqI7LfcyZbiI7mTze5mZj8hyZ7rFVquy33MmW0zLvd1zczMxHOTPdYqtV2W+5ky2m Zd7uuXze977vd3vf2lVVdlvuZMtpmXe7rl83ve5mqme6pVarst9zJltMy73dcvm973M1Uz3V KrVdlvuZMkRDvZ5l83ve/5M1X2e6pVarst9yINaO9nmXze97j797WuRf2f5St851Pb1p3XWZ G173vfuuV/OcT6q9v7n13s+u7eau9a4qe1zva37vHqru51mvd7vbMx5rWZEVVb7fKnvbry9+ u5j7n32Z3bMx5rM1qqqe1zva37vHqru51mvd7vbLe79u9a5zk5XMyt+7z3qru51mvZMrrvs+ 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 W8tmS7lVXc7h6+XPVuiZVXdImOK8F1AVXSdmjntSw520FlLa7kIc0NVdTbhm4z1VwzJxXWKS Nm3wtOqSSs7sS2ySe0GySurewrXyQ5XivKWjhTRyNjCGN3eTxO7u7vr2K3zYi8twIMHhI01m UjO7Z1Vwu1vMcMkEtg7ovG7fK1LYcHMK9vstXKsRQzqXSgbsjKFQUtb0IbtpJi0uDKV3y7De hW8ywXTWh9xcj6CxEtyTbmXtQXQvO6ddUmxea26gPXAn3cWGL3bebCHNczHlkW26trXj0djZ YdZudyDDCp+b19oNOtqJzuPhiGh92RYJaCC3KwR0rsPK57iLxTKyKzh6lredJnC6q1dMpUkR iyFVyprFHFawIb1UeGUKm663W7gNbaEanXjxc7aauE1BqNanQynJkpq92RXe2pkW5m9NnTpM f+szMq6bsTBJe9vtSd3LudykqswStzZIGksTM1hyqvIo5aNPVz2JzOkkutu7vj3c+dZlWmpe Vt1RLL18cyhYj1rjy7BYJ6VMx86W9WERrpxxLu20cNKg0GqJO5Jt8dCbNnNu+tJVw5dVczmG Q5z5PLJFXkruu867tkunTWRLap7rd87vKsYuu0latdy6U4tBRYgzciOTarYpLGWeIoiOryZV xhbxruk4RG8hR7SSUOkVq5zNI5HXC3kTyB5EOvcylUMZfLbeWW867O86ESaG0rRsxyq6ClcV rlvFBdqOXTewEw9IGNTErqVS+o+XNZJnRnadg3u032BXeZwbC4ahKzpqb51IOggsqXG5lULv b7t5ZnCUTa1kki83dV11fHuonaeCJ9wcZkcqAwRNLQ+51j72itqmE9/J59uT64q3VmZ99XJW t18zfdG5M7Hbrdmp0l1a93likh7jc11x1B5CS5h17UsMZY4rptU5glVKkZltmRXL57VHYnPR JdmLJaoidZpyZmXdPnamd2wWvtiJ3Gq6CrUbVK+zcW0o9uhNsYFWbjNsitczgsqZDAmoslcM Q4cOQsWHlycrSauc3l1lYuNchvWS5BV13FaabGSFjg0kqze6rupcvpnXzFurvLwFTQ7MLbjg d2Fq2g3m3L13fRa+vledMBtTM2lmWhJYec47HEGqD68Ma7as3wnbojzgxevuoinUFZ3iOsru cqjSYdSxVaKMrRd4qazaFTMCgTMv27oxZ0J2XuXJu8uqVC10pOUE9eZU3aKzZq7nyJklHTM2 XOxNipR3TKq3ObztavK1xCq4NvVj2rmcFMydSVm0tim5VxbYldmRMcxeJ3JdPqUvc5xdNNup MfLMQYV0dzehzu7cpObKXTrm3Ay7lmtW2aepOdx0QbHs3TdSZHBei7bb267drdazEpkdSlxO 3pplS5rAI3y4Omhq4NZiRHKCLU7u9d5Bq3azlOrt26xIWt6CU3OSaC5Ry5OpT67Y4K+GcN++ QSBx4J9jMluottpduYseQQOt7nOu4HysbuQhUIydzWVzoslIvat1HL1YJaPWr3colV2vt7dk yak8PWeFrA23Lzoq4LgyjmwXVqpeqjXVcImX0VHY0FOWwtblp3gUKcvakPZ1cDj3mN11iezJ Tq8dlVhujL4hy3l3aUiq10vnxkoIPl03L2dx5W+7U73Iqjb687G51ZlRq8yF2y5tN5ADM1qr QWhLscPM11XXPNJyZna95527aR2zV9Mo3xNTWrj7U12CcFMeOZDcpZXX2U5A6szAbzNuFdbs mJGtbjxdN6YzKPoRvaLymyHrp2smddrhcEWm1XPH1y6QcI3lV8LL5dUd1QubVVM7YlzLqGB1 t3xNGXimK3JM25MPRy8bMNyXca1Wyn2nhtSbaF4nnOtFrPTVV88yn0CMvCTKzBdUzQZtZSqY jmvjOeiK+7q684E3cw1Fj9b6ut87D6jWOFXUfLV18Ssrq266mkknpNQO93XixddUNmV27MHC hVXFxNV1XzJc46crhhorraWVSqmtGhN85xI4XNwztuP7hob03fdwp5z3hdpa2q2+uTRi3tLD 56xjWipkaGXgjNdEwscFVkuP2xK6vKLvu09ddqLPKsxrJjXZfZxmPrzK2k1qG80w+DqsSd1Q rLpnRll4Cubm7rrKkrVT5KsqRdN1LSEC9DsdtxVzvlccukdu94uxPOsDFsrud3Ohx5LoddOn cfW7GTGJjrJcm0szuudVupcipXeUhTjK4S+lnF2W6tGlELWPXq2GVXIuUaorGR1H5be6mR42 8K82Mz1q+wnhYzuyS1spPuubJNpZfTpSqVlShVVI1l1YYXnvFrLQ7keTfOTBWvMqVlbIa4y9 QOLu5qzVVBsUrSaWTKvhnZqUgtMmHFxppK3iXSZK7btPU1hCFBkx3y2s5UxJdWd47N2Guu0d hgaatmd1CuM69O4JePdYJgO47JLo7jeLb5m7vehC6a1uXuCnOV8z28U2isNYi6EDAAfEAVQf 9hEED7CIIH7AAqg/BBE6ER5lCIEoREwFQZAIVWAMgSIQoRHAEROQVhQXNRGFU5A4QBCQRBK4 ALSRQ4ARIESsQixCEQMBiMSkiYIrKqmIiKYKoEStFIkhKUgJiAAGSJUGINFIlUqUS5EwaSil WilSinEUDCUUEoKSiiCFAAiRVcUAyfsgAiD/qiKIqfugAiDCBz9/wrPt1fV/WqqqqqqqqqqK qqqqqqqqqqKqqqqqrnMzMyqqszKqqqqqqHIAoAsxHMKQKqqqtmwED7fT9D87PN0/X9vd3d3d f2d3coGYKq5i/Kqvyqqqvvefe8qqqgEVbebbbXu7u7mr8qq2222gBoDQED4NANkk3bVcxZJN 0OkmQn5Jy3u7nd3d3UALb3IAW23Mt971+toAFUA7gKByAgcgIHIMktd3d75UANAtAScycgBt qqySZkflVX5UAzAVVVzFd3dtALaqqqq5iqodHQDBCoAEQD/4IH/gIKennnp7fL6vo/C7u7fT vn8NttttttvgAAAADYHt+Hd3d3d3d3d3d3d3d3d3NtttttttttttttttttttttF02+7u7u7u 6qqqqqqqqqqqqqqqHd3cAAAAAAAO7u4AAAAAAAd3dwAAAAAAA7u7gAAAAAAB3d3AVVVVVVVV SpVVVVVVVXbu6qqqqqqqqqqqqqqqqqlVV22222JQHveH93v7/r/X5v+ttttvubb7t3Sd7u7u JX5VV+VVVV97z73lVVUAirde7u27u7t5q/KqqqqoBsktBkmZN0AvAHdVXMWSTdDpJmTdAOV7 u53d3d1AC29yAFtVzHMX5UABUA7gKByAgcgIHICBa7u7fqoAaBaAgcgIAbaqskmZH5VV+VA+ AVVVzFAO4A7nzzzzzzzzzzzzyuABHkgVIlRYgRYkEYgQIlVYhEIkUD/lABEH/QQOePt9q1ro tfbzWta1rMzMzMzMzMwBjGN71VVVVVTq7qqqqqqqqqqqqqqqqqqqtUul0VVVVVVVVVVVVVVV VVVVU6u6qgABsyzLMqqqq1ret1VVVVVVVVUb3vSBrWtIGta0uqqqqqqq1jaAAAAAAAJVVVVV VVVVV97wAH+qI/1/rt/1/r+Ntttz5tvu0MwVVzF+VVflVVVfe9mKqqqARVt5ttoAFqvyqqqq qAbJLQZJmTdALwB3VVzFkk3Q6SZk3QDle7ud3d3dQAtvcgBbVcxfe8/KgAKgHcBQOQEDkBA5 Bklru7vfKgBoFoCByAgBtqqySZkflVX5UD4BVVXMU3db3d1vu7u7u7u7uJ0D3veAAQPgPAf8 fe++++H3wH39l/Jvm05IF/Tqqq/qkkkkkkkklVVVVVVVVVVVe3d3d3d3d3FNt022k26bbSbb bbbbbbbbbbbbqqqqqqqq7qdVVVVVVQAAAADrpwYxizMzKqqqqqt63rdVVVVVVVVVVve9bgDe 96EqqqqrWtaqrbbbbbbbbAACqAAAAAAAAqqqqqru7u7vR8B4Afz/P8+3d/n+Ntttz8233buk 73KuYvyqr8qqqr73sxVVVQCKtvNttr3d3dzV+VVVVVQDZJaDJMyboBeAO6quYskm6HSTMm6A cr3dz3d3d3IBbdZJO7lX3vOYuYqAAskm6HSRQZIoMkUGScu7u98qAbJLQZIoMkm7yqskmZH5 VV+VA+AVVVzFAO4A7nzzzzzzzzzzzzyuEEQ/VABEHo+wgf7iK/8RDSjggCIOiRV/uKogj199 5mGfl+f561rWVVVVVVVVU6tawA1a1gBq1rADVkgUVVVVVVVVVVVVVVVVVVVVVfTMrMAAAAAA ADYAAAAAAB4bbbZmZmfn6/r+t/f+v67u7u7+v7Xu7lD4FV+V+VVflVVVzHMVVVUAirbzbba9 3d3c1flVVVVUA2SWgyTMm6AXgDuqvyoAaBaBmHSSVt7u693d3dyAW3WSTuW33vW+965lqAAs km6HSRQZIoMkUGScu7u98qAbJLQZIoMkm7yqsk+kflVX5UD4BVVXMUDukndyqqqq5n7v0FX/ sQP6oAIg/ugAiD/qgAiD9UAVQf5CBsQNiBCB/ZVQ/RABEHSKv8xVEEeEAVQdCBzn3+fx+7ud 32ee/eoennng9PPPB59+9QAAAAAAdzuAAAAFVVVVVVVVdu7qqqqqqqqqqqqqqqqqqqqrt3dV VVVVVVVVVVVVVVVVVVVdu7qqqqqqgAAAG2zq2222222222223pWLVVVVVVZVVR4igaP0n2v1 0/w/h/EAB/D9j3dyh8Cq/K/Kqvyqqq5jmKqqqSfir23u7u693d3c1cxVVVVVAO4CgcgZh0km 6Ab1V+VADQLQMzvz8/Nrb3d17u7u7kAtuskncvZfW+965lqAAskm6HSRQZIoMkUfz8/OXd3X 5UA2SWgyRQZJN3lVZJ9I/KqvyoHwCqvcO7t3W8zG33d3d3d3d3VX/P4AD3veA8x4fEAEQf8B A5RQP/qACIOIAqg/zQARB/ZFXBAEQfsqIoqcoAqg/iIH+IgQgCIP/QgciBsVUUH+aAKoPaoq gkIAiD+yKsir/giAKD+6iiiMqof0RV/oIHQgCIP5CB/ZABEHoQJFX6CB/MQNggaQBVB/JAFU H6oAqg4qKoJsQP8hA6QBVB0IAiD/dVQ/xVVFB7EDYgQAKoOkQBQf0VUORAEQfgCogIfkiryg naqyCgIMoqQgdACh6IAiDCoggyKukAEQfzECEDSKvQgYIH+wgf5oAIg+qqig9iBygCqD/8VU PVAUQfRA/hRUFQf7yocoAIg4qKoJKqHqiiiP/8xQVkmU1kU7k2dBCp424B1EEAD//AACr/t3 9BgjF8+BAAAAAAADFAAAAAAAAAAAAAAEADAFgAAAAAAAAAAAAcPuSq1QBqgAxNBRqpGeAd9T wAGnpRStsEhgFM8Xjre6ZNKrFQBopSiz3Cd4nKRUAKp6AySBAqzwvHrxl1pVAFtpqlCgo0gY 8C8HsnthloAaaaAlYCYIUFng8ePAVethRKBtgDKqTPXjnuWgNFAptmSgpCjPAc8PYkCgF7VF SEpQtgpphJZePHq4AFAAAFFAlCovYwFUKKqqAqRFSJQCpIQUoKYD1JHjrnY657Du8HHXcQAr DsONyuAAASp72ZphP9VSqko0MAjQyaGETDBUpST0I9QAAAAqp/pVU//eUf6qqqPTNSAAAAAN TwgUlKJPKAABoABqf6VKnqaSRmU8oAAAACJIAkhMhImmam1MmmmE6gCir9T3r2lQ+9z69CIJ SoAkBBEQqqYBAiBIh8y0SxarRJUqUQAO7veacxxxycOdE5JzHIBOHOcxuc7qtyuc67pug0GX dd7gAAAdEgUCSSSSW6uwhBQAAAMJAACtJS1IJJIckkkAAd5yiK2iwiqApJIqQiJIISAABCBI qAEiCASAySAjIgCjaIWgWkg2iMtQtRSRSRLVRaWIAEIgEkiqIlQVFVD/1QUACAqKqGFALqL7 qqD+VVBggoAHQEOgpkIJBAgECBCCQiQRiiv9QUH9gUH+4AifzRUEA/ZEGhUQACkEaVBoBpVQ Ygp/YQRUCCn7AoMVB/UQRUD/AgioFAo/L4H6on2AbAe4AJCwKfgFA+gAMAK4BU/kCvyCr+QH gCbAdijsRCxAF2A7BU2A7BA4CBsEDaC6VQ0CBoEDSImlReIAfq7QF6IQB4CpwFSyCnVUYA9R WKoZFEsAOAEC4IvQToAPQE6AgaBB0CEBAoRGAAlJpVHiDwTQC6AANAoaBR0C4E/c/vgjIjIL IrIrILIj5FaisitRWoDIrIrIrIrIrIrIrIoSKyKyKyKyKyKyK1FajIrIrIrIrIrIrUVqKyLI rIrIrIrIrIrIrIrIpIrIrIrIrIrIrUVqKyNRWorIqSKyKyKyKyKyKyKyK1FaisisipIrIrIr IrIrIrIrUUaisisisitRWorIrIqSKyKyKyKyKyKyK1BQqIyCyKyAEisisisisisitRUkVqKy KyLIrIrIrIrIDIrIrIrUWorUVqKyKMisitRWotRWorIrIrIDIrIrIrIrIrIrUVqKyKyKyKyK yKyKyKyCkiMisisisisisisipIrIrIrUUqKyKyKyKyKSKyKyKyKSKyKyKyKyKSKyKyKyKSK1 FaisisisisisisiyKyKyKyK1CRKisisisisisisgrIrIrIrIrIrIrUVqASAyCyIyAslQGorI jIrIjIrIrIrIrIrUVqKyKyLIrIrIrIrIrIrIrIrUUqKyKyKyKMisisisisisitRWopUWorUV qKyKMisitRWopIrIrIrILSqg/uUFAAsoI4EEVAuoKAB8/0t7evxa3/eP01Wfn7b183+u2158 /Va+ceunfPMyx5/T4vvvvudj3P75rzVclN/zvnb/Teb7zrUZTn7W+ufVkc59HnKmY+j2brrP r/sf43m8vnav95579vPv5y6xPOfq+7LP67/P79VfTd8+/l+V/eV9rI/tu8veZuE71+rzzfrz 39vjO97PWMewKD8goMFABA77+3cz2M+/z/lmZ/f7EMu/f898y7ew3Pua1qkq/z999555/f75 U7zPb5zj6f1Zmb199nv3Od/nf368871ma0eejqZnPu9+73vfPPPKqqnnOc++/n333e971ERE R9zn33333333333332ta1rX3333333333988/effy69/m9/33+/t7+zk71pMdiruZm4uNaXZ PtfquqRUOpmbi41pdk+1+qru473WtVPnne61OfsyqqMzWtVPnmZrU5+zKqozNa1U+eZmtTn7 MqqjM1rVT55ma1OZlV9cd7vervzzvdanMmcreZveqrzzM1qcyZyt5m96qvPMzWpzJnK3mb3q q88zNez5mTrJjM17Wfsz3n7MycmMzXtZ+zPefszJyYzNe1n7M95+zMnJjM17Wfsz3n7MycmM zXtZ+zyMzMnJjM17Wfs8jMzJyYyM3qs/Z5zOZk5MZGb0vvnfP0tTk7+j6O/Jmbi4127Oe+85 c/ZCG9Zmed+9pRaoQ3pbw9pRaoQ3pbw9pRaoQ3pbw9pSuzv5CNreHtqUnZCNreHvlqU3shG1 jzVqU3shG1jyyVc2HIhj317ZLnNhyIY99e2S5zYciGPfXtkuc2HIhj317b8RGwRC3vr234iN giFvfXtvxEbBELe+vbfiI2CIW3rS73X18iPo79kzNxv33Krsfv0fRETi97+rGtfNm9mxENn2 9/fR99vf32/vvoj7f3329/fR99vf32/vvoj7f3329/f36Pvt6++3999H2vvvtX9f3Pvoj6N/ ffRH2/vvt7+v99z76NfRsiGhq1uLiEbIiJQIhk8XEI2RESgQzkL3aNkREoEM5C92jZERKBDO Qvdo2REVTg5GchFxcb73e91XedvvIzkdi4uN97ve6rvO33kZyOxcXG+93vdV3nb7yM5HYuLj fe73uq7zt9meZ+fo7HdxGR9fOcrf3v1U3+/XFuVtes2v7nb+meZPCeZGzV7u3FpnmTwnmRs1 e7txaZ5l1JU95t7erpCkzy553s8yN99rVV2O12Z5c872eZG++1qq7Ha7M8ued7PMjffa1Vdj tdmeXPO9nmRvvtaqux2uzPL8nnezrI332tVXY7XeRf7kd7zM5vvs6qux2uzF/3kd7yL5vvvd VXY7XZnl/v0872eZO++1qq72u83f9i+95F8333uqrva7zkfZ75OFb7zb29VRSNs/cwnvebe3 qqKc5DPfJwrfedhrN3F8U5Dnn79u9/biKj6uc5W/MmWu577n3fqzf3rVbq8r6Z4n9OFT3nYa zdxfFJnif04VPedhrN3F8UmeJ/ThU952Gs3cXxSZ4n9OFT2Od43kRF8UmeJ/ThU9jneN5ERf FJniffJwrfY53jeREXxTkOfuYT3sc7xvIiL4pM8T+nCp7HO8byIi+KTPE/pwqexzvG8iIvik zxP6cKnsc7xvIiL4pM8T+nCp7HO8byIi+KTPEx5OF12J7xvsRF8ykzxMeThddie8b7ERfMpM 8THk4XXYnvG+xEXzKTPEx5OF12J7xvsRF8zLVUq5+/fsj6IjIu+c5W/POzLd+eX9iYz7n2+x EXzMv6qlXM9vtstFOa7ve6jLpVSrj2+2y0U5ru97qMulVKueVlduuxPeN9iIvMtM8TzXs5S9 5EuN9iIvMtyHIr2cpe8iXG+xEXmW5DkecyVZkS432Ii8y0zxPL9rLZfYpzXd77F9y1VMzzPa y+5fYqGu732L7lqqZnj2u2y+xUNd3vsX3LVUzPPJyu3WRLjfYjvM73FVMzyvay2XES433fYz vcTMzPPJul0iXG+77Gd7iZmZ55N0ukS433fYzvcTMzPPJul0iXG+77Gd7iZmZ55N0ukS433f YzvcTMzPP379UfREXF3znKyPfVVvd+eX9iYz7n2+77Gd7n0zMzzybpdIlxvu+xne4mZmeeTd LpEuN932M73EzMzzybpdIlxvu+xne4mZmbneq9pe0S4iOx3md7xznOXz2fJVaJcRHY7zO94m Zmbn2vKXSJcRHY7zO94mZmbn2vKXSJcRHY7zMhznOcp7XlLpEuIjsd5mQ5znOU9ryl0iXER2 O8zIc5znKe15S6RLiI7HeZkOc5zlPa8pdIlxEdjvL2iIiJevKXSJcRHY7y9oiIiXryl0iXER 2O8vaIiIl68pdIlxEdjvL2iIiJXp7bLRUN773dab3MRLzz9XPuchGZznKuPfezrXc99tm+Rf 3PojPovX2q3uXryVWiXER3sXpvdREvXlLpEuIjvYvTe6iJevKXSJcRHexem91ES9eUukS4iO 9i9N7qIl68pdIlxEd7F6b3URL15S6RLiI72L03uoiXryl0iXER3sXpvdREvXlLpEuIjvYvTe 6iJevKXSJcRHexem91ES9eUukS4iO9i9N7qIl68pdIlxEd7F6b3URVI29tm0VXHOc73l6ave 7tp5WXiKrjnOd7y9N7uIu2nl5loquOc53vL03u4i7aeXmWiq45zne8i9oi+cuXvv7J+mY+jv ec5Vx779OtX55X1/ci/ufc5zPuRe/oi4vj15WXSKrjnOY5F7RFxfH7emqy9oqKc5zHOXtu9o ytPay9oqJc5zEXpq7RnrycrEVzkpmcRmmsxGe98nKxFc5KZnEZprMRnvfJysRXOSmZxGaazE Z73ycrEVzkpmcRmmsxGe98mbbmI4TOIzTWYjPe+TNtzEcJnEZprMRnvfJm25iOEziM01mIz3 vkzbcxHCZxGaazEZ73yZtuYjhM4jNNZiM975M23MRwmcRmmsxGe98mbbmI4TOIzTWYjO7/b8 9mbbrfDnG69du0c8zOfTMfZkRFXfvv061UfsmZyJzIiLrzzOa1OfsmZyMze91PnmZrU5+yZn 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 gKoof/i7kinChIOxmTNY --hcut4fGOf7Kh6EdG-- From eguan@redhat.com Thu Aug 20 09:36:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E35177CBE for ; Thu, 20 Aug 2015 09:36:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D1E9D8F8052 for ; Thu, 20 Aug 2015 07:36:32 -0700 (PDT) X-ASG-Debug-ID: 1440081390-04cbb032f63a2e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VpAFLtBc3GIxzW8y (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 20 Aug 2015 07:36:31 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id A5F49A37EB; Thu, 20 Aug 2015 14:36:30 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7KEaRHA027168; Thu, 20 Aug 2015 10:36:28 -0400 Date: Thu, 20 Aug 2015 22:36:26 +0800 From: Eryu Guan To: Dave Chinner Cc: Tejun Heo , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="D6IIOQQv2Iwyp54J" Content-Disposition: inline In-Reply-To: <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440081391 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --D6IIOQQv2Iwyp54J Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Aug 20, 2015 at 02:12:24PM +0800, Eryu Guan wrote: > On Wed, Aug 19, 2015 at 07:56:11AM +1000, Dave Chinner wrote: > > On Tue, Aug 18, 2015 at 12:54:39PM -0700, Tejun Heo wrote: > > > Hello, > > > > > > On Tue, Aug 18, 2015 at 10:47:18AM -0700, Tejun Heo wrote: > > > > Hmm... the only possibility I can think of is tot_write_bandwidth > > > > being zero when it shouldn't be. I've been staring at the code for a > > > > while now but nothing rings a bell. Time for another debug patch, I > > > > guess. > > > > > > So, I can now reproduce the bug (it takes a lot of trials but lowering > > > the number of tested files helps quite a bit) and instrumented all the > > > early exit paths w/o the fix patch. bdi_has_dirty_io() and > > > wb_has_dirty_io() are never out of sync with the actual dirty / io > > > lists even when the test 048 fails, so the bug at least is not caused > > > by writeback skipping due to buggy bdi/wb_has_dirty_io() result. > > > Whenever it skips, all the lists are actually empty (verified while > > > holding list_lock). > > > > > > One suspicion I have is that this could be a subtle timing issue which > > > is being exposed by the new short-cut path. Anything which adds delay > > > seems to make the issue go away. Dave, does anything ring a bell? > > > > No, it doesn't. The data writeback mechanisms XFS uses are all > > generic. It marks inodes I_DIRTY_PAGES and lets the generic code > > take care of everything else. Yes, we do delayed allocation during > > writeback, and we log the inode size updates during IO completion, > > so if inode sizes are not getting updated, then Occam's Razor > > suggests that writeback is not happening. > > > > I'd suggest looking at some of the XFS tracepoints during the test: > > > > tracepoint trigger > > xfs_file_buffered_write once per write syscall > > xfs_file_sync once per fsync per inode > > xfs_vm_writepage every ->writepage call > > xfs_setfilesize every IO completion that updates inode size > > I gave the tracepoints a try, but my root fs is xfs so I got many > noises. I'll try to install a new vm with ext4 as root fs. But I'm not > sure if the new vm could reproduce the failure, will see. I installed a new vm with ext4 as root fs and got some trace info. On the new vm, only generic/048 is reproducible, generic/049 always passes. And I can only reproduce generic/048 when xfs tracepoints are enabled, if writeback tracepoints are enabled too, I can no longer reproduce the failure. All tests are done on 4.2-rc7 kernel. This is the trace-cmd I'm using: cd /mnt/ext4 trace-cmd record -e xfs_file_buffered_write \ -e xfs_file_fsync \ -e xfs_writepage \ -e xfs_setfilesize & pushd /path/to/xfstests ./check generic/048 popd kill -s 2 $! trace-cmd report >trace_report.txt I attached three files: 1) xfs-trace-generic-048.txt.bz2[1] trace report result 2) xfs-trace-generic-048.diff generic/048 failure diff output, could know which files has incorrect size 3) xfs-trace-generic-048.metadump.bz2 metadump of SCRATCH_DEV, which contains the test files If more info is needed please let me know. Thanks, Eryu [1] attach this file in a following mail, to avoid xfs list 500k limit --D6IIOQQv2Iwyp54J Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="xfs-trace-generic-048.diff" --- tests/generic/048.out 2015-08-20 15:00:06.210000000 +0800 +++ /root/xfstests/results//generic/048.out.bad 2015-08-20 20:52:58.847000000 +0800 @@ -1 +1,9 @@ QA output created by 048 +file /mnt/testarea/scratch/982 has incorrect size - sync failed +file /mnt/testarea/scratch/983 has incorrect size - sync failed +file /mnt/testarea/scratch/984 has incorrect size - sync failed +file /mnt/testarea/scratch/985 has incorrect size - sync failed +file /mnt/testarea/scratch/987 has incorrect size - sync failed +file /mnt/testarea/scratch/989 has incorrect size - sync failed +file /mnt/testarea/scratch/991 has incorrect size - sync failed +file /mnt/testarea/scratch/993 has incorrect size - sync failed --D6IIOQQv2Iwyp54J Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-trace-generic-048.metadump.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWQ+4V/MFGfR/////////////////////////////////////////////4bH/ d2+Li6WaAAAAAAkkGTQAADPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA53Q AAD4pREI4cbhurhsPlTw2CUIVwAACxdMrn3H1zgAAAAAAAAAAAAGelVVezVabAFqVIsBtFQS JNaUKoAAEsBKAoqhIgEhAAgrQfR3QGAAAsF8AAA4AADgABxbyhQW70AAAAD4jgCVSKOzH0YA AV93ZdHG2xqPbbxvRbvHgjEPcg9sOhUBuHXYLjby4BSoRVxjV7hgw2qedc4eB8AEAMD5UHq9 8zhX1TfDAueDcAEIGHgYBxBx2AAOKgDh3XAAwQDnXnAeIc3Bye97wAAoAiBiA56sHCAPEPIH EABpxBwgAAMnTjsAkHgvYF2ebtvAEgxAB3YHEAAAAAAHoBxDhAYjDDzgMRuM944eDo5cTLNN 5xOG7ljbhO7MNnCy41xddmZuJyxsSyDImM9VyOJljbvcXPfTPGGDF64TjFkYZmGO4zkZZMY+ xjjFixjMshkTaylsKTGC2BTEFmCixgtgAAAAuUoXHKWYttJjUaKUsYKblgpcyjIBiUUGmIKA iTju5kpJZm3lh3miweNlCgKKCl17mQaDcdztlmDW5gZvA5yPTdLMdmd3c7NzudKXM3rOlO7E A+2dAHL3mSlL0gDZKF2GlstlKDQb72gODT00FBpI29497UjCBKioAEil6AAAABkk91TnW5KW d3dNbmGNGRUEzaIiF1o7GdgRBtazHZOOoTmcdlXZzgzEiLTKUKZMgiFsDQoCgAKFAyW8oAou XZtmomoAIrYAYoK0bMaooLM1otmkgpWi7vG9zFYNIgAEgHoDSYAAAAAAAAAAAAAAAAAABlJb xZmy7DSgE22QYwYGSRCmTuMT2ZKXsNCQpTQDcF3XAB4gAAABz3ixTWgkpJTQaFwBiyuDbCCl IAAAAZGIAB/6qg0DQAaaGQGhpoNGh6gafqgNMmn/iqg0aGgb/VSb9VAMT1BtDU9GibT0/ApT JpqeInpPTJvwTVEzRvVRhonpP0//fpVVU9/pVVBpJAgAwmQ0ZGmCaYbQQBkyaEaGETU9TRPP SanqYTRMTag2poNE2jI0DUyZMAAAEYmmmAYEyaBGmnkm0EU2MjQAYiglTEE0GSMQDSmTEIAC MACMjTUNMSY00U9Mpqb1PTJT9D1SDHqTGNU9CaPJNAMajExGJmk02o9TR6GU9TR6aj1ND0hp 5TYKeibSaGmmhoAafqSUSCnoAmmmAmU8EmNBE36lT2aKnmJMp+gk2mFPTaTyYU3qnpT0J6mn lDNQZMnqGm1AADQGg9TQ9TQA0eUempk9QBk9TQBkaGg0BpmoCalJIhNE9RMpmJgiMpvKjyGp vUym1PKbGiaaeiammTxP9VNHqmDTTak2k0ep5JjRNB6QYJ6mmQYgMNEZDQZM1GjR6TATaTRi M//VUoyb0o/SJ6NT1HlNP9VAqKSIRoA0yATQA0AmEGACaMgnoaGptNBMAARphNNP8ShMkwTa ABoMQ/UjQ00Cn6DJoAGhiGIjGgCbI9Q0GH6qptQ22SZkUf6P7bVnmvrGzz0nYT2Nm/jMjxum wPztjGWeOk92/hx5c+mvXxdmIeIHScOc7h6fl8MfUlPHv9LHd6H+C4igfu9GB1a3ZNtAwzsj EIIGCRoDvKhQs6E+hZWQ+hQs+ZN0pyMM8JLUz93asspYknOdbu9bV6HQSSdTq4AxSSSoWqqy GBrA/QLQxgzEctUL3OkcPPVz3XOIdZDlpDhZDmkLg1Drkqo4R1RKJJiFIknY5ElXKu1ds7d4 d3Dq3iHRPsH2SZMmTJkyZMmTJkyZMmTmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTmTJk yZMmTJkyZMmTJkyZMmTJkyZMmTNs2zbNs2zbbc+kpB8/X7OGTNJW7z+IyCeW/u9P7n8HHfOP mOyAxCLK8HwGbmp7N0QBaoMRAUzEneUgBvNMCqGcmsmJwp03FEwkdColtT8vEkOaqSZXmqSc 1Yk6CpJzH/nwOl9PM85+IbkqCOom4h9b/vwHb+brfMahibGLhGTjEB0gUkiyMgGMDGMDY5hE Ihk059rJpVRGXXryjmO3f7V3Ac5CO7cg0crPtJ9KGaURyvZ8IEUCKKhFlcyOZB5EUiI6W1C1 LRHFoD3OzfX5OcB73tBM9jRE0Eiw5D9N798B+o+CztRyXJcl27t3bu3de+Y/zz/QP4p/GMjI yMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLLTMzMzMzMzMzMzMzMzMzMzMzMzMzMjIyMjIy MjIyMjIyMjIyNMzMzMzMzMzMzMzMzMzMzMzMzMzMyMjIyMjIyMstMzMzMzMzMzMzMzMzMzMz MzMzMzMyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyzzzMzMzM zMzMzMzMzMzMzMzNNBDExMTExMTExMTExMTExMTE0NDMzMjIyMjIyMjIyMjIyMjIyMjIyMjI yMjIyy0zMzMzMzMzMzMzMzMzMzMzMzMzMzIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjLPPMzMzMzMzMzMzMzMzMzMzMzMzMyMjIyMjIyMjIyMjIyMjIyMjIyM jIyMjIyMjIyMjIyMjIyMjIyMjIyMipQwLy4uLi4uNDQBHa9ETxFTsO07SI5z0iRGiRIkXDvO ASSJIkSJEiLh0USJEiRIkXOdFEiRIxRIkXDokSMYpFUi5znpFHrEeRIwSLj1EcEZCSJEpIkQ CKMixIxSCxIuc6JEjBIrFUi6SOcNKRIkPkRAIo6JEiRIkAcqEYkYokIkXOkjnPkSJMkiREAW JEgRHxIgDRIkSL0iRHOVHRIkSJCJEASJEiRIkIuc6JEjFEjEiDokSMUiqRIjghESJEjEiDoR EiRIkYuHIjiERIkSJEiDowVYjRIkSLnOhESMUSJEiDooJEjFEjEi4cqEGiLGJEhEHPR8SI9k iRIjnQe0RoviqQi4dEiRikVSMXDoLCIyxiiQi4JI4kSlJJKkiI50INEaL4qkIuHESJGKRVIk XAj4kVjFEhFznRIkYpEjFznPezRIkIRVIxAIJEWMUiqRIg6JEjEiRiSQHQkSJMkiUREHOiRJ RkkiJJAdIkRiiRIxRHOdEiRiiRIxRBzokSMUSMpSRBzpEiRIkRiiOHNEiRGiRiiOHRiiRiiR IxEQc6ERIxRIkYiIOGjFIqyxIkSSA5IyislSRIkDmiRiiNEiRc50SMUiRIkQJI6KQlJHqyyJ EXOdCMFiqRIkXDmjFEiNEjFEAHxikWSJGKI5xF8RSI0SMURw6JGKJEiRiiDnReosUiqPiRii OJI4IykqSJEoojhyRIkSJEhFznRVIkSJEhEcWOc5znDnQVxIeo57kGJECUpIkRzvtOQkSJSk klSI52bSht429HXWBmdJTFeEsnra29e1ruK/Erva4dftV8av8K3NNzW5sfTVuq3Vbqt1W6rd Vuq3VKIUQogUQojnYIYIYIYIYIYIYIYIYIYIYIGCGCOKIUQohRCiFEKIUQohRCkwMSgiWwcF UHXWTf81OidE6J0TnnROfdE283N3KyPK2Sb1xaYri2TiVv64lcSuJXEriVxK4lcStzTcoYI4 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 AAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZma AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZoAAAAAAAAAM zNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAA AAZmaAAAAAAAAADMzQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAA AAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAA AAAAAAADMzQAAAAAAAAAZmaAAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM 0AAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAA DMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAA AAAGZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAA AAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmg AAAAAAAAAzM0AAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZ maAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAA AAzM0AAAAAAAAAGZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAA AAAABmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAAGZmgAA AAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzN AAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAA zM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAA AABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAA AAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAMzNAAAAAAAAABmZoA AAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADM zQAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAABmZoAAAAAAAA AMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAAAAAAAZmaAAAAAAAAADMzQAAAAA AAAAZmaAAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAMzNAAA AAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAZmaAAAAAAAAADMzQAAAAAAAAAZma AAAAAAAAADMzQAAAAAAAAAZmgAAAAAAAAAzM0AAAAAAAAAGZmgAAAAAAAAAzM0AAAAAAAAAG ZmgAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAABmZoAAAAAAAAAMzNAAAAAAAAADMzQAAAfH7m 7u7u59T5G567c23d3d3d3918nueR5HkbnkeR5HkS/0wsj22h3Zlzzy+hkLJH+OZlkgw0Mow8 JZmkU/8rQr+etzXv695Xt6+1r6uvV7xze3zN7Te1vK4ghVCqEkKoVQqhVCqFUK/i/mVAy/pK 4FHDiBEXWmAGhngIPDFcMRIZZYtzrc9hptl9Zd67Ns7ezd2tXr7/L3+XK4ev5GdPx0yNv3M9 /DfxtOPL735n39umWWd+9+26XH83djTdH79Z7Ofd+b+ZfLZON2mnZy8XSt/kn212+Lldyv74 7ruy03zy8fPxS3dkO/x9iZw55tu3Qj47PF2JPG/Kkvv5diT56adiL4/wce3uMbE7pYeQ8Xbh nx25cZ9Onjt6eEu7fj3499l+c8K47sMOHh4ufYvW3dpOa5pj29fHR/hzrZys247818NVsvrV mpSmEOHd16P789J+NY3Tv37O/shHTZ4p7/FDs3Ydz588Dwnzt39nK7uny77e/pwlp4u0j4ZY +POzv37n392Fl9vTs8Vu3HOXhd47Z+Pdj2p293h3eLus2TSXfZ4x/Cu3vl4ufeT57JdvZXhu ttO/DDuThfLHZpVK49/bfivO3Oe2dqeHj76JbuhlHrN7/Df3y7Mb4dstcce1/DG7U8PDnj16 3Xd+Gvd3ePw7m5Rf44c+OO3LHu7k69/b4YdOmnfpwjp28OfgePh4+dumqZQ8eBwx2d/Dpvte +fh2S47X+Lt02UxfXwt4+B4/Cvhrd3X9L+3lh18Gpq/xw3w8KW9idfDXwORDn3Z12Hhv4eB2 YdnXlHXffhpVPC3v2Q6293Xt4W+HS7wj4br7u/hnj07IX43cfA48+7f0u636+Pt6N4X9X6eH dUj4Uu7k7KdfA4lnPplwyx3b/A64S6ePpu44bq69/h28O7p2Yd3h4/Dre/svlmS8G8OW7Hst yhZx0OPLv068O/GvLu54WdWw7td3h37CN2OPanDHx+B4zp3ZP218PA62x6cfHrpw8NLvE3b3 7uuh2It/j7O/nd4Pu2xld4d3hy4eLszvhO3luOVvfp4d/fbz8Lo+HS/w5dvDwxI+Svdxx8PA 7jLXa/ZTyZ+Q1ulz4d3TDh4W9V7M5dnh1iqx77/CWj/DPb5O/LXyYcs/HPu2eSniw4dnk17I tf28vF5OWMfJj5PImPh4HkJa978e3p5NbY6w1s0txt8G7F2dfGiR6Q76+K67jPnp3eHM7/Jj lw18menKzny8XZ3+Tp06c+fPmLguHkZmVVZmZlVWZu5VVmbe222222222+EW0qqW0ttttvmW 2222wlve3d3d3d8Pdtu7u23d3bbu7vnbtbd2tu7W3d3d3d227u7bfN3dtu7u7rM3JmZmZmZm ZurMzMzMqqzMy9VezMzMzMzM27u7u7u7u7u7bd2tu7vi85dtu7u23d3z93d3d3d3d+o3d3d3 d3d3d3d9xtt3d227u7bdZmZmZmZmZmZmZmZmZm1ZmZmZmZmZmbqzMzbu23fc7tt3d227u23f qK27tbd227u7u7u23d3W7u7u7527u7u7u7u7u7u75W7u7tt3fR227u7bd3fP3d3d3d3d3d3d 3dtu263bqMyqyqras3YzMz3ve973ve9/c973szM973v8TM0Hve973ve973ve972ZvFB73vZm Z73vezMz3ve973ve973ve97MzPe972Zme973szM9/e9/ke973szM972Xu6b05zbebznN3d9P nOc5S2ltLbbbbbbbbbbbbbb6VtttpbfTbaW+6ttttLaqr2XbbbbbbbbaW16e2lttvp222n1C qqwtttoBbS2u5vZ5XZPdeZ2sru3f29i2cr+/p0u58t8vKOHOA9xHOBzhx32gcfbB2F2vRHOc OBznW+XP83mB6H6F+1OyB52GPPr5rAm4T7/j+/W/DHTy/nYa9sNvDjsOPG+r8q7t1d1KUpSl KUpSlKUpSlKfoAOrWM3VN1TdU3Vhuabmm5sNzTc03NNxTcU3dNSnR031N/ToLHTU52nIpxqd JTnacWnRU6GnJpzFOmp0VOmp0dOmsdNTpadNToadPTv6d/Tv6dLTpad/TwtO/p39O/p84xDm mA5pgOaaZo/81iIiLGdWP/cqibQyn2lGfZFEiCk7HQQQbc50gZkbTYUlwBtkVRuCLE6ED3bG SAPbgERERERbu7XIGQtY7RmAOFs/zfV3+jt5X+33/G+Va9pLo/pmzvx5vS+Lnf2eD6w2bi5e VlZOPjZzzMycx4+zX2e/P9jdw9vd+T4/yfF49O5VVVVFVfQZhmYVWZmZGZkZmRd1bV1t1u7t 3a3W3W7u27N23dLd3bu7u7u7u7t3d3bt27u7u7dm7tu7u7u7u7u7u7u7u7uzd3d3bu7u7u63 dW7u7t3dXdtu7u7u3Y3Yu7u7u3W7u3bu7bd3dbNkEOBs2bN2zZs2R4ODg1eDg4J/BwcHBwSk hl9YSAMRgYiMRjAwNZatlqVgH/2P7MZN/6T0npPSek6jR9J6Tr/Sbj0fo/R5ee+fznz/n/P/ dtfu/dl/u/cz+79z/937u34f2/t/bt/t/b+nmu/2fs/Z+zfrgb9IBQgpHJAOCH6yH1PopOgr g14etCvYV5KvS17CvYV7Cu8pu63Njsa3VKIUQohRCiFEKIUQohRAohRHOwQwQwQwQwQwQwQw tABTBDBDBAehgjiiFEKIUQohRCiFEKIUQpgpRAVCiOdg3gMUQohRCiFEKSUohRClFEQvQRCi OKoVQqhVCqFUKoZZhlGGUYZXTIAAWx07GbxO9r0fb3LvWdDowSD4h+l9/B7wyXn0HDog3w7+ TbyJlZJNrvuZxPm3fXFnjtBGjSJTbc7jqMu+XKVnkSYqBeTk4+2zM8JJXa7zjTJ7nPIxQnmb CTFi0JLZFKLUH1NQTFSE+q6j1fsOa5nlaU0gNT3+BMqkPpsIYkqtqTZGwrZA/DThyqrfJcg5 YWwrfc/Gcv7ne28JK5lTfX8A/CbfN6OfFuYD1egmc54cxYmSZc9PX+06fg8L2exqbeJJt/YU NPVdTFSveaUS5P5GAj5P4fD3vMOq6vkJxtzDE1uLuM0jeIjBJJJJM+jjs7mAu89d7Tc8H7TL T0RpYmBq+UzZRJMwxZJbFstmHkJKyGEhISGGEhIQkJCQwkJCQwyEwyEhkMhkJCYSEhITDIZC QmyZjKyGQk9tbMMhMJCYZDISGYS2W1bG1bVtKdYPA0hPYYkWyJJbM0kk6vwqvC14/p/s9HR9 tdYZJuOq8NeL4bwugGcUdNSen0oiYosOaw05JJYTjTUkkRrZYQiHacLT23Y3rtzb2vD0dHR4 e6JD/H+/8HcJu+h3kmSOFhNu3k3TeZTMkOfsSaNCP5rIO9sTdyJPqP/fF/9etzvvt8NJz/7G 5Rl1XjWMkRJbCLZFbQVslTaDaUfGeaD2d76vg/BufI/KfrqAH0vqDtk8yHsZ7/3Pl8L6/xRN AykY6DK+0GSJMdzzHG+0+t0JNsNNwNxmEOq1dS56M9/yvMnjishyXOdgeKHjI5BiMh7B76hy RqGIeGSp7VDy8g5BoPawaDQYHqQaDQaDzeKHjPt/PB8beFEziHi+28h9F1Djdbt5PrfAeA8B 4DdPAeA8B4DbeRdb4DzDwHYeB4DwHlHgPAeA8B4DwHgPAfjOoeA8Q8B4DwHgPPvAeA9A8DwH VeA/O9Y9D4DwH47wH5jwHgPy3gPAeA8B+c8BqebeR/h+M9i+N458ZyvjPjPjPjPjNP4z6byb 2r4z6p8Z8ZtT479t6l8d+w9Q/ifHfHfCexcP6u/Noe0+H/g8vzuvyv5i8dO+rkHlimgwkkT0 dQmEknqPieuvR/bfH9H9joaUk9Lts/s/svY/a+px9/l8X6r4X73x9Fx7DyvbepfIet91B/ge QWz/S1m/r/t/d9xB/DrafeRX2L7V6/0/XYn3fY/e/DN+L7mX7GTC+JA1fYy4qMOTG/p0DuPY /Fz/hPH8DP+Dq52hoasb4enIb+2ipy5mkjry8SZ7yVP1/iJyWz5P+HSjaGq+m6krRS2Jct7n xEdjHeuH7lWdqytfXgtm0RI0idRScRJ+udXEizYqrhM9BWbRjHoK6+hO1p0fLnKRYKMGJSx4 Wu/cZCaieRoyjSNhSbKzJ2nPjnnHbxjoy1aMjYUoKIt5NFvPiKyp0PPVzYWNLdvKB0ldLPo5 GnmI0oL7WpQo7hWE2hRKLhHWmydifRo0FaEqfsUJbag20sR8715U/Mz5sRtpSZ8FVRLIo58P WlaD7R1MrK0042Mg6oTJs6VR1pCNJvKl0tifQpSVaS3vzAxekQAQMgggDOtGA72Jec2pvqj9 9TNjatVTIoxNaIrEp1HNNsfKeRct7rIv5tCpNoaOY7B6tN5rGRUlSoUibTzT6akTNPo5D5Go o7pqxFaNSirUdT3GVnO58zYGbMnqQ4mJTVjRpU2gpFxJ+piy8ZujPfxpWlKmpRM+AlG10aFW dIcttFXYzXKtHXV1ZmxmZOxoZsSINF07zNNR7Rx81SWMiE/16FFV+31lYk3WbNo+rRqqyp50 HB5c5KYlSlu8yblZaj2BqZmlKh6MJ+rk4s7YipP3uvGc0qDnWlxtKlRl6z/KFE7mdkaUVKds Sos6Yq21c/Jzc/UhSKUfYTgPM7NRlRI1KUrKVkJYlKdN1MihDk6eXpS8ajPk6j6kjPmUqVI1 LQmUpimTH2IR4cXKgvch1puk9GRpKPdUQZKUwZ2nNVViys+Zr0YsHWka7lzCVoRdbQoa6VHW oHeacB06cPI9ERKWtn4+rKnQsabHj60vUxNONqztCbRS1HE2jruHEuK3ROnsa8o6VCa4lPtj EVPibEvVbY8FJ7mKQkZ1LXc4r+ZLpSpeYeHsZ+tsRtZxIUhpwJZ5817JbUqVBvJxoWvsY8aB Lnarea+ysvXkZmuriS3dKVHysWRi68nUlUdSVrToFFu31hKoJzEaDdtKh0J6MzUpRpDvGzHt SoDFVMSACBIIIEgYAwQMZBBBBBBBAiN28uhp6tHQWAIizL0/9fj/F+f77wfl8dLUl+H87xsb 33Z1Nvz39mb0471ugh773P1/qv6/O83/P67n+JxOJxO25xIiLZAWySKsJFtRVtRbSWsg7Vak tT93xKv93n510h4+PCHjLUNpzLa2ramtclw5q3C+a6my3C6v2r7L8d4zrPqjQTdPQbnbQSNC 2RnwxYMsTNRb7/RuBnZEyZ1nWbkLmbL9l2bmoSRbmS9a6STVSfkYzIyRXO5GSMhiTBEhPa0m RJo7p6nKSMt5WIG/s9FfQ2I+ZvYQbrJI9F9IKcRXrNJXhfNI/eEAdQ6ba1nwnxnKjqa2Rzj8 HQA9tXKKa29a2Ub6WREOtsIh1VhCGeoIbJE9ppKvjvcdvL7XnhIpUexyJKMa7/33nnMP/nfe fvfu2e37T63sfR4I/skuHwZvqOH51v8+v43vf7ej5Pw2uOd8f/D0H4P4v1ei/D9D/Nj+r6f+ 3Q/J9bxtn8u17rdw3fe+B6LyeT2fqv2/D4+r5Hx/ceg+78H3ngfe/i9x6r8Hz/idh1/0P7+3 /p+n+nvez1XvvofD63zfn+n7T4HpP8v23n+l8z0/+7/B7T2ntf8X0vh8vyvpL1fJxdvrOfyv K3fn9zd3N3c+R+n6vR/w/Se3+R/Jtp9xI+5fRw9/XzLPz5mknt78D335nh/fee/wld7+j3/k 9LNmzcz7j2vI+2zZs2rPb81if0z4NjpzJNvT8GGUiz/jq/+86P57H/Vj5P6Ps+T9TzHre00j 2Ed973yn9Pt3+P9f5j/L0v/PRTot14eSTIy+V1V7nF8BVUaEP8X75gZ2fy/93/X/2T34Rs/g RnOdqf7X+//r/wEz/e7nO9QBAPUSN8uUi1Sqe5vyK9d/J+u/G/kyzZM8+BU6e/xXf/3/7fyf 6fp8vKicr/q7/p/l1vMT/X/3X/54v+eWn9z/yNPu/18xH9nkdh5HkeRa5nkU/I5nkeR5HkeR 5E/yPI8hbyPI8jyN3yPI8jcxPM/R8TL2e6+Pnfo6nV0ur3HV1ur3PVlfo73+U/pO/+lR9B3X 1V/+vZdpa857TwvkvbfSeu/hdP/bg+W9x6T2X8z0PTfRbfW/H5896j9r17cnyPmfN8/733V6 r5TzdvW/Le59J7D+Xt/6+o9F/o+r+2+Z+j9P7L+z3+o9p85/p9T7Xh+m5ur/H9V5fb9B9L9l 7b6Hx+u9x6P6r5z0vj9jw+Px/b/PePx/+f83j959f/q8fj8P0Xj9f7f/f6j7X3H/Tx+V5no/ s+f3X0/rfZ+79L7H7jzfT/a9Xf6j1/Z93yfC9t77y9vc+dt5vqLb2nJ9zt73o9r7P33q/vdv getbef7Dx+9+99i870Pt77z3ftfce67+zzvP8723n++9/7n4PwvvPN+B8F7z4XivO+G9D0Lz 9ba9Dx7bVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqq qqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVV VVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1V VVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqq qqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUN qqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVV VVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqq obVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqq qqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVV VVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVV VVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqq qqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqq qqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVV VVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVV VVVVVVVVVVVVVVVVVQ2qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqq qqqqqqqqG1VVVVVVVVVVVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ2 qqqqqqqqqqqqqqqqqqqhtVVVVVVVVVVVVVVVVVVVDaqqqqqqqqqqqqqqqqqqqG1VVVVVVVVV VVVVVVVVVUNqqqqqqqqqqqqqqqqqqqobVVVVVVVVVVVVVVVVVVVQ/L/EXxG5tfEfY/tvjdz+ hmJ/j6X6bJJP3Uskm+/16LKQ9L9L8r1H/7/T/T5e7+Vu/W7f1mWllo7fR2220dDP/c3c5cdN 0Fy0t98z5uNz1PzcnTpb0vzMie6sSROcqPM69Hrc/Lc7ct1KqJ8dqjrR9JhtIXhSTFSLUkcW yGpYdCKVLCE8n/sRgeCsGOt6fwMz51+Z4TBD3sLJ1NifDiLD3OKrxxD7VP06WVtLVarhPe5A dDRzO2w8HueD2mb/zrsRInVWKsWLFli5a34bLlq1lmk1lZobX3uOZFWLS2SWg/I9DzHsvQdp oJOdshG60Nbn+L1/McHSg/F//vnuvmsF58i/Hea+knT5PEB8jkqQkTRr+z/XwKq235OZz0PD SJwKnkM2H/fu8Qw6hxLBppKlfb2SrGk5kESOTSYU1ttzeUgiSc3c91sY41jF4N4FHO0fizhU AvUvYFuUW5XA51yDnDgGQ2G3Lr2H3XPlbyLkH6vlwSir2WHstey1Jey0XstK9lh7LR7LUnss F7DQr1MF6nqY29Qm3sE3jeMcTc6zVZgMYUYkkJu6Kr0Z6NIf/3seS5lB7HEXsclLppd7UDe1 EN7RCbqyIRuLANxZ6ur1dA8+Uq8/ocB8ZpT1ff/j/Ydvx/o9Ho7I51a1rXD9/fdO667j+B0Y uHDgHODBHADgcYYLgh639rl7Z7Z7S6VIr5F7HgPzF8dOUPd5LxWkI9nZE/nMUns7ClV7SyRA cOjy1kQ9PTgKSTuHfPo3hj7pvGhIWIBejgHG5HOMN6OvORyORA1OhxNxMmTJkyZMmTJzJkyZ MmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJk yZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJz JkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmTJzJkyZMmTJkyZMmTJkyZMmTJkyZMmTJkyZMmT JzJkyZMmW9BbJqk09vttLRzZtu0pIjgrGlJAmLILULY2JbJNqltUW1R++yExUi2JLSTi9Nj9 HPxvW3RaSHR2IhE3alVfhffcRS9r1+AulK8mCXs7Qc0oj9HRhFV4+w+0+mu0k83qet1jx229 HOa4uFttxcKWze73e77Pn3WkiJJNz94whD7xoPGjxh49Kq9NiPj6wq+k9rt8zz5ncTQuh4zQ z6GjppPo2i8TdwEVYkpUSrIjMgS1JC0kS2A4FIGLbBLomybEW1DaEbRWxUtqKuaE5lKtpVtS m1RWxNF01LTVWtrC0wsyiWiSu/VH3ixPKrI8qrfaGCd+sTfLB5ODDnZHgKONddxtO47juMCZ 5jyHmJkyZMmTJkyZMmTJkyZMmTJkyZS20tLS0tLS0tLSZMmTJkyZMmTJkyZMmTJkyZMmTLbb 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 Tl1t59Up04y555a8+u23Zutyhrvjx538N3Ljpx59NnPinUu1lft589evM47uMd2lU6bUxj00 51u1Mresk3y6a9NeS5ctNdbK29enTmbbp37uXLbz3Z7n3701w4ZdH78s6X15P1679vHjDjh0 38benXFteOHHpvu41rPLnn14btOenKx+3jv469Or6YNrq1Ou5Gw2vrljz2w28sOlWbhu2dLO HXPlyzf1OaZ2aceuGr+GzWN+WtmPXhZsuy0l1jpw3a3aW6y69NnHLdpXZv6aQtly48efG1da 8V027WhpbDPnBdemmG3pjs6anHj138559NbJdK7+HTTp069eNNOONI62Z9et0uMk4W6IlMeX OfC+7htyhHrlffv4cONtKc35y05bOl3Pd15r1jnwm1vWme/dhVOufLTf1ft232U6a7ht/OWN 9ONd0rtOvDPLrfu0z1058+UeXLXpu289deuzpauOPDZZW9Kz3nCe/Prs57elX7n6rDjvx15v 6qlnXp1WXLr10wbfZpEt1y4WWcN23Hfft6yv48qct/Ku7hnuxz2az529b55yfrv366awa3Pn r1x3L0fw13V5XaaVttlrGq7ceGzdr1wx1f049NOPTlx69OmvVuFOtl+TeIcO6OEcE0AAABRC RBGpQki0iJJaIO/qD8KRkr2miVtVLwxK8LJWyFbVUpbIqtpRtVsUNhIs1ETmlZ424p21VXNO ZQqrZFcyl9ctVxitipYrL6e2Riu2gVW0qeW1FXusxYjOWIyq1lLEH3vu/Teu0M89Lx+Nwef9 Zq5/q+Lt/X6jfKGjG7+LkSNiTkCLlOog1xiZeoMfIHoR8od0PjDP0y7oPx3XdfM9FBg+i9N6 P0/pI8qbOSjUNehKoK5+VlaykURYoiiKIoiiLFL0uVFEWKkIwjCKIvp4wjCMmExBg+wkyteF rjXFVuaHiyNTUhwoWnp6emWkNjTGnpjTGmNMaY0xph9p6emNMaensDTq0asygJoo5+poZDk1 XMzMvLPl5dXGykkkqNGjmURQoUDoozznVSSOeIiijOnTZkdSRImSI8xSbIkSMeU6dSpWLiYg lU9jY2BKFLYGwNjYoyZFCjHSoyZMmjr0dfX19dWUrsSJUiRHlR6cWLlxNWnPVoz4qsXGU1tX V1FNXV1RihMogpDWLWzGzlTU1FNVTVUUUiUlVY0aNGpR48ePSkUpKaaevr68mTIkSD0jx5Ma NGRioxosWlFixYsWieTMNARhzxqDUCWqKcQaWLECQ1hk0BFEWgIz2MFFBIFASZIVGuqJUoSh KlBURJkCAIEAQBAEB+/fv87Ozs57FevZexTlSk6CilJUUoSqQSCQSSSCSQSCSSVOm/p028B+ /f04ECAeBAgQH7/Ozs45znRRmhWbNmzVJ05SdOpoo0zy5cuWcTJkybMmS5eLi4h8XEGIJoxc UHnCcJ04TgcTg7nCcJ1IIhFFGgc9Cgmkkkkkkeekkc56YRhn1s2dNozw3D4Pg+pZwzhQD8P3 78UBAEAQIFAP8+gJ5UBn0KFKjQoT589VXIznlJHVGrqjV1S1Rq6uqNUauqNXL1dUapaojxA/ iCJqUtWlq6+rS2IlKlRo0aNGZJSCQSCQliXLl7GxsbE2VJkyZMiRHSkSJCUmSlJkyT68mlJk xpMmkgEAgKVIUxTFOnSlZLelNoZtN27zc3NzczMx0cydOmzZkylMmUpkyYrsbEqVKla+vrz5 GrKiRJWrrxFVdSXq6svRmI6+U5zEYSMoZYlChm5onuxkCe8EsU5kwKCgJ04UAiEQiKYh0Row xpA5aZzunDoQNNM0vMgSnSh9E5EQcGIAiBasnWm6uLMizZ8lufImZznKmUsXHmZme4R9n3dP Wj6tg/TxVpf7limzDHGUKW5cPXa000rTbf9XDHb7L6/V3U1rrTHvvzpgvCWV3KufO7LlDldl y646W9dfFLhhrDj11533TTe+WjaP29dMrOvXfvbXXpuzw04w6Wp1x3whqlq2V1203X368rbb uHJd+y/THPPfwzxy6bsOfPjdjuxvwspR9NI2dLN3Lb15ba8dmzdLfupytvpl0wxnhzsuaHW2 +2b9Mb999vLDbjlwa6GeV+s9/Xbw4U6at1tae3Xn142dapvhyjelsuErt3PFM+e/TdmmzNNd eXPllsy5a68+tnPLotOWyzhlllWt9tcusOOjQ3cLt27rz0Xlry6JqbrdZXbeNeOvXmlq7tOE p7t2xOee2XPdy2dMG3kd1vWacbefXmu3nn069eue7rr0tsu38rp488+WWkMN6dK78+j92elb 8ej9evTbrzhzhhrw527detmW2PSvDdfvx4bLOWnTjt37tOL+U4beXDl049X4aYdMq003JZXJ +zZxsft44Soza106lm/Xbn146Zx6nLfvu6c+uPV/Xpn1lScbNmXLG7Pd03U3crN/S7G7Wzjr t47umnBYv5c90V1nn0bHDWfSFm3pLbwgs+tNnHBeOJu1166z28+kcM+XHjrr1trt0wjby1t2 4c+u+SX3ZIlbONk59dLeMda3bKddd/G6uDdJcuPK3lp1TrDbes9dqZ8bb06deNc9z8ccOvOn JbeMbePXDSPXn055bdb8suXXKXR8d/A4ZV115c+OMGatKb50uTrV+hunu69ML9vOldukOm7j rnrxI85dFht111134P428Il+zjLPZjpPbvx28OWHCO3Pdnhspxs4c+tm3k/XZu3dNJRay3Pj 06892xOcOEN3HKfK+W6uN21+PNt0Nu7hzs049cNmtvPf03ceHThns4v1tf16mHXbXmtNej9x 4nOB3U2qO+sg5znOAK9GpT1tKNkvmrNhfGWiXWip1Y8d4Y2VV/AxJKS5qvR7zkq+t8UnGVM0 No1oVmq2JfmdScsTNaLWmq+r0uVX8DxnUeHZ63Pp9ddrNajwtp9y5VwxaVTaEtpUbKotm01S /c5NXjckeFi1tVFqtSTK1Wo0lNhU1qqmyVMWCm1SmsrQKqu1WoWy9XUvJou1hmFCPdspF46g VfZVaCvLgVeOShI9bK9b1uUvNaJDy2r9vpLrUm2Xk4vk+i5hiQrq1SgeousrlKQ+e0+W7OFV XhgU8+8/n4XbXhYquaKCr5fX5PVS+7yvu2Ij1ZhF78xKHJpSFzezlIfIXDmoklfqfdL5Xqk0 SyRNzYFoICZngjHQFkIzpUBLCxEkHD393+/zGkoGaisRWCQw0/r2JMom2WRNwq0iNu3FmBPP rz+fle9wbRUnn8/mt0vKWF4WrICI5zh3/sP9hC230/4Zhh9kmznORyOHok5szMzMzM27u7u7 tNbu23dpzJmQyTM5u/oumo5L+hu6v+MncOzs10i29NvW83blnHHOnSc7HL0sUZGlFUfKUElK EYQeiPSEhFkyyEi5YvZnK58EhvJtvTo1vVrpbt3pzeznXkcxrOi7zZdy7dlal2Xd3arZdu1d l03d2XdUiNuxi21o3cu2bZuzdxZd3ZNqi7dbm20rZt3Rtzec445pro3nN5zm1KD3wUhJHwV4 giwe5mIQIvfARB7MzovewsWXocam7tVbd2M1Ntm7sWbttu7tSqlssWbiXZu3b03nMi2y8bdt 26ltrbdS3W3cTds3ZdrGWaS7tupU3bdm6m7uxrZZbvY5svN01bGm9eTpvTr1vZyLenXp2dLj ema27CxWtsWLZqqMiszIyuVWRkg96MRlF6WOcDgKDhBw4ww9bpJ6mpV4WhB4a8PDhKVV2VpB 8Z/K/le9fxviviviv0HxG3/VdK+A8u+G+G+G+G/icB+dwv033BHHkj7Y8gOxLEoXBMDIpicL AuBcYBsigLg2hTHIKA4x3rzDy7yjuHh3fvQO55v0DluW5bluW5bluW5byjluW5bluW5bluW9 c5bluW8c5bluW5bl8bluW71y3Lct6Fy3Lcty3Lcty3LeJhOW5bluW5bluW9c+octy3Lcty3L cty3Lcty+c5bluW+tcty3LctrtdrtdrtdrtdrtdrtdrtdrtdrtdrtdxdfXa7Xa7XaHg9fXa7 Xa7Xa7Xa+312u12u12u12u12u12u12u12u12u12u1+Brtdrtdrtdrtdrtdrtdrtdrtd0yGu1 2u12u12u12u12u12u12u12u12u12u12u12u12v0eu12u12u12u12u12u12u12u12u12u12vw NdrtdrtdrtdrtdrtdrtdrtdrvvthsNhsNhsNhsNhsNhsNhsNhsNhsPINhsNhsNhsNhsdHsNh sNhsNhsNhsN9I8txMIm4pE2Gw2Gw2Gw2Gw2Gw2GxudhsNhsNhsNhsNhsNhsNhsNhsPv9lstl stlsuebLZbLZbLZbLZbLZbLZbLZbLZbLZbLZ6PZbLZbLZbLZbLZbLZbLZbLZbLZbLZbLZ4Gy 2Wy2Wy2Wy2Wy2Wy2Wy2Wy2X4my2Wy2Wy2Wy2XnSddTZbL0DZbLZbLZbLY2dPDZbLZbLZbLZb PS7LZbLZbLZbLZbLZbLZbO52Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Wy2Ww2Gw2Gw2Gw2Gw2 Gw2Gw2HcNhsNhsNhsNhsNhsNhsNjqdhsNhsNhsNhsNhsNhsNjc7DYbDYeUDYbDYbDYbDYbDY bDYbDYbDYbDYbDYa7Xa7Xa7Xa7XewTYbDYbDYbDYbDYbDnmw2DYNg2DYNg2DYdVdg2DYNg2D YNg2DYNg2DYNhursGwbBsGwbBsGwbBsGwbBsGwbBsGwbBsGwbBsGwbBsT8jZNk2TZNk2TZNk 2TZNk2TZNk2Tsj3ykco5RyjlHKOUco5RyjlHKeDvKOUco5RyjlHKOUco5RyjlHK3Vco5Ryjl HKOUco5RyjlHKOUco5RyjlHKOUco5RyjlHKOUeT5U5RyjlHKOUco2TZNk2TZNk2TZNls7Ozs 7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7PZ7GxydjY2NjY2NjY2PNRPTXz/SYkhNjY2NjY2NjY2NjY2N fwTX19fU19fX19fX1+Jr8PBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH7Pf39/f39/9bv7+/v7 +/v7+/v7+/v7+/v7+/v7+/v7+/v7/ym/v7+/v7+/8Xv/vt/f39/f/Abm7/h3dzyN3d3Nzg4O Dg4ODg4ODg4ODg4OD9jwcHBwcHB6bh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4dfX19fX19fX19fX19fX19fstfX19ea81342xNjYmxsTY2JsbE2NjY2NjgebQe ilg9Csx6e30D4apk9wr2Gkvm1FaQzNKbZMTs9H05X2lHXes20z58+UhbIlsLUD01k8mjyakT yZ5rVax5dQsayxuW42tNrZ/lVdOdVX09qeUsiD8/bWvJbzebrpXqZFKeKwPDw8OlV9pkrwaD jNoPDw8OhLwLVC66520TxyPCsuvDw9S7KvHFK8Xj4+PaUDtWR27duiFV2Lt27eN4KqVeHhzw 8OSrxxW1R4Go8N4eHjdSV4MpeG8PDkP2lgatHhrWrw8PDojyZTwNVLw8PDpDsrty7duIrtXO dduU8MF4Qv2P4uJGjQM9JI06QkDQWEwoQzZFwjCYowx+5MLYtlpkly02UrnScrmNwuWjnFuJ ybnKc5lWEUx9FkyMHV5spGZcVMRFkAxRI9FqvLZNnZXbnKvN10dLnLrdTRAb1YjNYZLYsjFM SXHiMFWESSbn0v0/qbxfw95t5tobfbsqOF6vdfb+q936n8DSgSSfcfeY3FgoPVrVc05aLmri 5yX+x+0z8P1QoeHhwo5VzHLmq5Nz7+lHVdV18x+v+d7Q+wyPdP1XA9pq8xqq99keHPX6qc0T JUg065Ga4DQkuakwmjZlYxjKMmLNxVyc1Oc1cXOREcucpxrm4c5cauctyBDlc+x5O3a7Z5L6 hXKvA6uO3S3KbIVyyKlzLic9xePaETciJFxs+si+h/z4D/a0Ked6v/37nefV+hp/Ezfm6HUz el7TwMDCvveVi+09l/73/M2u81/v/B/o/P/t8l03SWSW9NMYGBUj7inUXNSMymKwMUuEwlYt rEjFkxMeHYEiBbx2KuxkduVfv+dXVc5yc5c8eV11Ny4uaW8bqunPG7dnLTw3H/Jt1XQvG8OX JzLccObrHOrhlzOGueFxXU8XXXbdlzksypFlmRKlzLZLMqbzot50zk6SbsXFpc1yaSrnJblz tl11xiua5OaXHNeFqL7P7X8T9r2keH7HlTzaRDzVaLtePJNxytobUebdqucrk8OumrJjGEYw xGMP1e2yyZov4n3Nl1lVTBWGFKwwphVMJVYYMKVVUwUYWXDClFUwpgpFKqmFYVhUwowYVTCU phhWEwVhWGEwYlUpWDDCsMGFLWFYVgphKpVYKmFVWFKxhhhhgqlVTCxVS3SyYVKrJgxhhKsw lVKKYViZZMmTBZcsMmTDDLLDJFKVTCsFMKwYVhKVhTK4UyKslVhVVVVVVGIZVGTJUwqxWWDC lU/mZiMkoUjKKqqwwqsEwlKVMKyXNWYrMrMrJVKowyYMlVWFYUqslYWVVFZKwwyZMlYYYYYV kYYVhVVkKwqsFmGGGGIwVMMMGCrKwVhVSmjoSQmjDGEMGOfyufiPsrwV4dris/j5f6tu3YuH 21v43bl2LzaTLNmGD7etvnYmek3yzNoTJmwP/Gf9W5qec3G3PXH2RQDX9YrUjFCLiUhnoPHf 8hXf2Y9Qe5wjsKS8Z2PbTrk5syZZm+LN5yXMyd5qTZFiLm5er7LnZ2yuK5igcaB7K1eT0cR7 VHDnPEjFzrGZBgILbMhhEcsBXO27Xve4KXttgpBxtVmL0c1r1POc57ibD0wVTZBzmQBGFsRz fge2q0tsmy2IVbUqmlUTN5iM8Yz5luULMVDElb4yyFyMGPksU6da8lXR1pbq4rnOHOXDnCue OXDrXJdddXRzlVONIQc1wucuVzXM1cyHu8F5Nev99yHVlO3irq6pmZ2L2XCSclslyWyyLckX LmVktSysWLJFlmViyySpkuVlkzZN2c5k3ZZIliWZWYuXLcsktlklsyzEysGVfraDm3fPMN68 0+C0fENxGnUumuJLhiYsuOZVOGpPWtU2oddVuOVa5xlqfyG5NpmWW2S2WZWYsuVkrJLcwTGM MYXHKbuTUdY+Z5+5tuPrG3mPBXNjGMXKadhxlZ13EaDPgXJiRjGExhhND0WbKFzMGazJk8eT IZstBnwiZpKxTBKxYREEuWyzmtxW5cZ5N1un1lyOVVfQck0ZZRwIYtox7uH4GdngcKkYmMT0 Y8xp26l5NRt4ZPHCuY7fpTnOtciu3uv4duXObeHHh2uPCnWnhYXhvz02Xbinjqnazl1yl5cb E7auYnu/Wcv3VovkVgCIOHTbJysj7D6JG8LL8N/m5754+fxofi/xyOp4uvylWPm9l0vPdp1f P9P5vjfO5OuT+B5P6f1f5vrPg958HrE6iR1OEnWLkkS2YqZWSAtVDnXK6wmyXNQrrUNiV1iI EFQG5gYD43yvUxvX+8P4F/4H0tb2HwvqfN4Nv1vsYnu4PqdqDkmeZ2Zi4mTlQONdue/Lbt48 OO7hv4cvhcIH4yO+v9ZwqdrgVBBHHYIJ1cM4PgEcfZTlB7z7AgzQRvoi6EYkXq/7AgysgzIM zxpWudCJBXiK308ArHyjpOHH2kPtOEc4c5xihFtVNk2qUraTZG0q9j/x3FnV1zNk5NuzKkrJ vgdk6dIZypnWZPi+Jmnqb+F4KXjg8+h46dZFzBzBXOuUo5qVzE2KXWjZ1q5hzUuaLa6wushb RV1qXWj/l7a1d1lzn2esjNidMyeFKydn+f7e2CeFLuu3ItwWDPbdAuIkS4tMChcWmzeX+kcP tn2zefbPtn2z7Z1EhdF0XRdF0XRdD1/pQyL+YQwSAH3Pi/kab63Ztm3+zpw2+4b0zqC4Q+Vj PlZHc+LT6KR5CR4hM9a0njdbE6rjE5mJu06Cba3oul4pxJPL8X2uiasjPbbaWqq2YaPT8jp9 PfdP0+76fp+n3/T9P0+93qWRm3V8FJv8ZUt3mgDf0byw8FNG4fx+rn1NYbaxPPg2Ee31dZ41 YXbCltF1hfod61XbFOVc16jdtyzePjldXy2rq0V45WwnNSn9D4PF1MpXa5i3KObaReTBXi7Z ch2yi+69vVxJdZSltI2qleOLhuattwysLQtlpaQgH86yqknT3xnB6bH331edjN//ZeC8d1OW 30MadkkrTEE79UghLGu4WQM/DmGW8zJvbJO4+T7TpdHm+x6voue7TQ+30/2/1tO4/q8TI6f2 PL+PE2vO/0YvqptnjpK0Oz885yNNrP0I8z+zLmWZ3jRIz3138vUk+y7fkNz3akzzcn2Hg++a ypM3639Gn137d/7vtfmYiv+n8Xy/5dqn/j5t+088/jfRlQ8j4VOrb3eGJE7qYvTmwvQ42ft/ +bdLuqf9LUX0el/b6D3XvN3fj5uD+v021+vgu/kodZ7O5+96j9Pef5b3qt/eu2XChRaklR5n HmfrMOBl56so21jQGTGXR5ZW+oqTFJnWu+w74qGUmEwj1PNYkTc2RnNPGFiVKWnYrhkxBubl TbVExEsCxFszNGXJlFZ6z3KZk/Zsdj+jM5oWIaE0cNtdzJzy5s2dLNkiOXOYnGtxm7c3EmVc 646ynTrl1um63WdNdYkut01Cc/g8dO3Coultldt2XbiUVzW0lkkk1Jca1s7d5y5zGVc2zWbm 3NbnLxxnMZu/ud5izGs3OWak3Ns1m41NbibtzcSrm2btxNs1uNZmZmTUmeGz+2jLy8SEqS25 0ayalZKqYtyVKyVKlSW32mVNSW2T/Qzbk1WVkqTJbo6TFiAif7zoyYd/KcymA9Q/nGcGHo7c A8cKheornzLx4vHfSuuV/Jc5dtT9s65OtAv5LrlNd/NuarMWyZlZUlSpUn8Jrfaskqf36cZP dM/BPHsvXzPC7OknEzxOlzjjKqYtkqVJWVWSqyYS+NLk27smslVlVmZNZLtzL6Nk1nbcZqsl VhKkvusmYxUMsTXhI21TGexmuLMXFFxgxWKVlVkq+ZZKmpLbJKzKlTMzLbMdlk6+RzZ0Z3Gs 1zbM1KkPbMknEycScTMklSVmEltmO1ZKmpKlSVkltkJUltyVktsltmLZMyVJmVJWUxUxjBax TGMRimLimKY2MD6jlXEb0kncSWeH2ep4nW9zsmdGSsqdE17blzNtyGX9yMJlWWriJJlYyuf+ /qbbar8JWFVhgYYVhVLJUwwisMMrkpVTJUwwwwpWDClKqUsYYYYVWGEwuFYVhTCphUwqsMFY YVTCphTCsFYVhUwYYRgwwKrBUqqwrCqwqqwVVVRVKiUsiVVVaqLFUqlVVVastVla1rWa1gum 8fBePOHm3MyONP7IX6eJFgigSSSHqCf2MVKCEkcMg5f1LGT98QZxNPu5ui2DoK6KHJHeeXf+ kYMRCKPR0v7W1hIKOgn78Qy2n6c3yRxLw/dSIQcVQ/6oyyR2BdMpdKISQ3CbS9SCA6CZibMV gjnQfCRCDjEhhmPII6xAVCsqZVZLbmdlupnEms9ORJxJ6b2zoyP4MzneTpBqCQQdmquejsEx eo9HY5vZzn5ye9w9MGwatm2yxnpp5YMrNHLD3NmbLEmMYk3QsnPw+2zMsnjdLnVJUqZWSXxb rJtuYVJUlZWS25ltzDL7ayamp05eMzluS25hUlSVlZKypM9L6iXJmZWXss6cnOnMJOeTLm2b uayW3LbkW5UrKypWS24SstuVktuVlTFuVKkrLbktuErMYxMWMYxMY9tk+yfJe3eieyfZvZNL 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 L0vS9N8p6Xpf3b0vm3pel6Xpel6Xpel6X0r0vS+gfcP1T+A/pP8V9y+nvU+2fl31j5G/pvrn 8F3vkPhvyD4T+s+4foH3L7t/2P4j/Deu+rfYviPsH5Z/FfxH9V+ifdPz7138q/t/0r7194/y X1b9M/OXyHw3rv6b/Ifmvo7+w++fzH9V+ofzX6Z/oPiPuX/0/sP577p/Weu/SPXfdu77++D9 6/Tv6T7x8V+ofFvwPxXxXxXxX3L4r4j9U/03xH+4+I+I+I+I+I+I+I9Hu9+737vfu9+737v/ Lc/r/Ybvf9N/17+/v7+/v7+/v5O/y+/v7+/v7/rfV9/f39/f3+w7/1nsPVe9+Feh7/4Pwvsv Zbef7X1norb2PoZt1+O8e3j8evcbe5/MfN+R193t/b+Hw+H8p4fD4fD4fD4fD4fD4fD4fD4f D4fD4fD4fy3P29vb29vb29vb29vb29vb/V7e3t9n2/X9vg7e3t7e3t+K7Ozs7Ozs7Ozs7Ozs 7Ozs7Ozs+T+Q8jd3N3d3Nz5fyNzs7Ozs7Ozs7Ozs7Ozs+L6+vr6+vr6+vr6+vr6+vr6+vr6+ vr6+vr6+vr6+vr6/iurq6urq6urq6urq6urq6urq6urq6urq6urq6urq6ur4rp6enp6enp6e np6enp6enp6enp6enp+Y+Y6enp6enp6enp2+Z+M4+Pj4+Pj4/xvHx8fHx8fHx8fHx8fHx8fH x8fHx8fdycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJyd3Ly8vLy8vLy8vLy8vLy8vL y8vLy8vLy8vLy/MfK7n7/l5eXl5e7m5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm7u fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fu6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6O jo6Ojo6Ojo/neq3Nzy/L7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7vie7u+522222222 97tt8Dbbbzt7bz9ttttttvh7eP1//567u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7 u7u7u+2+gr+Gvw+u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u 7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u 7u7u76r813d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3 d3d3d3d3d/rO7u7u7u7u7u7u7u7u7u7u7u7u76J3d3d3d3d3d3d3d3d3d3d9q9d6713rvXeu 9d678vXtvUtzcuc8N1bbhJf6r8T8P7n9r+u/B+f+q/Zfd/qPa/sf2f5Hh54jxLc/jTd224W3 Kiy5bYSpauW22yFZUlttuW0z+TbtuW22yFty223LbDKtuVJbbbhfI8vnM5bdm7m9ZdjNttuW 3PItw39/Mm7m21lZbLLSypLVirlpZbLLSy1cqZIZL0m7mbbbclthM2W5trhVVyqrhFV3wf4h 2n8eMHEYvP/9CDoftT9897h8z+W97v4d398M56OkjpFz2PK8m97iP5FhHAoSk6X+5cPe49tY M6HXrOnMnTveHOcznan3/OZOW53JbNZWW3JbctuFk2e8cqDlg97z/5kNuMION++OdYxdK9mI o7Zk9h+3w+cyc54POZzubuTw7zcrJbcltyW3MkhKysrKmW2W3Itysn0Jk3dy25Lbniy2ayst uS25bcj3Fysm25WV89PU5z3nk3pOeP7jnR0nS2ZbYqy13Jdm2XFWWrlYqy0stllvcbNpZyXW y222PxrlTPk/y+9875nkvH6XY6fg+4676Lgd9pbxbFsti1aLZbFsti2QmGGQyEkMMhhkMMhh OyWYsti2WxbLY/6xiHXc7rY67g8Prt5xNra2uJtdRtbW1qbW2236Hbb47bbb9Ftttttttttt tttttttttttt8l+p+o/rbfkP6f/fxfO/XfjPpff/8flfo/x+u/nY77yKfhpfWyXThu+zM57m ZOPjvIGc+fPnr3OgQIG0ANAriG0DEARg2IrhvOZf6P3f09Op3wMY3wTINvTI75cEff39/f39 /f39+dv7+/v7+nC68npE5DeYmEHFkngcx9tzPM3Pm43G6LPpcjbwNOOcbxvHIeTOZ0XM2aSW OtqTn6nDWSTPp4INK7fGCcWyJJ2J0z3W7Pyv+b6eeF2desdlvxJZuly2klvxJbstLi3Kyr6s s3bltbJLNSSSbbJJJdlm6WBLdm7tlssttZUy3ZbsVZabNm7LLSy2y2xVlq5UlssxZEmKkkxc VjFv9eT/98t6lj/p/+ch8xpf8PDtPcXcLSy2WWllq5WTFWWllsstLLznuOcg26wPrVdcutzm 4DnOKq2qrVlpYtqS25kyW3LZZaWSWltzkLmcyq5zcuc4D2/s+urtoOc7duu05SwzKypbZbZb LLVlZLSxVlttstllpZaWKsq25kklSfofxvtf0Pm/wfk/L6rz3mfLdN5DjdL/Vxeq/55rg6oH BvBtrGLcMYtwuLhjGFVRUWS+z8g9iCEPiPb/dD4xVUFke49vbyPcJOgjlvFaKqgqH1yWRtjG dRrB/uxHvs+uXj3kkmJ/xXvRhbqjPR78RnoI9XOc5yoKg4AVUUXCr3gAIjno/Yo5znPR6AAb GUZBznO8M8Yf6oRxaRti0Nni71nOm1st8Js3d2bbKkkkqZ7zMgiIMzGSSTdsW5WW2W2Wyy0s tLFskklSszMy1ZbLLVys/+WpvrrGrLSy2WWlno7psVZauVktllWrLSx9Ys2ly/azZs2llq5W LbbmZmVmZmfV2zbLLSyrVhLbirLbhnZrMzMwzMqqwjMrDMyqwADI4AFZhhWb3jrrrtdddc5z qt110e17cKezyitoVbKbA2pVbFVsK2StpKIxiAIxiIAGdU1qmK/n469u3rW7b22zOt2+17VP tWu1nUu17Xte1qdrc7XtV+17Xte1V7Xo9r2u32vm/N7fm1QB/d3v7v9/Rd95r/P1vpMbGr9z R//ekO16KV7GJodo+y8jGxHTrOevcvIf5PsM796BAzs7PgP8XOKYbU2P2/5uP3tzK8vEb/W+ 99r9CGO288Xqb169ekXr169evXr15G9CAot3dCFqZtdra7xvjkABq/89XGbakZ8hKbyJDqLF Qbt42SQADn+nxfwfl+v4fl/bxpnifg/Q/pIzXc8wI7lAEQw85AEHTp02dEl2xjGLv2P2P2HP eEYsqr5zwR71c9mV4IzKznDNtt2Td2bJu79nu8zjJu7bdyN27Ju7bdk3d3HtWTnLs5zl5mbu 2y7Mbt3Mkkkkk3bu7uazN3f2MxyZzlm7t3INslpZLX7KtkSbpslpZLbJVSWlkvlZqW7JaWS0 slpZLSyWlktuVUlv0Z9Ld5Jb4duyWlktLJaWT6G6bJaWS25VSWlktLJbcmZltktLJaWS0slv 9Bbsnzd3cqpLSyW+N2bvJLec3eSWlktLJaWS0sltyqktLJaWS0slpZLSyWv4V2TbLJZblVJ+ Z/qf63+x16nWS0slrv3ZNpZLSyW+79/nv573vOjGQey89n/aIxgKsQ9m4e/zz2PY9ksdFIoC rf9AzPd+3c5Nkz2ttCyzbgM0wrgfaIQx2GRSEJhX1h77yjNEGtHvyqM0QVURQVaKrBUgPe9y oqBSj320Zoh6VsMIxeqxDZt2QhhRmkFuL3yVYBgzKqsGLMbJaWS25VSWlktttktLJaWS0slp ZFiyW3KqS0slpZLSyWlktLJaWS0sltyqktttktLJaWS0slv7TJLdktuZbZLSyW3KqS0slpZL SyWlktLJLSyWlktsqVJaWS0slpZLSyWjIAIIBAIBAxkAggPj6hZc2I81nWrckTrly5cuaNy5 buXO37d/2/b9vt9vzu3j0e3v9v2/b8/g7ft+37ft63b9v2jOHt+K/y9pt9W/gn2ZvqNvG+d5 7g97zPVXOtwo8UnrNV28eOnLh+8zHr55nO8t48du4ED6MCBA21jDbM5gIfbqeKPM/fQbfpwt +z+g3vG7DlYuDBgwYMGB/sYMGDBgf4N8CCQeAxspAiIoOf4aEBt/y3QboZ9XLjZ+PtpJPJNy 8k8K5BzHMY6xpJz1IRJM22xoWJM16PLBhoM2bMzzz/n/PzMaHkmjkGWMCSTGMQBjGADGMQBj 6JlkAZYxAGMdPlIgq1ZFsFokZZYgDGMAGPFsspEiaapDNliQDFxYAxjABjGIAxjABjoXUM1z JCefsSSpkRkhmSTOnLkkltt8bZm7cl6za20trZd23Kq0trZd29kt20t5N5JNvLS2ltuVVuy3 bS2ltLLSrFtLbcqp9nu+N2bvTrPF87p0OlpbS2222ltLbZVS0tpbS2ltLaW0ttyqtLbzxd3l vObvOs3TbS2ltLbZVT7ySbptpbS2ltlspbS23Kq32/kOTOs6dNt7LdtLybptpbePPmeuQhGb NKIzQ8TN1n2ECLopFHnY973k3vf6pC4s/2CUvWO5mmqzLbKEIRwqYkId/rjNKVw99C1miqoi qqIt8nve5UFRVfezP3Z52RjnNmsnm9+1VhCL32KvTwt3lvO9um22223Kq0tpbS2+HLdWLaW0 ttyv4+3aW0tpbS28lu2+bbtpbblVb+Pkt20tpbS2l6TdNtLbcqrS2ltLaW0tpbS23Kq0tpfX 3TbZbKW0tpbaCN9h3paOnBcv4akNRRRRRRRR8nhw0MKWHDhw4cOG9Np4cOGrUw4eVhw4cOGt hw4fNYeh8vp1/9/9LP+P4PHsO/E/up+F/ansy//fyxv2fWxsR04ycR1AfPn7547zc3NzX+dA gQIEC4W2bxfK83d4/fOBObAzf7LfWJt65ttbu7H3d3d3d3d3d2bz7t3QKDxn23A1McP3mM3D +44WfifD2+mD+E5nA4ne8bKIjNYxZltkzc9r2vazmdetyW2S2zLb+rmJNamW2S25LbJbcltk tsltzKrJbctuS25bZLbJbcltktuTLbJbcltktuS9rWxhu7ktskqsy25LbktuS25Lbkv2+7lk Zu2S2zLbktsy25bcltyW2ZfkTUm4zDEmtTLbJbZltkkltmW3JbchkpfydkYN25LbmW2S2zLb ktsy2ySqyW3JbZltyW2ZbZLbMtuS2zLbktsltyW2S2yW2S25lVktsltyW2S2yfBbtktuS2yW 2ZbZLbktsltyW3Lbkt+rzNzNSTWS2yW3JbZO13uc5ktsnOc5zJbcltyW2S25LbJbcltktuS2 zKrJbZLbktsltyW3CSy2S25LbJbcltktuS2yW2S25lVkt+8+95JzlnX07nHElVkqpKrJVSVW SlRyoqOFRUDnu5nQjCKOGN0ZEYRQOH/vHs9HHnDKyB05iuej0cel1R7PQKekPZ6OPFBHs9As ZWQMCr2ejpdlhB8EcbGVkBUVHDMrI5+B+ZB8EcKlSVUyqkqsnid3m8ZlSsnd6c3iTxNunGe+ 2D4IFNr2ejh9Xs9Axvez0cRi9noGLKyBVSbt1k8LbqSqyVUlVkqsypWS2yVWSqkqphJYrMqp KqZVZVZlVJVZlVJVZKrMqs++kibvzPvnM5yyW2TwN3Zlty2yW3LbMtuW2S25bZlty2yW2ZVS W3LbJbctslty2yW3KrLbltlty25bZbctsypUqpVSqlVKqVVVKv7eWa1KqVUqpVTzNupVZKqV VVKrCWJUqpVSqqqqqqpVVWeq02MBomQ/2Q/Z/mEDAwxoUPJxIEJLITTTTTTTTzk0+w1ew7CU fd7DsOw7DsOw7DsOw6xLsOw7DsOw7DsLHM7DsOw7DsL3YTv4qHlfmg4u/afen/s+RXr9llbP 9/z+sseZW+2rluG7Z7mvcvHy3+P57L80+gO3efAz89/j7WyYrhhu//fw/8G932nbNtBv4/d9 5jb0je3t7ekb29vb29vb29vaP0wNcFJBSAUcE4AAELNgCDowkNQaTbxr+MADpu5jkuqk48PJ PBudcl5I5/n9wO9beSqp1PRz673e9kIg8QET9fernFuK3o/3xmvHCPaDr/1P1HQhI9QBBllb hGPIsv9WWMyMYtwjGOEx3bLcDOjNlVmS3ZLfxpyZEk5zll+FN6Zn4Kc0syWlmS8m1ucTN3/u kluzJa6S7Mm0syW9ZLdmTd1yfvNdJk6WTpw5JLS9jw0znZOlbMlpZkt/MyS3ZktLJLe1Jbsy bumzI3Z+XrkyJN02ZLeTLdklpZktLMlpZkt3KuzJd02SWlmS0syWlmS0syWlklp9DM2ZN3mV Wwkm6WZLSzJbuZbsk2btluzJaWZLSzJaWZLdkt2SWlmS32/b6c50mS3p06cTOJnSZN0uSdzk k5y28klpZktLk4k3eZbdkm7LMllLJLSzJaWZLTZuZznDZktLJLeSW7MnscnOW3kyWlydE3RR wqoigKqIo4ezKed6J5RvPjGQ4h5558Ie+PZo3IO9G8uIxRQRYDhrxHvjcM0XFEI3+kf4hKTC rG9LEHWemmJKTYQKkISHEXfCPeo1z3sOgOEPoHvQR44VURQFVEUceuBdthCQKsRxjse/bgzR A02TgQlczSAilr34qrwNjMiMOMWZEYJI63InJw2Zsybu5JJLdmS3Zkt2SbdjZkt+jbvRJN0s zW6WZLekt2SWlmS0syW7JbZmzJu+99jd5Mnge/5w5JLSzJaWZLTtbmbpZktLJLe1JbsyWlmS 02ZsybpZktLJLSzJaWZLSyS3ZLdmTd02SbumzJaWZLTZmzIm6bMlpZJaWZLdkbMmylmS0syW ln66JN0uSdN02ZLSzJaWZOm7YYxf+mDjFSx0nWRqScrMr169evXr169ef0ej0ejqdHo9GnY6 PR6Nbo9Ho1+jP6PR6PR6PR6PQ53Q6HQt7f2fB839D1XhZnj8vf8Lzvj9Zk+Ov44oePO8fyJL py4bZrh5lu3eZlZOpwOBrcDV1tbg6zue6spDxVJJHc3xfivFZbWpb/nwfZeFzfc49Jj5uX3X /9G3t7e3t7e3t7em729vb287IiJb9JvWPWzfooaelpaDrShDFBEVFIR+lPc/T+76fT3veVRe O7aiXktDrriV4t8PXw8+GxDt4+PVKnOchzm23vKuc22wO1LeSWvzcrJmZloAAABuS0AuS3kt AACNkU2WgfQyS05aALlSS0slocloAAAGyWgB5skkloAAGyWllp4Hb3Td3estA+ZaER1ktAAA AAslv/vb0loBZby0DyJ4vk+ROnS9Z5H7Ge7nXr+gHP0h75KviOvYXBCGEhmROzsLCUIemQZr zYzQLmZhsh78FXIozNaMyIiIiJODNcCrTJmbBm3b8Xvmqz2M117Niqqq1VbFWqqiCTRAVAcq KgKqAAPCloABsl+w3xdoAAdJaAHSS0toAAbLQDZLQC2/TtACIDcyVaAAXJVoAW+hdZz291/4 fCyAITQ5QMYB83xE42K/OfHPGOc55BznPx8fHx3OPj45PHx8fOwc7nc7nc7nc7nK8vnc7nbf O51Lnc7+T7Hc1fr/WPUf6+p9fw3fh/Q8Lw/E8P0niex9h9LxM589fPXr549z2ba5bdnDLbv4 8N3Hjx3/QfQg5wKgCo4+0jhEAFQDrCuZHWl1qOsXNPosXWNqbBdsbHbS61FbS5pVzVTaK6wn MTa6xVc0K2tq2ltJbUWzbrVVs5qdZTmWwbFXWhtV1hNhbFGylW0pWSszM4k4kJCQkJDCQwkO JUhJCSGYYYQwltkMMlwTYjaU7aLmguPc8+bvD3Pz+XYVeOHkypPoq222xVzV1luclK0kJihI WhMUdVZnaN0vq/F6GP6L8vP/k4v7MbF0cq+CALjBBAAEEOrj729vbzx/vb29vb28/3k97OD0 AADTQNeWnH+Xre/9qkXyt/p2ucB4y88R4HeHXr+VYiORDtVQqz3Vk0Zn7xJrhqzWSmclhYlE Jy2GENtwwwnG7LC28thnE1CaIQhzlmpxzbbajll25qc222ctltzU4ms5bhLbktstuEwltltl tl2zjjKnNttu2Eu2XlnGBhnGGVMMMrKypWGGalQwysqVhlZrKwwycYZrNSQwhNZWVhhDMRhC QyExGZjbmWMMzUm7crDLVnEu3Lblty25bctuW3LbLtl2y24TCQy1crCQy2y25xm7ctuEi3It mbbIZvLl25zly7Zy2Qzbc1i3DLtkmststubbltyXbl25duXlysqayagSoQlZKlQkMhCVCVCE qVkyahOJAJxKqahCEJVEhACaJUJUhDNZN3m1WV3JJ6lwJXrNLoqOCL49r3+2QSx36v6rDoxj /DX8ob5oD2UVVLbMltl+2lyTW234mtTd20uS+7m7ttv8jd0t5PiTnLJzdttpbybu222176Vq Td3JeTd239Zum2+3ybvSc3bf4G7ZmW7bbaWUtttuS/j5u7S222220uW2387U3Q22222yVa8v zHOctt9vu7aW0tttLbbbbbbltltttttLbbbbbf9KSSS3bbbbQuSqtttt8npu8ttttClltttf Ju7bJbZbbS222220tttttt8zJbtttsypKt+3t222222ltqqqqqr53hkPfDyQ8hCEP1zzPe/Y MzedEUHvRFb0Ee9/oWeKEIWwHvf7Z6L3/blePfKuA976DM3pMzX0HvRHqqIiLt2Pe8FVbXve +TM2/fhCEMGa6xmhRmZmZrmZk72y713d9Dd222lyW22220ttttttLbbbbbS23JbZbb/w5rJm Zlu+8mbu2222ltttttpbbbclttLb6O7tzJbbS222220tttttyWlttpbS216N2bbS2ltttyW2 22222ltttttpbbbbbaV5VzwvqfH955/Z4/pd/3vf7/f7/f7/f7/f7/zvnfO+dQ4+PjT4+OxY 41+PjqcHHx8fHx8fGsxt8fHx8fHj9r9N/9jV+t6uf8P6/hZP2PB9t4PgeF1vN8Klx+Cg8fQM vay3j/NzXrt+8f52dnPs7Ozs/P2gLmzB8tuMnnG/jQQQ//on/b79zl1tbu7u7u7u7srd3d3r rt27m9lnkCLP/A80XOfoNrDlubEIiKEYi389DuJM4ySpbzPa9rnAD/qzLXW0AWS0D6rLQAAA 2S0ACIAALJaAAAABZLT0fuN3uefugAAAdZLQAAD7vJloBslofeW9e9ukQAdJaBZLQAAAALJb Zb91PV3TpaAB0mZJLbJG9wwkOfVJGbLETNhgkb5TNlhEYxh61RrUkZs2IkZ78RYZs2JHQqSa 1kZs3Kr31i9th27cle31Hb+FcS/pWrx8eE9RZJp0zZsAYxhEcamisIzZsRNJSPHTt25Rsea1 HXXKl57I665TyWlJugHg27Jbtp43idvnO1b2+5enJe7btsAA+9t7sloe8loAAAGyW/MloAAA AbJaAAAAH2FuyVaCIAAALlWgAAAD07Zv71PYBhl6EOC6eOp0OdOnTp06c8nTp2HDaw4cOHDh w4cN7DhmYcOHDhw8OHDhwnw4aeHm4fS0PrfV+zkeLqKfX8L5UHxNlHxPE8X43rdra8TxXuTj YjnLxHWK/xoD949zXz93nPnz/aAue4IXPq/n9zT/P+huHDa5+j5fQdYmjx4MGhgx8GDBgwYM GrgwYII0wABoDPfs5v/EDTNodDEdYwIiV6waQ1R1g6wCHDpKjGBCOZvjOdyZmZmZmctmTpN+ 4nOmeD9LpwB+mlr05JaDw5a7ct7klrwbtm66y0B+ouzafc1JaNlo6yW20s2fZTUyclO1LRyW h9tVv5uSWh2SW23rLQP30ktAAD7O3plSpadJaABZloAblVJafKtA22y25JktskyW2SZLbJMl tkmS0LJaRHjeLuh1lodLQAuW20A+jaAABslWvceT1nOdrz90+PadJaAdrp5k9DyJ16+5+Adv bbGPjLGZE9cgSQHv8CTM9VWER71L2az/LGaU7x76irZ+oM0gHEvrD3vAcWHme97gcKqgOFVQ HCqibVXa8GbZJaPFz4beEIZqr1WWxmxVURlXbfBtAO9JbbQAPEloABsltt9T0W6d60AOstAD rJaAAFkzORERERERE3dmxERERERERERERERERKqqqqqqqqyy/z9M/+PSsvxnCfrvjviv2W5b lVVVVVVVVVVVVVVVUiIiIiIiIieBPA8Dk5EREMRERERERERERERERERERERN3ZsRERERERER ERERERERERERERERN0LIWUAAstAAslp+vy0AAAAnb5Ono+J6Xi9nlev7Poez7Ps+z7Ps+z7P s+z7P1tHnzKfP2ufz1+fz+exz+fy+fQ5/P2bXP5/P4ex7Hsd3sex8WVSo/T8LFcxt/5K8Pa+ CM+8PtcPi+P4/keP5Htbbg2e8zMp9kv32VlP859mPg+D19n52c/2gLm0mx+SFJN9X87dw2Hs W/5zfvodzdu3bt27Jybt27du3bt3OgkRFCzyzvzf8By4NnmbuiIs85M8j9P5POVbuen+r5z5 0tdbQAPVlo2S0AHqSpLTtTkRERERERERERERERERERERERERN3ZsREREREREMRERERERERER ERERE3dmxERERERERERERERERERERERERE3dmxERERERERERERERERERERERERE3dmxERERE REREREREMRERERERERETdO8uyKAAPUrJaABslr+nrLQAP22Wh7VoHSS0AAC2gBZLQAA7U2Ii IiIiIhVVYTLLAjTyyyEYxgRjGBGMKWS0DwOm6AAAHJLQAAAALJb820ADrb7aSqiIl+Zte9cn kCEM2GZvKM1wKsFXSIzIiJ/KeWvfvVX/6IzPVZgOGZmBzjEQL/MQg8AcKqgDhVUAcIoiJewM yn7c7DHCMairnezW1ZkSVvgW8t222+BaAd6ZaAAAABZlp+p9nd7vq7oAAAHWZaWWgAWSTJbZ JMltkkyW2ZmEmSyhZLfvZJs3QLaB9naABuSr+PNp5VoAAe9tADj7BEYwLxjEYwJAPMlPL4sT MOd2c5znhHOc52uLi4uLip8XFxbmHDhw4cMvDv4beHDhwpYcPXYcOGd4fb/A8LznS8T6P2vs +If7Hjav2vjWus4PtPsZHFh52LlvXeY7zHbt3mvM56/fP377ZsmK5wAbPzPem8tj8iCvnvyf k6nqPQOpGDBgwYMGDBgRe4MGDBpj5RgRForaSD7gx3HwUG7oAgHA6wag1h1gGjougJ8NPT8a c7nJOvZ225k7OHTPp/TvOD1paAfEloDsmWvQloBZfozJtOSSdkIQhCN3ZqEIQhCEIQhCEIQh CN3ZqEIQhCEIQhCEIQRCOk3ZqEIQhCEIQhCEIQhCOTdmoQhCEIQhCEIQhCEI3Qsltl5NoBZa 3JaAAfS2ZugAAPMrMloBuVfFs3QAAADpbuS2y0AA7JqEIQhCEIQhCEIQhCN3ZpEIQhCEIQhC EIQhCLZUIQhCEIQhCEIQhCEbN2ahCEIQhCEIQhCEIQjd2ahGTESIkRIiRCEIRN0LJbZaHg83 QBy0AFyZf57d/ez5XTgAH6rMloAB0kv8XaAAAO7257mc55W+vPYnTp5uzdPN9EvB71tGbstG aRBma0Zr/4gzQFW+8ZvWFVRLCjxkREREREngDM+9mmq353vfRVgqvttc96JYqo+bb3bQ7Vp1 ktAAAAAuW3LQAAAA/Bmbm7+R+Vulttttqrb0vLfuvAfEabn33bSdY23NOS986d515x0L/Vni d0A8fLQALaALLQXLQALJklpZJaABZmLcv+cyBAwMTYAwAMQIiIyAMZLNSPiakx7Tp51OnAp5 9OnodPp9PSpdOF0+n002en06/T6fT6fT6fT6fT3KfT6e10+n0+n01dYwnqGQAN3ZfkHd9l3v m/y/Lx2zep7xu5cV6datWrVq1atWrXlls1bQzQ7Buw0gRE5/3c6EXPxXGnoWRF62/2aABYO/ NOfa9w75+vzfPCAD0j4rCELHfs/2b3oiAAA+9kzrN3t5bbT8XLQP3H5EfRn5E/An1M/In7af s5+NO53YA+8mS0DwMtAf88q3wpaAA/76klp0y05LQD58loctAC5b+3t+q/SN3sn0933MttoA AB2stACI/CyZkloAfoySSS05loHm9d0PnyduboAAdct+haB/gyWgAAHd6ZrU/2t25mZmdk3f zZJJLQNloB9T6/sT2J06eyemzer6wzetAZrRqOe+EBm+6Kr/VGbBVU9daUYgP8DDEe/EqzQM Wa/+kMyIiIiIiY02Oe+arjNm48YvfG229rwt3w7fAt7Le5b4FofOmWney0AA8OWgAbLbloAA GyWgBuX9LN/n525zQiAA6y0A65aAAAAAXLQAAAD622eFnoYyTCIkzomYZJxpNbYmbYWrBq0m rBrVNbNbSZtoZha2tzKca2kzW0ma2U1rWozbRazWFmJtWtVzDlaG2xM2ymta1TW1ia2tHMrl tYiEZMjBMmICSVMywEyYiFEtKq2IqquKkYWrIllWkzWyWe/5zKZtpNbMpra0mtrSa2tJm2qb WttF1rjbUZthZthbWttUzbKZtlNbWqbZlNbWo1tottWU1Ym1asTWi2rNsTNsrmlsram0psT5 74Hy/wOxF8D4HwPgdiebQS0Rbp6eEiMqi1Il6/ot1xs4kz1AcIgDnORAdWtavcDh1a1q9wBN K1rWta1rX0ej0et6PQVcwejVV6MHo1VejB6NVXowejVV6MHo1VejB6ND1dejKvQ6QysrKysr KysrKysrKysuw7sWIdjj4+Pj4+Pj4+Pj4+Pj41OPj4+Pj4+Pj4+PjT40+Pj4+PjnkQE8wAIx gYySSobERUe26/7ex97Gn/bg/d3fIk+Tlfez/ufO8f+V/p/+f9z9qGWWlcsNNuNc8c923du4 Z/xuO7hw3gcnPU5ozlERB2LBjEwd1WS2wlen8VneK09AaLg2XPI7/qPPf1R0GG6Gi2+Fl98D A3QbNDIALLlSsGCVgwYMGDBgwYE8GaROwYQoiAc538/n/cfyue7l/Q8fWMOycFtuADu8RWvl PKHb22WIiCIgiMB/DtZIjCRGAAQICJMdv1ul69JM5bbufifidOn3E67Nv3eWg+1loDkvxZtG 222J48tALLQCy0bLSy1stB+Ba2WgD/rtOloAAABbSy3w/F3fB9fdP1OZaAAB2Trmeoyc4EQH MmWlttoABbQ8TtboA5mZkmZlSS0AstWrQAAAADx/bt0OtoAdJb5Pl+VPczp08ydd3s83d6eJ Oj3+kTZn59fUGe+4aI/s98ZrJEXvozN3UL5EiMZKsRrXvgq92IzIiJ/YOFVERNtWZZs1smbd nR76GLNVb4PN3r4W6dbetvhWh3rQ9q093yMzPMZmZOcAAAAf01oAAAAJ0stnJ3kknvGZMnjd eoAAAHbtAAA7LQAC2gAAB59vqTLTmPv7ni+d53g+d2eR4XwfR+D8H4KUZ+/SSSS4lFOJLi4u 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 JuyzU3ZZqJuzZqJuzZqJuzZqJuzZqJuzZqJuzZqJuzZu54rMzxWZn+FP68erH0x7wVh+cVAs PzjGAAaBSECIpJg7MAYDSTOnrS4kutWrVtPTrVq1OtIrYOh0OhT6HQ6C9fh6HQn2Oh0Oh0Oh zehb6HQ6HQ6G3ydDodBXc3/P+H8JWX+/4vxfteLJ5fh+LE9l4vH4ni+Nv/abPHmVjv3eZkPo D7KfvnuY/fvs5+/fwNva0QMWjtkh3QmeWPlt27n+s3bfgbdZ5mpFv379+/fv378y/fv37+Pp AiLOkfU0vrPOHHpr1TrrL/Wtn4raVADu6+P8r8qAEIKL/13Rd+5/csD3B6zlaCp1C0lhqQsm SumKOcc4x9kzszNlmWWc5Nm2WWbs2aibs2aibs2aibs2aTbsTSbs2axN2bNRN2bN/fTn4UzL J5V02NFW8voKkm+yxlWZZE8xJhj0FMKcHg80M3jY1HnigL1SRuXuO5e8tW9zpEmsTtvF7+/5 iA+RdUuH3I3h7BfIhi14zvMJPapkqme3BuHBd25ckkmabqrTat+e1slVx1Oou8Yb8w/Q/ReP IxGGQQZhhkE3Zs1E3Zs1E3Zs1E3Zs1E3Zs2zDDLJkyqssmTLKT9tYZlSeNr6YX6n3T4r1D3I b2B/gMsdyPmjJGOBJMRFEMCAbAaqspWXXkQq9GvX09OvXr169dTpzen09/p9Pp9Pp9Pp9Pr+ n02un0+n0+n0+s6dXp9Pp9Pp73T+ztfHi/Y8GnkeCwnueL7rxfZeL+/8z0mrzLfi+N42O8zM 7NxnrvMyX8B/nwIGbn5+fnwID/PQ2YG78rysae6bt/vOLLpu2g+83Nzc3NzW3Mjc3Nzc3Nzc 2NzzNB3okRF/Zn1vy/PheE3xoTds3xQRF9F5F5FzjyLdnI5HhdxjS25MmJ6v1eXkG5YVdvXi 1yV9HXXsmFU59hgr08mMlyXylmTJhMMMFIpg5XDCeB4CvGGQQZhhkEGYYZ4oo95s1E3Zs1E3 Zs1E3Zs1E3Zs1E3ZkyzMMM2ZkyymZY4GpjJvugyMlSqVUqlVKsy3+MlSqVXmopj0WHhPO4Zl VQgjszkrCCFimaDCHXp6A3Z2+uNIedrfzxVeKLwSfeKQEPIh65hMm+J5fWJxITEiJ7B52waA joCYIbMVeYKiKcs2kgPEhitMVMEiIII7xHiFTMYugo8hAYZBBmGGQQZWEbcoo94w0ObDEOk2 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 6s8VSMxZmo3ObGMYJPyU+2ORwZ+kaG5+468zpqVj4uiw8Qtw9bLhbzxLd6Ytky0a8SMiFLyF TsVDBaWC2H4FmI4jYuy/Br0RV00wbBMcVEwq2KbsVmjhzqPVzg/NAQDDBXDvBB33Qw0AYgMw nBYptZxrTp2POnSJ06dOfTpz6dOv379+9evXta9evXr169evXmb169el3r169evXr17w6FLn eDj+LJb0fF8Xw3KDaGPf9ajVq1atWrVq1atWrVf1V64qgOfOZua4GdqaUKHD8XxkHWo2dDLF gRBYGmBFywRlyN15d933fTN26x2Cx1qpz6nkyYYm7klmFO57rDJ3UmIdjJoTEPFSo0Llv8cx 0eIGNbGMYR3lcwI4DijnoO11geIf6/j8S+MeWiEDxqsBYpYwqEFf7B/pHf55C4vXvS4qspiy eK7chiy1R2W3Fnpdir0W9d1W2uW4xE8pCzc1Ju1g4tHq93jNSPLcPEMs1s/0JEnFh6SSSSSU 5RPVTk31L9BFW/fv379+Tfo379+pTv379+/fv0r9+/fv35/830z/VbfWgfz/zOB3CGShi4ve ysSlScUusp06dOnTp06dOm7ys7QM+bZ31cZ9D4OV1uLw9tw8/ieP2vwlx0+THezve972Zn4n +Mw8eFk/CSp9u/5e9fiv+Xy3sHCfmvx23d7f4YWH1yWPN12fV8SZP40sN9CuI2+JP45TJUf9 yCAWPLipksjSSKeV5/FxiJPKeVxm8Loshz/P9C6Nm6bHXv3mbnor6tgsi9pj3iemPvG9aQsl krSgLEUe+0h2JZcL7bfEN7B7C0EcbVWh+h0rshgl9m1m4YNBMoLkn6g4W5sqsaFt3thkpVk3 dwv4V8xZuqk+iWSaWWJHO1DtLyO5dy7lrO5dz3L375LS2yecfVPuHPPNPNPNPNPNPZMzMzMz M/694136DdSSSdWjydBxKDqqDydAH5aAB+WgAfUQAPy0c5x3e55V934vv+dWta1rWtcK1rWt a1rWta1rWta1rWta1rWrqUpSlKUpSlKUpX7/3/v/f+/2S3Zaurq6ur2XZdl2XZdl2XZbPZcf ZVuy7Lldl2XZdlTZZZZZZnggcwAAOYFHbdf+r4aQzBaDw1B4ag8NQeGqRnoeFK5vhtvAceEb xEA6N4f1zYwEF/lZ2cwxksMMMMMMMMMZ8fRjx4+dH3NxAUU5HnlpMmTJkyZMmTJkyZMmTJn8 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 5aLYtq2LNbFmtipKc1sWa2OWdgyLNUnP2fX9j2va6/U8v8H2mZ//ug9MjX3vuJ4TrMeyeonq PUenmYzuosSw41kJJ5KxAWyIlqCFsC2EthGUSaa3mHMOO3jKzWHi7Iy7PEOLS5LiZEkNddC6 6MrrhxaXJcTIkhrroXXRldcOLS5LiZEkNddC66MrrhxaXJcTIkhrroXXRldcOLS6K3EyRYNd dC6EbrhxMuS0sIkhrbYW3RldcOcWlyXEyJIa66F10ZXXDnOtLkuJkSQ110LroyuuHOdaXTW4 tkJYNc110I3XDnOuc7+Iio6iOcffDcyJ+by6dbDx+P8J/OMezuEieMsT1y/v8BKWnzl4siN7 yywYsvU/hGMVKY3/XyceJHB2o4cCo5znCI4FRw4FQcOLty5tnfjil23ZCEnudbb+kC/OO1LT t7CEIg1BEEQPRJMMh+2baYnieJ4niYJ4nieJ4bhuG4bhuJ4nieJ40izTRc2rbt50OTAt27du 3bt251vmczmampqampzOZzOZzKnM5nM5nM5nM5nM5nM5nM4a9evXrr+fQ/k8oLa3lt/PDyvE Q855V0W7gd1q1atWrVq1atWrVq3w/D9YHHft7+/x7u/6fxGGGGPKTJkyZMmTJkyZMmTJkyZM tIkSJEiRLbS0tJkyY8efCW/CfCP+EaW0MvL2htDL2htBw87EXOxD7sR2IcwNcdiNC+NgOIN8 KjS2xCDjXxHiOniOpDp1Op06nUhz6mpz1DUIc9Q1DnqGrucddeeuseeuvOWuseeuvOzXWPOH Fd66LRdi2rgqTnYs1sWa2LNbFmtizWxyzsGRZqk59np/zd8PcPa9hPafD5owkV8n3T7p90UA JWXpZo55P+fz+eWsNwUCuDFFYXgDAaZEOBu2H9gAfFEFTxneNy7Id/hGWHkNRznIBc64mRJD XXQuujK64c51rrSwiLba+22NrrbRznWutsEiJba+22NrrbRznWutLCIttr7bY2uttHOd+yud cTJC3XPuujc679peOc651xMkLdc+66NzrvZ/nn70/bjf1D/UP4Z/yj9U+IzHOdm7M2mIueb8 845uztHOda60sIrba+22NrrVtHOdaf1qXEyAt1z7ro6c09vppJTk7joO6+kJzB1bN0tuQiJJ tsdP4J1XjX0g9mZ9WREf/kntse28iWvF5Fn3CIyMSUgPkVh+yL/vE7SILdbcX2RfddZK8Yk+ R+8bY3jc5D0P4ApqdTxnadgyhqCIIgtC0LQfi0LQpi0LQbBsGwbBgWhaFoaBPzS9eZatQ63K PyuU1yuVyuVyuVytrrOxhw4cOH2Nzsexvdj2O/V5OVycnJycnJyXVlllllllvoeV+Meo9k9/ G3+f/Wb5rbzeRmVKlSpUqVKlSpUqVKlSpZ7LwosV9Fixc+Ltx24bjx48mTJkyZMnMmTJkyZM mTJu+YiRIkSJEtLS0tJkyY8efAW2/AfAQ+A+ghT6D6Cn0H6RDb+sfszL9Y/WIbv0jkcPun3S HL7p15/SakOepqc9TUhz1NTU1H8uh0OXQOgQ5dA6O5dA6BDl06cunSHLp05S6dI66687NdXR 5w4rvXRaLsW1cFsWa2LNbFmtizWxZrYs1scqSdOamxUofgUv/TIKClj984og8gDty7ft+3L/ Qh0yHxy6Q9qQLzRaIzBBCHTi/prHV2v5w5zrXWlhEW219tsbXW2jnOtZLSwiLba+22NhbO0c 5yOtLCIttr7bY2utzLhznXOuJkhbrn3XRudda4cXCOC51xMkLdc+66NzrrRznWkktFIi2222 wtdbaOc610y0iLba+22NrrbRznWutLCIttr7bY2uttHOda60sIi22vttja620c51w74/6pE/ QcH59X8YnX0TqePt+wfZO3udulLvH99heW4YWlp+hEst8hcfG9j8QTExvxWu3djjhfHZa1Ux KX/xmHcMCn5b23w4fT9Nn0/Ts+n6fp+nX6fp+n6fp4sLMhllnDhw4cOHVw4eDDh63Dhw4cOG 8xZaZs2bX4fxcr+rYQ/F9XwENX4n5M74OIOljVKlSpUqVKlSpUqVKlRZauPa52cDQPLhIQNM 3lwtV03sDKyrA0wNPTdiEOYXM5nMJcUBwkRRgfrROH1AmNgVQ5XC4qjGAFsEXW53RE/sQPR7 /aO3ynm8x5yeeed53tETeefO0vBPQgYDSvMJrcYWlxYsrJbNlbbraXFtsLb/zgPP9Gh5zhKi o3ow9GPL6v1fqqqvFVdNVVXdV3d2Ru7u7W3aO7u7qae7P3a27R3Z+7u7u6svu7tjd3Y0BP3n bt8lugndUUUUUUUUUUyFFFPq/2/tQzn5jPm/1bgKpvFvb28XrgwYD6REPx/z6ez0UvDILakm 1LZJtJbErY2VS2kfv60nMLaBbQNora2KbSRtVVtEktRLUkmJO/eKe8bLzDyj3r7h7171/DP8 k/in4Md4Odj6m1E8//E/I7/G7zjv9k8PLGJ5YisPkQiPhEvvfCEXhZ2BE25MRxjEpmNsiTwz 3OJPnz58+BPnz82fLn8Onw8PDw8PDw8PDqcPDw8PDw8PDw8PDw8PCpw8PDw8PWdZrBMAW+FN NNNNNNNNNNNPMTToCgHooCgHpqamWfpDLf95O87zvJ4N0ziN4RN5ZI6yg8b3TkO6eMZu7d27 t3bu25TTVqp3EOLvMmdwcrcZJ5FTNmwDt7pE3buSA9ODIaWLpw4eJlStSVKlSpUqVKlStra2 tra2NrY2traibW1tJbOzs7Ozs7Ozs7Ozs7Ozs2tnZlltHOc7g5znOc5znPjgDaLa2topoDjT /09aPwUdpPix13YcPhdMx2NvQ9p2WXZye/NDLtxjGaXbucfW1nWtoZetra2tra2tra2swwww wxGYYYYYYYjnYYYYYYYmsMT2GGGGGGPvhmUkkkkkkkkkkkkkklm0BQFAUBQD0B69dAqBPwyy yXwynVOxh0jlTjvgU3CU1JJJ+u2X6zZfoPzXzn7DzjxTg8fuZMY1eNzGbof0wNT7SNKwO7pP dbjh9o8Pz/RaM3O34iQixSBTJPvwAAA4DnfzGzxy913Wod+fJSSSepJJQHp7169evXr15WJe vXo969elXr169evXr169evXr174V8JJJJJJJJJJJJJJJXpN8r7JdcQk67ws6A4vrnQufabnX NulaPRvqW2h2UcjdWr47eBvh+OHaj/sDo93d4+18Z/Jd5fLf5b6YeWnlrWta1rWta1rWta1r Wta1rWta1rWlKUpSlKUpSlKV8vl8vl8vd8nyfJ8nyfJ8nyfJ8nn/J8nn/JXlVznr1069dWvX oV6K68SaqPeT56qiiaR8cgQcmABjNjAgU/FNPxvCW3f9/1/Z/q5+P+7nPvgcr2n1vsczj9Vp +xzN+BD1NS5q3NS5rXLly5HuPBCEcdA6FqGpqfI76TcPhaWWCzvJ0nSd5MyN23eEeHZDLKRR wIARx/yEwb+xZmZmZmZmZlVWZmZmZmZmZm3d3d3d3d2d75/JOr767V69OTst3p01zU7G5Nc3 bdttsbvW652dk7HXS6uzedOk3nTd0tVGhBWFjBIsLKEnvikGjY4+cQAtHOcg7tFOLpOHYLRq 1Jx6mgk8qTQxFsmiqN1SGFP64o31hkpM95ij3MWSxmZiTjZkR0SlSh3qyZipPfJUhiVIqy1K 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 QMkwJckhNHrYI9y/le0fnv0nm377TeneeaO3VwJYw+tTiQZljfWJLYZj/0P3XpuH4xHG0rfz 7j1P0cTms3Eul59zXhwN7ncZuJrZDubOnTp06dOnO5069evXr169evXocK9evT7169evXr16 9evXr169evXryV5NNNNNNNNNNNNNNNP6Wa7oZuXfK/fvlp4gIAVDECL/wxAUSFVusQLIQMYx tosoibNphBkN22biY0OHiw4b6HDhw4cOHDhw1114K66666666666668hdddddddddddddddL 1JVE00000000000000080UBQFAPhQD4B8+xAAuS665TxVE0d4RSR8ACEP6jD3g5A/pOcfWP5 ZaZ7u7i55pxijB8jj+dzlKJ8jSc5EHD3tgbGc4sGC6zI+VHjx48ePHjx47TTWi1GgtNNNNWL EuxYsWLFiwlYsWLFaxYsWLFhJpJJJJJJJJJJJJJJJL6gBAETRNNNFVBB5UMa0RCaKtVw4zoN cg2WDhDyx9gibtsV1iwoWLChZMKFChQoWnp6devXr169evXr16+xrV69evXr169evXr169ev Xr169eenQnJpppppppppp11FFHZAAEABRBgCoiiHwoh6A9e4gIUAuS665Z5EmNgTyJYgzHQC uH/HDB/sdj8aOM9xHH38nEqITiVEW1Q2W0i2SrahW1EbVRbStjYQtpLZbFWyrYGy2VLajYNp DwTL56vb/1iDggg56A4OLIjB6Vg4bVOsvJY+/zOHOd511k59upjPpOTJkydGS/dyZMmxrwrF ixYkWLGxYsWLFixYsJ2LFixYsUbFhSxYsWElEkkkkkkkkkkkkkkkqGaC8gPDANE000X7wxPz lxAveC6OiO+Hx3tH4z8Z7l459LN0/kymGr4mSSc7vrcxjGHkIo4lZs31vxw83m83m83m83mx u/E8NvoehsrWta1rWta1rWta1rWta1phfdbPExBl4mXi5eNl4+XkZeTl5WVlypUrOlbe3t7e 3t7elt7e3t7e3t7e3t7e3t7e3t7e3t3Lly5cuTZsURSIgmYtgwE4xERJNwmgmntmx8fFUUUy VFFFFMsvqR+rnlsxrSJoSNCwzCebQn9Lvp+n6XfUPRMTTERw5USN7ZuKRi/nvxHfPynu3vn3 T3zeG8bkbqHEHbzwTLicXDr+Jlbk+Fcsu3MpHAkJlWrRyMzuJGjoZfB+eEG2pkwYkTFe6+tr 5uvm6+u919eDbt27duXb1Ldu3atWk7Vq1sWrVq1atWq9q1atWrR7ZznOc5znOc5znPbK2uuX uiAbEB7QiC/+IKsQ/aX1gBWWf6C5jMkUNs2DREghjGdOMSHDdQ4eRDhw4cOFChQmGGGGGGGG GGNhhhhhhhhhhhhhhhhhhhhhhg8xFFFFFFFFFFg5zn+UABPE8Tw9E8PQHr10CCoZJdlkq4SF YAbA0wQbgd+RGGRt+IcqsGu3OEPFFwH8Lc9gIL0SULN++VO2/tp29vbXt7e3tXhrrrrrrrr6 y66666668pddddddddddddddLoLppppppppppppp9V1XVeCk7Kdl2XZTm5qkT+mP9AOEyIni h/pH/EkySfuqvnTUo+Y6VVe5+d24k5+44Un4tXtPnaqsDqk+B8DiT5DUnl83FJ9AhdJBs6kY kiRiyJGRIkSJEiRIkSM5/Zk2bNmzZ1LNmzZs2bNmzZs2bM+zZstNNNNNNHsnOc5znOc5znOc /nqBUBQFAZwoDOAzs7IDi0Vq1aLHOP/xTR+sFpjUhhMRQcIhxNH6B8wTRjD6oBgX9pFYItP+ MQwRCDnGM3CCDRBC2RGbNyBavqwCQbNoUSJExMubNmzZs2bNm7E2batWrVq1atWrU21anJ2j 2rSVq0latUrVqpatVrXWT0zEAgYGJlAgmmmmmmmmmmmmmmmnmEQAAALIAAAVVyrRWrVovEG0 Ck4Lr+wWSSYkSY8F5J/K92++f+35T7155/+fkO5jjyOr4nX31hZHAUiJI6PgY1SScBJM7oc9 uDuk0ESLwHh4dLwsvyO5ZAf1tVEfS3Uz4vg/mO13XUV3WteGqq1rjjjijVcVxrgo4KK4Cjjj jVVrVAUa1oDRVaqiq1wBqgA41w982ovS3eN6c43enLu84ct1o10cs28obts0pdlibu63Nl3d uzbIm7dTd3bupU2bu7LVGbIGQIyCBmxja2MMp1kBwEIua6hzsTJjx506dOezZs2bdu3bt27d u3btO7doS7t27dl3bqd27du3bt27du3TuSmooooooooo7pznOfMVCoVajrGoanA0SfVHjZ43 xvjZmdY6R+Y59x3Yu3evfyvYPKth+g/FeUfnTTPICvezup5xIfo2R5jHgnSaLmXH6vSnPSST 8ZBxGRvgoskxpJkDYhAiLTIDHbt75ATsptj4uRKlYuanmJvU08tNNNNO9evXryd69evXr169 eq3r169evXmb168ilevUb15LgSSSSSSSSSSSSSSSSn3yv375UQAuREKxiIswxEGGBp5jh+MT VxCAJAcBkOAtDj8SI/4mbl8bs3WDhx2QijPWULPF4rKeK/xZsKFlvYUKFCXXXXXXXXXXXXXX XXXXXXXXXXXWOsssqssdc5znOc5znOc5znVCoVD0Kh6A9e/zhULkuuuRx8zLBSh70DTA/XFT 3jspKcZxnHYYqsMMVWGGKrDDFiWWVE/8Zs2buZZZssqJZZUSyyqwwxt0dHVsqvsn99xOksP7 eX+s/n/bz8W9z/pzn+nD5zk6P3V5/Vw5++bz+fgOq9VCD7Ldb226XycZeRR/3p8dunMMTEsu WWXLLLJZZZZZcssuLFyyy5YgEMvMVxcbfAyUHD10ijiR6GPQy8vLoaFChQob9Df39/f39/fk b29vb29vb28xvb29vV9zer729vb1PePvnOc5znOc5znOc+bvFvb28XuypimgC5u/bUklSSf/ w7STfNRqMMMMGGGJhhiYYY2ysmTEwwxMMMTDDEwwxk1QK4Wnbg7I8JmzevjO0WltlxMMMTDD Ewwx5+smTEwKK5RRXKKK5RRXKKK8/x/ynAo4nOLL9ff9fu7rIkR5EzMmJEiRIkSxYsWLFiFY sbFixYsWLFixYsWLFixYsWLFixYsWLGsDzkUUUUUUUaBznyjnVCoVDwKh4A9euG7uwVixYJQ bAWBf10xpHFiV1SSnNTiuO47Ewwx+cSsmTEwwxMMMe+VkyYmGGJhhiYYYmGGP00cLh8/2SP9 +Ok8voHancnclyyy5ZZfkYmzZcssuWWXKKK5RRXKKK5RRboxaS636+LxWZeTs31rTyeTyeTy eT5fF8rDEZhhhiOwwwxMYYYYYYYYYYYYUYosMMJHOc5znOc5znOc/0g7Wdr2vaz9JPWI/Vn5 k/JTeN83zEwwxMMMTDDEwwxMMMTDDEwwxMMMTDDHX9hq9o4fZW8fGHiDSdydyXLLLlllyyy5 ZZcssvkJs2XLLLAgEAgEAgEPUVE8XFskJdgg2zMrNixcWLFfRXjx5FixX8WLYsWLFixp2LFi xYsWLEaxYsWLFixYsWLFixYsWLB1TnOc5znOc5znOdUKhVqOsahqanVu1na9r2s6d1DkuKjW cJwmJcLjDDEwwK7JhhnKKK4xYYZnDDDOFFF+AcMMM6Z+kIY6IihN3wDrd0Y9YjpCEy4uFUUV wooqiy5Fi5ZZcssuWWXLLLlllnJ5HZZns5DDFbYhsZzjwIDrNh5cPMzMyHDhw4cOtqVq1atW rVdaFVq1atWrVlVatWqnVq1atWrVq1T1vTpJJJJJJJJJJJJJJJLEsssXECH1/oggB8giBDs0 +5T5/34/JR21kQkknG1AHbONe3h2f1mbN0PsbNqRsgnTrKM4cOcmO6jx48ePGexo0aNGt29C 3bt27c63bt27du3bt27du3bt27du3bSt27ds9k5znOc57SSSSSSSWXPE8Tw9E8OCevcYfnGh RqvEeI8RNx2KeCdK4qP2pBAOw3WjbvMY7eNSQNm2jmt2z5s+xH2JkQoUKFkwoUKFpQoSyyyy yyyyy0RZZZaOssssssssssssssssssiiiiiiiiiiiiiiijVUTyaxVqxPCL3hwMeECIetH9Kd V/QnYp63sOx7KTfSI3WVvucY7YuL2p+akkdwgB39/Hv/dgeHh4eGzDsyy8vlyxxxxrWta1rW ta1rWta1rWta1rWta1rWta0pSlKUpSlKUpSvl8vl7PL8/z/P8/z/P5vD5/n+f5/n+f5/n+ez Zs2bNlpqi0000000pOnIJKBRBRSeHRBMw61miARERERFadZLmlSxaVKlSpUqVKlSzyIg7IiL PGeM8Z4fAPn0ArVnQKeO+Im66ZUTjPgxx3w5TM/EJhgT0KVv99yMkTA2S9l+A26EQ/AddXUX zw111ylfHlS2cWjB+lUk8QLBnsHhVeC5p26D6XNobzKy4ULMeyHsiRIzJD9/IkSLNmzZsyLL TTTURpqY00001KaTaaaaaaaaaaOqCIiKzrJJJJJJJJJJJJJJJZtgrFiwSwJyA7pmNWqgCrV3 EHOcyDnSVXOciDnQku5V/wtfsuBopJ9vTpPphf058+ejo6L3SWWWWWWWirLLLLLLLLLLLLLL LLLLLLLLLLLHRRRRRRRWOc5znOdUKhUPAqHoD17RIKjjACxLLLEkP5AWwM0DTFckD/HBA/G/ 4Qf631nG3gieNVRPmccuPf3/pGMo6y11u2eS+mHk8kaNGjRozUZpppppppqS00000001Oaaa aaaaaaaaaaaS8qgmmmmmmmmmmmmmmmnmz3iBWCsWLBNwCKYDECBgYAAwMBVIxAcrFfG+bnOc 6tDrrh1avmaXzWJcl9A0mSWaGhgaCnx+NIIBgZKlUie68h4z4vfSHXK9DzsoWhnh6I4jh6I4 jiOI4jiOI4jiPHGfHEcWhaFoWhaFoWhaFoWhaD/StWhaFoWhaFoWhaFoWhaFoWhatBK0LVoW haHtR0h7wdsO+HrB6wf7j4NoZv7fas9iPaD/MOPajuh/cOgPVP1H3b6D6t7N9S/sfev/b+x9 +9U/VfEeleV/Beoexewefcx/4++ejejf3PeP8HzfWvVP2nv3rntHv3u3gPsH/1/8fBfuvkP/ v671n+T6r+l+a/naOt90+ue0fiNn959X/M/FfmPh/CfXP13wnLfjPhP+fn/dPhP7n6D8V+c9 0/Dfpv6XvnxNzfcNXd/7+5f0v2mX7L3HzX5T4T+18N/C//n/b+J+e/mfDfrv536z5j/p9B8V /i/wfpv/j5L5T+Z/K+M+G/cf1v8XzHxX+D5z/p/m/qf5v3/73w3y397+581/o+Q+U/8fOf1v Af6tp/x/S+d/a+Y+a+U+e+c8B8p859B4D5b/j6D5X+7530HzHzHz3z3/j/x/02nzn0G0430G 03//3mv9f1dT+DW85FfrKh62JJtbXydra2tra/w2tra2tra2tba2trbbbbbbbbbbbb4v85tt tttttttrWvO1rX6jWtfGbm9tvb29vb29vb29vb28fLOdUKhUPQqHoD162cO/aF87+f+clBQI hLGiJBAeiH8I9oPZj7R7V/7fYPrX1jTf9SU7iT+5ZSphZ6GLJP45ZVE/XsOZoncVOZpOapD7 ZUSczliYxhBc5yn0dZLyfIp2yp1I8bPHtyleFUJ+ZZBPkFgj5f73v/a/odr+l+bt/Xep/1/g /N4/iu7d27t0ju3dtDu296d4d3bu3du7d27t3bu3du7d22m02m02m02nhnmn0babTabTabW0 5O06vabTabTa2m07ptNptNptNp/22m02m02m04Xim+2m086862nlG0/ybTabTabTabW08dtO +2m02m0/7ehbTabTabW03m0/6/29Dsv8202no9p6Xael/1bT8BtNpvNp9P8x8xtNp6vabThb TabTabT2j7htPtm02n3DabT7rabT7xtNp7Z9s2n3zabT8BtNrae4bW02nttpm4HLe22m02m0 2m02m02m02m02n8TabTabTabTabTabTa2nvtptbTafsNHabW0+DtNrabTabTabT5Tafvtp/o 2m02m02m02tttttzbbc223Pifkf8P5r4n8fu7u5ubvtvb/deZ5nvPee77/F73xeLxeLxeLxe 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 q/dNfP3t6cmjCvk7VNYWsi5cva/H9k6sp2r6iY7aq6lLWC82pe+7duhrI5qbDkstTc1XAYiI h4fZdz/9nvfUa/8X9X30fneT9rqz3/qP4Pq5nnfxfmx7np+vyf3/i/8/NxWf8Pw+2x/+vk/M /b+X6vy/mvtOjQPBdNiGMYJaTplHM4idtYM1kpG3amsaVovsG6yW0j7PT9IJEksoWTOsqqUF QqKsHv1Lw0XFHVajrVcx5uuG0OrDVNDZVr6RVepkf6nXCu1Llkkz0jutLEnj6M6kyqGKjPfK pUyJLMrIjCi2D69+26VvH8z8dy39D9p4Nt4STTRKlU3FRI+icHZz59/n33dd5wuF0PB7zvuy 77ed9x++77Z8ps7Ozs7Oz3fd8zu+74+7v2u77vmd33fd4avd933dfu+77vu+7OQYAEo5znOc 5znOc5+pI7L6Xg0XeVLPkz+jndP6znvPVd9+vM75/lZaXt7vaY8D1L/12P5r+mz9T0jUPa/B 8eY9qw6Oh9l5n5n3pE+PpyffdbKf6OJ8bNfSv2fU+n4Wfc/t6DHlKWvB/w+3qfP/687j+bd9 Tu/V+z6uV+1t+z9f6f+suO9Zb/T/Z7ztvWbWj8+5HUzPK07kbR/kTgf88l2hbfd76v51+5cw aX9Xr7vs/13Pbfud17LtNj7P4Pi/8O/7vvew9D6GSQkmpPV+39vNToJJ89B6So+38l6rzmv7 D2PrPJeL28OnTZaA5UnnN765Nf6aSSfVyTh8j77/Lo+O5D5j4PzH0zs37r8d8x9O8m+Y+Y+/ eneQfZPbvkNTvGt/a+K7J5B/E+Y+Y7V8h8R8x7Z4l3L2z9t793TyD3L3D5jxrvHzHzH4bx7y 34bq//rwfmH8L4T3T2LzL4rT7x13ZTw/h1xE/UH2UzZsE8OBSfpEsn318q8a+/fYtF7Z5l3b vW5bdJOl4bo2o5J0DnnOIgxNMe40CX38vjz/eaGlxQdL2en7z3kPo+41fePontvkfIjdp7iR x/I9H2XyO3+R0/e9L5HyPS+6+R1O29z77zvyPke+6vyPkawUTUTTTTTTTTTTTTTzE01CHdPH j0jBANw3GoampnzetnJ19eavVPijpH1IGkBxXqFdlFO8gGW8bD6ALxC2RPeutTSqOFTzNf2/ w2DIYzbFdYmJiZGRkamUA7MQK6RUM+WMYxInQWJlllJJOck95/N+14Hs/vdP23ufjPs33j9Z +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 IOe9ERPjB3Zx9v7h7Jzlz38+fTDHp317+/v7+/v7tZ/Xr169evXrwq8ivXl19ivGrrrrrrrr rrrrrrrzFK8053B25znOc5znOdRNQl5K65Zr2jTIhnAkPB+yFSGQ3bB0ggEENcIIVQ3AOwTk Q+A+zf8P2XYuxdi3bscmTJk8m+Q/1fqPKNbk8Pk8nk+f5+7l4dfD0fR7K1rWta1rWta1rWta 1rWta1rWta1rWta1dXKysrKysrKysrKysrKysrL2NjY2Ni1atQ4cOHatWrVpK1atWrVK0rat WrVq1atWrVq1NmwUwmmmm5cfiqTHGM5VVVVVVVVVVVVzs2mkgEwgEw4qByOudc65+Q+wfgvy Gv9i+3dw7h3DuGpqNRqNRqNTUajUajUagD0B4A8AeAPAHjx48du3bt27d2hHGuNca4kASJDc rq926XMNw/UjtHWvKp059lH0ULGH5JN3qYybdPuD9aGDjtbW6rwfjpG43GkYxiTwnCzZm3cH QdrXUhM9ng7Ix3kZmUQ31hPpOjdG6N0bo26ch0bo8mTJk6N0bo3Rsx3pQNKVK0acOnBp06er p06dPf39+FChQoW/v7+/vy9+hv7+/v7++pW39/f39/f39/f30znOdZJJJJJJJJJJJKcJwnCc JwpCkKQpDcG8N4bw3h94+8fMfMfMfMZGRkZGRkZGRkZGRkZBkGQZBkB4A8ePHjx48ePHjx4T hkRd6pvbxWwAcSdj4NwE2bGN2PWDofTH1jf4wv9bOP3vz75/9y6CRhKEpSe+MZSkqxhCUYwl CMYyjGMYylKMpSjCMYxjGMYRhGUIxjGMZSlKUZRlGUpSjGMYxjKUoyIwlKUpEYQjCMoRjGMY ySUoylKSQjGEoxSMYxlGT4xjKEkfCL4xlCMYxlKSSlKMoyhGMIQkkYxjKUiMYxjGUIxjGMYR jGMpSlKUZSk+MYxjGMYQfCUJSlKUpRjCMYxjKUpSlKMpRlCUoMsZSlJnyhKUZSlKT5SlCMoy hKUYylGMWhGMoRlGMZRjF8IxlGMiEoxjGT0jGMpSfGMZSlKUZSlGMiMZSlKUYxjKEXssYxjK EINB8YwjGMIK+EovjGUWlKUYq+MJPjGT5SlGMYPhGUIyJSlKUpRhGEYRlKUpSlGTSlKUZEIQ hGMoqkYxjKSyhCEFgiDQjKEoxkRjGMpSSUlhZZGB/nAfst2OP1fvQ/NDlCjg92SJIkiSJIki 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 ZZZZZZZZZZZTZYZiCYnYOduc5znOc5z5Zzqh2FQqFQ9Ae/IbODOv+3RGDTRPlBsDiOPgdzxP gAvcO+NyOatK7ds7ta6666666666+/7/v+/r7/v+/79SpUqVI0qpUqVKlSpUqVKlSpUqVKih AiIiIiKaogCIERAAgBVMQIhsJJOUkkkkkkkkkkkswgFCp0ynlSAVdaxEMQAeGCS+IQHwwQxa hs50M/TFUVgITi4RAzjFe40LGhQsmFCyYUKFChQtHUWWhLLLLaiyyyyyyyyyyyy05ZZZZZZZ ZZZZUAFOUQCyTdJJJJJJJJJJJJKeHYnieJ4eh62I4WWL/gEWwJw1wYf8EBogYd5Jh9BTz5mR 2JyN/bk32/vMZDtpHEw7M1uDtts/xnEDIy9XK1dXV1dV3q6urq169evXj169evX1K9evsV69 ebXr169evXr169ddeYnXOduc5znOc5znOdMl1ypEQxAVEgHecPv0ypUzPqgxHTjJc6Ghj6Gh j6GhoaGg80NDQ0KlSpUqVKlSpUqVKlSpTp06dOnTp06dOnTp06NOnMTFRNJJwkkkkkkkkkkk kkqHioeKh69xQoHA8MqpVSQBThw3/9Jw36NPtK7BXkE/hf0x4/mtW3wfaTfauftjhz0H94k2 tB9DoPsNB/n6D2Og+50H2Wg/faD+hoP8fQfh9B9noPrdB+S0HzOg+FoPptB9hoPndB+C0H/R oPptB9DoP2Gg/BaD73QfR6D7/Qf2NB+j0H4TQfxtB/E0H1ug+o0H8nQf19B6+g+FoPmNB9po P/XQfPaD7fQfrdB+w0H4zQf9+g/s6D9DoPpdB+p0H7bQf2tB+J0H63Qff6D/20H95oPs9B+5 0H4rQf4mg/oaD7XX/tvu3PWdbf/f9zcJCdl7/auPROHHXmdIZ+Rx8HXfg/ydkAACAGSYz3E0 cflc3JyMnki8nJybHJpdgfqwJ/V6vVrdXq9Vrq9jIjyer1b3V6vV6zq9Xq8zq9Xq8nV6vV2F ZqjZsCAlnO5O5Oc5znOc/Vn+sJ2AQVFBAFQL0JehLNbkAEV7XD69kFcwI+j1+Mnte10nrNev Z66RXvOHjgqlJYhv7IEH5chX0jbPBt2zIy3U27KBohIhZOGwaKyQmVkoltsmF85RzhKVfs7I vLmtHtlhiHkfabcT8IttttqameyJOcv7Ohmwx0ksk/qRIkH2/2UiJGJE/U/3ZzJzP9CMT+Gf o9zK+L6RusvphhSjIM0sKW3W0upbAwssmUIECFCMSNCV1koxjCEGnSxEpfg8o97x7x5ZIskS IkbaUsJSlGJGOFKQIDyjx+EIkTCROwkRjEjGMYwfSN6i0o95R48ePePIzoTsLJSlSlkowgQI X0wpEiQIFzhzijhzryVL0a88L1kXj6sLz0rxseeK5luwYpbJuBGLG5SRuZIZKaSQwrirnOcq AiOdVw5xhaW2lsydglaUpOymD5RcOMVVsML/J/VknO+//QFdkO8xr5x6w54PGJOm48BO4+ST oOGtdLzB//zFBWSZTWSf3cCwAvBx//////////////////////////////////////////// /4CMSOAAAAAAAAADggAAAAAAAAHzl8AAEAQAAAAAAAAAAAAAAABAABAEBNNDJppo0xGgBo00 yMTQ0GhppgIaMmmjCDCDIMJiGgMIzSMTCYgaMg0ZNMmTbSPUPSPU00aaMhoYTRgJiaZTZMmm o9QkwAEwABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGAABNNNMAJiYEYAAACYCMjT BDCNMAAAAAATATTBMAAJkwBMEYJiYABMAAAA/3+qqo0HVT9UYgMQNNBpoaNDRppoGTIyDTIG gGgDEyZGExBhDRkZGI0GgNGmgDJk0DTCNDIAAaNA0AP1TQAyZME///aqpVH/+qqQiVKAAamD 3/7VKlVAAAAAAA0AAAAAAAAH6oAAAAAAAAAAAAAAAAAAAAAADaVVRAA0aH/+9VVSeo0000wj QGmmgaGmmhoaaaaMIZMQZGmIAP9VDQGIM1AGTEaGJgmgZMEyGmIMgYIyAf6VANNADIAE1OT1 BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcXJzdHV2d3h5ent8fX5/gIGCg4SFho eIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6wsbKvEgCrCxBsrO0CF2 tsHbjLgbc3Q67H3l6QI31/gEsHCwyZQqWxC+LjGDJo2cOnsc+gQ5CLJRpMpKmy06jMU5qr+f 1X/qr8VdZ+a2u/VeJAFWFiDZWdoELtbYO3GXA25uh12PvL0gRvr/AJYOFhkyhUsXxcYwZNGz h09jn0CHIRZKNJ+8pKmy06jMU5qr/oAAAACr/wAAAAAAAAAVYAAAAAAAAAFXWAAAAAAAAACr rAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAACrAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAA AAAAAABVgAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAA AAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKs AAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAACrAAAAAAAAAAqwAAAA AAAAAKsAAAAAAAAACrAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAA AqwAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgA AAAAAAAAVYAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAAAZp06dOn Tp06dOkAAAAAAAEIQiAAAAAAAAAAhCEQAAAAAAAAAEIQiAAAAAAAAAAhCEIQhCEIQhCEIAAA AAAAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAA KsAAAAAAAAACrAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAqwAA AAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAA AAAVYAAAAAAAAAKsAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAABV gAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAACrAAAAAAAAAAqwAAAAAAAAAKsAAAAAAAAACrAAAA AAAAABVgAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAKsAAAAAAAA ACrAAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAFWAAAAAAAAABVgAAAAAAAAAVYAAAAAAAAAKsA B2frWrqaNGrqaNGrqaNGrqaNGrqaNGrqSalk1LJqWTUsmpZNSkmmyabJpsmmyabJpsmmyabJ psmmyabJpvgwhJAh/myBISQkVC5V3QjBHHRjpx/SkPTBqCXshlRSlidyX+kXvzNTIOh2s7z1 tK7xPjaBLcrdgiIFyCm3QOfiHobRxJ8fSRiIj8ZFIS+vfSk6qUT4lbMKTAE2/mwZ/sHgqPtI A/d3VatX/L/wEgEAhN9ISFIASQkNGjR37Ro0eC0aNHh/A7PZ8b2ez2fS+z19n1Hs7nMzmczM zm7u7u7u7u7u7u7u7u7zOc5zd3d3d3d3d3d3d3d3QAVVVVQAHegAAAAAAAAAAAKqqqqAB3gA B4OZzM56nu7u7vdbu7u7u7u7u7oAAAAAVVVVVAB3YAAAAAAAAAAACqqqqqdN3d3d3u93d3d3 d3d3dAAAAAAAAgCqqqqrrgDuQAAAAAAAAAAoBVVVVV4tAO4AAAAAAAAAACoCqqqqrxKgO3AA AAAAAAAACqBVVVVV4dSq7aqqqqqqqqqlVVVVVVVVVVczMVczMzMzMzMzNbzMxV1lVVVVVVVV VVVVVVVVVVVVczMxXMzMzMzMzMztmZmYrrCqqqqqqqqqqqqqqqqqqqq5mZmLmZmZmZmZmZ2v MzMxaqqqqqqqqqqqqqqqqqqqquZmZmOZmZmZmZmZmtZmZmYxVVVVVVVVVVVVVVVVVVVVczMz MxVVVVV1pVVVWqqqqqqqqqqqqqqqqqqq6+vr6+vr6+vrvPMzM5zAADsABmZmZmAAAAMzMzMw AAABmZmZmAAKqqqdXOc5znAAHgAAzMzMzAAAAGZmZmYAAAAzMzMzAAKqqqnVzM6ZnMznVnOZ znN3d3d3d3fA3d3d3d3WZmZmYAAAAzMzMzAAAAGZmZmYACqqqqdXOc5znAAd8AAzMzMzAAAA GZmZmYAAAAzOZzP7uZzM51ZnOZzN3d3d3dAAW9XOc5znAA70AAzMzMzAAAAGZmZmYAAAAzMz MzABVVVVU6uc5znOADvAABmZmZmAAAAPV+ZzM51c5znOc3d3d3d3d3d3d3d3dZmZmZgBVVVV VOrnOc5znjd3d3d3vN3d3d3d3d3dzMzN3d3d3d3d3d3d3d3dAAAAAFVVVVU7zmczOAHdgdgA AAAAAAAAQBVVVVV1wB3IAAPR8zmc/c6szM506dOnTp06dOnTp06dOnTp06dOnTp0AAACgFVV VVXi0A7gAAAAAAAAAAKgKqqqqvEqA7cAAAAAAAAAAKoFVVVVXh1QO2AAAAAAAAAACqgqqqqq 8Kqg7UAAAAAAAAAAKqhVVVVV4NVQ7QAAAAAAAAAAKqoqqqqq8ZVVHUAAAAAAAAAAFVVKqqqq uxVVTAAAAAAAAAAAqqqAADsAAAAAAAAAAAAKqqp4/mczObu7u7u7u7vY3d3d3d3d3d3d3d3d 3d3d3d3dAAAAAAKqqqAAO/AAAAAAAAAAAAVVVVAAO+AAAAAAAAAAAAVVVVQAHegAAAAAAAAA AAKqqqqAB3gAAAAAAAAAAACqqqqoAO7AAAAAAAAAAAAVVVVVQA7oAAAAAAAAAAJu7u7ugACa A7kAAAAAAAAAAKAVVVVVeLQDuAAAAAAAAAAAqAqqqqq8SoDtwAAAAAAAAAAqgVVVVVeHVA7Y AAAAAAAAAAKqCqqqqrwqqDtQAAAAAAAAAAqqFVVVVXg1VDtAAAAAAAAAAAqqiqqqqrxlVUdQ AAAAAAAAAAVVUqqqqq7FVVMAAAAAAAAAACqqoAAOwAAAAAAAAAAAAqqqgAB4AAAAAAAAAAAA CqqqgADvwAAAAAAAAAAAFVVVQADvgAAAAAAAAAAAFVVVUAB3oAAAAAAAAAAACqqqqgAd4AAA AAAAAAAAAqqqqqADuwAAAAAAAAAAAFVVVVUAO6AAAAAAAAAACAKqqqquuAO5AAAAAAAAAACg FVVVVXi0A7gAAAAAAAAAAKgKqqqqvEqA7cAAAAAAAAAAKoFVVVVXh1QO2AAAAAAAAAACqgqq qqq8Kqg7UAAAAAAAAAAKqhVVVVV4NVQ7QAAAAAAAAAAKqoqqqqq8ZVVHUAAAAAAAAAACqq65 sWrCSauwAtgBbAtAJbAC2AFsALYSWhCWwAtgBbAC2BLQJLYAWwAtgBbCFoSS2AFsALYAWwC0 AtgBbAC2AFsJJaELYAWwAtgBbAktAlsALYAWwAthCWhJbAC2AFsALYBLQLYAWwAtgBbCQtCW wAtgBbAC2BC0LYAWwAtgBbCBaWwAtgBbAC2AFsALYAWwAtgBaWwgWwAtgBbAC0LYELYAWwAt gBaEthIWwAtgBbAC0C2AS2AFsALYAWhJbCEtgBbAC2AFoEtgSWwAtgBbAC0IWwklsALYAWwA tALYBbAC2AFsALQklsIWwAtgBbAC0CS2BLYAWwAtgBaEJbCS2AFsALYAWgEtgWgarVarp06d OnTp06dOnTwunTp06dOnTxzAAAAAAAAAAAqqqAADsAAAAAAAAAAAAKqqoAAeAAAAAAAAAAB4 7znM5nOczM5u7u7u7u7oANAAd+AAAAAAAAAA//F3JFOFCQOIffyg --D6IIOQQv2Iwyp54J-- From eguan@redhat.com Thu Aug 20 09:37:48 2015 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D6EF57CBE for ; Thu, 20 Aug 2015 09:37:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BDF38F804C for ; Thu, 20 Aug 2015 07:37:46 -0700 (PDT) X-ASG-Debug-ID: 1440081464-04bdf070ae380c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4VbNEUGQu9XChu1R (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 20 Aug 2015 07:37:44 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 2A5B78E6F3; Thu, 20 Aug 2015 14:37:44 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7KEbaPK027988; Thu, 20 Aug 2015 10:37:37 -0400 Date: Thu, 20 Aug 2015 22:37:35 +0800 From: Eryu Guan To: Dave Chinner Cc: Tejun Heo , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="NyChO5MpGs3JHJbz" Content-Disposition: inline In-Reply-To: <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440081464 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com --NyChO5MpGs3JHJbz Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Aug 20, 2015 at 10:36:26PM +0800, Eryu Guan wrote: > On Thu, Aug 20, 2015 at 02:12:24PM +0800, Eryu Guan wrote: [snip] > > I installed a new vm with ext4 as root fs and got some trace info. > > On the new vm, only generic/048 is reproducible, generic/049 always > passes. And I can only reproduce generic/048 when xfs tracepoints are > enabled, if writeback tracepoints are enabled too, I can no longer > reproduce the failure. > > All tests are done on 4.2-rc7 kernel. > > This is the trace-cmd I'm using: > > cd /mnt/ext4 > trace-cmd record -e xfs_file_buffered_write \ > -e xfs_file_fsync \ > -e xfs_writepage \ > -e xfs_setfilesize & > pushd /path/to/xfstests > ./check generic/048 > popd > kill -s 2 $! > trace-cmd report >trace_report.txt > > I attached three files: > 1) xfs-trace-generic-048.txt.bz2[1] trace report result > 2) xfs-trace-generic-048.diff generic/048 failure diff output, could know which files has incorrect size > 3) xfs-trace-generic-048.metadump.bz2 metadump of SCRATCH_DEV, which contains the test files > > If more info is needed please let me know. > > Thanks, > Eryu > > [1] attach this file in a following mail, to avoid xfs list 500k limit Attached this file in this mail. Eryu --NyChO5MpGs3JHJbz Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfs-trace-generic-048.txt.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWWQf160Gf7TbgHyQQAP/9wAKv+3f8GDJ/wAAAAAAAAAABAAAAAAAAAAAAAAA AAAAAAABD3wpnAAAAAAAAAAAAAAAAAAAAAHfV8XjtY0dHTrSQ2YhWw6cduzu23bTdmzdcZ86 N4eGvXO6baqIiWhudw7sdckm2yRSttztWVY3PLw4Txo6rd25qKLZ3aZk7jp05TWzLjsJ4jDw eDodNAKAA2wG2BWtdsSASu6rG023M48Fg8XugAAusF2zduokU6NsaA0AC05ps23PMcQQ8PLj Tq7to3ddnZ0bMd3Dbuu7M3A7sIzjzxDh4Obb0JNsdsJHbFCuGx11k7ZUmczwmDw2vVUJu7q6 Cml2YhZhzGdzLZGmg7sbmeCDw8MHptourMWmjbU7O4RZGQFAdlXVs6TwLhwwHoCgOjTLQGgD QLbRdsnTIu42orc7TtVkLY7uXFbNSwZVa2WpqtNqrG0dw12ZZZ2s3dcONBDZbt3a4eeLcPDd 4m8PDePE8PDOFw4e8Dg444eeHi8ABKqf+2wMP1UqqqjD1QwCAMgYKnhpmqpVKDTEGCYjIwga Yqn42kapVQ0SAAAAAAip+2iJqVKNFGUyBoAA00Aqf7UqaqoYJtEaGRoAADEEiASSpAUxqmp6 aamT2pP1MjTTT8gAAEL+/+X8/71Uuv8v71aEkkf3/oJAkhCj/cQi5/ykSEJCE2JAkhC/6pCQ kITBIEkIX9z/RDSSQkIX+x/qf/IgX/MEkJCF/rCQIQCCIhJIQiAaASQB/0EgTQIYJIaBDSQh oENCTQIYJIYhDBJDEIaQkxCGCAYhDQCGIQwSQ0CGkkxAhoEMQhgkhpIQ0kAxCGCAYhDQgGCQ 0gBgkMEAwSGgQMEhgkhgkMEkMEhpAhgkMEAwSGCAYJDQCGCQwSQwSGCSGCQwE0JDSQk0JDAA SBiSGkISBiEAwSSABoSGgEkj/Uj/2QAkhC/7IASQhR/6+/sB/Q/zEkl/hAAQACP8AAj/AAIo AEf5AAj/AAI/wACP8AAjwAI8CSPAAjwAI8kkliQBIkJaCSIBJGpIRqEtBJFgkjUhLQQHkAjw JI8klyBHAkjkkBwIDkIDkgDgQHIEHAkjwJI8kCPAgPAgPIBHgSR4EkeAXkkJeBAcgSOBJHJC RwIDgQHAgNBAahIPAkjgSRwJI4EkcCSOBJHJAvIQB5JAeBAeQgPAkjyQiQEBIICQEBIJI8CR yAMF/5JL/e0k2km0k2kNpKGkoaSbSG0k2km0lDSUNIbSTaSbSTaSG0lDSUNJNpDaSbSTaShp ChpJtJNpJtJQ0lDSTaSbSQ2km0k2km0htJNpJtJNpChpKGkm0k2kNpJtJQ0lDSQ2km0lDSUN IbSTaSbSTaShpENJNpJtJNpDaSbSTaSbSTaQ2km0k2km0iGkoaSbSTaSbSbSTaSbSTaQm0k2 km0k2kQ0lDSTaSbSE2koaShpJtIbSTaSbSUNIUNJNpJtJNpDaSbSTaSbSE2km0k2km0htJNp JtJNpChpKGkm0k2kNpJtJQ0lDSE2km0k2koaUNJQ0lDSTaSbSTaSbSTaSbSG0k2km0k2JQ0l DSTaSbSTaSbSTaSbSTaQ2koaShpJtITaSbSUNJQ0htJNpJtJNpCbSTaSbSTaQ2km0k2km0hN pJtJNpJtJNpJtJNpJtIbSTaSbSTaSbSIaShpJtJNpDaSbSUNJQ0k2kNpJtJNpKGkQ0k2km0k 2km0lDSUNJNpJtIbSTaShpKGkJtJNpJtJQ0iGkm0k2km0k2koaShpJtJNpNpJtJNpJtJNpJt JNpJtJQ0lDSTaSbSTaTaSbSTaSbSTaQ2km0k2km0iGkoaSbSTaSbSG0lDSUNJNpDaSbSTaSb STaSbSTaSbSUNJQ0k2km0k2km0k2km0k2km0lDSUNJNpJtJNpJtJNpJtJNpJtJQ0lDSTaSbS TaSbSTaSbSTaSbSUNJQ0k2km0k2km0k2km0k2km0lDSUNJNpJtJNpJtJNpJtJNpJtJQ0lDST aSbSTaSbSTaSbSTaSbSUNJQ0k2km0k2km0k2km0k2km0lDSUNJNpJtJNpJtJNpJtJNpJtJQ0 lDSTaSbSTaSbSTaSbSTaSbSUNJQ0k2km0hNpKGkoaSbSTaSbSTaSbSTaSbSTaShpKGkm0k2k m0k2km0k2km0k2koaShpJtJNpJtJNpJtJNiUNJQ0k2km0k2km0k2km0CbSTaSbSTaSbSTaSb STaQ2km0k2km0k2kNpJtJNpJtJNpJtJNpJtITaSbSTaSbSTaShpKGkm0A2km0k2km0k2km0k 2kJtJNqA/wCSEhCZYv4bQDaAbQDaQCEIUIoSEJCFxCAEkITDr7+P4/v//+/n27uf5/6d/Xv3 7d3uecmf0MYr/7//gCPf4+u5nveb3vUzz3Jne97nnJn9HsYr3gI8fVMz3erzmtenkxzl85uZ /d9jF+qqXfvT/H1TM93q85rXp5Mc5fObmf3fYxfqql370/x9UzPd6vOa16eTHOXzm5n932MX 6qpd+9P8/TERzV7vWq36e+5Peu95PP3axi/VVLv3p/n6YiOavd61W/T33J713vJ5+7WMX6qp d+9Mfn30RHNXu9arfp77k9673k8/drGL9VUu/emPz76Ijmr3etVv099ye9d7yefu1jF+qqXf vTH599ERze75e91z3e7jnL5zcz372MYv1VS796Y/PvoiOb3fL3uue73cc5fObme/exjF+qqX fvXU/Pvpme7243u+e73cc45zcz368Yxfqql3711Pz76Znu9uN7vnu93HOOc3M9+vGMX6qpd+ 9dT8++mZ1ptrV1Xojk967znKqPmMYeu78eXU/Pvpmdaba1dV6I5Peu85yqj5jGHru/Hl1Pz7 6ZnWm2tXVeiOT3rvOcqo+Yxh67vx5dT8++mZ1ptrV1Xojk967znKqPmMYeu78eXU/PvpnOWm bmfd7uOcve9zPcYvOc36qr1+8up+/zGLzM97ze96mee5M73vc85M/o9jFe8BHn6YjOb1eaiP d7uOcre9zPcY9nOb9VV6/eXU/PvpnOWmbmfd7uOcve9zPcYvOc36qr1+8up+ffTOctM3M+73 cc5e97me4xec5v1VXr95dT8++qq1ptrSq9Ec5xrWpnmMM5yTL1+8up+ffVVa021pVeiOc41r UzzGGc5Jl6/eXU/Pvqqtaba0qvRHOca1qZ5jDOcky9fvLqfn31VWtNtaVXojnONa1M8xhnOS Zev3l1Pz9VVnLec3M+730963vdV3GGc5TMvX7y6n5+qqzlvObmfd76e9b3uq7jDOcpmXr95d T8/VVZy3nNzPu99Pet73VdxhnOUzL1+8up+fqqs5bzm5n3e+nvW97qu4wznKZl6/eXVVj+qq w47rSq9EcuohznK799eMQmZev3l1VY/qqsOO60qvRHLqIc5yu/fXjEJmXr95cz9/TM4bNaVX ojl1EOc5XfvrxiEzL1+8uZ+/pmcNmtKr0Ry6iHOcrv314xCZl6/eXM/f0zPs+5729+u4jd13 re7u4xjGMQmZev3lzP3+YvOZnu9a1mZ36ezPOc5XeVX6PYxfvAR6IiPZ973d7VURv1d63u7u MYxjEJmXr94VWP6qr2ec97e/XcRu671vd3cYxjGITMvX7wqsf1VXs85729+u4jd13re7u4xj GMQmZev3hVY/qqvZ5z3t79dxG7rvWru+4xjGOoiHq94VWP6qr2ec97e/XcRu671q7vuMYxjq Ih6veFfVVV7POe9vfruI3dd61d33GMYx1EQ9XvCvqqq9nnPe3v13Ebuu9au77jGMY6iIer3h X1VXsb372vVXe6qeczMzzGMYxyu9773veFfVVexvfva9Vd7qp5zMzPMYxjHK73vve94V9VV7 G9+9r1V3uqnnMzM8xjGMcrve+973hX1VXsb372vVXe6qeczMzzGMYxyu9773veFfTPvta97e 0zEbnnMTM7xjGMb9zle973hX0z77Wve3tMxG55zEzO8YxjG/c5Xve94V9M++1r3t7TMRuecx MzvGMYxv3OV73veFfTPvta97e0zEbnnMTM7xjGMb9zle973hX0z77Wva1cR3vp5zEzO8YxjG /c5QXdz9/vvqxUe7vWtZmd+nszznOV3lV+j2MX7wHp/u99973tauI72Pc5iZneMYxjfucoLu 5+iH2tNaqI71POYmZ3jGMY25ygu7n6Ifa01qojvU85iZneMYxjbnKC7uYhrLOaiN6RzmZjf3 3329ucku7u5iGss5qI3pHOZmN/fffb25yS7u7uplvWs5qI3pHOZmN/fffb25yS7u7uplvWs5 qI3pHOZmN/fffb25yS7u7upnbm961Ucyje+91+n77e3OSXd3d1M7c3vWqjmUb33uv0/fb25y S7u7upnbm961Ucyje+91+n77e3OSXd3d1M7c3vWqjmUb33uv0/fb25yS7u7upnbm961Ucyje 897v9P33OO9ku7u7qZ25vetVHMo3vPe7/T99zjvZLu7u6mdub3rVRzKN7z3u/0/fc472S7u7 upnbm961Ucyje897v9P33OO9ku7u7qdN61mu7w7rVa73n6fvu9RCV3d3dYxi8XPo3rWs1W/T 2Z5znL7yq/ReMX7wHp797BmubxxrU673n7333e+iPSu7u7qdN61mu7w7rVa73n6fvu9RCV3d 3dTpvWs13eHdarXe8/T993qISu7u7r/TpvWr1ccyjV5iN/q++5yeyld3d3X+nTetXq45lGrz Eb/V99zk9lK7u7uv9Om9avVxzKNXmI3+r77nJ7KV3d3df6dN61erjmUavMRv9X33OT2Uru7u 6/f06bzebjfWbx3uv1ffbqeyld3d3X7+nTebzcb6zeO91+r77dT2Uru7u6/f06bzebjfWbx3 uv1ffbqeyld3d3X7+nTebzcb6zeO91+r77dT2Uru7u6/f06YvFxrPGrzWv6v291PZSu7u7r9 /Tpi8XGs8avNa/q/b3U9lK7u7uv39OmLxcazxq81r+r9vdT2Uru7u6/f06YvFxrPGrzWv6v2 91PZSu7u7r9/TvbN5vWOM32tf1ft7qeyld3d3WMYvFz6N61rNVv09mec5y+8qv0XjF+8B6bq da9m83rDua7Ov737e6ns+ld3d3X7+ne2bzescZvta/q/b3U9lK7u7uv39O9s3m9Y4zfa1/V+ 3up7KV3d3dfv6d7ZvN1vPWs57W/6v3OVMSpd3d3X7+ne2bzdbz1rOe1v+r9zlTEqXd3d1+/p 3tm83W89azntb/q/c5UxKl3d3dfv6d7ZvN1vPWs57W/6v3OVMSpd3d3X7+1pi7nWOM+1rtc/ q/d7Uz71eu7u7r9/a17F3OscZ9rXa5/V+72pn3q9d3d3X7+1r2LudY4z7Wu1z+r93tTPvV67 u7uv39rXsXc6xxn2tdrn9X7vamfer13d3dfr/b37OCt5732cxW/6v3OTM+9Xru7u6/X+3v2c Fbz3vs5it/1fucmZ96vXd3d1+v9vfs4K3nvfZzFb/q/c5Mz71eu7u7r9f7e/ZwVvPe+zmK3/ V+5yZn3q9d3d3X31/b374rXI9jHa1/V+3UzPvV67u7usYxeLlG9a1mtejkRvd85uZ/drGK96 7u796T9ete+J1z14x2tf1ft1Mz71eu7u7r76/t798Vrkexjta/q/bqZn3q9d3d3X31/b374r XI9jHa1/V+3UzPvV67u7uvvr+3v9dznnOs57P+3vczMlLu7u6++v7e/13Oec6zns/7e9zMyU u7qpv6/t7/Xc55zrOez/t73MzJS7uqm/r+3v9dznnOs57P+3vczMlLu6qb+v7nOfXc97DHe1 /t73UzJS7uqm/r+5zn13Pewx3tf7e91MyUu7qpv6/uc59dz3sMd7X+3vdTMlLu6qb+v7nOfX c97DHe1/t73UzJS7uqm/r+jve4u1zNYxERf+5zl1VF3d3VTf1/R3vcXa5msYiIv/c5y6qi7u 7qpv6/o73uLtczWMREX/uc5dVRd3d1U39f0d73F2uZrGIiL/3Ocuqou7qZivq+7zl4tURMZz ERX+73tVQu5iO/TicT03rWszr0ciN7rnNzP7tYxRd3d+9J+uOc5i5mIRnMRFf7ve1VC7mI7P 0/c3d4tURMZzERX+73tVQu5iOz9P3N3eLVETGcxEV/u97VULuYjs/fTjm7vObVMzOczM1/u9 7VUBUzFffVjuzOVVMzOczM1/u97VUBUzFffVjuzOVVMzOczM1/u97VUBUzFffVjuzOVVMzOc zM1/u97VUBUzH1YxWe7M5VUzGMREVP93tYqgKmY+rGKz3ZnKqmYxiIip/u9rFUBUzH1YxWe7 M5VUzGMREVP93tYqgKmY+rGKz3ZnKqmYxiIip/u9rFUBUzH1YxWe7YxczMzGcxDk/3e1iqAq Zj6sYrPdsYuZmZjOYhyf7vaxVARHarGKz3bGLmZmYzmIcn+72sVQER2qxis92xi5mZmM5iHJ /u9rFUBEdqsYrPdsYuZ1MzGtahyf7vaxVARHarFYqIb1rWZ16ORG91zm5n92sYou7u/en+GE 97jCq1MzGtaiuT/d7WKoCI7VYxWe7YxczqZmNa1Dk/3e1iqAiO1WMVnu2MXM6mZjWtQ5P93t YqgIjtVjFZiOM5vNVuqrWtahyf7vbxVARHarGKzEcZzeardVWta1Dk/3e3iqAiO1WMVmI4zm 81W6qta1qHJ/u9vFUBEdqsYrMRxnN5qt1Va1rUOT/d7eKoCI7VYxWYjjOcTOpmY3ve4dn+iK xQCI7VYxWYjjOcTOpmY3ve4dn+iKxQCI7VYxWYjjOcTOpmY3ve4dn+iKxQCI7VYxWYjjOcTO pmY3ve4dn+iKxQCI7VfViI41rWZncRM73vcuz/RFYoBEdqvqxEca1rMzuImd73uXZ/oisUAi O1X1YiONa1mZ3ETO973Ls/0RWKARHar6sRHGtazM7iJne97l2f6IrFAIjtV9WIjjm971M83E a1rUOTP6KxigER2qxWKiG9a1mdejkRvdc5uZ/drGKLu7v3p/j67qqjm971qt+ns73e96mf3P YxXlUu/en+PruqqOb3vWq36ezvd73qZ/c9jFeVS796f4+u6qo5ve9arfp7O93vepn9z2MV5V Lv3p/j67qqjm971qt+ns73e96mf3PYxXlUu/en+PqmZ7vV5zWvTyY5y+c3M/u+xi/VVLv3pk k/sgBJCFB/qkkhIQv9UkkJCF/zSSQkIUgJCSA/mgQAghJJCQhf/RKSSSEIX/I/3AAiwSRKBB 5JCX+YID+EkB/3oGkkPRpMZCSBCQNoQkCqqz/T/T/IAAAAAAAAAAAAABttgAFmyqqqqqqqqq qzZVVVVVVVVVVZsqqqqqqqqqqs2VVVVVVVVVVg22AG2222222222AAAAAAAAAAAAAAAADbbb bbYAAABZsqqqqqqqqqqs2VVVVVVVNttttzEzMzMzMzMzMzMzN3/QhJCEJIDECBpIEhJAffff 6H8FIZBQCQkg/339j7H/H/N/x0/4/4/4/94AAAAAAAIiIiIiIgAAAAAAAAEREREREQAAAAAA AAEREREREQAAAAAAAADe973vewAAAAAAAACIiIiIiIAAAAAAAABMzMzMzMyAAAAAAAAAAAAA AAAAAAb3ve972AAAAAAAAARERERERAAAAAAAAAJmZmZmZmQAAAAAAAAiIiIiIiAAAAAAAAAb 3ve972AAAAAAAAARERERERAAAAAAAAARERERERAAAAAAAAAIiIiIiIgAAAAAAAAIiIiIiIgA AAAAAAAEREREREQAAAAAAAAGta1rWgAAAAAAAABMzMzMzMyAAAAAAAAEREREREQAAAAAAAAC ZmZmZmZkAAAAAAAAIiIiIiIgAAAAAAAAEzMzMzMzIAAAAAAAARERERERAAAAAAAAAJmZmZmZ mQAAAAAAAAiIiIiIiAAAAAAAAATMzMzMzMgAAAAAAABEREREREAAAAAAAAAmZmZmZmZAAAAA AAADWta1rQAAAAAAAAAAAAAAAAAAAEREREREQAAAAAAAAC7u7u7u7u7AAAAAAAAAAAAAAAAA ACIiIiIiIAAAAAAAABMzMzMzMyAAAAAAAAEREREREQAAAAAAAACZmZmZmZkAAAAAAAAIiIiI iIgAAAAAAAAEzMzMzMzIAAAAAAAAAAAAAAAAAABEREREREAAAAAAAABEREREREAAAAAAAAAi IiIiIiAAAAAAAAAiIiIiIiAAAAAAAAARERERERAAAAAAAAAAAAAAAAAAABEREREREAAAAAAA AAmZmZmZmZAAAAAAAACIiIiIiIAAAAAAAAAAAAAAAAAAANa1rWtAAAAAAAAAAAAAAAAAAAAA AAAAAAAAABrWta1oAAAAAAAAAiIiIiIiAAAAAAAAARERERERAAAAAAAAARERERERAAAAAAAA AIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMzMzMzMyAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALu7u7u7u7sAAAAAAAA AAAAAAAAA73ve973vQAAAAAAAAAAAAAAAAAAAiIiIiIiAAAAAAAAAiIiIiIiAAAAAAAAAAAA AAAAAAABMzMzMzMyAAAAAAAAAAAAAAAAAAAf38AAAAAAAAAAAAAAAAAAmZmZmZmZAAA/f7/l /y/3/Kv36v1fv9bD/H8b/v/dv+m3TjbgEm1v+PSSAbru7fJcknwHAckqpNJIS7M3l2ZncHNv 3pAPefgokz3vSSY2wDW/B7zfm33BySu7XACSfJck+STepIzN1JG7VSSSSSVUkSS7d17vt1Ny SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSZmZJJJJJJJJJJJ3d3NtttvgAYAPkkl 3d3d3duzyUz91NV5y7z/YBAZX9t9VPLjv0VTm9j94EkgArz97yzpuXdd85uvIEkR227+qSZ+ Kzz4ECQgM770t7BT+37Zey7p19W7cjsf3u9XCk7nfSz3sOi6oo60Shux/yCrOUupVG3tbXV5 12L3VwO1Vu8rK2ntkt1VOnzC/T5Wnu/fMlWnOa+paPzsd+yeyerlpN91843z7vU9e7pk4YAg IBJH329POqj5nn30ay3DLyacTb9WN4yh86c7clvvvT3Rr+6qn7d7l9ndn2LWVUJtP6druz2/ fWzC45ab5oL9naPdtLNOfrpeBiywvF6d9Thn30GNYwxtrX5+Y8zHer6b9997rp+dG+24dTUf IxpEzEVASwjYC/vSKOyWyGtm5XPmV6hx5+09Ppz7iosj6O6/PIp+j9dSq6pLzZXp5q8aar3c 8CuM3sTeXbt13bWxEdsVewCSQASCSJ09EWOz03nwvmc6Yveg++gKYpnbrGvMTiAlqR/bRUz7 4fsj6jfROQ4zY77djr+LaWv13z0D32/v1Xdd9Ra+zlyHOTsqMNuvrpIbXy7vrZbNNrxz+u4n AtmMCmQ20DdNLOb+uaUGwHzCWY15rpimU1DGyvu5T59r+KSyl7bzNrW3835Wn9S0lCOjftVr Ynpkv1ZvkCSKSBFVGE7Li/ezSNeZPSvMN9mWvZT93m8RFULFzp35PGd3Ose+MuHbZ9DJaKis IjLyYJa90GxGNYxbMJS2yHcTd9tHTyX30HehNi3IPmU1WvPdjyqV1fUeRPoNb31F+vJn3ZNv FArdUMwzKteuGNV5ZPPPeM8S15bUOqryW6T9uEw9p7sdbmcn1ZWd7PeqM2rm0IEhAYCAhj2I ro6d4vd90ZBXZ7L++ncyRlnqKmGs2BU4+gh3udztY1XoXvotilqGQNGT88602pZ9X0qajmvN Y6aPrjK9vvlslWW7r9Xq7dPFYsLj+ReWbV6/XO163VVNTdq1my+HMho463eJfatj65F9WXV3 +LpzvY6PtS+UXD+2twNW+eY9bwqy9wz1t1Pqkq/U9k8ZszU4QYCA+RDtmNKG3LuoQ2UwmbWd h0ac7avskh79B8zm3rxrmEs9RFsr7Pi/bjPuKoozJc++Kn6tT+0qLD5jeCIu0cURelQ9HCbv b4v1HjHvn7dvtgraq2m/U6bHg8Wef4y0kqvkjK1Vrlcm89566xXzo3sq89JZnaPcdWP0V8lv Kpf7LstlQm87hJUSvahuS9uOu+s2yc6352gEbWT1VThjgn2YxTGtKUnn7vH48JZc2rmVd7x5 zxjy1bbyrft22ug4/W6uhUqHVeedFtz9ivF7Z90VPnb+XzS+ZVwoYpm/ouPu0KffQtZLRjVN U1W+1wyS+vrt9ev27Cqt6dnZzKfGfaQevYrb0jeir0tl7JObXqj3erASR8eaFDRLLfr9WY+r t2PcfXHo6rgwj23WjzrQL6O9vKMyk3NivLlRnnmLPUd3aUd3P3xeQVUAvmY7v7XxYDYsqEQ1 DUNXnzjqSllvmoaTfX99nX09o/Vjc19DU1bNQvH/P99NpHBe7fo9361iXs9eKvavO1he+x+P YWvl0azK9ohzmqr9+/UKs60PkeVmm1kP5dl07rL/G1891r0kEr9U+yGeN+1wuy23J1+6ZfbX 2dZX733q/IrgxBFRHRDI+imFtWzanaOe7BvbnZkP5l+h177xXvOX9ivq8r/J67laXB37VQsP DXc3XwO5rvwsRl0L7k+rc3O4GuSe1tv5+771z7jvp7soDN+lO0ufYlhg1uccrl2i5Gk1u02u 0pmx6V52VVfvi6XHnWV9shFx5m9Es+dvWbuSresjK2VQU6zemh83m0rTz6/osZt/Sb4Er3Wx 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 5iZO3pN28X08i3dUxU7rIyX9dcsVR1L2+tW765dU7Vu5i/Vy37RH3TiDryC8hW3uSrZTv5z9 s2GfNzMtS8ZrUsmz7XNLxj9Pj1YvoY9E03L22nWq90oFpZ0pyUUq3UTIhvDyS7yz2V3r9uM9 V3UmZ7OyZsd74ntAuV6KvRsre2u3k+a3tPUqSbWOr0O1brrxguvrPbl7uwy68PupQpFeqI+e sFvIxTXXnnq9V8Ve72LsFrVTPN8N3WN5u97sZb25rujbq3amBspVEVd56J3rrH44g6jodzI6 L3NZW5eK79cWzeMDu3Pb7BN7ecWFuleEVJHszRuU8WSU6N3cilC2o+vh7fkb1pOZnXHRVZ49 Mgu23vNFa5d1F7odc8oSrR6s3fOerY1au+KenNovFfer18ebyUUrtuZqXPZ5yHpm+Lprtza9 xTQevCeVd7Zw+RpLpPZeF9mY5QVV56uvbo1rpUV+3S7LqJPVRrno1Wesgq7uw7te0s8+lQ5k 3yKfPXqoVa69xWrh9HVZZvVV/K8Kqo+u432bWwmaXGcok657OoASQheBAkID8kgAz/jQCEQh LASRYIDASRwJI+SEfAkjM/n/X+tJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJNtttttttttttttttttttttgAAAAAkxtiX+QAAAAAAAAAAAAAAAAAAAI5IJQAAEACqqq qqrvve952qqqqqqqqqrve97ztVVVVVVVVV0d73vt0B7ttgAAAAA7u++4AAAAAAAHu999wAAA AAkkkkkkkmNttttttttttttv+/6vvvtSX9YH8klVJsA/poBu9Vf1kAN0DgMzM2BElsCJKQPA wAYGwCAbAIBsAgGwCAbAKo3ekgBuhmZhwGwCAbAIBsAu7ACJLYESUgA+4A3QOAB97pJJJJJV SJJNhqS9vcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJJIAAAAAAABtttttttsQDSSbgAEkk kkndPfvfvWvf2+9TpU68O3rt/MLdkTZFH9PtnXrJZuxL30B23j/cLk47Fj9bLDJLj+WX9fOZ bvmGcpauu6bmpc/BMW9zPu4JddDahluXU3Id9Gdc1vnL7bobKe17KLdVGXnW2+z584Z5ksbC GQ1Rux2YRRumfRjNdNS8adTlBX0U8+955mEs8OWsqFLP7XH7OkzYR0/VsH35++6vrmLXoJyH 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 ri2U6j3PG+BLTlQOnzc8jyeod23FfbuMmJS9qiR0+N3Z7U3OlzM7gW37bl0twdPM6+0qLPLW pytOZVzNoU0oF25m0Guqv73vCSELAPAAj4BH3xQ/OSZm5ma9BfuKtl6UrXy+jxuF1r9q3qvg S7yM0VLlj6PevuOVNpKs3mWnRki8peT0iqr9qG7bZpsyvLyO7vMD2uevNOp5l2vbXZJjolG+ Tt+q1uWzS1fDD2SLPRllLz82JU+apJ5SmG07s7c1arVzSoqu6uyd+pe/lazxf2/WSntvZ8br HbdXKKku7w67pgkj8Ajdzx89Iv67mu9e9utZnT9Hq9t5kcTj4ZS5156uz0XksZcliMWJyrKb 14/CGbt32U9fp27t9ekOUkueAeFnTXQ9MVJi4nl5j2CeXvpZyqsvNm3XtH3dnJJHnuI1Xi3N 2tJvk1yXWYGoQvHeqZS8va/bwgMWYJKTusI1V2TJue2mVVGJseRkJxvXetiSDx3bvuuqisu6 ABHwCJrG7upqqqo+uPXmR6HP2P7Vec+zIdJT92J08PNS5vRtQBFoAARYhqut0yAhAF3mZMuJ c8cjWezHPGnQ2FlwFfZr9u75wcRXtqLZXklqzdlW47IOKbkT245fNN0CH3uzsr1VVyD1xX6h 5JXoledniy/LLpPr7rfYerrjfevd49j94AEfJIKj6vHncl3W2TXits+uzzvCs8wtYv1P6tSF yXc83Ooqwq+QF+HN7yve1VrVYPyfbx1YlnjV6CfOD66Tjx5dUV+786wpdTVihvtl70vKV0+9 m9jTkxsZrjkMJ3sWlPzx61neqI2iX51WVUHV2bS3qy0kkvkkE+xd9XvvVv3d6u55m/dr0j5o NG85A9yFJasdmyeB1cTu/da7w36vVturtVb7xnqWaaSEz7BSXnlar3Qy950UrdyT0y0vPLq5 nZc2qMi5vIL15c6tUt8VmydZa6rNl9CSd6r7a0dTnpfc5jp7t3K8xJJfJIJ93xovahL7Y5ud V/XnvYqu4Ql1rpe2be4VcX9qH4/VeZLn3Nv67z6tHfyvg12ef3ziS4okq/s2rIJX9vsc+SF8 CCjKlbLvczubd36tH+vhdit6Cb7i82diXjvS4qazav1+r2Vt5LYopMjYV1+yrv1b1zkyyndQ fP9feVejw3Jfaw8iKLqbgiercSzk1Vr0p2Vr9q3afYusv1Xw0kWWeq92/MexrjtIPdC7WtVn r31dsPF5ynbhbvlnvCFszOjYgrtPXK7PevxOSzkY95XDu9yR561mHvdpnZ5qXvWYndKlASbz XvhLLu7lXbDGll4t8s7UK8AnRbbzyO8tMPLYbvFZWbaq8cH5innWjXu7O3j2bpxVZma+2cum STfVjpzWm8MuN+9mXNboS0qdvYTsXjhDzAqpM8/dKlSqTlSbd2pmb5vn3P3cq6qzzkLqrPZK 3PR1kiFfpi7J2Dj2/ctUq0jitqijaONvXVrKnet0qwVYlVRJ8+7d6/K25j911552xt+mipze c1R1HRRPrjXr38hAl7+/GgAiwARAkJeBJFggPIBHgQHwJI/ukhCQhf0Rbbbbf94iIiIiIiIg AHAAAAAAAAOAAAAAABJJJJUkkkkl/sAA/2tttttttttttttttttttttttttttu22Nttttttt tttttttsAAAAAEkkkkkkpAAAAAAABIAAAAAAAJAPi22222222AAAAJAAAAAHdttttttmYJV7 9/En9tSX9oH9ElVJsA/jQDd6q/rIAboHAZmZsCJLYESUgeBgAwNgEA2AQDYBANgEA2AVRu9J ADdDMzDgNgEA2AQDYBd2AESTEjd0EkukSSbSUSSXT0AAACqDd3e5J7u+3uYAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAkkkAAAAAAAA22222222JJdu7vcJJJAAAEh7773r8V3qEVOHTYtqdm xXV/4z6/ZW4930js55plYU9fuyhHO8i8/PW62pC6nvCdrwF0q87wliOV+2jqd7NCyuo2nnuj zNvS78GbsXP2cqurlX3lWeynU5Dk2KW09rOeqrxePVPz71rO1pKc7tVe4i9iSgiAID4SC99E VZ0Tb+d/b9UZVznTGd9R71eXk7KSXvbfZbMz1ryRXGc5YyXotSmSk+9WG7OcChF5G7zY063f T87ui1ZR7LksSqxGbNNjwSudvSXi1ZlD32hDzKF69LmHkzbdDtxmbjM3a20h1j9J3jHfnZFz eW445xx2mzlZE4TGwY49Sl0wQHwkER6pc3E/feyJd2/riW/iMy3EEpOneWZvZ0yXiWaut3nb r10qtYVr0v1pteVrEN97cp1ipKuQFx0/U7Mp0h3dm5jnX3JZ1ZemEq86nUyb/HIDqHe38gmt 2fs6c2qvd2KnM4jrQID8AiPZ21UU6d5PlHPAVMLGfb9jlYdJLtuo3b0dNalAPI1qMx0VwOuW ZNrLjfuyW4Ai7noW4UAIPXkr2ZqfOd7Mh+lPpMzqZDSzq3C7Ul6a0z2ex/q1VXK0S+tDzIN0 EkfAI7Z5kzM3J9cOnrxxU1UM5029Nsk2R/TL+nZclW2UHN15y6lbMGpVuzbf5sTTbEUkdkk7 vd2al3udZyWrVa8+9mYsbK9OXqfVr1PQ/FIvlvec263b5s2DpmzDaJ3P3LvIxxV3lAvcg5dZ 2PzPdBcnZUVnHcyI6Cej3oOkSR8Ahw8fd0O7+yK+iIyJplSpdVE/XEH1y/VnPiUL3mtUu6ir TrdPDtu2nClO2EX4vjCAHMrp55u7Wyl55auOeulaSoukul1mztX5pZdCVFbEU7UnrnpFnb3b jhhWs3DJby6I893k8j5Yq91vENq/JSOrNvL9KBJfAId0PRh0R9uP7bW39oYsUnxtXZ7Hu7Df 2NUk0FSu/bqb0zGWM8vbsbrLFWm1CrT/Zcqe5/pfVi6XDlKTTo1cbvq7xGt327qPZVt5a9Er 8rusz0UZ1TCrecRl7GVWvYe97x5xyAPkkA681F5el4/t/S/lSlr70xBKvye2ZQ5frzkrObo0 kipXl4R9crKsv1u6NvQyXddRXt6LZeNb4vzvDBSy1KawbeP953bvmF7zeQQy3kyyrM92IqG+ 02e9PTOuKN13Vdb9ewOM97anoMl5u9O84jvkkHZkQjFkdqz7Ex59N6Hvlr8IuBKbt+saizNt dT7Kp7Tp4ZcJObLnLMu5RlhqLS103WGcvTE3BYM71LAybgvbjRoMur8YoeGr9SMiqaa55KtW cqU85u5mpX7h4iiLs7t2memS9tJ9T8uF4j8wqZ7KJoHHr9m4t7HM6TnX2+75JBfx773zh/tk gX+f8P5ky7a/FXSqzFT/gS+xX/Nnyn41zMyl5bdPFYndRKMz4Tn53kuE+X6XF8S6Gq+NubuG ++e3+7EXkVJroqeJ/PY+qgs22bm0tsu/basT+x/j8yXT2t9RVZuz0QjoZmYw89645DIG273o e02e/K+zu0KrMvF5JditqLwmVXUDtSuXLzaamT3cJicSP16kteeORF52XUrbr3qt+WHHr70l ed7vTPRQnc5eJ2T1bku+vK8qd6tukyOrci9Hzuo9Va+mT2XdOb2bFTfusWiu5lX1w2tO4XLz q+Dlqu6dCBXmy/Ud2TLwvMPB6ePVN4WTtr3VWLNfBsdgbKj3rsst7Hs3q71kXWuRtxDHLS8d 6OU+e01XL3b5PZakoPexYy273+y35L7vdbv673NpK7L02teVc2NqPOW1708k1XlkaK+ZlLcm vuf40Mfhetv2d15XtSNuY9dSX4ojfNefYdy271yRecpae8K63POh1m9JzL1pY6PxPc9LdYco umHbrWwOt3t9jnD9t5nXK7Cte74lxNEZHRVWtI5nXa6zMrCLH28cpfFRv2LxyLvyXS6jWLPW lGjd865LIrV1LuRc9jd4P3bjiS7pXbXjz3XTS1uvOu27F0+uH/AkhLVwAIsAEeSEvIQHgSRo IDgSR5AF3/T+f9Kqqqqqqqqqqqqqqqkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkmAAAAAH+W222AAABGEI2AAAAAAAAAAAAAAAAAG2Hfdu92AVVVVVVVVXe+7vVVVVV VVVVVXe93eqqqqqqq6ABXe7vqqqqqqqqqqq993vqqvQAPdtttttsAAAAAAAA22wAAAAAAAAA AAAAAAAAAAABtttpJJJJJJJJL+kn8dwH8Af0/mBVGpJNgD3qr+Ikk2GpLkkoBsAgGwCAeBgD SWwIkpAiSkCJKQIkpA8D7pEkmwzMzUlIESUgRJSBd2ABsAgGwCAA+SSbDUkm990kkkknoCSS 5JSJLybgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkkkAAAAAAAA22222222JJdu7vcJJJAAA Eh9996u51/Xq1jVf5UzMt4p9Noi/bweust7DLrKy19iqur+TnPU/xS0+X7q1Z6YVmw5eUp0k XQeNeW6uRMApBK+q7v6pdSw9j/XhCt2ymsjeo99BrMazYXt8df0P33EfQFXX6XSyTAQuP30k vEHARKtFlLMoHm+yit7Zr2NTxe3Wt/bjONuVrVtWyHNwi6d1X0ZVO6e598g99gm6Xopf09Xx dd4lwRL9U+rxPOC62aytz3rl0UTFfkkH5bffx1TSL/UilTpPF99v38vS3/De9g8OL5cVfqzd y7tMRWJLXfWlJlp9zH98Kqdl07p3+Yvyx79ZMu0nHNDaY7d1fm+li+v2pJW6+2/GU4sS3vs7 dddm7pe93qLqWYjzsyCWY4abhjqAtlOvT9fUTz018yGc/mT3pRjxlzHNQOmVVx6dsCtqUU6v 4+qUeV/diXt31Oh0q2ipy+207qy3V9En7IVye0XOHlFdtV0zoX5mVpe9Ozv4ffv1UI+R9oS+ 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 vbq+q7NcvOO7UehVKO76+8ZoJI/CQH33dfutxdRN10/XUut3Tuytt0yqr73Zi4nuq4yIn9T+ yfYV7Ec93Ou1TCXdRT96Y6Z2w5qHrp802W6ouUQ1HZFddPLIvYFzMy5btmMPmXeMiTH7e0+l Pd35ffVv3vnvb9JpnuMst6HpY2MxyydJ+QplrElUbe3pSyyQ6b7N8liRdZiAWdUvPV2ryRVP 0OyuwNu/AObTVdlXe9lXmzubJDt5HG6CS/CQBHZvzJ9Qvril98yBeG7Xs+9kxUtzbqT2Ve+v C6Zc93h4ebp5ZHqG97c9qrlt9+vrCJpfyWecP307zvnzqIJZDl26ZzJZdkW/TeuL34lmkOmf MPM1g3zLevXl1Kz2H1++6pr7ytw9ZjVPzt225apw6v71ZLzfbqefUwcF3qSWUu+53Wv3cl5O WpKrvRezkCzlrrqqsygeNy77XebG2NOlvReLOMqXk+tx1V7KEgPwkAeyuyoqaon0ayekuwSR ubePKnZzHLudPmCSJrC4+pz6Y2PTd8khGydsMnf0/QvM+Zfvu96HbtCWU/mU0fXk40W76Cmp Ze/WuQkiznTp6TCzoIZg8Z5ohyyOK+jWCSLRbO6Bc36/o+rKf0nkhJ3t7W3cx7Mv6rHU8CAx +3s31Vvpy6jKZPIBGxVy3Fxu+2urea2/K48zU5SZu7nFeKnTw8xVtdnjge+zNfe3zm292NQC PyQlgJIYhGfi3+ZpVfRPT9Hkkqt3P3rqLo/Przc2Y9sb1X3sqt6/TGd0entQI+l2yms++kVt KD3tPV0AkjDXVlyNpN0wfQQyYhsv7dgh5spIDDzUtc6YXnSfPGoW+77ILYICLrY6vq6vveQg Oqub1zLhuPXM4kARM45x30Y/ZfmCA+MYNnn588ZTCZp3QU5YYz9Nq87PLht/jHTbqU/fxV+/ F/ZJf69zoJrs8vrVRejMrd9nTy3qnjbMHSyvU+7LO2vZVSuFU96dTEZZuE2k/FSnb5KqeCOp be1l01Y4ylPF4pT6+q5lHa731aeeLdflR4WXqd0iy+e1f5tpbXEJv5TXtMs9vVWy8TbMu31x qLsntV2fFOrrqKja8og71askoiPLdwl4PNwDRG+4y/VE87u+2t9edkrn1VFOkjArT72l96Dg r5vO8Uoy89UN33nfYrz9qrvcnt7Q3O19Tr1K99HOW+aT8Xj2vZkbvFb9aOmKQiaubJxo96e4 7NxshvwmGRc/dlLu+J0K2Y68j0tXfQwbnua69fLC+6qqNiJPZWkm7uYNwPpvp5y+e1TemVWv MF3X1FiuzslSGSy/Uz6um656mKXN6rlQw1riYtcuYOnXtO9CquXMvB+rqW5EervaTfoNpOq6 6qJqYqovevP4ECQGnwkktABGIBEggMAWoQBM/yiIht1VfOAAAAAGywAAAAAAAbLAAqqqq55Z 5znBzlVVVVVVVVCqqqqqqqqqqhVVVVVVVVVVQqqqqqqqqqqoVVVVVzzgAAhwgQAggEkcCSNQ IH/G/Xl3f8Xd/v4AqjUkmwB71VIkk2GpLkkoBsAgGwCAeBgDSWwIkpAiSkCJKQIkpA8D7pEk mwzMzUlIESUgRJSBd2ABsAgGwCAA+SSbDUknz9AAADwCSS5JSJLybgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAkkkAAAAAAAA22222222JJNpJNiSSXve973ve93eEI/mv5MbP1/V1cOZYff fRmfgSR6zDZOindev1266euASQ5vdfpyYedvuvfNIET8UzzPNU+2FZfTtQpmC2Vm78ZfgQG8 w73pWO2fRFXEstpx2feBAVdt1LcjfrjIQCMd9n2lDznMxv3nvqBJGkzj2ubmqCvUeHwJIeZ3 3eg+9tbctsxmOnP0W/fUyDdkBWjsim3zOYSx4vzirBZb+3vks+xRR/Tdu5vei+MutMsuXiy/ ZtZOa5n0VFeh3tW8fJJfkkBySEmIR+Ws/PfV+IodQrZF1NshubvX636YoEBEXeOohuI/US5U Z+upSAMi96Kreqb+2HyBIqu9s9u38ZpBrNzXm1IJIsIYU3FOM6DPr+iUhIr5229yXYIC9mPp hu9zt6dfPL9IID03Z47nxT+VbhfvumQQGlslmtEMmIUTCHtdczZrIY2O1ZdHfH6pf6YVfpd/ V1qfaxnxsSPmu7tqrJrevejnczk5Gro96enY/AgMBAMQj8jvoXzXMdQGM5mR86+GhILVfm+7 ufr79k27cKwSRlzs5N93dSEkTF4+p1tuurtir4EkOjHfzodQrBJHufr57HqjO5CSOuJys497 zm8uPRvgSR7Zv30s++gWMj5t+b93XSQLAlyy2e9AVEBeuZPNWTm5UHQ0IAwtoLapkMmINzHe ePj7T4pGfeebVnjcO51rbpX272zCtV1tzYjaiKmnGxOVJU5sYgR+QgKSQDBI/IxiPv2VGe+/ ZSEB9+3Xdc7kcXsl6hAem3tvNHMvm69014Ekbk7OTOFY5bh9ZVfv1WSJa5uastK/IovyXds5 96VCPvX7oOM775jj0r5rmFsJaPPHz888bEfUUwyoX3RbKdsUsNGGknXRmx1lt5tlV+qvUln5 V5px8qrCGL56ffS9ceu7F7mCDqzPWdHVbYxPelRrtfg11zNeTiveL9V1XsH3Z0nt3e6onZIs EkfkkhOsqNdI2XZyTnGF3Yrq4tWZHnzWZE17Jsi3lOezOs3c6c7t39noNyt6uro3HUXKGy2V MW+eVCHfp1mjXs5937dKqMZjI6FTLyCGsndrdgxox86edk3Vvx3qQAGSyohfOmfMfr+zD15M ZmTfjEAIibeOpo11V3cY6QAir+ic28ibZeZmedwe4v3xgAIxbXbR9PTjN70n2++33vfG32fD 2c2cABHsnod2X2bu48sms6ZmbuD3Yc606dPU7ukvI9QGKlsbeV3u0tfpnlap9svx7diItJAf gQHwAIYJG0/q6Mor8qyFDt3mSfTBr+LndkAEWn0ExU20XZCKi5LZbOt7udzn4rPfugAEfHzj Y+zIvKumc/PHjRbi6iIKiEAIouIp3ZO3n0Z6arL2vqZWFdqAEPKvcy5ZUTc3ESz63G1dXtAk h+6cz3u9nd2ev4m1p9YAIsr2Tzty1TXffStZrXMl2171fNndE9IAI1NkRAS632G7vH11n1Qd PWkkk+mtu7xzj3z2a92ZYkktvoz1b9bewkX0j+2Jr75zsW3FiUzjfnTje9afaCRCL3r1dkze nrOrcq69lbE7cVlQCA/IQl34x6xNkNT0L36PGfr7nPOAEBl1Pbryiv36cbbk2552CAfdMZUu Y97a9NdiBAa7+hqdhEsC6rrBJE3DCmiHLbppS0Vtyp+n4jASLbRLCGUwuqroM37Jj7jEkJfd MZ2e29Jyc681iA19UzP0eg99CyfruO1hvo7z5fTo0fUdZkBM8/L8XeuL99+7MTlGxG56vER1 d5SVePfHlt9L8Opa9h6rNiuukID8AgJr7fvn9WTE9RN+7Ny7m/kuyuse0rdkq1ivFfsMOqZ3 t3M/j8qlpksK+g9Hsu8cO2dm199tJx4++kjzmnlus7dqoj1ffNZFxImxFslhLDr9rpealihr G2eY2aMxrvPDfHsV3Cv0E3CtqnX53UnFev91Q9xX3Os4mXUHq7fsLuiCrKzLeDwXJHZvVO9d xSazxplz2TvWtqG1bqHm1lpAH4BAfgX6yAIa1o+mtpX+rbffQX18H8XuNr1e0Nw2m5vz3TXw 179m9rhkSys6kPZfPRM6K/GKn9t1V3UmF999n1iHUKWUzWjzU6+ygbRtQs4hUwtpsqTDeLRL Wv093sgs2eJnPp3bjhmMyy3nHu8V4+uvZXqvfTeJZNU/FVudcez01NE9nuyp12MEB+SBEIEA IGCREeHkbNS+Iqu5+qZjs7O6J26vtirZl+97cy6+x72DHW51+PWsIbXFrpd1KRpchtsrsd4m vWGfw+WxfXn3yiz2XdS5e36y3gyGN39nvve+ni/oPqjZj7YplYQW5yLez7F6Pp14d1tU7dHo JqLdMt+x9CtAgBBWvzWjJZOQ3TocTB77Pteb6IzL2HbzNC2bPtkx+p/b6rDvTer18/VtvdSL rq8pd26fSZy3jpPVd5vlj3nTm36ZWy/pte59DW9Fvk3uvwq197Ve8vZnsuupF1bm152bUvzt O6K3HaamlLBObT7aJq/X+t3e3r1tZY/RKvWwI+5a4Ze94vp3Dw5Fa263OxGH9ch+fvfOvs86 PBKj9dl5f6XIR51e7Zy85VZpSKOb5O3LlWz3XFSBZdXuVlAnhOJ1KLny6+dvfDhPU+ujJnrp t2UilhUzdREcFe32r0x+2jni4yeXXlJedDHMV7b6vDckFfikd3bFVN2JzieutN8dRk9d2V1t Pn5HPVC6FhxtdF0zyJXju6K1YkvZ2wvV7Jq1vFJnY/dkzF427XpT4VSF3MfbsCdzTc8beent bV9OxPijb5JwpHru8F6M5SnEzORlRfKKrnc3uR3GfwIEhH8j/yYkkJCFf8fv49Ee9P34yO/h 2S6qb5zd+mpK2n5+6Ho9XHLjrxY1K2Vwo1QLOy6cdeXXsnJSJt87zn3q9YqJmcz1UzqSZ4Wq 6qqPD664W7Qyjz0rpmFe3Xk6VsrtmbmK57sVLb4xedW/eUXBm1wZ7Imr3kVqSb33HPZdVc86 g/ZJ0MttUr7RMurfVtUqsod3XZ55EUqYZTZu2qXba/XOr3ZzvMB2rXbmk3archtd89sLz3dA OMzpwaYJ9UqYeo7cVqrz9vLXRuEiZ091czW/AlfHuB3ccdUrvHfL3Zq5T7pfbb91+8RGUl5+ jrdhT9HxV4JDl7eyLlOl+tUrl3rlbXVeJZzqFN7B9uDe5b9ieR3jV9ztef1mGVYalD2E0171 9tev2tyJam0VWek7EbM7IunVRxzZmRSjlsfJc9uqke9jvo5HZM8833HnTvd7fTtmt49O+qlt Q26r7bpUX1nj3LOPcZXe0sM8V1nlinlku1W7XddyWXW562sZezp5oifoid6Yhqba91XiavsU ZuKlW3Ub28K+V96SNrJPTOsvJvzpSniupnpzj+cKmK/LlPZK0pxgVYZ5X4Tvuv1J+Ox3OPPG 71+fquRW57NJkWGYp6bl3p43EehXecR0GHri90znkR7XPiNKNza0nSM6tDdx1K1FWU0V2ZMG rxYv2ezzxzOy/OvVfX3eMPPyeejfWbcr1R2y+p50bqvVlvd3vct7zU58vAvbqp3V7VR+VG+U aKM9j28Pd3YvV6n3KbV0tijhWlqjCiB6jZ7stkKol0dKKyqyZDN8u0OPrPOmLMmHt9sZXNUe mwHqu6rnuztfZ7N92ekbfvO/X2mVflfaX7tPVGPK4c6rd+vtucdna5tO5YlsxVMbvtou6h3o qWdhZl9212xUenjyp5ds2bKutuXCZ7mUmqbyLG+03waMHGp1du1T5VtFqqa3peWd20DfufRW vOBLs61lxXWLxb84p12OvK7RDLQd11nYu7yaDLRnSn7hXt5NjkuHrnrk91V7YkjjruLzl5lX 5XeHunQ7n7MWXizd2/Qk94PZmy92uCnvDimjPQqS11UovHi1vp2eV3nzLWj7S6vxJS6/J1dk w5vcfsZlFXvTnwmTKoRm5Z4aEq7t3g1VHoC96LluP9zmUjlvrv2l3j9M3fXjt1mLGSyq1lVE X1VTuhrq8/MhuNegeeedyLH5vgWPJD2cuahexXyudfsjT7W0SVOnt1Xi69UBG1ap3iuJ1GsE Sd5LDnVefKcdqrNT9L7Hm8qlq61Dx3t6kercNK19yGZ6Urbvhb19O8SK8zOUxkl4r2fZzqjz C7fFeiVvn2WO+au5XXlLyNKm/JiFp4U7HC7fZSXbQLw6VU/Sc2/SRJT3Vz1V0tVe00TrnPlt UVdbWlN5lM7Lt+JG5WZXU9597fnOe8znWSc16xN76bsur8bXQr23jobdHGMmPea7l5Enp68M FJlbsyeX0vqnl3qxWqL6+Mv3pKy3nc2AzXXkxvXdU22q6iXR7coo6TqtbzS73A6ed7PV3b4H G+ine7s7zwfbWPegebeaW0Lpur24Tcazt2t3awP7zzraVd9dPh3zVfe+yxrb8+yeoq6zpyn5 1gLalepN1621sXm5kWXN/JWbdWGt+qan5qIfe5VlrItoxWig7poBSb2qE2VbY+p4vTzxrNxo zLOcTK2/XVKiPKp6LUXd84kk8UXrenbVq4q57mdlylKpw81T569hooe32m2p0foePLTk1p1w fl6+VXU5tCLmXdGQg9eiQoUnTXkb1ZXE2/d73dZVy+59Xs7fQv1cTZG869td6jD21U9NsKGp PVsXJCIa1b8896suU+EZu5kzw+5TqtsIIvQKLXjN5+v3b6s1yDJAfn2X6ufZU8yrMZjwnOC6 t3lQap6eGtsMrt0l+pvPqxnI9uuvDVX5VPbvPm7yy/CwtSk1VbpU3lmclPMem7CXl3nfVuK+ j8GPe2vapXBeiJjqAnYvKkYa3H7Y554wE23Pcg6HcB6u91ezxmn7OtmkDzgsoC6zwBPTK5VK zsq3YZ2TI+VXm88zK1256YzmxGd7fd1cq3GsbBeqPNsZlFSovYCV37Qp+u9k6TFnS53G4l5b dtJ1C8uqddFy9uTB72tXeenRXVcUk7DvDnb136/N95VKz1XUR2DM6nRDIt8/TxV2Vl7bnPak bbA70cM9qaed7kzfT2E4wK9dvMhdK2VyXp7vbNsd+NM2+0v0/Ki6PGKXt02u951tcHtV2pFh S8ekaRvTlZIkplK3tYyzt1mJ7j3i88G2uOTB3ft1Ktp9YLx1Z6KdOrucPXd5Ze5qwp3xWr2C pZ7sWZVv2evvAta3b5Ikv1bnVvGsPZVwuc3RHStU5K2bvn6vVu7t662N6bWw36Y6yiSj0E7u 9OTZxh2z6sMu17Hk9h7jNexXs0W7aJG2uZDs5evz8rH1ud7qp36FXFAHa513r50u59lw9vnt 7p6LcxJGnp26XIU3l+eU2+V9vsva8q6zOzEqh5xrvXVUSZ6cpJT7ex2ru6eaUs9ueMMWV1dZ HvcuIbM3PLUVdzN+e+t9vJ+7Wp7rCbAtZ65WdQxN1vUc4hHq3J0uc0Wj3+j7sM+WWkyvp5fo Jk27exmHrxeR9TfeS02+4i9+Ly3H7yK3VJF2Y7uzya7nz3Drym7UKq83Sus7bFpUG6gr26S2 ky527cu/qq8uDt37XEmDrpW65yryl95+u4d6KoTafl7bgs7dqeKJQhb5b0jmx0VlZ53depTK GHPLKKrMO8tT8+sVvnjZO/S/GcV6PEnN8h89LvY763mLrVxedbhSmPuqmer3Fv13FjwfU3K3 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 WRWRWRWorUVkWRWRWRWRWRWRWRWRWRWorUVkVkVJFZFZFZFJFZFZFZFZFZFZFZFZFaitRWRW RZFZFZFZFZFZFZFZFailRWRWRWRWRWorUVkVkUkVkVqK1FSRWRWRWRZFZFZFZFZFZFZFaitR aitRWRWRWRWRWRWRWRWRWorUVkVJFZFZFZFKitRWRWRUkVkVkVkUkVkVkVkVkVkVkVkVkVqK 1FZFZFSRWRWRWRWRWRWRWoqSK1FZFZFkVkVkVkVkVkVkVkVqLUVqK1FZFZFJFZFaitRUkVkV kVkVkVkVkVkUkVkVkVkVkVkVkVqK1FqK1FZFZFZFkVkVkVkVkVkVkVqK1FqK1FZFZFGRWorU VkWRWRWRWRWRWRWRWRWRWorUVkVkVJFZFZFZFJFZFZFZFSRWRWRWRWRWRWorUUZFZFZFaihU VkVkVkVkVkVqK1FSRWRWRWRZFZFZFZFZFZFZFaitRaitRWRWQf+ggKCPBAUEaEBQRxQFBH/X /6/zv+/7/r+v9f/r3u7/c5r/b7/LnP8c/d+7/O9/d73+s/4zP/GPf5M7u1u1VTzsR9t+iPR2 bnJnszO56Z9HpmdzMmf3v31VWbGyrLrcmUzO1W3lZS7u6zJn9799VViE7WXW5MpmdqtvKyl3 d1mTP7376qrEJ2sutyZTM7VbeVlLu7rMmf3v31VWITtZdbkymZ2q28rKXd3WRH9v9z6qrEq2 7zt7tUqkyrZ2d27usiP7f7n1VWJVt3nb3apVJlWzs7t3dZEf2/3PqqsSrbvO3u1SqTKtnZ3b u6yI/t/ufVVYlW3edvdqlUmVbOzu3d1zn8rLzl3eKXVZdbszs7EbOQzKqpvn8rt7y7vFLqsu t2Z2diNnIZlVU3z+V295d3il1WXW7M7OxGzkMyqqb5/K7e8u7xS6rLrdmdnYjZyGZVVPux/c t9d3vlTPanc9sbzmxnu9mZj1x/WPru98qZ7U7ntjec2M93szMeuP6x9d3vlTPanc9sbzmxnu 9mZj1x/WPru98qZ7U7ntjec2M93/OzCIMqp4iPtv0Rsdm5yZ7MzuJn0emZ2s9Mv11zMztUuq 7dbOkohPu9iIiO1Pv1jmZnar11XbrZ3yUQn3exERHan36xzMztV66rt1s75KIT7vYiIjtT79 Y5mZ2q9dV262d8lEJ93vOc52o575iO7OZd+7d527ut8pMyr2ZERzLjlfMR3ZzLv3bvO3d1vl JmVezIiOZccr5iO7OZd+7d527ut8pMyr2ZERzLjlfMR3ZzLv3bvO3d1vlJmVeycmZjOfV+sc 2Luq9dVu973t75cxCfZGZMxnPq/WObF3Veuq3e97298uYhPsjMmYzn1frHNi7qvXVbve97e+ XMQn2RmTMZz6v1jmxd1Xrqt3ve9vfLmIT7IzJmMmOV8z7OXcz6vF3d08XUyr3IzJmMmOV8z7 OXcz6vF3d08XUyr3IzJmMmOV8z7OXcz6vF3d08XUyr3IzJmMmOV8z7OXcz6vF3d08XUyr3P8 yI5z3vdqp5sR96/RGx2bnJnszO4mfR78mNnPV6Y9zv7v13Eb6ve93ve371+926r1xsTu1U7t zHeb+79dxHvV73u972/ev3u3VeuNid2qnduY7zf3fruI96ve93ve371+926r1xsTu1U7tzHe b+79dxHvV73u972/ev3u3VeuNj+Tu1W7Ec73m/by7mUi7u6yt26mdrZ2f5W7d6iOZnHzl3Mp F3d1lbt1M7Wzs/yt271EczOPnLuZSLu7rK3bqZ2tnZ/lbt3qI5mcfOXcykXd3WVu3UztbO/l bs65z767hzY2Y2NKqq7O5UxG7W1v5e7UOc++u4c2NmNjSqquzuVMRu1tb+Xu1DnPvruHNjZj Y0qqrs7lTEbtbW/l7tQ5z767hzY2Y2NKqq7O5UxG7W1v5eTx993nLudiMjmczU5PY3JjN2dn fyszj77vOXc7EZHM5mpyexuTGbs7O/lZnH33ecu52IyOZzNTk9jcmM3Z2d/KzOPvu85dzsRk czmanJ7G5MZuzs7O1VVMXMx7nP1Wc9Gz2rrKqlVTfVU7Pv5f9mfTy/viO12fTHo2I7F8zsdz IyM/Pye95vN++u42tnZjY2I7F8zsdzIyM/Pye95vN++u42tnZjY2I7F8zsdzIyM/Pye95vN+ +u42tnZjY2I7F8zsdzIyM/Pye95uRvOd7MVs7MbGxHYvmcvO87zv5+Z3vNyN5zvZitnZjY2I 7F8zl53ned/PzO95uRvOd7MVs7MbGxHYvmcvO87zv5+Z3vNyN5zvZitnZjY2I7F8zl53ned/ PzO95uRvOd7MzW1tTzOc7y+Zysvm9j8zvebkbznezM1tbU8znO8vmcrL5vY/M73m5G853szN bW1PM5zvL5nKy+b2PzO95uRvOd7MzW1tTzOc7y+Zysvm9j8zvZjcnYiIiJ2dnZjIjsc5nKy+ b2PzO9mNydiIiInZ2dmMiOxzmcrL5vY/M72Y3J2IiIidnZ2YyI7HOZysvm9j8zvZjcnYiIiJ 2dnZjIjsc5nKy+b3nsmZiNmY9zn6rvPRs9q6yqpVU31VOz7+X/ZnfVU9j0zMzXamfTGRHY5z OVn3r5+ZdxG9nI7MzM1lTOzGRHY5zOVn23z8y7iN7OR2ZmZrKmdmMiOxzmcrPtvn5l3Eb2cj szMzWVM7MZEdjnM5WfbfPzIu5ne1kZMzM3dTOzGRHY5zOVn23z8yLuZ3tZGTMzN3UzsxkR2O czlZ9t8/Mi7md7WRkzMzd1M7MZEdjnM5WfbfPzIu5ne1kZMzM3dTOzGRHY5zOVn23z8yLuZ3 tVk5VVVd7Uzsx3neffZVZ9t8/Mi7md7VZOVVVXe1M7Md53n32VWfbfPzIu5ne1WTlVVV3tTO zHed599lVn23z8yLuZ3tVk5VVVd7Uzsx3neffZVZ9t8/Mi7mdrt3lZd3dZlTOzHed599lVn2 3z8yLuZ2u3eVl3d1mVM7Md53n32VWfbfPzIu5na7d5WXd3WZUzsx3neffZVZ9t8/Mi7mdrt3 lZd3dZlTOzHed599lVn2397sRkRszHuc/Vd56NntXWVVKqm+qp2ffy/7/ZnfVt3eV67ve3u3 VeqM5nPvtqt+Xz8yLuZ2u3eVl3bt7t1Sozmc++2q35fPzIu5na7d5WXdu3u3VKjOZz77arfl 8/Mi7mdrt3lZd27e7dUqM5nPvtqt+Xz8yLuZ2u3eVl0ut2plUd53n32VT7XY/NnvapWXe1t1 t1u1MqjvO8++yqfa7H5s97VKy72tutut2plUd53n32VT7XY/NnvapWXe1t1t1u1MqjvO8++y qfa7H5s97VKy72tutut2oTzv3effZOfubfPzIu1Ky72tutut2oTzv3effZOfubfPzIu1Ky72 tutut2oTzv3effZOfubfPzIu1Ky72tutut2oTzv3effZOfubfPzIu1Ky7rb3t729qoTzvfv3 9yc/c2ufmRdqVl3S97e9vaqE87379/cnP3Nrn5kXalZd0ve3vb2qhPO9+/f3Jz9za5+ZF2pW XdL3t729qoTzvfv39yc/c2vvZHtiEzFc5+q7z0bPausqqVVN9VTs+/l/3+zO+rbu6y/dve3t VHp53v37+5OfubXPzIu1Ky7pe9ve3tVCed79+/uTn7m1z8yLtSsu6Xvb3t7VQnne/fv7k5+5 tc/Mi7UrLul7297e1UJ53v37+5OfubXPzIu1Ky7pe9ve3tVCed79+/uTn7m1z8yLtSsu6Xvb 3t7VQnne/fv7k5+5tc/Mi7UrLul7297e1UJ53v37+5OfubXPzIu1Ky7pe9ve3tVCed79+/uT n7m1z8yLtSsu6Xvb3t7VQmY73n1/ZefVt8/NjvVZWXdL3t729qoTMd7z6/svPq2+fmx3qsrL ul7297e1UJmO959f2Xn1bfPzY71WVl3S97e9vaqEzHe8+v7Lz6tvn5sd6rKy7pe1t1szqZjv efX9l59W3z82O9VlZd0va262Z1Mx3vPr+y8+rb5+bHeqysu6XtbdbM6mY73n1/ZefVt8/Njv VZWXdL2tutmdTMd7z6/svPq2/vbG84iOcmI+e+c2Ozc3Mpmdz2xsP5X9/tTO+3e97denanYb 6ZjvefX9l59W3z82PZnr297262dqdj2+mY73n1/ZefVt8/Nj2Z69ve9utnanY9vpmO959f2X n1bfPzY9mevb3vbrZ2p2Pb6ZjvefX9l59W3zY9mevb2+97e1t1Ee30zHe8+v7LvOXvY2fbvr Wvve3tbdRDfTMd7z6/su85e9jZ9u+ta+97e1t1EN9Mx3vPr+y7zl72Nn2761r73t7W3UQ30z He8+v7LvOXvY2fbvrXV3dZOUqZb6qnM5937t3nL3sbPt31rq7usnKVMt9VTmc+7927zl72Nn 27611d3WTlKmW+qpzOfd+7d5y97Gz7d9a6u7rJylTLfVU5nPu/du85e9jZ9u+tdXd1k5Splv qqczn3e3efXtxs+zPXt1d3WTlKmW+qpzOfd7d59e3Gz7M9e3V3dZOUqZb6qnM593t3n17cbP sz17dXd1k5Splvqqczn3e3efXt89EbziI5yYj7ffbzY7Nzcz6Znc9sbD+fz+TEb7drbuvTtb Uy31VOZz77vbvOc242fZnr26u7rJylTLfVU5nPvu9u85zbjZ9mevbq7usnKVMt9VTmc++727 znNuNn2Z69uru6ycpUy31VOZz77vbvOc242fZnr26u7qOymIZ6qnvebzmZ3vucdhPt3b26u7 qOymIZ6qnvebzmZ3vucdhPt3b26u7qOymIZ6qnvebzmZ3vucdhPt3b26u7qOymIZ6qnvebzm Z3vucdhPt3b26u7qOymIZ6qnvebzmZ3vucdhPt3b26u7qOymIZ6qnvebzmZ3vucdhPt3b26u 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 AAdVVVVVVVVVd3d1VVVVVVVVVVVVVVV3d3ckkkkkkEgkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkgkEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkEgkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkklVeqqVVVeqie+7ubbiSUnzqr79KrlABmAKqjgDve973pVe 9V9VXft3d34qrtQ75VfffVXd3fvqbu5m974VXd3d71wBwZgCqoZgAMwVVAMwBVUbu7maZgDM ABmCq5SqoBmAMwZgDMN3dzNAqqGYcAcFVZkAGYKrlAqr7773ve99mDMd3d3XfcaqvVoiapLu +X3z3A6unCLLZMZBZJqMgSCU7q7rTVrFZxV2MssldXczi5704W5da4qDWTG2wZlnpTo3bBy6 cLgLWQslaaraxbz226adGXhrHEi7qcuRYxUwJFKjwg5MLdjOrKNksMErm5mp3e7ru9EBA4Cv wCZ3fu856t71qHLjT+2jqy0EY7zHI2bSNY4xbZJlJWbyPZClJFjO0XmvN3MOuzqsjPtm5t7S aaNp6ByBtDO3c6c8sSNuLFzrA85Zt9nN5r3MO7OfXs8h2U8avZ0mETd3M1bsrFm5m7jsx226 17u7s142DuMtNqXkmSsTTbZUawEF4k8L2tyKOGiWL4+yq77ucy+zLv3da72Z3vedARsED4BK 1rzpoz57eMbqWbponcT36S62RSOty6v47V3yxB0ATqNws3wFkUtVcA6fZm0F6WXiWK4qZaU1 vZM15ia6s5Qc+GdMmabWZl08qw4wsDLa1syauI0DLOIlLE96Ze1H2UdrsOPUOkWlmNKTeA1U +LPDqs0qMvCIdPOb2O82MOiKOMYVhF9eta9m7rt1Obmc3lAqWCB8AlcvV1f15aWNE3fgmiR7 5dHCMH0GxqJYlRUbMjpuZ8K3tJuckEuOY3h7a2rjgLVlW28tVeCNWQdK0HudZldhdvVUWlVm tp5mxVzbbOddXjy3AQrSJSTlYtUzADbSaMraZy1RDXZTnKsLANZXYLs2zbpdrO1zO82e73nd 7quF1YFAI/AJ9zMl7Low0ykMNM2NxK08XP6rLhOWyiLhWJqzzsZHfoPGg9YaIp6Xm1t2le0x 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 XaprGKDeoX2o3d2QWVkKyVxo3Zii6YAe0b0Y4ZpExC+yKd3Bta+wHWmzqe8Sc5aU7fO95vST 3o74vOjZYQqCl0nU3rVC66ui3FOu0Ft9vJrG1MVbpu3Lvi0+zus71PbVYnw46KFBpKMi2LmZ ze2xtPTSayKKa3RW3aRaV4o+HMzslN49V8gUd6+SbyN9pjUJ3r6+Ubt6kuD11XWqaovbmUq2 DrkFOKseE9b325DctEb2XjSTfdmrDeHDsayDRQfIYhpizWsUkeXCX2Pdrib3MXKUTRp25GRm hZFLFsdH29dGR5/gylUhpfVxXD7Tm0R3yorB0L2bbFH74arJ2Sq7Vd7nLq4s263Zku8BDlJP OB3ES4YpQpobj2+rltaVRVXaT2+STg47HZzaG1cN9sCoSxZfV4lOmTe9cK0YKxi6WtnqQ4bQ h3ZmzInJwxDrzqW8zRdkVljrqtVxcCQiOHIdy1DobncLIqGbnVN2g5nZXXUIeHjieim5xKrZ r7WXUQsxcdQIqpOx5BguFjJKEsXUhV34NTbeNkQzgM5OEgcc5ck8a03prr4ZnUIBCRl5t5ip 882K52EpzZMKKGzl3Qnt7b69D0AQBARYcbPdSp105cU74whnQ63iLCuvQYC4c5NbK3tw4ZH2 Zh1jmw3FeXnG7e09nO63ZMOLicrTjd5V6tsnq0c6q8VHp3F0CEpDGc7jM3KnJDsJzrPbcLsx SG6C5zKndt27ZzKx5m296iAfp0dbSP3cvpUm2U5dxbiBlX9R11j7tGdNWlYywwQtdd01ypVc 1S3ULrRmD/pfL2mgHW9BYfznzFwsWWC4PnVzuGOVvYgKCP+wgKCP+BAUEf8xAUEbEBQR/wIC gj/sICgj/zEB+eefPPn19/3/aqqqqqqgADbbbbbbaI22222222222+eRb7tttttttttttttt tu679L0AAAAAAAe+3vr0AAAPaqqqqqqqqqnt7717VVVVVVVVVVVVVVVVVVVU9vfevaqqqqqq qqqqqqqqqqqqqnt7717VVVUAAAAAA9vZwAAAAAAAddVVVVVfx/H8fxzf6/6f2fv91XvVXvf8 KqhVcoAcAbu7o4A73ve963d3va9u7ve+qqFV3d0dKr776q96r6ryrMve+FV71V7zMAZgzAFV RwADMN3d0BwBu7uiqsycAcAAzDd3czSqoBmAMw4A4KqzICqo4OAOCq5QAZhu7uZoFV3vd73v vZPePe973vHvf7iAoI/q/fru7u7u6qqqve7u7u7u7u7u7u7uqqqqqqqqqo67uqqqqqqqqqvp JJJJJJJJJJIkkkkkkhBtNEkkmqqqqqqqqqqqqqqqqqnr332ABttttttttttt773vvuJJJJJJ JJJJJJJJOZmZhJJJJJJJJJJJJJJOZmZhJJJJJJJJJJJJJJ3vvvvvu2229AAAAADe+++96AAA AADbbbz31kkkkkkkkkk3f9/f39/Nt5jbeZ/Ntt/u6q5QA4A3d3RwB3ve971u7ve17d3e99VU Kru7o6VX331V71X1XlWZe98Kr3qr3mYAzBmAKqjgAGYbu7oDgDd3dFVZk4A4ABmG7u5mlVQD MAZhwBwVVmQFVRwcAcFVygAzDd3czQKr777ve9++zDgDh/55+c5z8/OefPPn19fcNttttwAA AAAU0AAAG2222+gA7ncAAANtttttttu7vt76AAAAAAAPfffffQB7VVVVVQAAAPfXcAAAAAHV VVVVXHdVVVVVVVVVVVVVVVVVVVVXHdVVVVVVVVVVVVVVVVVVVVXHdVVVVVVVVVVVVVVVXvd3 d3JJJJJJgAAAAAAA3/f39/JJbG25/fzbdfzbu7maAHAFVQzAHe973vVVdq++qve+qqFV71XT 3lVffbu73te3d+Vyu/fG7u97VdMwBmHAG7u6OAA4KqgHAFVQquU4A4ADgqrMm7u6A4A4OAOC q5QN3d0cGYAzBVcoAcFVZkBVfffd73v3PjgDh/b+fnOc/Pzzz558+vru+u7u7qqqqqqgAAAA A6u6gAAA222222226u5ttttttttttt883dd3JJJJJJJJJL1VSSS9Xru7u7tJJJJJJJJJJJJJ JV/f39/fySUjbc/v5ttvuSSvNADgCqoZgDve973qqu1ffVXvfVVCq96rp7yqvvt3d72vbu/K 5Xfvjd3e9qumYAzDgDd3dHAAcFVQDgCqoVXKcAcABwVVmTd3dAcAcHAHBVcoG7u6ODMAZgqu UAOCqsyAqvvvu9737nxwBw/t5+c5z8/Oc/Ofn9OfnAUEf/KgKCP9/1JN1VVVVVVVVVVVVVUA AAA2ABttttvsAAAFqAAAAAD76qqqqu3dwAAAAAAA7u7gAAAAAAB3d3AAAAAA2227q2222222 22222222p8822222222222zNtttttttJJJJJJJJUkkkkkP7/v+/7/vMzPb1rWt/3/etaq/Td 3czQA4AqqGYA73ve96qrtX31V731VQqveq6e8qr77d3e9r27vyuV3743d3varpmAMw4A3d3R wAHBVUA4AqqFVynAHAAcFVZk3d3QHAHBwBwVXKBu7ujgzAGYKrlADgqrMgKr777ve9+58cAc P1+fn5+fn4iP/4ICgj/kICgj/3EBQRsQFBH/koCgj/yEBQR5/wkyu3d3d3d3VVVVVVVVVVVV VVVVU0qqqqq/L3d3d3d3d3d3d3d1VVVVVVVVVu7rqqqqqqqqqqqqqqqoALu7gAAAAAAB3d3A AAAAAADu7uAAAAAAAHd3cAAAAAAAO7u4AAAAAAAd3dwAAAAAAA7tuAB5+/3+/3+93d+7Vd/f 7qqN3dzNADgCqoZgDve973qqu1ffVXvfVVCq96rp7yqvvt3d72vbu/K5Xfvjd3e9qumYAzDg Dd3dHAAcFVQDgCqoVXKcAcABwVVmTd3dAcAcHAHBVcoG7u6ODMAZgquUAOCqsyAqvvvu9737 nfePe973vHvUAABSqqI/CAoI0CIf+BAUEf91AUEf9BAUEYICgjYgKCOKAoI/7CAoIwQFBH/Q EBQR/zEBQR/zUBQRsQFBH/uCAoI+UBQR/8CAoI7UBQRsQFBH/7UBQR/6iAoI/+RAUEf/IgKC PUQFBHagKCOAKcEBQRiiACM4ICgj/uICgj/agKCOCAoI/8BAUEf/VRAUEeCAoI7UBQR//zFB WSZTWUba05UCbq9bgHSQQAP/9QAKv+3f0GDL3wAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAj 6UACpCPoGcAAAAAAAAAAAAAAAAAAAAfePq8cctsLWFSrZogqgNWytKZAqqQJnwLwCcvZNg1o NVVrK0WgS2iYzNZiDS6Yc8DvXYBb0UNVilUJY2iQiCkFULtqVFVcvAeAM8j1gLFgGJqamAFG RpkgJLPAeAc9KiXmyIQszVsy0TakqEqhEoDPAHgHnAKA8zIZstjTIbbVbWJoaoqXbVU43qAu 8BvcaNmGgprRmmpW2NGQKjRlVXTjvAN4B48cmUpqsWmqJKVsNtlKbaqhKsPB3gHbwpc7OTZi KaNLRltibYNaCqhQx4PAPA68G7OXYatDLYzZloZQmjCoSLbRIKAoTtqqFUCqJVJUhVFrCQqV EJEm2JSVRLgDwHgGwMAgCPQ7uQ4BzOIOAcM4m4BAACVPTz2yYn+qVVVJoGg0ZAAGKqfpvaR6 qqTSU9Q0MgyAAGDU8gyUlJQg0A0AAAIp7BCUqin6oZMmgGRhNMgVP9qUpTJJ4JAAAAABCoJo KiIZNRNExPyT1TaNNJ6ooKA/y/T+f6fr/T9sc65r+nOX6g8RBXqwgAIjuozjFirGc5sYqxZS WSUmaSRicYw0lSsoqjQkQJEAxKtULELEhSqljAA4mkWkKoKAFSJQiBpApiVQBzZkBFzIMQAR C0qVQLVCUgRANKiCBiFVRV/2BUFBgFARHg6H+QJ/UQWEVVB/wKp/cVT/0gIf2RBFB/uqn/kM qIqgwoQoSEoiBAooMooASqIKEoCKMSqoESiRIKjkTKqYUTAgsomSUVkSQSED+4qmBP+4qACP +6KACOBP2Rf5EoJH/UBSBA/gED+oIH9QQP4BQOgVP4BU4A8BU4CpwRTAfsKPYIHYonYKnYKn YoGgEDQIH7iAHZBApAqcBA0CBoBDgKnAVOAPYKngKngD4Cr4CB4CJ4Cp4AD4Ap4CL4CB4ACe AAngCngL4Cp4CJ4AHgKngPYIHYIHYInYKnYAPYIHYAvYKnYIHgIHgIHgAPgCeAgdIEoDgBNg K+KLlBGBTwFA8AA6AV8AOgQfAQ8AE8AXwAAhR0ChoED/IUP85ooSlaVpWlaVpXcriVpUpWla VpWlaVpWlcSuJWlaVKVpWlaVpWlaVxKGJWlaVpWlaVxK4laWlaVpWlHEriVpWlpWlaVpWlaV pWgSkaRpWkaVpGkaRoSlaVpWkKVpGlaVoWhaFxI0riUpWlaVpSlaVpWlaUpWlaVpSlaVpWla SlaVpWlaRoFpVpWlaVpWlClaVpWlGlaVpWlaVpWlaVxK4laVpRpXEriVpSlaVpXEqUriVpWl KVpXEriVpSlaVpXEpiVpWlaVpHE0riVpWlpWlaVpWlKVpWlaUpXEriVpWlKVpXEriUpWlaVp XEpiVpWlaVKRpWkaEaRpWkaVpGhcSuJSlaVpWlGlaVpWlKVpWlaUaVpWlaUxK4laVpRpXEri VpSlaVpXEqUriVpWlKVpXEriVpSlaVpXEqUriVpWlaVpWlaUpWlaVpWlpWlaVpWlcSuJWlaU pWlcSuJWlaVpWlGlaVpWlKVxK4laVpWlaVpWlKVpWlaUxK4laVpWlaVpWlaVpXEriVpWlaVp WlaVpWlcSuJWlaVpWlClcSuJWlKVpWlcSjiVpWlaWlaVxK4laUpWlaVxCUriVpWlaVpWlaVp WlaVpSlaVpWlaUpWlaVpSlcSuJWlaUpWlcSuJWlaVpWlSlaVpWlKVpWlaVpWlaVxK4lKVpWl aUaVpWlaUpWlaVpUpWlaVpSlaVpWlaVpXEriVpaVpWlaVoGlaVpWwIL/CigoOATaKACOgVBQ ef655+P3P39/Bvet7533rQqnoqkqiKDz9POfn/x953/L+Xfeu//H6f1+++6666666+/Pvf7P 9m7s85wXfJ/PyLvZ3d2627uM+/f3N0VznOc4N39flVteqoiPyf2t3ZtlRERe9133rqu99vZz 5n2Vz839n2pv2VERFu67711Xe+3s5HH25kV9937t1EfbzvN1PsrfemZi+Xv25kX9935VRH28 7zSfZW+9MzF8vftzIv77vyqiPt53mk+yt96ZmL5e/bmRf33flVEfbzvNJ9lb70zMXybnY3P2 v39qVVMc5sZGs76q33pmYvk3Oxuftfv7UqqY5zYyNZ31VvvTMxfLjebmfV99XyqmOc2MjWd9 Vb70zMXy43m5n1ffV8qpjnNjI1nfVW+9MzF8v+RvNzPq++r5VT99vM5rMz13p3vc+z+c37Mv 7v32fKqfvt5nNZmeu9O97n2fzm/Zl/d++z5Vfv7v2fau79d753vc+z+c37Mv7v32fKr9/d+z 7V3frvfO97n2fzm/Zl/d++z5Vfv7v2fau79d753vc+z+c37Mv7v32fKr9/d+z7V3frvfO97n 2fzm/Zl/fd5zOLu/vt5z7V3a732973Ps/nN+zL++7zmcXd/fbzn2ru13vt73ufZ/N59aPz37 72pt3nOcr077uZdV3ub2c++37cjOc7Ec5dXf32859e7mYzNVVVWcz+Rv3ve9zlRHOLu/vt5z 6zMxmaqqqs5n8jfve97nKiOcXd/fbzn1mZjM1VVVZzP5G/e973OVEc4u7++3nPrMzGZqqqqz mfyN973vvqqOLu/2t5+2ZmLve973pn8jfe9776qji7v9reftmZi73ve96Z/I33ve++qo4u7/ a3n7ZmYu973vemfyN973vvqqOLu/2t5+2ZmLve973pn8jZ973oiLvjMn979+dz1V71VMzM3X 856Lu7iIquZ7J/e/fnc9Ve9VTMzN1H9j03d85yq+z2T+59+dz1V71VMzM3Uf2PTd3znKr7PZ P7n353PVXvVUzMzdc9F3dxEXdxnvdv6+ft+u79VVMzM7lwnMzIiMzI892/r5+367v1VUzMyy 4TmZkRGZkee7f18/b9d36qqZmZZcJzMyIjMyPPdv6+ft+u79VVMzMsv+OfX5+P0vZve85zle nfdzLqu9zezn7vt9z3rmWZLzufZz9td2qqmZmY3Ll3IzNmZ970tdz7Oftru1VUzMzG5cu5GZ szPvelrP3Prtd2qqmZmY3Ll3IzNmZ970tZ+59dru1VUzMzG5cu5GZszPvelrP3Pruqr3e9hM c3LhNxd7MznvS1n7n13VV7vewmOblwm4u+73vc97us/M27qqd72NmObl/2E3F33a73Pe7rPz Nu6qne9jZjm5f9hN3c72Zz3u75+Zt3VU73sZvZjfZ/Zmbu53sznvd3z8zbuqp3vYzezG+z+z M3dzvZnPe7vn5m3dVTvexm9mN9n9mZu7nezOe93fPzNu6qne9jN7Mb7P7MzmZndrvfd9vmZV d730zMW7MMz+zM5mZ1Xe99XnnvXfe9TMxmdmGZ/ZmczM6rve+rzz3rvvepmYzOzDM/szOZmd V3vfV557133vUzMZnZhmfyOc5r89++9cV6fvt5Xpe2vey7qvd7OZHP845bJvu7Wc25mIeiPR bsw33o/zv+e973dnvSt5+Lmf2N9Eei3Zhvvf3s+973dnvVL2Pxne/saiEZnZhvvf3s+973dn vVL2Pxne/saiEZnZhvvV/ld973djsuq2Py2VX07EQjM7Mcb737/ld973djsuq2Py2VX07EQj M7Mcb739rvve73Z71S9j79x6q+7sRCO52Y433v7Xfe93uz3ql7H37j1V93YiEdzsxxvvf2u+ 97vdnvVL2Pv3Hqr7ec45OTMzDcz+3Tvu92e9UvY+/ceqvt5zjk5MzMNzP7dO+73Z71S9/fzH u9+3nOOTczMw1m/5l7Sqjsuq39/LZ3v285z3JuZmY9rN/zL2lVHZdVv7+Wzvec2Ij0RcRHPa z+113O92e99S9/fzHu95zYiERcRHGs/tddzvdnvfUvf38x7vec2IhEXERxrP7XXc73Z731L3 9/Me73nNiIRFxEcaz+dzs89+V++u4r0/fbyvS9te9l3Ve72c59nPq9cVO9VN/fu76q5xEQiM iI5es/tdZM7Ez7qp37749VRzYiER2Ijl6/nZXEbCfdVO/ffHqqObEQiOxEcvX87K4jYT7qp3 7749VRzYiER2Ijl6/nZXEbD0uxv33xnfRzYiGzNTMxkuyuI2HpdjfvvjO+jmxENmamZjJdlc RsPS7G/ffGd9HNiIbM1MzGS7K4jYel2N+++M76ObEQ2ZqZmMmldZM7s7vbqY++J993ecbEdi I3N7td3JmdnXdqY+++J9z7ecbEdiI3N7e3W+73uzu9upj74n33d5xsR2Ijc3u13cmZ2dd2pj 774n3Pt5xsR2Ijc3u13cmZ2dd2pj777d3qOc+bznediNza262ZmdnXdqY+++3d6jnPm853nY jc2tutmZnZ13amL5zm7tRHOfN5zvOxG5tbdbMzOzru1MXznN3aiOc+bznediNzaysrv3vy/2 7uNt3nPRcy9te9l3Ve72c59nPq9czW9VMXznM3aiPv1v33Z5zc3u13ZmZ2Xu7UxfOc3dqI+/ W/fdnnNze7XdmZnZe7tTf3327vYj79b992ec296rqZmdl7u1N/ffbu9iPv1v33Z5zb3qupmZ 2Xu7U3999u73n7+N79H323s/jvkzOw9O9mvvvt3e8/fz29+j77b2XfJmZ2Xu7U3999u73n7+ N79H323s/jvkzOw9O9mvvvt3e8/fz29+j77b2XfJmZ2Xu7Xe3znN3cuPv1q+d5z3t73rZmZS 93a72+c5u7lx9+tXzvOe9vU1X5ve96lO9mav7d3L59+tVzvOZm92ar83ve9SnezNX9u7l8+/ Wq53nMze97uzMynJ3vu9uIhCL2efG76LiGd73rZmZTk733e3EQhF7PPjd9FxDO971szMpyd7 7vbiIQi9nnxu+i4hne962ZmU5O993txEIRezz43fRcQzvbn2d+9+X+3dx6/d5z0XMvbXvZd1 Xu9nOfZz6vXM7M7M1zm5HK9H2m76LiEzMtiEpyZyZrnNRytj7Td9FxCZmWxCU5M5M1zmo5Wx 9pu+i4hMzLYhKcmcma5zUcrY+03fRcQmZlsQlOTOTNc5sJitnTdcqI2ZmdRHp9OTOTNc5sbM Vs6brlRGzP+TOo9PoyIyp9cRs72b7Om65URsy/O93ZdR6I9UriI2YqY33te5UQmZkiPT6cmc mfXEbO9m+zOm7zLiNmXdupl1Ppn0yuIjZipiN97XMuITMq7ERkXEXHvXEbO9m+zOm7zLiNmZ 2uxEZFxFx71xGzvZvszpu8y4jZmdrsRGRcRce9cRs72biNN265zYj+w72Ivl85fM2ojZ3s3E b5u3XObEQ72Ii4uIuM24jZ3s3Eabt1zmxHZVUzNxzl8zauNnezcRpu3XObEbRP3vyv2qR697 znouZ32172XdV6qrubMejmZMc5sRvqufd9UvTO+3nNuojZn+wrsRXL5y4jNqZ3u1L0zvt5zb qI2ZhXYiKi4i5nNuZ3u1L0zvt5zbqI2ZhXYiKi4i5nNuZ3u1L0zvt5zbqI2Z9K6mZvOcemW3 3ve9mVzO5z0Qy5m5nkev8iIrOc9kz5fezMR64hfPRBczczz8j1/sRWffeyK8vvZmI9cQvnog uZuZ/yPX2IrPvvZFeX3ve9mfXMs56IZczczHr7ERWc57Jny+972I9cQvnohaZiKj19jJuec9 kz5czPOeu4Xz0QtMxHPVPMis5z2TPlzM8567hfPRC0zEc9U8yKznPZM+XMzznruF89ELTMR2 Pf5PMis5z2TPlxH33ru4XHplERzk9jPyYua++xEeVEffer1wuPTKIjnPs7HLjt85iZ9bO97E ezIhkJn0RHOfZ2OXHb5zEz62d72I9mRDITPoiOc/nq30V/m/nXq9e95z0XM77a97Luq9VV3I 5nPruN5zuzO37O97EMyI3ITPtmZiLj1zEVn33til7ne9iPZkQyEz7ZmYjnqjnO3997YL3O97 EezIhkJn2zMxHPVHOdv772wXud72I9mRDITPtmZiOeqNiKznEQXud72I9ncmWS73uzMxHPVG xFZziIL3O97EezuTLJd73ZmYjnqjYis5xEF7ne9iPZ3Jlku97szMRz1RsRWc4iC9zvexHs7k yyXe92ZmI56o2IrOcRcmb6qqI8U733u9mdiI5XPVGxFZziLkzfVVRHine+93szsRHK56o2Ir OcRcmb6qqI8U733u9mdiI5XPVGxFZziLkzfVVRHine+93szsRHK7Hv8jYjPvnKgvc72IjPbR Xq72Z2Iip56o2Lz75y4VtzPOZntor1d7M7ERX3q5vKz75yoL3O9iIz20V6u9mdiIqJ+/an1/ b/n+Py5TvY++vPb0ervZnYiKXz3Pcr937vPRl73nEXM77a97Luq9VV3OT/djmZH5v737a9fu 84i5nfbXvZd17vezmbz7feyfvvu85lZP2ouN9vfeuq97vezmbz7feyfvvu85lZP2ouN9vfeu q97vezmbz7feyfvvu85lZP2ouN9vfeuq97vezmbz7feyfvvu85lZP2ufc/X8/r5+fz977+fz 5553+PhVNiqf0FQAR/uKpkCBUFByD/cRVUH+wiqoPiKABkqqKKqiqqiqoquVVVyq5XlV5XK5 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 8TwCF7QvJDu9Ol8xTNXBXHjoius3ZYV9mu4jsfBniamkmTTmcILyljvDTm96km+3rlmzdPst Va4zKRq+EPOJp5x5l31aGb3aSzSOQQmwWTTIOu3kGZDOUM5qDCUXW4BfGZi1OczgxnZxebG+ kQ7DtPaerYDbrNF2JWAJ9a6i6TSxs7xO6bV0+Z4Bxm6B2pi6nJZMJgqu45zwo5U6+63aS3Wu OL1bWEdjfzhemjwNUCpjrrVHjtx03riXk6IbXYu3WIcGITq6ZdPMHVczjjqmO3COgzopRStW gTLJfXW+sla4Rljeb3ZI8292OA6cbwvqu7SK4sVnapmWzRky11caBwPFd8SYe3rPZdTOfTNl sYN3aeYWeqntTtq+knKKI3kTtPmuJJ2u1Cj0RHNiuzqR52Nx44KrTwrd4WibNXE3Rjzt6ZIB B0zuHzUw6Z3XcVl9lB2aZ7q0GcEaLCm/awVm231aO2LsbeXm4iIdfy4Oz3x+42D08dUp/Cjt 6WytGxX0XsFbueOqVl70DxY7m3lxu+OVXSdtrTNWlZttuiTT2y01jZRyGoszllblnN6AvD1y W6qQ2RYVOZsrnxljWo1m2XlO6zO5tY9malkJ1u1mZV8YBtSu3BgEV9Ckjsq5vDZjLuMrpbrs 0MGhbeAuukl7ZnDg1xT25LXmh0WYGhmVtpLmLJ0QY6Zs07u8pwmtwG0YnVIy+Njd3FxDuqGG lh69XLjcRTOmXbVBlUYAdc2cBnN8dPCc9093RHuut3Jd3aN3l3rn2YtKxy0KfDJEnN5461jr abOaijKfTtNrs4cLvjz0dfuVZzkqZLMUFBA9sDzbolbH3cKFg7vcKMgrjmRSlQ23yZoZe7nx JyvedE7vVDpnLfu/cuWpjko1arOcnTMiBWWaPza3HbQW6W85ubryJPvXnddZB3SJ47lP3dZz lIZw0PqlLIlpObfWhQvTdsUTDMFbTLw2ZON9bw7DSsrpx26B2Cs7ZXO+pImLahutnXsazdra SxXJ0Z2lCnA5vaJDVzipweSj1rOuVmRGsojhvWZmmYVydp/O1EiK7q64bq9nTO0svrrZbJpL gbw0Az3bs6u5UtoFDtxBkJzby8Ho+uC53qNqT3p58trNQmjhuS97ZdjAu4WJpoxNH7LjrSpJ Kwy9Z2+0HdZNvN6sF0DzDuc75DG65zb4CsyuB4iCVnMm3Dronq6LYmR2G1eDa2t4N1LrsoJ1 kKriiu090qPbe0No+Kk43vV3otwu2OJLya4z0yrN9ZY7jpfChWTZr4ZuIrLW8sC6IRicsB7t c64eaDsWMy290dtaMCgNlQ9S2WymeTl8zpC3pcEvOE29ZFTrVO5ke3Y3Hi7KLpU+tcLeUM4l a8NDYukEfsNgrH3DhO42xwebhzu6F3y6hGmCbFaszngy7GzqsEpLnldlLtum74mZrKKgCh5e SpFyZfA8+HW0eU3e59hgPK48u3rnXXmd76515vrw83gCHCggCP+BFVQf0EVVB/YAQET8jCAo EMAIaVVR9UqkSqQaoAKKVqlaoSYEDgLiBGgoAI4JRSRgEEMooYqBKpGIQgDIVQqmVBRMkwQq C5yQRRCNUgFUrAQDRSLRSkDkQqkGCAUECFVgAECUX9FFBQf4VRFB/zUUFBh8885+Hew+v3/b 7bbbaqqqqqqqqqoYqqqqqqqqqqxiqqq88xvtznOd73vecqqqqqqqq73vedqqqqqqqqqq73ve dqqqqqqqqqq73va6AAAAAAAO972ugAABVVVVV3u7ttttttttts33Pl9/d8Ph7fh+j3qqqq96 qq22214qAcBVV3d3dAPe94N3gAUB0BA+++LuyaBbbugG7qqAWSd7LQDMA0ALvNUAsk3QZIof dAJySySFBkigyRQZJ3stANwDvTM1UA4CqgAKgFkktQAoAVVVVVVW23JIocCgBwVX3veQDMA0 DEAzN71UABZJLQySd7LQAMeK+9705+cF4qiCh/uKp/uIqqD/0P1/X9cYx+vPzjGAAKqqqqqq +oMYACqquc5ttznObbc5zm23Oc1VVVVVs1XnmqqqqqsVVVVVVVVVVUPqAAAAAAADGAAAAAFV VGAAH4PX0+e303tvb39/b6/Gvj8VVVe9VVbbba8VAOAqq7u7ugHvvg3QAwB0BA+++LuyaBbb ugG7qqAWSd7LQDMA0ALvNUAsk3QZIofdAgcCySWgyRQZIoMk72WgG4B3pmaqAcBVQAFQCySW oAUAKqqqqqrbbkkUOBQAFV973kAzANAxAMze9VAAWSS0Mkney0ADHivve9Of+vz85+fnOfnn Oefz55555z6fT6cPl8q+d8wAAAAAABmsAFVVVVVVVbbVVVVfcAAAAd736evW222222222222 222222wAAevXe9ABVVVVVVVevXrvaqqqqoAAAO9d6AAAAAAAHeu9ABVVVVVVXQutgANttttt tttttttttttttttttg+++73ve977p+/Utv7/pz+iqqq96qq5mZmZj3qoBwFVVVVAPffAvADJ JugyT776W4gAZmZmgBu6qgGYB3rxJKRvUkpMre5tuJLdb5JdzYAJJoKAFAxAQMQEDEDvTJJL Q4FzVkk72KqgAKgGYAZiAWSS1VVVVVW23dAQOBQAFV973pJLQySKAXd71ZJIqAFA3QO93zWt a1zvw888znOf3VRFB/P5/OMY1+Px+M5znOc4wAAA+W22222222222222xJJRJRJJJJJJJJJJ JJJJ/mkkkkkkkkkSSSSSSSSiWyWSSQAAAAAAAAAAHru9enoAAAAAAAevW9enoqqqqqqqqqvX p66qqqqqqqvOd67c8VVVVc5pnOc5rZznOa25tgfffffffE+7+i0L/P88/lVVVe9VVczMzMx7 1UA4CqqqqgHve9F5JhZJugyT776WoAbczMzQA3dVQDMA70ySS0Nkluc10AZJugyRQ+++973u BQAoGICBiAgYgd6ZJJaHAuasknexVUABUAzADMQCySWqqqqqq227oCBwKAAqvve9JJaGSRQC 7verJJFQAoG6B3pk1rWud+Hnnmc5z6ooKD+RVP/J/sEQkQBEjhRQUHAGFUiIjAJ/9QOec5zz nn159r4D6/SvsAD7ttttttttttttsAAGtvtttttttttttiSSSSSSSSSSSSSSSSSSSVaSJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJKtJEkkkkkkkkkkkkkkkkkknbbbbbbbbbbbt3vdttttttgA AAAO7bbLNtttttttgAAAAAoAAAAqqqqrgqqqqqqqqqq4KqqqqqqqqquKqu9739+IH9f6/15/ VVVVe9VVczMzMx71UA4CqqqqgHve8C8ALJN0GSe970txtttuZmZoAbuqoBmAd6ZJJaGySW53 uqAZgGgYgIH33xJJyFACgYgIGICBiB3pkklocC5qySd7FVQAFQDMAMxALJJaqqqqqrbbugIH AoACq+970kloZJFALu96skkVACgboHema1rWud+Hnnmc5z8Cig7X8gn/sVT/CigoP8KKCg6A /1UUFBg/0FU0KpoVSFU/+AnaigoOQT/mgCAjtFABHIqn7xF++LH4/apX96iqqqqqqqqqquVV VVVV+IAAACqqqsAAB/SSSSSSSUkkSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSkkiSSSSSSSSSSS SSSSSSSSSSSSSSSSSSUkkdttttttttttttttttttttttgB3bAAAARVVVVmKqqqqqqqqqsD+T pQD9w1f03cNu/2c/sVVVXvVVXMzMzMe9VAOAq7u7u7ugHve8G8kkJJmBsk973pckkwczMzQA 3dVQDMA70ySS0Nklud7roBUDQMQED774kk5LJJaBiAgYgIGIHemSSWhwLmrJJ3sVVAAVAMwA zEAsklqqqqqqttu6AgcCgAKr73vSSWhkkUAu73qySRUAKBugd6ZJJM14rnOc6FdAooPqigoP +YqmQ4oB/wooKDlFABH/RRQUH9wTAKgoOxUAEekUAEf9RVP/wVSBUFB/3FU6FU0qiKD/zQRF Qf6gkCf8lREEf8kRQEYE/sCbBUFB/yFU/4UUFB6FUgT0VT/QVTQKplFABH+SKACP4RQAR0Kp /0FU4igAjsFQUH/6Cf7Koig9iqaFUlURQcqiII/0BOgVBQflFABH9gTpBOxIQVEGFYVTgqD6 ooKDKCIgwJlRQUH+YqkKpkE4KpgVT+yigoPiqIoPBVNooAI/9gTxBVUHwVT/sKIqoOxUAEe0 RQEf/8xQVkmU1kANqNlBAYa24B0kEAD//UACr/t39Bgzb98hQAAAAAAAAAA7gAAAAAAAAAAA AAAAAAAAABYcAoAAoURH1QZ4AAAAAAAAAAAAAAAAAAAD59C4+bYFGrZqaagASESilRSgkz5y DvAXBQUBeGUqJbBlVtZTBAprFUaQqpYecRvAIA9eBbAFAWGykAFABIlDPA8B3hQL20ABLRrI tqACRECpZ4F4D3iihVAuwGQkAqUpEBJTPOC3gHvCXAAUgSAADQBSSgUUhUY9oO8BOUEJ61LS trUNFLZQtgbYZRQpnuBvAe4F2ADQCgDZmg0o1lSQqpQseYB4D2Kpeba0pNBioFUUq2DQKCQW MeXgPZFQ9bZq2BtjRQaZW2ottElSKSlZa6aIURKqkhJKqBIqVSKKSIICEooSFKlFEcAPKchH eA88DAd3HngPcBxwDxzgDgPeO8C8B7wAAtPPbZhN+qVVVUAYjQGQAYiehpipSSelJtT1GRoA 0ABVVU//9VPftRtVVVD01AANAAABqn4QJSklT8lH6hGIyMgNMDT9KkqpinowmqemoDQAAARJ ACogjKaKZlD2lPU2ptT0dURUAf1+vz9Prj7FZ+81J+m7W+qK7QVAzdt23du3e6gRJACAEkgX kmvAQAlvbubsIMQi1Ui0Wq0UtIxYxkQiQCACpUUQbWpSSRVEtEVAkFVkBQqDIqiFQBAkUUCQ BFCQBWiASAgqBaNoLUEJAMbdjG6bw445m7cG7jbbsjUtFSRKgCtiKskgAQiLCIsIEIiySABJ CEIiwgAQiLIKACj/gQBEGCIAKOAAsi/ZVD8qAMFFFB2GA/uCL+4Iv/4VU/qgiiD+6C0IgKD/ wMRCAxFQCCiQVFAiCKQVVFiiAgkRFAYgoLBAFbAJZRaBClAGxQoQICjBgIQP3BFpUP/SIACP +UQAEaAT8qC/gFT9UAPyIfgVT8gqf0BA/IIH5AQ/UEA4CBwFDgKnAQyAgQAA4ChwEDgIFwQO AgcBA4CpxQHQOkQNIg8UB/UMABSCvEB2KhAXKLlUSgVOAqXUA4AvQQOggaBA0ABkFTIKmQVO AqcABNgibBA2CrsFTgC8BA4AocBHgIBwFTgA8AQOAqcBTgCBwAHgCcAEOArwFXgKnAVOABwE DgIHAQDgcAF4CJoBA2gpEEyqH7K/xIgblQJCQAJFZFZFZBCRWRWRWRWRWRWRWorUUkVkVkVk VqK1FZFZFZFkEJFZFZFZFZFaitRWRRkVkVqK1EJEZFZFZFGRWRWRWRSRWRWRWQRkVkVkVkUq K1FZFZFZFZFZFZFZFJFZFZFZBJFZFZFZFZFKitRWRWQSRWRWorUVkKgtRWQCorUVJFZFZFZF JFaitRWRWRSRWRWorUUkVkVkFkVqK1FZFZFZCRWRWQWRZFZFZFZFZFkVkVkVkUZFZFZFZFkV kVkVkUJFZFZFZFZFZFZFZFZCorUVkVkVkUkVqK1FZFJFZFZFaitRWRWRWRWRSorUVkVkUZFa itRWRWRWRWRWQVkVkVqK1FZFZFZEZBkVkVkVkUZFZFZFZFZFZFZFailRWRWRWRWRWorUVkVk WRWRWRWRWRSRWRWRWRWRWRWRWRWRWorUVkVkWRWRWRWRWRWRWRWRWopUVkVkVkVkVqK1FZFS RWRWRWRWRWRWRWRRkVkVkVkVkVqK1FZFSRWRWRWRWRWRWRWRSRWRWRWRWRWRWorUVkWRWRWR WRWRWRWRWRWRWorUVkVkVJFZFZFZFZFZFZFailRWRWRWRWRWorUVkVkUkVkVqK1FSRWRWRWR UkVkVkVkUkVkVkVkVkVkVkVkVqNRWRFkFkFkFkRqAlRWRGQWQSRWRWRWRWRWRWRWRWRWRWRW RWRWRWopUVkVkVkUZFZFZFZFJFZFZFZFGRWRWRWRZFZFZFZFZFJFZFZFZFKitRWRWRWRSRWo rUVkVkVkVkVkRkFkEkVkVkVkVkVkVkEJFZEZFZEZFZEZFZEZACRFkVkEJEZFZEWQWUoA/sIA iDSqGEQAEbiAIg9/efG+PPVn8fn6fT68l7fNp/b/53fyaz8fN/pz5+nSqxCvn3vpv5586zX0 +n0+fpM7q2sZxp+Pa+NAi/YEWIHqr3qr36dffiX7nySUP6JMk/t+/p+/3/Ekndmb/P7/e7vd 73dzGK/aIi+973uZ3UzMzd5/n+ZuZmae973P7d3ef5v2lVcz/d3vbiIuIrnOcvtV7Mjl83ee v9+69G7PtiM5znPdqt3Y5fN3nr/fv3Xo37a9vqrIiIiIr2z367d7/f39sd7tb9u5u1SIiIiK zZ79d73v9/f2x3u1v27m7VIiIiIrNnv13ve/39/bHe7W/bubtUiIiIis2e/Xe97/f39sd7tT vN3N272IiIiLenveXexH9/f2zzbjft03b2IiIiLenveXexH9/f2zXdjft03a2IiIiPPT3vLv Yj+/v7Zruxv26btbERERHnp73l3sR/f39s83u/t3M1SIiIiNemYjt3sz/V+/bfdjf2abu973 ve91czEdy9mf6v37b7sb+zTd3ve973urmYjuXsz/V+/bfdjf2abu973ve91czEdy9mf6v37b 7sb+zTd3ve973uruqmYz21W/fe5z6+bGfs1pznOb3uruqmYz21W/fe5z6/+c2M/ZrTnOc3vd XdVMxntqt++9zn329zM1pznOb3uruqmYz21W/fe5z647vczSIznOc3tVuZHL5u89f79+/497 f2zlZl973uxBPvXdVLKneffe57n2xmZrde73vdiN2feu6qWVO8++9z3L5s5+zW693ve7Ebs+ 9d1Usqd5997nuW7tPjde5y+7Ebs+9d1Usqd5997nuXzZz9mGXzm92Ijdr3veu6Wut7zmcznu TOfswy+c3uxEbte9713S11veczmc9yZz9mGXzm92Ijdr3veu6Wut7zmcznuTOfswy+c3uxEb te9713S11veczmd77s/s++zDL5ze7ERu1me9d7W1O85z3Pd7fez97nPEV99u7ERu1me9d7W1 O85z3Pd7fez97nPEV99u7ERu1me9d7W1O85z3Pd7f+d7P3vueIr77d2IjdrM9672tqd5znue 7fOT996u+Jj7473pPvXdJTDnOXy+9r/MiK733Y9OTH3x3vSfeu6SmHOcvl9qsiL733pmcmPv jvek+9d0lMOc5fL72q/5kzcR6ZmcmPvjvek+9d0lMOc5fL72vRUe9uohznOb2qzMjl83eev9 +/Z+R97ciI9CecbERqcypRkdd73vaiplkzznu99Hbj75nUE5lSjI673ve1FTKv+ZVd76I7y+ /pZ1BOZUoyOu973tRUyrKrvfRER24++Z1BOZUoyOu973tRUyrKrvfRER247zjISVUw77rqIu Zm6u6XlV3uRER247zhCSqmHfddRFzM3V3S8qu9yIiO3HecISVUw77rqIuZm6u6XlV3uRER24 7zhCSqmHfddRFzM3V3S8qu9yIiO3HecITkzHc5eczvaiIXd0vKrvciIjtx3nCE5Mx3OXnM72 oiF3dLjK73IiOxcd5whOTMdzl5zO9qIhd3S8rnM73vbuO84QnJmO5y85ne1EQu7peVzmd7y7 7z6SHqyqmOXn2c5Xahd3S8rnM73l33n0kPVlVMcvPs57txcve9byucd7y77z6SHqyqmOXn2c 924uXvet5XOO95d959JD1ZVTHLz7Oe7cXL3vW9VTOfaRDnOc3tVnu/V9u3X379H7P6m85Gd5 9rq59MxsdvOZ30ej07met7/H3zn31V3n0O5k+mYR285nfR6PSzPXefv2fPqrvPodzJ9Mwjt5 zO+j0elmet7/H3zn308+/dczM9Mwjt5zO+j0elmeuznOO85PPvz7My4j27MedRkZGTuXVeff ZzeTz78+zMuI9uzHnUZGRk7l1Xn32c3k8+/PszLiPbsx51GRkZO5dV7rnM7va59+fZl3Ee3Z jzqMjIydy6r3XOZ3e1z78+zLuIr27U4iIyMiN9Uz2zvcjb+/fycqu9n27M+yIj0IjfVM9s73 I2/v38nKrvZ9uzPsiI9CI31TNnOZ3a+/fycy7iK9u1OIiMjIjfVM2c5ndr7778nMu5i/btS7 3vu99Ebe1UHOZ3a+++/JzLuYv27Uu977vfRG3tV/n+Qc5ndr7778nMu5i/btS73vu99Ebe1U HOZ3a+++/JzLuYv27Uu977vfRG3v3331167uZd73ve1V736vtXX379HvvvvqbGffffsnNubq b9m3U7EZ3uREXs+mTvcjb+++/JLm6m81dTsRGRGTM3tVMne5G3999+SXN1N5q6nYiMiMmZva rsyRGTvvvvvyVRUxWblVOxEeiNmZvar/kyd7kV+/ftTlRUxXtyqlEd9EbMze16ZO9RX79+1O VFTFe3KqUREemdqqvbuZO9RX79+1OVFTFe3KqUREemdqqvbv66omVf39/bsJ9UxWZlVKIj0R szN7VTJ3O1/T+2PT2Y7N76qnIiI2Z2qq9u5mSEX/V+2cnsx2fblVKIiNmdqqvbuZkhF/1ftn J7Mdn25VSiIjZnaqr27uqolPv6/2ynsx2czKqURGxGzM3tV6qpKle/vftpXZjsiqnIiNiNmb 2ZiIeTk+9+99t8rsx2c1VTkREbM7VXtVEQxKfe/e+2+V2Y7OaqpyIiNmdqr2qiIYlPvfvfbf K7MdnNVU5ERGzO1V7VVURHvd770Q5yu97Ve3v1fbs/v7+7X3ed71u5+z7719qJmI3VVORERs zs3sz/d715kvV777b7UTMRmqqciIjZnZvZn+73rzmS9+999t9qJmIzVVORERszs7Ef85zizJ e/e++2+1EzEZqqnIjuxGxex7+73rzmS979+2+V2O9zUzGRERszsojnOZesl7379t8rsd7mpm MiIjZnZtM973PbOS979+2+V2O9zUzGRERszs2mbiIzZyXvfv21yex3ubkzCIiNmdm0z3vc9s 5K/7+2vpyO9zUzGRERszs2mbiIzZyV/39s/Rkd7m5MwiIjZnZtM973PbOSv+/tr6cjvc1Mxk REbM7Npn/O97ntnF/7W19OR3uamYyIiNmdm0z3vc9s4v/b2vpyO9zUzGRERszs2mf873ue2c X/tbX05He5qZjIiI2Z2bRPe9z2zi/9ra+nI73NTMZERGzOzaOc5ntjFf62vpyO9zUzGRERsz s2mfvc9773vemc73ve9qvO/V9u3X379H73v9nswZ/u3n0a710mMiIjZnZtM973Pbiv9rdrkk QhMxkREbM7Np5zme3E/7Oq5OZEbCZjIiI2Z2bTPe9z24r/a3a5JEITMZERGzOzaZ73uR7cX/ t7t8qkQhMxkREbM7aI5zme9ufL/r3b5dohCZhERGzK0R/znOZ7258v+vdvl2iEJmER3Yhbvo 73ue9ufPf3t9fLtEITMIiNiFu95zmXe++y73b+u1QhMw73uxFZ3vecZd6+e9vr+u1QhMw73e 9rOc++ZVa+y73b+u1QhMw73uxFZ3v3zLvXy73b+u1QhMw73uxFZ3v998y71897dv67yoQmYI iNmXOfv2ru8+y71f13tQhMwREbM27377XvefLvdv67VCEzBERszbvfvte958u92/rtUITMER GzNu933vZ973vTLve972qzNjl83vb+/fou55dQzjN897y+31FwREbM272+c1mYnl3u3dq7Xc hBERszbvf777XveTx72773l9vqLgiI2Zc5+/au7yOZd697232+ouCIjZlzn79q7vv3qrc973 t2PREXBERsy5z9+1d3371Vue9727HoiLgiI2Zc5+/au7796q3Pe97dj0RFwREbMuc/5+/au7 796q3Pe97dj0RFwR3Yh9XPvtXff3qrfru7vdmIiLjNiNiPnOffaqufrmd+y7u92YiIuMREbM 8d799q75+9M79l3d7sxERcYiI2Z47377V3z96Z37Lu73ZiIi4xERszx3v+ffau+/vTO/Zd3e 7MREXGIiNmeOd++1d9++9M7zLi73ZiIi4xERszxz9+1d8++9Ht5lxd7sxERcYiI2Z473/n32 rvn33pneZcXe7MREXGIiNmeO827v3ue96Zd73ve1TNjl83vf39/dqo5U+++zZ+V2qvZiIio9 kRGz9vOfq1d8++9G/ZXardmIiKjyIjZ+3n/P6tXd/fejfsrtVuzERFR5ERs/b/tau6++9796 eTJERETF5EQn5/tF3X33vfvTyZIiIiYvIiE/P9ou6++9796eTJERETF5EQn5/tF3X33vfvTy ZIiIiYvIiE/P9ou6++9796eTJERETF5EQn5/tF3t85mfsrlVuxEREx5EbH7f9kqtrnPe/ZXK rdiIiJjyI2P2/7JVbXOe9+yuVW7ERETHkRsft/2Sq2uc979lcqt2IiImPIjY/b+/pKrux3vv fsz3fe3Zme11vfe/t/2CZ5ud7737M933t2Zntdb3vvft/2Sq5td7737M933t2Zntdb3vvft+ +/39JVc2O99/Zl8u91M9rre+9/Z3vbu5m5nO973varN2OXx3t/fv0b9C63eZuzL0RERF3m1H L5ve/v7+7zJgeJnLiIiIrye/U5yv379sdzb3bzdmVxEREVmz36t5yv379sdzb3bzdmVxEREV mz36t5yv27+2V/H7/P3++/j9/uT+n42239/H7iP377szP2v4qvV7xqkX9EQAEfsH7gi3FggC IN0V/cUUUH+ooooPRQ+ghEUkkgAwECAgQECAgQECKLAUkISSRQikiqMiyMkQAiiE23DAZgGA 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 SPAd1i0VOB4c8RvXay3xR3sNuIdVQTQMk3CVu6PFGKsOpyZLJfLgM5bqqcw4qy5KJyV13mqz fU5y3ulrttdhM0bj7IgeGjWYbO6g0azgaIx4ob6dUpV24ua010VztTOzdCuasF7yLRy3YxR9 g7jndsSMV0ctCxT2NKbQ3s2seE2stPXnBoYDz3t1PjOUIy9jts8CqrSFWjmksld110yHDJsT qbpmvMQwm7kaXccUMWOXVupeZa5S3T0NQ3qebY2cAqyBbpU7hkvFqQNu6EK40+muug3IKbe9 /Es08b3G1EmBlXr9XOxTb3axCaOtNKTtvOTmMmpuB3nVJFXOhV1q8XOpkkTRt9OW3nUdTj3u EXcss7EZOqaCt69pZQftNY9d4LizNXLGw+EEgRBJAETJYQ6CHQACwIGgROgDsFTKCm/xW+3v V7mObq979/wP4qqqqqqqqqqqqqqqo/L1VVVVVVVVVVV/Hve97zbbbbhkjbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbhkjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhkjbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbhkjbbDbSTDRKSSSSSSSSSVVVVfIAAAGYCpIRWqpAqqqqqqqqqqqvui+BU+d/Px8 fPzu7u/skkl/V9bbbaAGgNAQOQEANskm6HSSoZh+fmZ+GgDwFADb6rJJ6KAGYNtttrbWSboB qgHcAdyqqvlQAFQAFcxZJIqq+VVZJIr5VVAAVzFVUABXMVVVXMVVQAFQDwOYqAAu7u7uoAaA Fvd3d1AO4CgcgZh0km6DJJu9ZJIttttrbfW22+971caYZ/Cs+++cm2Y3aLOAbxvHmf3YPZJf jW0H2M8cGLeX2m+KwowjfDzH1EUR8nfMoYzQFkMjDmqEZahlTEKCu1yGHKQHH7vIUbr3tm2G fqi06/NkD19K8peUm0j948fjFyVEZeCt9fy7xYo8rz1eBA41m84csu+YlchY56R2DqVJ9lp9 vEmxgp/JuyIiAnVx2H120+fvVVV+er3qfu3WzXrVKiz7PODTkXv1kh380Q82TDp+swuVVXrX LlxUJMxQWUcsCpWtWzEAL8KURox2wKluUCpWqBAogIE5zNTVctkBDJ2gQCsYsCBYgKGSs2BU ogISIJM0i1FRM0XsCpi0m7YObrXMy2QVNRQCG6AWtVuxiyIGLUiBWqBAtqgEGu85itF7GQVM 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 hcdJBS3zwl0r0G2OzRpmzs5GleZxV3LI2skO7qQwumiT1Z2b11jVgWU7rT2UnzUtzmDyCQiC QgAJjIKnAQOIgbReAgdBVyCpwAOX+37WlrX5vdrWt9l79wGAAAAAMAP+F/httttttttttttt ttttttttthtttttttttttttttttttttttttttttttsNttttttttttttttttttttttttttttt tthtttttttttttttttttttttttttttttttsNtttttttttttttttokkkkkkkgkkmIyAEHwIHZ zVviVVu/T2c5zn63ve99/bhziqqAfffW0EBQEANskm6HSSoZh+fmZ+GgDwFADb637759FADM G2221trJN0A1QDuAO5VVXyoACoACuYskkVVfKqskkV8qqgAK5iqqAArmKqqrmKqoACoB4HMV AAXd3dH7vt2aFvd3d1AO4CgcgZh0km6DJJu9SSSZG222426bbbqq9S/mfG592gbdaN7MFKrT dTLTbyI5af+NxM0VSEumPERN4nfBfo7ojd6SyF5IiEouLDXzvtg0km0KaDis2aFaPdQog8EL B2kKONQiNB+xF+as7S8fvEUQL8n6AlN5HCdXHQYSbOAvE0mMetwm2ri+ZloEzKYJoo5HXXZ8 3pFuw/oYfE4oYaPnnHcqLNvPkc4HPuq1gvK3ZW6lW8m4ecieU7BPS2b5vrmN8yZN7N4AUPAJ 49ir91Y5DOKkodSiJtTwxj2LDF+ijN+dXizROj4TCI7rqncq2nvJtXkOupnxdu0qC6vPEjjF XIqc8vg5z+CaAk9g8Tzv7zWEaQBx+shNABQXlesI2eiBMIWI0hCT6vVmTM9aBIqIc2olywjy NWIm99NqtaqrUzLUprykjHaDL69EvNe2I5eTdqy+CKw1lAfD78APh0fX7vruXZ2nguhwu3eW mMTW7d05aLjrdpG9xon0l5+cX2V2JlCqogbam+YD5SP33V9DZs2Ta+WqtVHlXaN62sRs0X7n R2IUQiKs4mEVXT1CrWtCsVXXmzWHtdX2PY9fnW2o2KqrTN9curc5Nbz7eb0ggFGMUQ61d1gY FY4UjztJxE7SKCYKo5BsvpRnVlAfAAfgB8EjxXqSa1NL3qBu8n7CkELsWtgzFhH6j1UP1KwT B5afifUtvGMINIQhvhadUBmoU19h+oiEBWUzpFlH7noxJwC8Q9SAwjbQ04QBZRXZwiPHNTpa fHiKtVq3EOVtDLnud8biuYgrHO2mMXuRvHhdpZUvyZtdeLq6168WmKpFEIrdsqrUN+kF0Esw ipFMEnrpHywZguYO134LaTTsY8g21MpaYUykjnFUeuCop1X6Rt1XvfD8APhWcobxyiOHrXU4 7q/MTQtlM4kNq7mC2Xl7JS568qlkVrhbqBSToMR/VSRwG7vroAvGYve7LFD2mmax+Dw6umHz pSbz2yLvZiubEzho0IiJPQ2Hjw8nuLVlq9wzpsqUu7p3TkcuLy1mJbuNF77zk7WdmvhufZGd iqYlVEl5vJW7l7buC5e6eCIp91oAD798B8HPeucsNKXf6EZ+27/DrWBIKzpHHdCFYYxVqjWV aI29yEtBH7T9ph0/CiBjVkLj+B6zgscQKISIWm7U4jYhi9b33tw1ymbobSt12BjQUzl1LDjN 6IKqDxs4RW31JVsE1l/O64fZeMj50Fuy524Qds33Kj82m07dK9aZn2ptVSnqbBvfCiL9WUeq jkvq8TlvRpjOSQSIxA1RExDJqo5LJ3c1CvPFoV7c5kBA8gnrZrPa5DRCWo7KxRWu7z3eK/bC 83jVAeVIaoLtDx7Znrfm6h15mY/Ddzg8Ve73rFdeAIhooby+EBGOrszKuzcQ0/MEePw9Orcn sIPyIHahC7Qww/aRnuDJC1aUCMohfPVh6LPO8jC31cqFeF3n2ov7cWe69HXSeVu5EgpYQd7d g3bQHAnYYeMPHp1dMy9yhKr3vV+eqvVtOslhgu1O1VDVCTsH7PFM2bOy5k/e9ejDtFQ+I8QJ EEDcG5uXtL6yNtAbyJhy1wSrjPh86A+HiPglmQeI9k2+MHDbAFGvr9vvLfcrNyjtK155NFXc sKSBJaedoRVM1jFFdOlvUoSNrHZ8z97l8SGbIZ+osiJCdsF+wF6OYlR37q2747Oomkbw5y2+ JzWL55uXvmtVfW+WoFPCh5zDUMxxGTSixW3GftujyE1KEM5jmHK8S6nKGJGd+eVjbaKRtoTa FtrhcezoyUaWaMs0PZmDRj17WzkQqf0HgK4J18jqZ75wMWd5AH1OrXxPy7b0Lksv6Xvq9sAd YIsujPW87GhpsxcdBc5ZXZ2ruAJxY2NvJVzChpzL1ZljItq6SEaWnQB8APw++ArplX+/EYRH c/fjWYBR+TKCpD8d9wtkWK0isAc+VcwF7yFBFSTjJ1fWdubtq7YNux1LO7Ve/EVYKc8/uYgM q7ywKLmcxI5OQW4TgoxnMZMz16YVu+Eh4i8pRirNlOOVWzBTejONOdl+TjwjgT6MnjhZJ2LB 0Ni8WD0OHOFKajnsxot9z7L58M7OPKm0mhGLbOSwm2J9RPW72tUy9uzt4jcyUi7y5MAkAxDk hZCSkmPbra26VUjyB7KCJ0632aduXC1D0T5GUK150fateKnDlnmgRhkGTR39dzqIoLNUsNjx SmEP3jM9Lu7s0JWd2bdLLK3Et9y+GJzqV3Fps5lgrm4D1sXk0Vw7moJczF11yeUOmycJRG3f CEq9Vii4VmY70DVFKFO+ybwtbu4iK6FuHlSmPDewTLq7G9LvsOSdlTQ12Hd2JOwQN4dFhUUv 2Aw9KWXkysOJ8RG5t3S3F1rtN5WlSannS4ho9xK7K3LqC7tOOtnXy6OSpdBjFGOFnELIu1O3 rcs6QHxZ6uNDry2JqqWqe7rTqyGG9qkMmZwZoR6L5UbsXxfFrGMc5jGslZjuGJyc58ChtBFN oKC0IA0CBgEDKIOlRMgAaBU6CmwQPtvBVW3rVrWt9TgP2kkklVUgAH71VVqLUVXve9VVVVVV VVVVVVVVVVVVVUkkkkk22222222222w2220k22222222222222222222222222222230kkkk kkkkkkkkkkkkkkkkkkkkkkkkjbYbbbaSbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbYbbbaSbbbbbbYbaSSSSSSSSSSSSSSSSSSSfw/sAAPu/b/H+/n8u7u/6k km/24d3d3coBsktBkigySbvABoFoCBmH5+Zn4aAPAUANvq/fffeVAPA2222ttiBoAaySboBq qqr5UABUABfKgAKqvlVUABXMVVQAFcxVVAAXyqqquYqqgALJJmRcxZJIru7u7qBv3327b3d3 dJJuh0kqHg0ANA5AO6oAGRtttuNum22/e9VfzAPz8zhVigLF9dgmH6lmuTEyjaU8oWQd/LP2 67YW3XG8jenYSnHXqO1vZePpCc3V3WpV2sd+PpLmXMWuexpHp7Lvd5wwm2aRGeuE4uPlIKPC m0M+rtMKNW72D7PohmO8ZwqZXOUHuGXm483PC7OTOi9Xque0XeNeZKNKn1Pna1Cu7jQd3Odz uBWWqd4jthYHxdAfD9998BU6GtJC+0UC40p73nBu7FUe50MsrefQ/hl+E3OfrkbXndsYuHTt q3ns++ofXt0hTmZUHwrh5t9FrcbI0Sw5dKUkVCOoXjWemdTA7jqLIBbtXhjnOZ5nkTsai7zR yW322YEg9vNVuu8y1B0Wr4Wfu5fafqse9lw4uVm5dOisL9t7G54rClXYpQdZGMUf83Or6nkn 1o4c96veqq9Xq+FQ+KhjNelrlu8LZ3jFr91Ws6vcEX4ntF76cjwZgeYi+nM7LAq309ZracYG Pw2pzyiRpFJQ2mVwhh0U9JdjiZljUsy5xXK9dJKQ5xfaqnZwA472sp9KlMjq6nQvKgMyaKxy 6lb3ZKPSbprUqMRCqve+/D74DPWOb9N9dTWcEgjHm613deExpwbk8+wCiKtwnbN71MkO+dk9 lPN6ArTtGAuVr6Z11cIkiWaAyjvs40gspI1phkr88N+Gl5VhHQRlIBES8dkULq7Iatv1xkEo +8Lp3flUUvhQrhwNLsxaxQUxNZtuaxgxfOszeMoq+FD2YnYcmyXmaXtKHeGftvh4cr8oC90Z MzOrpdTpKoNVTXbMGK9bl9mTZjyg827jSJVs+vdqDTpnlps69YVoDxGkepBm+j91xPCJdjx0 +MiojubflvlhnKZovAaEOkSl9KxVwIN4E+uGAVVsU06ywjeXE6XjmAjMZ83bPL6keWGXmrRv Zk2anmoBV73vV+V71U+wpfd33cB8t6x1WQvptQhaq6+TzucZ0cOpNDXdpqPr/NCoMQzTvxqz sj8BNXH62vEVKl8RYs5aos4EmbIq6OZrKGPTXGgdSX1K+QJwcsNZbe8hyfHHhb0RaqRMl+Y7 Y6rF3PphwH6t0kQ1D2pTGJzaur7lUebI77aJixIWyHFOIaizki7zMCjpZJduW2rUX3333w/D 74ArPDJfuY9keYtsZA1e7+0jW3x+TXy5Un+HHhk3WUQyPEI9yFRWRU9r2hhALXiMPw8nt54Z pGEcfmQHCbwd7sHED3kLI8fEAWPR/FcqITFeser4MUR8KWR19s0v6nwx2MLwIcRcVnCHnsIo Pb+o2bOHTDeeYMeuHerHHvpLIqF57yGTspiwxTunazPp4RDfJWfduQdPne9lXd3Iejajmg7t iE51646Zic49xHwA/D74D8jxAVZnrVWGV+QTmGh4XtIbownfzzPyuecdZNynH6WXzdWquxza sh+08tWcux9Nlyxz5q1lt0dX13IVd1kmnXZd1Zq+tKBu+Pl5Ul9CHfMB9Rq4lQ+2L5H4Wgma IwsgE51dqHfc5IKVYs+PDvHwiuxYwaCJ2Mg1w9h95Q3iDHIpDF1Zft8cl3Pn5ZDiW63k3ZZE tslLdL4wZ2C1rEscmVb5d+eqveBYKBFQ9UzN1mzf3axjPeFYzjFy563uzQ38eCAJCsb6q+NK eWtDiLiQIy1LXXqE3L8RoOEZqh2L7PKjZrc8Ofq9y91+VFHwIZ5Y6IZxWeB69aNCl8ya65lx +9yLo01p6paUFmrtvXY0VQgggl8LdlWIE0lDOnVDTynt2XvQ0a0J31FXwtc7h7OxrRfCce6u ArpdSS3L632TsoyuMt4mPvgB++++AM7AfyfnXeYuxQRzH6fpaq9KzLNxWsdWaP6ed5RqER6b tGkbxIRZQvey7TECeHe7Wo7omN9iemzGbz1JXAobLdeU+33fXgoWDh+CxSeqDSjit+4+9CQb QL88I6lfLQQPWfUK8Qb46fqxDrur6ZYHXjkmQWrYQrtBrwmWY1ZedzV3keSdMzMMO5ssVpbR WVL70h5PtrN07zsHZ16xm8IndXazruBmuJuXd3aFFjNNmn139I6S1OQhZ2609M4ZbV8qSoSl BV4HRE3ep9JQjmDKFJQurZaqXIO4G4W74itrDfKOrUDSDpl7rpMi4W5RqM2xHludazTDgd0O oYiWnUytdX0xIN8jqy33F5lMZbt+IR4IVhUvYNwUSMi25XR5BMsqEMwk9Oy6CkvtCxXeWknf MTkLrLxfJMVyKgj6sE3u4UZuw8+vP9sfGUZuK31ZLlZ5E+gVuzBmTHJwpwc9xauWtCPhVQG1 W7HNWx1ks9ou1W1aVxJd1cW/iwRidTTbt11XaLnbrG2HmLb7kIw9BRq8mPl0t1IhZLb28RJb QHbtuNSSsq7zkH15Sq7VhPZRy5vauazw+FQhFQhFQhAEhAEhAEslgA2CBoBAsCBhFC4KnQF4 AgbBAuAlyVV8WtbN+fX6yV9/ve1rWbbbbbbbbbbbbbbbbbbbbbbbbYbaSZiEkSTbbbbbbbbb bbbbbbbbbbbbbbbbbbbMUiSSSSSSSSSSqqqqqqqqvnvWotVQAAAe97wHbvettqttqttqXzAD bSSSSSSS8PvgAN7+v5+i/n8/rLu7vKoAv7HMVVVAPvvraMkUGSTd4ANAtAQMzMzAkkdCySbv er99995UA8Dbbba22IGgBrJJugGqqqqoACoAC+VAAVVfKqoACuYqqgAK5iqqAAvlVVVcxVVA AWSTMi5iySRXd3d3ZPj74h3d3d3SSbodJFDwaAGgcgFJwkkmRtttuNum22696q3e2nvaaCSr WzeLGzhqn5ief98lc+riKMNnvL6z9Rv3YO9l4PEMk9AhfIeMvFOl6ir6651TPEqwyktzteEH e6z9xszOPXaF863KModtaa2aHhk3i2quN6p07L0vtzLmBFX1X2O7xgvlxMeZnaKKesvd4elr OoiCsVY73Mzt1bhY+/fD4A+s+s972XfldpSwyB7MvuNX90FycipdXrKyDvzFhFfMb3j93RFE aa0qeX1e3KgT42ONmyPtiGEmXWdl0RDRh+0ruT+lizzHkKHlnpZhGuhfvuKsSLLBXj60MPuq vP3s9q0vUjtrSztu/W8Rqifejh91QPaZTlvt2qtC6x/brtab1y2NTRfF9yb5rggvkQ9i9Ml8 UewVg0F+9083Wk30zfrL5UaIXXKIzef65869xhud20jZXbcwk9f1IUTsrfW6CUNV2XRqYxSc jiYnL8szHedtKwNoG67YTsDdUqxu5thFH4An6EfQwgaQPNARWsV0LpUaJIDMIsiUvu1YcJIh AswiP2Z5C/lDnqQLyqDJobqlqqWcZL62w8nt6607TR0gIiH49K958TqxUJln2kTJENGZc3MW YtpkK9FlWLPZ3wp4+ko7ATxsV71ePKB5Ts9C5NboOx5ivVW/VblGtGcYm91axFkfjuqaPF9D 9LS2+l7qIIOkCj9IiT3n9Z7RRYHEYD98iVZelJe1TN3h2PAJMZhxjiHqELP188x3XqdWjviu 045q1FL5jHnIVczQ+s6PLxPL1exeC7wt7jqWIQ3IswWfeXw92MXYzd2x8G28xIj7SGQySBZC YcLrHh3E1dc/NZd50J3eeYOfOXdCYhUU7uKWUtZ1rkz0sUsG8IiD5QPNRtJGoHeWczua9rud axjWtwwwr/Sv1Yn7PLhZzSPPb9LFjvWuF0dVDOYw2acox4q1yq3lNQyW/PH3Vc+wm0KHxPxW dV96t0gkkMPKvcJHnJOFLSLmtm+x82iVjFEkd9fb2asYd5pOcc5i+bwTY0Eslnc2zFBXE6rW LmDj2XNzXKdWdBWGVE2hLShatj4AAfvvgB5UIhhzaqLsT8YKQeuLKulNQNguC/X2r7ry6Zpk 0WO7WcO/lVwrR4K/Xs5X3yQA93X47ftJPyPxIDOkCyIgzV0iLIs4fsfMMskjYvhhAhiq1cve RTpaL9dZQ52b173XGPViFHg/er6/bq0O7y323vt9uvwPvK7t2Dua/OdHy7lnK0CQKxRWpW+P vZB/g4B3XmGN7wsvWfwiHXu2TgqlmLWby/qUIAlCofCgfBeWhfNHIO4GIWvy145gURYr1+qy GftaOlDoEOg1j4kCECiIRxCuVfWBpA618NB+3kGL4sWZwzeumtrc9dHd3pvHhx0LDuWePDjd cD+Dve8bRuHJuM9sOYhH1nSZinbUFWVM7vphZ+Vi9595xok/bWOy6CZ3E86Pj3vRkWsMnkes pJP4liyESsK3qtoK6ZrTLxO+AxCgeUD2oezKqbl61u+J2FWrUxej183z6jw/HfWhmlfc1p45 i09yBKfp2S29kedxeDvMeYqmKfFH5XS0eQgq088TdVUFMWKWn5GzDPL7Yfd1fF+3vdb9HV/T t9XWbWOHhl1DuvumMFe6nha7QagGcLzgRuVoKtwLXcl62L3jbpjs28kuzJBbRg+qiPXl8PhM RukMkr6/nSROjUyS1mYbwGvC2ht4myurV0W1VM2b7MN5HEMH3wA/KB7M1Dk3C8cw5ExujGK1 Cu07hi/vSqDrDX13nSBy7T1VC/pkDYWUqPc6QOGRRLasYtSpmBzMmXZY9Zs3ysnteVKOU+Af 2m5dKxiz7r09Nw6MZSDPzbu7ILy82rJunXQ902ha5paqzDMwJzebyVxmnOFlgCS+s5yBJnbW mdTrrBy2L7GLNdRTwZj7OTGre2+MHcatfBj74AfvvgA2MW+b717d0V661OtpWdxv172jqaXW ESzt1H1S7pQwUse6gpWrjqBqUim93byVmvh11wOqHfJ4pKiNdZ6tri/zHZFIPR99C/mdv1a7 IzVDt6gLI8Rspkij2AnhpSQy2KzZnr+vQndI2frQ7vuUU9VvwHsIlpZ53ELPxkle72RWKpNT xu6B0W8qbV6Ip6hVRVKoRjbJzOxqQm7+Qq9mKivMNeLBHQYV7JOc2KSQ2ak5KHac0JJ3V3BN cw5XJtbzbRvWXRuk60xdys9IFTW8npfcZlG9zC09qPHQ7HGdKe25m3LFZkD5dS75U+es1kOK IMLERtCNLXb0UC3SIrZXccwXHlX3QOleB0jkUu53GisOdZMreFiK6uxupvIpdclGo5ypIFFK XXN7TpC7wWpddepUhFy1u9q0puC1jqrEySFzamvR1udcHHbuwuxYRGq4boYOuZubki2Co5nB ubVnWRti9N8z1GU3rBzt5LuKn2ijLoJoI7TupEznYxldFLJJMenN+IVXQsY0sPLaglPgcncK dOBGzrx31jpWoyy8aZkQrM3cDh6pL6GG5fdjTe8DbxFbsfbK2Pc5vmr4rG5bNtcmuWL65jJT bR5QIRQIQEIqhAQigsBCAqRVE/REAAPh9u5ntND9XqlRX6WonUMjc0HSsV7j/MRXFVkF7mk9 w66NGurSYszKnSOVqq7aczHzeC3WJEW0KpVMeVuCLrbutJO331++ZrHQn2Shs6vmy/lD193m SR81WDavq1RNbSnzzgrqzu0woFBrZF9OQsEUp2zRdcIbHfZdOWLs1vbqQJrMltSB3I2W51lz OTdZYVZdDLsWaxoyQ6EKc02yI8rC66GSVSodqG6pFrMWiMN0bG8IrlbIO5M11VWC8lh3nLJK FVOfKtW3cDejnebSFyMLHH/ReozeS8ZXQ5VmfQHcGViKOJt0X3bCREsPLZuU74pvGTjvkzwX W8usrsx2sOZIa64re1yU5nuO3DN1ZdJ6EDKzpfStGqdi6dTvOePkLNNPFUlCInHzOvVlIYMy Gnh2u7BqRxpEs1Qy7vdd28LvIxMFhHbJd5OV3Orq1UqrBgoI9j0tdqBx4tEmiW3QqHh1CZwV d1nku43taO2wiunSlhlWZKzqd5FPEG1lJZkSmsSCFZ2IcTUT0ZW2u+zGyKwXFxmWy1mgtJWD I9uq4THNYu1DlmWcdnhcGJ7owTr5VhFin10azLV4NDg44awJcHkp7oa7qdQtnJjrbujxPmWa sRKLcHZKdTryUw0jkt11ZIThkAx48vvYFw8+rQ1p1LiXrA1zaelxZT4TgpfKmFe52zLk11Km 601Nq+x303LS63uLJYa2a7xIUNNCFWqUekW3qzLeuClKu81AuHOU3jEpWiytq4tubehUMI2a vFHrA2cNqYcydWjKjSi1kIbrdrXrmsrmitlKbZ66e5vUDDUmhYtvdrb40ZrmFpvbirXZRJGZ brnlzHs6PGKvzrltTkRpGmy8t271KbnXTeS8OcGdh7dOuQdIce5J1ORdwoXsjsQkidXMmm3l 76YaVvDgNBdzdEZc8PXcczllzRYrWuwPU1aqTdb7XJV7U7qgISw42+Oydeax5w1O7byCFpsl mrzLq82jGVSh0ntqaeNXcW2XO4ZlMsx7V8BM4VAKzDsubjt8sTdDZmPHurgvNALGNudgWijx ScnFOtl477S3rEzNhw2zt1OsbWdcOMihjulLFVuoZlwzMlvsTGmWjBhUunmgAbaXOXHnBrDi 25wohHtuzhUlgDQqVaFvbr88nZTxZGhfuzRUfFMOUwpUL29QYJfR0Lp02ZL68q6x2CljUOLf XtITtbnUptz1u3vqFRVt4khVKrchoPou2msPPah7ZXLknXKuOrFp0sUF0SsdFLV7tVa7eYh6 M5mR2JVYc0MbkyFZHV5m3sCM7q6reUHJyMwCHJA+3u27Ls7JM6V1huSquu4R5OjHA21ubFKv etsit7SZ07k+SKV7GjjpC9OaLy75CxofBdI6j7HmsoyrjUp9rD1BIuJO6lg3aBdujnaeT27r jHkdDavZIHemkXvF8pGB0Tq9j6hDeDesMh8B2s5tXp5m0Ddi8kSNRDyOevkGag7EgGiDo2mS BXcJna3YmXsbNy4dpbyoul7EHKVaz1a7xqQPNeTgrBtpyt2r2Ip9F2pSktiLoyQXUm9kzapr C67q110UG9xvXzM6URhl93XozV3BVDsF8UrAFvsMF3jGUZL6+pbgduE4YKXczO7r4nBqSyNF 7jrrfG23UkksNrDYrtwWuAFgPMFaXlyFEzJob52c0LDgsnitw45LG6zSpjteC5FndqujTCrP c+Z2b3Z2HHiqP7dhVxvW+Dr667OGi7RbtXeduWEcamsMumnsZHUuup0wvs2ZZt1HkbpWjvVO IgGG8mMBaQaVYzgypZPZUDrEerDYk12toXeXXP3rN39ke+d3HU9i5+sV3t16+pcg+0I71Emp avaA0CoJYHcNlFG8ucMyXdikZaZx2OZVhDowyT0vNeWIRSp7o1ro8L6WYUNEvJmVVJ6rnV23 p4xAu0uvRHGs1bdrqMiFNdC5A2pu6Z0ZlMd5Yu7XvHQULxG4FmOs7uPc4IzVmUt0SkjV2c3c NljNulDlpikjO2u0WLYXNg9VGxhnaoazdiUSlDMpw9SyocUOTaRUxabJm5nESle247WdGCD1 utQDxZ1IWeAe4anNZoLTksbtZUWZbc3lJM7nfPtMGqnvbIdAq9rFgcFHZqlZt4na0JYKJ7Zt 3WG3GHqMo91EuLNG6A3u7cesbik2FYk2q4Hmhm2gLzSUkRUv14Y+7DOilje2iIoNQHVpPhaM ucCNuLGCVSNPb6LJOxXJi6qGrpWu9dZCeitw4rRxylce0lk+rViU2kIroyO3edHh7DbNijly zshpVOvrJFJTaNGTOKZB4E4F0U67MVLW5HR3RwoKrdWysSXOobo3COCEDVOuSNY3hybOnihq lDKsYOVLYbxSKr6q6PZmCCRhnMOXG7TBurlzsBpIUCMvexVqvi9yg7WA9cfPBwoutibvbhM2 pYky43WXBu2LOrEFLiNc+tyKr0vSOMu/qEeHjlchxtDNTnXRzYhSO7qqXFgenKTvhda3jQgn VnZSXukgZvA23WaOWXL3umwqmnpwywFJed1CjzzM7ZUS0YmHqvtDkGnZWjulJpnsw6VUvpdk 0uSNodQeCjtZapZoHXNj3ufTIO1zoy+vHOMRKObjMsU1W6nbKCkAW3LVMZu7zc2nVh5jeSaH gBPLSg3vPKmkiHhoxnbuDVYPWrvKmQFrlSsRN5lPcdd1Tju9FElRrBy1uuj665LTbY0O7qWo ze1bhLlutkIbh1w7FNFqlFZe09u0x06+QYraRlbag2OOXT2hxybbhTmpLdVjUH2Psl7bqub6 9wg9WO8s69jSqO9e9IzsO7yZI6c1qpZmMbrhPXrEbwmLLzkmxRWF4hHc4kZfR8TZO4MzsRi5 qosG9m4mcHLXpqxR+8YKhfWM5JMLy27+17uQWleacD4HaIHy6QiCXuW0vDpJxyzeur61V02W DtYuJmlUaGK+YqiseQSSt0k9zLqZQyia7M3qW661Yu6AzKdLqCFcfQkxTErs6NlVM4wTOWTq jW/Evcd0p1BDRTY1a7Q5PMpdZ8Omg3WXelso1Ly+vid7gGIje1lbHDLdPEqtHey7GJkYh3G4 ozJYlK03ShnanmVxxrGKra6XfKpkmGa1x6BpXZsnjSNGO96tm9ip3TutTswVWGnGDfXjjPc3 YirqxF3wvNhzzdJVqCGLXJz8fKogp2cLvjuClgWF6QjBpXEZ2UGeD3kaKzKtAPTBsphG1e0t 2cU9rs1X2cpdZQ2FLDNQgvEJ8swzFBIlvUQSr5tUgltBrLwfJYJ1Hdk4VY51mdyx11pbC96u A8y8gLSC6t23MToKztHROecr7XmKZ0zqby570L3yDPVOnesHNXaeIP06RWsCdjnoOacL7bHP nL6wIq696lsJ2RLO6UbWd2UMYkJB6mroM2SZxcutBpiE5Eu5ctPVfWhhaBZPaN7rBc4TqDEw B9yfcqHdeG7FzMsUZO2XKdi3psg0Yd7TdNka3SPE4FG3ddxXRbwutEGSqD7LX2fIcEHSToaI Kl4svwRqeEW5vc67MKs3Q0m4csW3NWCNTI+PWsHdG8bjVW5iPBY9G9mIRBrILgTudmdgq7Bs XfUJNyManQy9bEDnW+paO6S53CotY6t0uxu5slQaMtW5JT6663MoLFkGinkO862tGdOsC7DJ bVRxYtd2MaE2ocZ027+VmS97dFkqCa9vsqHKp7RHIGzUiL1EnWE+7qaRrqpG3qp0Y4DsWhih dVTXJZKLnV1ZcM4dlmnbtPhiQznz3N9tlNXWU9cLpqaR1bm2nVzbxONyi4OyNbb08r0PuqdU vdXdZC180TU57rL3HBnMCurFsnab2aLhks2za9awSb5axrXM5vnObC6ADKLsIiAAj/cUUUH6 Ciig/sCoqHyQGBBVAhEECAwFQIERQRSAQAAYMQSQSCkRcioaBBDKCkUFqVTIBQMhIAKUQVQK IqrCIoVRIDFhBAiIClAIEQBWogrJIhAIiCoEiQhCEIQgBCKEIgQiJCMCLIyEgQIEEgSSKMhI rEIrpQGyqikkIRhAGEGJAECiO7uMdtsG7uMdu4xs6N3cY7bYw3Zwbu4O22Dd3G/XuAEQf7fp ABBQfwIAiDARdfbRV+7+v7f1++999/b8wAAD+1VVVVVVVFVVVVVVVVVVVVV+jbYbaTSf8bbk kkkkkkkkkkkkkkkkkkkkkkkkjbbbbbbbcgkjbbbfve9VVVVVVVVVVqq++vfKqqUqqqqqqqqq qr77776qpSqqqqqqqqqqqvvr76oqqqlKqqqqqqqq++fffe97zbbbbbbbbbZbajkkkkkkkkkk kkkkkkEkjZLckkbbbbbbbbbbbbbbbbbbbbDbSTbbDbSJJJJJ/fAAD8+++/v/X67u7u7+pJJL /mCSSSRkk9u62TN3VBkk3eADQLQEDMzMwJJHQskm73q/fffeVAPA2222ttiBoAaySboBqqqq qAAqAAvlQAFVXyqqAArmKqoACuYqqgAL5VVVXMVVQAFkkzIuYskkV3d3d1ANkk23u7u6STdD pJUPBoAaByAd1QAFttttbb6227UAdqI2QRSAqRBQWCgA0RQU/yCL/kUUUHf8ZNc5f4lrXv9P p9qqoAAAAAqA7Yqv3273ve7AzAwwN73vAAAAAe9PVVVVVVWotRVVVVVe9PVVVVVVVWoqqqqq qt7296qqqqqqqgAD17UVVWr+m3d2/H9P3fnvft/P97+D9N3d3gAFcVVWgGyS0GSKDJJu8AbJ LQEDMzMwJJLoMkm73q/fffeVAPAqqq22xA0ANZJN0A1VVV8qAAqAAvlQAFVXyqqAArmKqoAC uYqqgAL5VVVXMVVQAFkkzIuYskkV3d3d3774JId3d3d0km6HSRQ8GgSeJKhJKThJJMjSSSij pttr3q97zICgwgCD/iAgoQQBEH+wIv4/j+X4/z++979P0/aqqqqqqqqqqqqqqqqqqqqqqqqq qoBtJu79g9eeAAAAA8mWSSSSSST8A02AA22AA22AA22B8iSSS00kkkkkkl+A+AH9XnDo5/b9 d3e/sAAv6uKqrQDuAoHICByAd1ANkloMkzMzMmySXQZJN3vV++++zFQDwKqqttsQ2STdQA0A NVVVcxUABZJIr5UABVVzFVUABXMVVQAF8qqySRXyqqq+VVZJIqAGYPlQAFd3d3X774JJ1vd3 dwAaA0BA8GgGzdUJJ5vd3dkkkkkiSVJJRVVV6vV6v7e23bd23f234fH6/qAB+tVVVVVVVQFa /aqqqqqqqqqqqqqqr3t71VVVVVVVVVVVVVVXve8AAAAB73vftVVVVVVVVVVVVVVX33331VVV VVVVVVVVVVVX33331VVVVVVVVVVVVVVX3333ySSSSTbbbbbbbbbbbbbbbbbbbbbbbjhkbbbb bbbbbbbbbbbbbbbbbbbSSSSSiJJJJJ4AD4D+383l/H1f2/t3d3fqAAriqq0A7gKByAgcgHdQ DZJaDJMzPZNACgVAO6+X7777MVAPAqqq22xDZJN1ADQA1VVVzFQAFkkivlQAFVXMVVQAFcxV VAAXyqrJJFfKqqr5VVkkioAZg+VAAV3d3d1AO4A693d3cAGgNAQPBoBsk5ANtQAFW28DuZuv Pe97wifwEARBigq/YEX/gEP8QhCEIQhCEIQgEIQhCMWAKUIAiDQBYEClUP+gREEffYnuVVfb 7x/KAAAAA1QAAAH9aqq3ve9VVVVVVVVJJJJJJJJJJBtv/RttttttttttttttttpJJJJKNttt ttxqKNtttttttttttttttttttttttttttttuNRRttttttttttttttttttttttttttttttxoy NNttttttttttttttttttttttttttttuOGRttttttttttttttttttttttttySSSSSSNxKNttt ttttttttttttttttttttttttttpEkkkk/3/v/Fz/v7v8fzMzMz/SgAVxVVaAdwFA5AQOQDuo BsktBkmZnsmgBQKgHdfL9999mKgHgVVVbbYhskm6gBoAaqqq5ioACySRXyoACqrmKqoACuYq qgAL5VVkkivlVVV8qqySRUAMwfKgAK7u7u6gHcAde7u7uADQGgIHg0A3d1Qknm4SSTJJI0uJ AL7v7V71epVX795Q/5BF/uIAiD/JQBEH+wgCIOD9QRbgi3BFgIv/9VDYgCINlUP5giII4RAA RsCL9P5ST6/NVX+n+f8/6m222222222220kkkkkkkkkkqqqq973qqqqqqqqqAAPV6u3+AAAA fe98+AAAAA++98+A3fAAH3vvfAAAAAPvvvfAD6qqoAAPvveAAAAAPe94AAAAA82222222222 +++HwAn3+r/J3+/v8/5mZ/W5mZmgAfzLiqq0A7gKByAgcgHdQDZJaDJMzPZNACgVAO6+X777 7MVAPBbbbbbbYhskm6gBoAaqqq5ioACySRXyoACqrmKqoACuYqqgAL5VVkkivlVVV8qqySRU AMwfKgAK7u7u/fffAAb3d3d3ABoFoCB4NANk1Qknm4SSTG20kkkqSXVXV71er6vVVCIP+wIv lED/QgCINIgAI/zUARB/gqhQgCIOkQAEcogAI/cEX+gIsEARB/yCLkEW4ggoP+6oCKD+VUIq h/4ERAR/ioCIjFUP3VQwIAiD/IEX/SgCIOQRYqh0EX/YEW4CLZEABH7IgAI/CIACNwRf5gi6 RAARwIAiD/0qh/ugIKDsEW4IsQEFBsIiAj+iqGRAEQfCIACP6qoZUDaoRVQEGKiwEXQAodEA RBgIIIMVQsIAiD9wRYCLZVDQItAi/zEARB4gIKDoEXCIACP9FUOCiig8BF/qACKoOEQAEdqA iI/9mKCskymsjdU5dwMt5y3AOkggAf/6gAVf9u/oMGYvvgCAABAAAAAACMAAAAAAAAAAAAAA AAAAAAACYAAAABE+AjcAAAAAAAAAAAAAAAAAAABePj7iUANAaBuy2Kpt1wDttETbnwYDu8AX YDuwAFsu7ulbakR1Q03D3AHAOwEASAXsDIBoA0BoG6GQA6OihcbwXD1WBp5EjZqNNDrpytZQ AokoAHdijiHjeB6vAUAUAHQrSQGhIAqQpdnaqwjcONBwGu7oUYAGzRtpaHQ0o0AAGmiUlcvF w9Vm1lK9AabHc0oAkAW7nTiVRtzjoBwMwFAKUJKBVAKDQUqlFOT0BwPW2zRXqJ0AOg61IAFV sw7MAZNVrkenA9YaJCqooqgPRoKKonY0LbbddzWxRKq1lbDbRVRsza2gpWgyGmRZsbALatKr QCjTLniiWAeeBXuPIcD17jy4eq9wBh1Xnk9wPXj3gW4HsAAKVT9t7eJpn6qVVVHpMIxDAJo0 YinpmTaqqRGJAAAAAEU8bSEqUoZAADCADBqeECkpCptU0NBoAADDbVKaqoR6eogbUAAAABEi AUkKbQSRiaNplGm1MngQQQH+X6/pX6/n9M3qr/OM/nOr/W/5KYREA91tq1rXfl+n5w4HDnDh 3x9vm+biX1MiFiy0tkWUhIlg3d8vmrLRtZlUzVBGCqZrRtmaoLaZamW2NtjbQWpm2xtrW1yq 22K1tFbVaNqtrlotWNatmajaKplZm0FW1rc1rG21sauY2K1tWZaxaxq1c1trWNtaja1Gt81i wVEVQBf9wVEQYKKiI6XIfoin7iIkQUVB8K5Ff7Iq/0RV/+gqn+qgqIP9FVoFRVH/4RVRWCEB ERYogRQARiAIgEBBALFLFWhEoREgglqgKBARf6IqwU/8igAI/3VAARpU/YX8AqfhAD7Ki/wC p/CK/sor+6P7qg/wgHQQOqI9ReqKHQVOoPVVDqKdBA6qp1BOggdUB6iHVBDqC9VV6Cp1EeqA HQVOoDxUA5xQXiJxVTiCcVQOIrxRXqPQQOggdBA6CB1QA6Cp0FTqD1AeoHQQOqK9R6qD1AOg gdUR6i9VE6opgOiliL+oBEGDlQSAUqbBQ0IjQr0FToKmFBOAgdRV4qhoEDYIHURPAqdBU6Cp 1FDoAJ1RDoLpUX+Yf4EGQQkti0bW/JVy2Ki0VG1y1yotGrFoqLRaKi0aua1y0VFo1cq5UVFW KioqKioqKuVtyoqKioqKuVcqKKioqKsVFRUVFRVyrlWKioqKioqKioq5VyoqKxUVcq5qxUVF RUVFRUVFXKuVFWKioqNWKioqKirlXKirFRUVGioqKioqKuVcqKKioqKioqKioq5VyoqKsVFR UVFRUVcrcqKioqKuVcqKiioqKioqKioq5W5UVFRUVcq5UW0VFRUVFRqxUVFRUVFRUVcuVFRU VFRUVcq5WxUajUVGrlXKirFRUVFRUVFotcq5Wi1ioqKioqKirlbcqKiorRUVFRWKioqKsVFR UVioqKioqKioq5W5UVFRUVcq5Ua0VFaK3KuVFRUVGKio1G25VyKioqKisVFRUVFRUVcrblRU VFRUVcq5UUVFRUVYqKioqKirlXKsVFRUVirlXKiorFotcq5WKioqKioqNXKuVFRWirlXKisV FRVytcqKiorFRUVFaKioqKioqKuVuVFRUVFYqKiorFRUVFRoqKioqKuVcqKisVFXKuVio1FR VytyoqKio20aoqKuVcqKio2uVcqKioqKioqKirlXJZFZFZFSRGhET+aKiINoptUABHAKiIOP 6z9vd+fPvv9f3/rjecz+vJX2uvqvXrlb19fXtfX1vndV1FX7oqxBAUG/z/kzYje5mXz3zefy qyMn/LqY++++zP/O6vnKjzx2+LP3+Mv9P0z+5xKLM97px6qr3ve5z3vd732Zme8/v+3qqq97 2d7FmZ9EXdTEbMzyd69kRmd72ZZ3a9znOZ7d5VOVM9qqjfO92MzvezPs7te5zLv2XznOOW9f J+fXW+jm3O95yPRERHuVyqr3O887dR6I7zfW7DKqPRERDlcqq9z3Dt1HojvN9bsMqo9EREOV yqr3PcO3UeiO831uwyqj0REQ5XKqvc9w7dR6I7zfW7DKqPREf185PJmfXz1md5777Lv3Fwmf vffZ9vJ5Mz6+eszvPffZd+4uEz9777Pt5PJmfXz1md5777Lv3FwmfvffZ/X28nkz669w7ee+ +y79xcJn7332fbyeTPrr3Dt5XojP1+4uEz9777Pt5PJn117h28r0Rn6/cXCZ+999n28nkz66 9w7eV6Iz9fuLhM/fv3f2VFTLlObvbykRn63Fwmfv37v7KiIVKt28vOJn7763EIj9+/T+yYiF SrMtecTP331uIRH79+mvsqZlyVZdrzif379akIjv331fRu9vapVTPqqo8d7sZne9mfZ3fVSv ZUz7J9Xrv15xP79+v1IRHfvvq+z775UJy+27lqqIiOufPvq+++n7PvvlQnLXvctVRER1z599 X330/Z998qE5a97lqqIiOufPvs5ERUR998qE5a97lqqIiOufPvs5ERUR2IhyVW5t5zFVMzPX LhEZ2IjkRURDkqvebecxVTMz1y4RGdiI5EVEQ5Kr3m3nMVUzM9cuEZ3777nIqIhyVXvNvOYq pmZ65cIzv333OcnkzK6m8rOZWzMREc3bjdnciIu7m5mbupvKzmVszERHN243Z3IiLu5uZm7q bys5lbMxERzduN2dyIi/13N1VXdTzKzmVsffffc3eRuzuxEX+u5uqq5isnK7mbMREXO8jdnd iIu7m5mbmOZOV3M2qmZm6243Z3IiLu5uZm5jmTldzNqpmZutuN2dyIi4tQqs5Uz6qqB3uxmd 72Z9nd9Vf1VV7nKpMe2drvUzEbc7f27m5ERfLm5m/vuZGTl7MxGXOX9nc799t8ubmb++5kZO XszEZc5f2dzv323dzczcfcyMnL2ZiMucv7O539txy/8Td1EfcyMnL2ZiMvL/Z3L/byObN25M xezGWiEHadS1v7vY72e97yZi9mIy0ykymJ3W/u9jvZ73vJmL2YjLTKTKYndH2ZOZWZnJmLTE bezKTKYndH2ZOZWVmXVTEffZzIWo3jm8rdJ+zJ/ZlZ+zLqpiPvs5i0m03eVuk/Zk5lZWZdVM R99nMhajeObyt33vVG7X7drf27dVMR99vM9fpNpu8rd971Ru1u7O7yZ7MzEbzPd9IoL4er1R u1u7O7yZ7MzEbzPd9IoL4er1Ru1u7O7yZ7MzEbzPd9IoL49Kfsyc9znPe5zlVM5VVDXe7GZ3 vZn2d31VMyqqT6ZmI7w6kUF8elP2ZPex3tRk9qqmfTOe76hzgvj0p+zJ72O9qMntVUz6Zz3f UOcF8elP2ZPf67He1GT2qqZ9M57vqFDlPTs/d7Lsd7UZPaqpn0znu+oc4L49Kfsye9jvajJ7 VVM+mc931DnBfHpT9mT3+ux3tRk9qqmfTOe76hQ5T07ORmUycyo2cqqmfTO+6oc4L49Kdjdr MnMqNnKqpn0zvuqHOC+PSnY3azJzKjZyqqbr1Vvsc4tdjs+hG7u1mTmVGzlVU3XqrfY5xa7H Z9CN3drP6ycyo2cqqm69Vb7HOLcFx6Njd3a/tk5n0bOVVTyvVW7m8563BcejY3cl2LfbHZna rnPc5u1te4or733fu97OXFvsjsz6q5z3ObtbXuKK+9937ve5f1u5HZn1Vznuc3a2vcUV9777 sd73e85UyrcvlVvJ+3fcfXfN3tV7O7VVEbEOR6ZuqvnecKU4or7333Y73uR9buR2Z9Vc57nN 2tr3FFfe++7He9vJjrIjsz6q5z3ObtbXuTuz+999cXd9j6976OzPqrnPc5u1te4or7vojJzM ipi3ciI9M8r1Xu1te4or7vojJzG85U9juTEemeV6hSvcUV930Rk5jecqex3JiPTPK9QpXuKK +76IycxvOVPY7kxHpnleoUr3FFfd9EZOY3LvlZOR996I5PqFK9z1Ffd9EZOY1d8rJyPvvRHJ 5W7tbXueor7vojJzGrvlZOR996I5PK3dra9z1Ffd9EZOY1d8rJyPvvRHJ5W7tbXueor7vojJ zGrvlZOR996I5PK3dra9z1Ffd9EZOY1d8rJyPvvRHJ5W7tbXueor7vojJzG/4XfKyMj770Ry eVu7W17nqK+76IyczN5yp6yPvvRHJ5W7tbXueor7vojJysa3vb5VUXyq7yft33H13zd7Vezu 1VVOVtUj764i55Xver1Oeor7vojJysa72+VOR996I5PK3dra9z1Ffd9EZOVjfne3+qcj770R yeVu7W17nqK+76IzJxsru85WR996IueVuzs+r3ivu+iMycau+ZU5H33ojk8rd2tr3PUV930R mTjV3zKnI++9Ecnlbu1Pq9O7P1ojvZ81d8ypyPvvRHJ5W7tT6vTuz9aI72fNXfMqcj770Rye Vu7U+r07s/WiO9nzV3zKnI++9Ecnlbu1Pq9O7P1ojvZ81d8ypyPvvRHJ5W7tT6vTuz9aI72f NXfMqcj770RyeVu7U+r07s/WiO9nzV3zKnI++9Ecnlbu1Pq9O7P31pnva81d82p2PvvRHJ5W 7tT6ozI/etM97Xm845tTs/feiOTVbu1PqjMj960z3tebxfNqdn770RyeVu7U+qMyP3rTPe15 tL5tTv333ojk1W7tT6ozI/etM97Xmu3fOVVNvlV3k/Y9x9d83e1Xs7tVX91OVtQj764i55Xv eqdqMyPy0z3teyN5zmU2PvvRFzyt2Y9O5kfvWme9rzV3zanY++9Ecnlbu1PqjMj960z3teau +bU7H33ojk8rd2p9UZkfvWme9rzV3zanY++9Ecnlbu1PqjMj960z3teau+bUzsxHpmZ5W7tT 6qnMmY91VZnPO7d82pnZiPTMzyt3an1VOZMx7qqzOed275tTOzEemZnlbu1PqqcyZj3VVmL9 7He2qZTEXMzPK3dqfVU5kzHuqrMX72O9tUymIuZmeVu7XpmMyLj3VVmL97He2qZTEXMzPK3d r0zGZFx7qqzF+9n8d7b6ZTEXMzPK3dr0zGZFx7qq69695yt2Z2Yi5mZ5We2vTMZkXHuqrrnv d275tTOzEXMzPKz2+iPsztx7qq6573du+bUzsxFzMzys9voj7M7ce6quue93bvm1M7MRczM8 rPb6I+zO3HuzN7Xl5fr9dVXl8qu8n7fOPrvm72q9ndqqqcraqkxFzMzyve9sR9mduHZm9ry8 57m1M7MRczM8rPb6IzO397vZva8tt+tyqTEdmZnlbvvvu9vn3rubyvbftv1uVSYjszM8rd99 93t8++9d1ec9vb45tTOzEXMzPKz2+iMzt/fe72r3nnb57m1M7MRczM8rPb6IzO3997vaveed vnubUzsxFzMzys9vojM7f33u9q9553+r57m1M7MRczM8rPb6IzO/v3ruebXj+r57m1M7MRcz M8rPb6IzO/v3ruebXi+e5tTOzEXMzPKz2+iMzt/fe72r3nnb57m1M7MRczM8rPb6IzO3997v aveedvnubUzsxFzMzys9vojM7f33u9q9552r9zamdqIuZmeVnt9EZnb++93tXvPO17vNqZ2o i5mZqs9vojM73sR7M53b93vu3zamdiIuZmarPb6IzO97EezOd2/d7fPc2pnZiLmZnlZ7fRGZ 3vYj2Zzu37vbv1+u+c552+cqP2+73mxdxc53nPZXqqqnK2qpMRczM8r3vbEZne9iGZzu37ve 9v17yqqYi5mZ5We30Rmd72I9mc7t+71md91fOVMR2ZmeVu+++727uI93vO5fu97217yqqYi5 mZ5We30Rmd72I9md3nrv+7vnt3nOVMRczM8rPb6IzO97EezO7znOcpmVVVMRyZmeV1iIzO97 EMzu89d3fPbvKqpiLmZnlZ7fRGZ3vYj2Z3eeu7vnt3lVUxFzMzys9vojM73sR7t7Xuc5x7d5 VVMRczM8rPb6IzO97Ee7e17nK49u8qpmIuZmeVnt9EZne9iPdva9znOPbvKqpiLmZnlZ7fRG Z3vYj3b2vc5XHt3lVMxFzMzys9vojM73sR7t7Xuc5x7d5VVMRczM8rPb6IzO97Ee7e17nOce 3eVVTEXMzPKz2+iMzvexHu3te5z+uce3eVVTEXMzPKz2+iMzvfvvXzZ9Tn9cevx27vkRkzM9 rffv13zn728yPTtV7nrvnOHb5yo/He82LuLnO857K9VVVZ7dvbu/dvnKj9vu95sXcXOd5z0+ mZme+zLy7v3b5yo/e93vNi7i5zvOen0zMz33ed5znr5q+T976636s5GXVen0zMzfu87znPXz y+T976636s5GXVen0zMzfu87znPXzy+T9766+2efXdfXuc199a18RV+3z7Iq/kUABH7iv9EV dBAVEQcKf0QUVB/1QUVNfi1VrfsqM22xjRjBjBjGDGMrVloDDGAADBa0tsFrKqIMBgMGAwYM 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 I26zDVUjd3juDMxSq7UjBozqyrExisgZKW51qFmZmw4EWXDdXTTrrh9mI31Va1mWt0KKA0ZT poES9R59gKFGdS7cNqXLqsVuCr0FWWcq9Zr3auE6aW7gqPCl57PUknZbTOO7ae9ezZ5uM6HY srZFdzGCdWKsj2ev1ZCqtOV7c4u54cnc1JhfiZE71blZZt9wx0+TSt0Yt1Qqem0tcwzxI3OM p3AdwztWSpfeU5Uhx4pd1rHOCF7XuVq4bHjnGSi9XbudynrvdKfrUshWVqOWMkyI4Tmcqqt1 0Csrc5Uaij9g3a3ePB54GZrtYszlnp7pcitO/S8F2C9UsvOu8Fx0Yg+6U4Ctmck9R5FLjnoh SpbS7euIUdzsiTYfHHmXKWclopSrqDsXCsrht4rsLVVbhmksxiTKkie5tFzdYjha3nZvLaq5 hquWp1dFGKMpdUNXx3ONVee0i8DK6Vdadzu3dI5SNVqW3MXm5jygmSIJCKK1SAcVUwoAeVQN AqcUR0irxRD8H4n4qVo+7m222222222222222222222222/pJJJJJIJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJBEkkkkkkkkkkkkkkkkkkkkkkkkpJJJJJJJJJJJJJIJJJJJJJJJ JJJJJJJJJJJJJJJG2222G2kSSZEySSSUkkkkkkkkkkkkkgkSk0mkkkkkkkkkkkkkkkkkkkkk kkmgmSkkkkkkkkkkkkkkkkkkkkkk0mkkkkkkkkkkkkkkkkkkkm22223G3G22222222222222 22222222222222223G222222222257w94b+78/z/Pd0ZQAAkkkBdgADbbbKAuwAC7AAABJJX aAAALsC7AALsKAAKAAAAuwABJJIKAAN3d0AAA7u7u7m222NttsLsAAALsAAbbkSN3bvW0kkg 3d3QEl3d3BmZm22NpJBG222UBdgAF2HAGJN9z7M7uAGkt0OSXcAPdAMwDQIB7vcADA3QBJJZ m9ySS7u7u7u4meA8E8O1hec+/qhJdOzT3HqVh47e7VX1tm7sYpgxDCFcu7spdP7ax3m5MLHI Es8QMLxM8lCPpxuX8hhA4tJk6vFCdd3Rh8W5Ik3o7ZYnNNfCucN/WeVK711kouzmxcyoyabC 7aBpLW4dm5eFwHLF1erSKl3uje3mubQ94fvAeGZu0y0lefUrz7T8u5XxrsKo4ddLCOhI2Yn+ 6amPZqlZj5Q5p1Dc0XlwSDF6YzdifYga15GiSjZHF59UAs0Rp0vV7XuRllkZyrQvZJcw2Ydy iiOP2m/bNdkHVRE3n1LCiTl2xRo4fIu1Dk+DFl0EMoyH4rMQZsX12YlSykey5Ku9+I4wcNLn RvFawrmCF73h737wHhMv9UWVNoXJG62o+u6OEK/fpJLiUy3+nbxvYxtCbt2NxUelwaPo/hbf xclYQL5e+1URxyYipnT1JCNYlYun2W46uSm/sQRiQyPK+N8QqRWMm3V4+vOyJwezDV2tpBcn EsyRlLHMVMTxznOy7uz1yjZWWYFdNasIl2MV2cG2qcultKgPe8P3gPDvmZtz6dSg+ce2ae3O 7OF0liQ7mGyqjceJzdt23lY4w9VZdRot21N15UxhzMeFQ5IuWSGyZtsdakrMqc+wXV1i0r2q JF2sl2tzMCnVvUqpy26pNJnGEOUGvu6hWbjc05272BUOIfawpuXmSkKwpUsPVViNZku8A970 e+iPoWNdxUUZWw5bqs9drdZIPfN0NVOFpPRcQ6VlFwcoeN1LugmnFPoSXOaJRZZ7SXLpcpq/ HIX4WdIokgM+5LzVjN347lFWlD5IZHGvvusFq9zJqq518MgqHdIYpNmbXfVubd3m5K5R3fzc NDPccdiu3W1LfvAeH8A94H9q+ZGrlX3TnTfw2Prjm5xsbLyQDFU2mJ/AIWRE5v0+zwVFroCD D3y4/b0tisIRFEM+rEiGR0QQZvoGYDZJ8E1vKjS9xz5ODZQp/d9nrsP7Gu2dQ7koEzDxFbKV jutqdHu7w2E8k0ocVTTqzLCSJWCMobtp8RGu5VRb6lPUYqbvLbWtGKGle9Li1Vj7Fm3z4DwA /Ae8KV8U3svQ5ucMGvHhGVX2RCIJKraTMyTa2yj8qb0ZlJkt10/RUwz5Hhf2UPvsAfLj4P5Y QPqukJaQH1TH93Cjop4XjfxqjSH0sjacyrJ3XmA1DhwdmYllysNXgvM1Z7OLUG0o3lDtNjsH NDMpXpw1m9qcSvjs06pDSx5bHeHve9+8PeFc1rJbGA/N/Gp1fqPmrCd2vWK+0SyNIv9Z4Ud+ mDixa5ofGgRp9W/HGfmfpCrE1Qj42Znyizq7lnzDdfac7OMwZzut09p19jJCpdNPUSdksZ0w 9hDDKjEJzU6FZGnfbfXDjNeaKrUpLt6m7uG8WcSO3ESZfeO50pt9eEm3JF3trFXve8B+8PeF bnMofbQfIXFTP2ffKVV728eakXBt/tXKHGHQHx04fUffbWZ9KqrV8yEvAlm4vYtutzNpWfQj iNSok+r4bxz4X6EPPqVvZvxZxYol0dV83yeOoXOIcdrdp25IWPF69229mWWxPIHjH1nlu3ad 9kpPtW6zvDnMEnVQrnQvGXVAeAH4D3hevh3wNGtrbb+qZGd/USR2d2WcUz2bb9m2wOLu3iin 6RUAz6E7Uu0sTofUjkpCxT4t5gVR/I41RthotzKsxXzv1Cu5cEqfIy1CcpNbe8ZtYN3rqqzM BYnJurrd0pHTZpV0lyWbSsfVNdZZUcadBz6/VoD0tvt5bZSVZfqaDXBddvdwcKbzUlPQPtBI 2CemXjV5E11jRmbMduuuVarGa1boVZ2rve96CS1cuuu4y3LM8SVssku77BQyK3taSLpZiDIw UZTxBdgt5OHsXXDJe353UxeOMaUppcGlPO3UnK8EqiYY1mxEWzwvnm6SVhQp9eS6CwSlAo1H 2EUq7orqm1133SLuazb2oinVqZku1nmmzlU71+ZPIhRpfW7aeXl3cHMVbSVmltnHuXcGk9ov rEq9RvHOZophddPegTHTi5lXTPsm93PDtAjsnEaOxbkqFZbptq9MLjFWaN9kekYjw7q0z23E h+7rlHqz1zNMvLtJDXpfJ/Oyw6pDIb3VMhvttnW9exlOCsCV6I8L9j1DucIuLDVVMuxOpNlb 3fgPeBHgO8AAiAUoIxsXwIHkEyCpxFdoPUWKCdVQ4C/j8SE/Eqve7y7u7qqqkkkkkkkkkkkk kkkkkkkkkk22kkkkkkkkkkkkkkkkkkkkkkkk22ut+QAAA+977wAAPu5JJJJJJJJKRSJJJJJJ JJJJJJJJJJJJJJJJJSKRJJJJJJJJJJJJJJJJJJJJJJKRSJJJJJJKNySSSSSSSSRttttttttt ttttpJtttttttttttttltttpNtttttttttttttJNttttttttttttttttttttttttttsttJJp JJJJJJJMDwAa3+v6/n57uvigABJJIC7AAG222UBdgAF2AAACSVJAAAF2FAABdhQABQAAAF2A AJJJBQABu7ugAAHd3d3c222xttthdgAABdgADbciRu7d62kkkG7u6Aku7u4MzM22xtJII222 ygLsAAuwEksSb7n2Z3cANJbocku4Ae6AZgGiVJOQEkk0lIklu7u90Dd3dAAACZ4DwodY6tdY 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 eaOcxix3lOHMtLmVQ65U1zUhz7Y11bFO01L42++Lqhs10JNwbnveesYh+c9tze7eyG3Tki9U SnoY8y62g6rmZuHNtbdOKlC+yFjZGhbPb2FjGGK4HgrvZqZmXe1K3CLycpXrsc9l9K9r44wc l27sBR072eNuOuMd3586qZy3cF3ITVX2PNOrf4PAeGA+A8CAUEgRBIEUEP3VAARvBjnPmcYM 8CJy/KfuoIgm+vFZ7qlh5RrcUsKaltRtG3tgHaZOdJLx4i3oyYlb2RJM3N4jVuZdkdHre1ki I255Gt+aGsdT4ZReZPcXz7m375sJeFnr8XKzSr9r60vSXlnp1PN2lBIRnnHElfbp0YcMTOVu lVrZ61bZ6SeMtDldjeqTluGb1FTc+e9zTUbIntZu/4e90V1+mJyJMsufSRbzlB7dZJJRD2jW 9hJQ2mkayZUktvLDvXfihdhIdljhl8czMu/ZN28FAxB1KwaJNnScEJzEqBh5LVdVsRSnHOzv 63ay7AySZLjoeVc0U/VeBiSApe7LsqFGXG7DzHzxG6GVd5ti9x3HDHTGmZePXzfN6+oHtdQV FV1x0bo20E0XH3c9qSF5errFhh5nMLLO61Z7Lu5UUj1b0tks8de68rbH00q6hNzxUlN4Ulhv O5MzYzlChpWDkzsNq0uW5nStqooEjYapXkbmQgXNrn3Xe3vIobs3JlU5xLpWyeuBBJZVLKPs pzm9ldVXKvFnadLRGvVm4g1r7vuvu+7H8t0U1W0vjsIdcIrzZgyyMDx3V9aFXYXqzliIeODU OKLvrtuLyvpfN5ILHN5u9yWQRi2uuKpO3UNVWGLrRiHrLdStS4XV1cqEydRJW6tXxFHj2ZtD VtlGhhwR8JFVkWnxMWVSsIc6HVi2KNskqFLhQ5cWp6DQzadK8vo03ckKSjJ3sMIIRrs0ttu1 hEzM4oyZIvMqwdqsBUK2jCo81FdrFHevC5pHeu/uz5ewnKknc7ylU5U8XGQBDNzfL3nYrV2j pRX48N+t9E69R4Nsj9snjqlHr6vd3c9aVMZV3TbLrXHdxJTFpzKYR51SZu06kXb17hlLanFT Z3AlWyOeF5WIcD15yzZI4wcZPbhdbsJGPUQnSlqESqBfbfLCyfSm8y7xZtjY87QRUjrrxdrN ntljSmKmZnrfKuXMK3GZqWVKyaeCNjt6j1B6jlbjWVh1XUfGLlFUp065WqhQnZuRq1OvezL7 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 HomKrVrI57BK7ksy7b6wR2XuRg9hN5VmoQyScI46rFtBmAiLXqWEJ1QbmbhHYTsNh3ZLrGpN 0zG5eGlxody7ayN8ulMwbYddSuzcnY7rzHlYK/eSgE1a+fqlWpK6iHVXjubroYeWJnRK5dog t9fB4LbucCqyPLFb17JHczLJDlYlgQmVsq09p077iSZvNlvoqti4M4MSDRMV0RW32be4xBdB lziQ9l5UwjdB92RmyZWvX2NwbYutz1HVr47qFFb0Y7s6DqWLHTd0TuZH1vhl4L2k/UrLzHt0 MwPXlztBM88njr2HbDQzV3kMowm77klK3mQ49lSE5qXk6d7uVLvm6S695lZtBe+slytuajpU IoJucHxwZGcGZynVZra7Z2LuaLm53ew0vQ6KxUABH+yCioP4QUVB/gAUVT7REWEAUgQWqzb9 H6tTZazYzbbBVGNmRjbbBWmpbBVGNaDVBrZsts0toxqgtsW0IMGACBCAoMICKjB2IjVbVtzU 2arMrVsFTZabNtsG0FpmZtrWs0rWWtZqpGLbEbNrWrcKsybQUgptBWKAiQgio2pCCEiqRUAP wCoiD/sggKD+qKiW0tVfu7N+7u7v1fqLbGt/EAA4iSSf7SSSXNttttttttttttttttttuGSN ttttttttttttttttySSSSSSSSSSSSRtthtttttttttttttttttttttttttttttttsNtttttt ttttttttttttttttttttttttthtttttttttttttttttttttttttttttttsNttttttttttttt ttttttttttttttttttht/SSSSRJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKEkqj4mI/Vf6/6T+f +hLNyZ9u93cABwXYAB3d3d3F2BdgAF2AAACSVJAAAF2FAAFAUAAUAAAFAAG7u6BQAAkkkAAA SSSSRtttjbbbKAAACgAA7u7okmJK7Xbu7vAkkkAku7u4MzM22xtJIJ3d3d3F2BdgAF2G7utp awJJAEkmkt0OSXcAPdAMwDQIB7vcADBSJJbu7vdA3d3QAAC72vq+r6trq+qrIgCIBBA/uir/ dBRUH7n4n4qq/Gvvm222222222220kkkkkl+bbbbbbbbbbbbbkbUbbbbbbbbbbbbbbbbbbbb bbbbbSSSSUjZiJJJJJJAAB73ve22973vW3gAD3vfeAAAAAe977wANJJJJJJJJJJJJJJJRRxp JJJJttttttttttttttttttttttttuNuNttttttttttttttttttttttttttttttuNtttttttt ttofL+D+f5/lf5O/BdkkgJJJAXYAB3d3d3F2BdgAF2AAACSVJAAAF2FAAFAUAAUAAAFAAG7u 6BQAAkkkAAASSSSRtttjbbbKAAAAuwADu7uiSYkrtdu7u8CSSQCS5tgbupNjaSQTu7u7uLsC 7AALsN3dbBPu7d3e7gDMA0DOA4AHqSTYZu7d630BJJ5kmtLd3dcgbu7oAAFdsBP9wVEQf9kV d+k/H3/FSvx8+fLqqqqqkkkkkvzbbbbbbbbbbbbbbbbbbbbbSTbbbbbbbbbbbbbbaSSSSSSS SSSSSLTaSSSSSSSSSSSSSSSS7u7u7u7u5933wAAAAHPvuMwANt8+bS3d1tu7rbd3QASSSSSS SSSYP9VPv6/z+f5lV26T3d27JOSAuwADu7u7uLsC7AALsAAAEkqSAAALsKAAKAoAAoAAAKAA N3d0CgABJJIAAAkkkkjbbbG222UAAAAAAd3d0STEEyYkks7gAO7gMbfdd2kdzYB3bnd3d3F2 BdgAF2G7utpawJJAEkswDQM4DgAepJNhiSmU3m9wA0tkSS3d3XIZmYAAAUb999VV99VVv31f yfAgKDjXft9sYvGPvMYl3fTQBIh95JJJPySSSbbSSSSQSJSSSSSSSSSSSSSSSTba+bbbDbST bbDbSTbbbbbbDbSSSSSSjbSSSSTbbbbbbbbbbbbbbbbbbbbbbbbDbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbYbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbDbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbYbbbbbbbbbbbbbbbaSSSSSSSSSSST8F7v4TPv5/df3dVmfi7Cd2Zmd1d3EBttthdhQAB QAAACSVJAAAUBQABQF2AAXYAAAUAAJJJAXYAAkkkAAASSSSTu7u7uG222UAAAAAA23iS7ggG AB3cAB3cBjb7ru1KO5pJIG223C7CgACgEkk0lrAkk7uAMwDQM4DgAepJNhiSmU3m9yST3dkS S3d3XIZmYAAAUZ999X8f1fffa1tNX8Fqr/fW/4zMzM1maZmZm1maZszZmzK2ZTNjYQIQYRAp FREGyIp/0oKAj5/T8/m5d/nf2+13d3d3VSSSRS5V0hcu/smMe97bb3ve9bwAAAe977wAAAAD 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 rIrUVqKyKyKyKyKyKyKyKyK1Faisisisisisikisisisisisisisisikisisisikisisisis isisisgtRCojIrIrIoSKyKyKyKMisisisikitRWorIqSKyKyKyKVFaisisisisisisisikis isisijIrIrIrIpUVqKyKyKMitRWorIpIrIrIrUVqKyKyKyKyLIrIrIrIrIrIrUVqKyLIrIrI rIqSKyKyKyKkisisitRSorIrIrIqSKyK1FaikisisisitRSorIrIrIpIrIrIrIrIrIrIrUVq KSKyKyKyKkitRWorIrIrIrIrIoyKyKyKyLIrIrIrIrIrIrUVqKyKSKyKyK1FGorIrIrIrUVq KyKyKyKyKyKyKMisisisikisisisiMgjILICyAsisisisisisitRWopIrIrIrIrUUqKyKyKy KSKyKyKyKyKSKyKyKyKyKyKyKyKMisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyK yKyKyK1FaisisisisisgNCqH8kEUQcKKfKgAI5ERRD78/6fj/e/5R+9/x7P27P77f4ZT/Rvy 9X+Pb/fdZ+O/0X/f5g/z2/vV3v0Cf12/wnf5P4vz71defzl+n79Xxz76qqv7fIBEQFQf09fc /u9+O/jv55+Pvz+v57vV3f7Pz+fz+fz+db/z/N73vvZ9Ws3nMzKqOb3vMzMzWv6+qpn3uZzj ep1m8n3OVuuXxvsz/JF8jnL33dbcVzdarbbddn78LqJ4DjnObvm51q+tV2Pv1cJieX5biIiO XHOc3u+t77H36uExPL8txERHLjnOb3fW99j79XCYnl+W4iIjlxznN7vre+x9+rhMTy/LcRER y45zm931vb06+7G0xlQvGRGTMzCd71p7N7y/a+7G8mFQvGRGTMzCd71p7N7y/a+7G8mFQvGR GTMzCd71p6s5zLvX3p3lRVQvGRGTMzCd71p6s5zLvX3pyuVXF4jJlVVU3rX319lzme9r7s5X K3d45kReVVTetffX2XOZ72vuzlcrd3jmRF5VVN6199cN7rO6+qMRW7vHMiLyqqb1r764b3Wd 19FTie8u8qYyZvO97V61992G953uvoqcR3l3lTGTN53vavWvvuw3vO919FTiO8u8qYyZvO97 V61992G91X8iYzORzmbbrbiubrVbzbde9WvoL7GczMqYyZvO97V61992G953uvoqcR3l3lTG TN53vb++/d+7DnM73X0zOI7y7ypjJm873t/ffu/dhzms73epnHO7u8mYyZ9ne9z77937sOcn 2e3vdVWc7u7yYvJnL73t/ffu/dhzmd+++iIxFc97KmMmcvtX+/V+rje8r776IjLiuZ7KmMmc vtX+/V+rje8r776IjLiuZ7KmMmcvtX+/V+rje8r776IjLiuZ7KmMmcvtX+/V+rje5z2tamZz k1MZ7O1OVWde6/fu/uxze5z2tamZzk1MZ7O1OVWde6/fu/uxze893WtTM5EVMZ7O1OVWde6/ fu/uxze893WtTM5EVMZ7O1OVWde6/fu/uxze893WtTM5Fz2py892qnKdpv76vq1ze861rUzO Rc9qcvPdqpynab++r6tc3vOta1MzkXPanLz3aqcp2m/vq+q9xzn0/yYjM5HON3ut5xXN1qt4 1X8j2vb3wvnM7GHalOU7Tf31fVe45z+Z7etTObvlVGXnVVOU7Tf31fVe45zPb1rUznLipjLz qqnKdpv76vqvcc5nt61qZzlxUxl51VTlO0399X1HJiMvetaqp5dRzLykzOVfavf31fVbkxGX vWtO9qHZjFVSqrO37szzWq1q3JiOZfN727XHY5iZtVVnb92Z5rVa1bkxH2XrWne1x2YxVUqq zt+7M81qtavOTEfZetad7XHZjFVSqrO37szzWq1q85MRl71p3tcdjuKqlVWdv3e1Ub33Wrcq IxvWu97XHY7iqpVVnb93tVG991q3KiMb1rve1x2O4qqVVZ2/d7VRvfdatyojG9a73tcdjuKq lVWdv3e1Ub33WrcqIz/P8b3vfe9qERiZlMzleqpnms97e7R2ZzN73v3e1GRHbVVKqs7dVM81 73t7xk+qt5ve9+72oyI7aqpVVnbqpnmve9veMn1VvV/rqt1yOctqtNp5udTvGq997N7iMuLi OrqqyqrO3VTPNe97e8ZPqr7e85znu95zIyfM73ud73vbqpnmve9vZk+qt7ze9+73nMjJ6zve 53ve9uqmea9729mT6q3vN737vecyMnrO97ne9726qZ5r3vb2ZN33u+f5nN7v3t5zsMmZyqqq 7VTPNPe3sybvveczm9372852GTM5UzPZmIyN573OZkzd97zjm9372852GTM5UzPZmIyN573O Zkzd97zjm9372852GTM5UzPZmIyN573OZmVR70RnN7Xe/c7DJmcqZnszEZG897nMzKo96Izm 9rvfudhkzOX2qr1VM3k8wiE5VHvR+/yM5td69vtMmZy+1Veqpm8nmERGTN33rPv8n9za79rt MiIy/VVeqpm8nmERGTN33sZORzi7vfuMiIu/VVeqpm8nmEIyZO9iM5veZd3z0IiIy/VVeqov I3gRkyd7H9RnN7zLu+ehERGdmZ7M89kby7vIyZO99M5HOZg5cZERF36qr1VF5G8CMmTvdffx V97yOce1Wm29R9Gsan1/5e85yqrL5cIiIu/VVeqovI3g5kRd1W+5OTEZhu+ZznOe92qrs89n NY5d3OVV3727mUxGDd8znOc97tVXZ57Oaxy7ucqrv3rmUc5gcuMiIi79VV6eXnNY5d3OVV37 0X/ko5zA5cZERF9mZ7G/ZzWXz3snKq7965lUxGDnLjIiIu/VVRu82vfvehM+93LmVTEYOcuM iIi79VVG7za9+96Ez73cuZVMRg5y4yIiLv1VUbvNr373oTPvdy5lUxGDnLjIiIu/VVRu82vf vehM+93Iv/JVMRg5y4yIiL7Eb+9nd37nepVVe7lzKpiMHOXGRERd+meavPbXz3vSqq93LmVT EYOcuMiIi79M81ee2vnvelVV7uRf+SqYjBzlxkREXfpnmrz21896EzPaxf+SqYjBURc5MzN1 Eb+vue5dx70zMz2s9c5UxGCoi5yZmbqI39fc9y7j3vVVVXu5czlTEYKiLnJmZuojf19z3LuP e9Tve9v2a+/mdz3uRzj2q1m83qPo1jU3d77kR3vcqIuUzM3URv6+57l3Hvep3ve37FVVTEYK iLnJmZuojf319z0Xc+9VO972/ZtVVMRgnsXOTMzdRG/vr7nou596qd73t+xVVUxGCoi5yZmb qI399fc9F3PvVTve9v2KqqmIwVEXOTMzdRG/vr7nou596qd73t+xVVUxDMzOzKpmIuecr76+ 56LufTKqqvdzd1VTEXhlelUzEXPOV99fc9F3PplVVXu5dVVTEXhnZlUzEXPOV99fc9F3PplV VXu5dVVTF4ZUQmZiPTzlffe7noy59Mqqq93LqqqYvDKiEzMR6ec5Wte7npybq6p3ve37Nqqp gMnsJmYj085yta93PTk3V1Tve9v2S/yqqYDKiEzMR6ec5Wte7npybq5VVVfc5+KqdBkxCI5z sbrla13uenJurqne97fsVUxwMmIuI5zsb3P33adiOz2Zyqqry5mObu7tMR6I5zsb3P33avsR 2ezKqqrXMxzd3dpiPRHOdje5++7V9iOz2ZVVVb79nsz3uRzj2q1m83qPo1jUxd3+zl+97J45 ze+83uPvu9zsR2ezOVVVeXMxzd3dp57nN77ze4++72+xHZ7MqqqtczHN3d2nnuc3vvN7j77v b7Ednsyqqq1zMc3d3aee5ze+83uPvu9vsR2ezKpm1xHOb973k89zm995vcffd67EdnsyqZtc Rzm/e95VR6I5znN7j77t+emfV6qqpm1xHOb973lVHojnOc3uPvu356Z9Xqqqmbc5veu970qP RHOc5vcffdvz0z6vVVVM25ze9d73pSbmYiI3ufvvL96Z9Xqqqmbfc5vXe0Qj0RHOa0/dX3sR 2e1VVM25ze9d7RKPREc5rT95fexHZ7VVUzbn9c3vXe0Sj0RHOa0/eX3sR2ezMxFvf1ze9d7R KPREc5rT95fexHZ7MzEW9ze9d7RKPREc5rT95fexHZmZmItzm96qrJR6IjnNafvL72I7MzMx Fuc3vVVZKPREc5rT95fexHZmZmIt39nce96JiLvXdN5vUfRqWp9/Xqzfu1mTkZERzmtZ+9l9 7EdmIjnLzvN71VWSj0RHOazefXj3pj0zMzEM+5zeqpmQj0RHOazefex70x6ZmZiGc5veqpmS j0RHOazefXj3pj0zMzEM5ze9VTMlHoiOc1m8+vHvTHpmZmIZzWvqpmQjnOb3ms/Zl97ibqqq pmc+5r6qZnEc5ze81n7MvvcTdVVVMznNa+qmZCOc5veaz9mX3uJuqqqmZz7mvqpmcRznN7zW fsy+9xN1VVUzOc1r6qZkI5zm9zm8+zN1iPTMzMzOc1r6qvEZHOc3uc3n2ZusR6ZmZmZz7mvq q8cyOc5vc5vPszdYj0zMxEZutfVV4jI5zm9zm8+zN1iPTMzERm619VXiMjnObnNZLUr52IyY iM3Wvqq8Rkc5zc5rJalfOxGTERm619VXiMjnObnNZLUr52IyYiMfvYqq5HPezN+3nN3zc6nd 9b7/FZfavvOoiI5PdXValfOxGTERm619V45WRxus+yZ1C+VEZMRGbrX1ZjlZHG6z7JnUL5UR kxEZutfVmOVkcbrPsmdQvlRGTERlfzmqzGqznG6z7JnUL5URkxEZutfVmOVkcbrPsmdQvlRG TERlc19WY3WRxus+yZ1C+VEZMRGbrX1ZjlZHG6z7JnUL5URkxEZXNfVmN1kcbrPsmdQvlRGT ERm/v05jc5HL27msqtyc7EZMRHd/fpzG5yOXt3NZVbk52IyYiO7+/TmNzkcvbuayq3JzsRkx Ed39+nMbnI5e3c1lVuTnYjJiI7+/k5ipzd6V3N5Vc5e65zI5kd/fycxU5u9K7m8qucvdc5kc yO+/n1ZmqnN2nuayZ5y9zzmRnO+/eJmeRzvczftubvm51O76330/zvCeRz3vXv23N3zc6nd9 b76f53hPI573r37bm75udTu+t99/U/fu8Jna7sc5zd83OtX1qu/1H36uEzu/LHOc3fNzrV9a rsffq4TE8vy3HOc3fNzrV9arP7/v+v6/r+o/v+wD9wCACNqIfzRRFBwAfzRRO7bv8e3du3dt 3579+7GYABgEkgMUAgCRQCBJIAxACMAxxjjGN2dtwx2McY2BxjgxjgxxgMYxjGMcYOMbGDjB jGMYxxuMYxjBmbu3Y4w2G4xjGGzBjYwGMYxjGMY4wcZhxjG4ztuMxjBxjGMYwYxxjBwY7t3N u7O7u527ZgwYxjYdhgAMAGADAGABhsDmAADmAZ3bNud3bgADMYABwAAYYAAAcADtztm27t27 fw23YqxGIhFFYCRQkkkkkkICwGGzAADu3Nm7Z3dsMYx3HGGbts7ubG5t3c7bYY4G7tnbsABn bYAAzDAYMABwcA4BgA4AzMOG7s27udhSRkJGQiMRCKDARCRJCJuNxm4AGHNgAAAMO7tnbbm2 3MAAYO7ooxVgSJIkiRhIwjIyEEYnds7dtjMwcDt3c7u4wGBwDAGYGAG3bYYAGAAAYwAGYYAA ADtztmAAcwwd22xzAADNgADAA4A4cBhgAAzhgDAAGYAYGzdtmzcDMwZhu3bO7dnbdm7bGDDA AAAMMAzAAMAwAADDAO7bYxjO3Ns7bG2GMbjjBjGMccYMYxjMMYOMYxjGMZuwRkBZJASEAIwg BCAwgQgQgQgQgJJIoEIEZERgKEDdnbbndtmOMYwGd3djAAGd2ztxmAAHdzdu527cZwNmABnb tzuDbu5kTCKIoP/KinkBEUH+SgFgH7gQMIodAQPlAD9QVP1BU0ir4AE/6FQ2KnVAO/xkpQDI qCm3fN2O7bO27bvy/I/T7B9qqqqqqqqqqqqqqqqqqqqqq/Hzbbbbbbbbbbbbbbbbbbbbbbbb bbbbbf0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 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 lLTdCrxd13xnoieaY3blA6jaXVcVZuWonFV3tdhO2Cc8pz48E7h6njNpu7zbKXutYXjmTtwS 1XOGVk4bHVmMWphJvroi4XLD+sVt93Zzw7Xc7i+55i5r+iiGBUCw/CIdCiFAhQQEKFoKFCEF CBBQnAQMqAHgQOoCfKC/AgfCo53+79JjGKqT9N9wAAAADAAAkmfxtttttttttttthttttttt ttttttttttttttttttttttttsNttttttttttttttttttttttttttttttthtttttttttttttt tttttttttttttttttsNtttttttttttttttttttttttptokkgkkkkkkkAADAA+tVVVVVVVVVV qqqqqqqqqqqqqqqqqqqqCpJJ+1RD5QA2Z14rmb+u710AKAX+f8O7u6qveqqttqtVu6DJN0Au 6qqqrJJaAVfvvvj3ttpmffY65gAUBe9bfvvvrd1VVVVVUABZJLQCqAbu3EBA4FAAVAMwDQMQ EALvNVV4rxXvVQDgIBZJugF3QDgKqAHeiqoBmAGYqoAUDgVQAFACgboCAF2SSaqqqqqqqqt5 +/c5+czpM9rPq3NSc6CiIGNyUqiItXSPeHh4UzNY21QVfLnL7Azh1qzf9qgqu5fRV8tKIebf oSEo+LTYopqC1poyl8++qwpY5IGubSDNGUvXhWHUhNXEYQvqZIs99nx/oHs/UPj+8giLwK8q 1uT100di2ttHKY/NTuZKyN+zOfVZfCB4nzwHxvcN5Z585dWSbfdovOIq95MrFdHGOYyiFL2s dpS05FN7dK6HJR+94X4DwHwQ/g94B8PyrfqgrbH6Xg4aNm3sr9P33xGfAfKUL2VqHfZhNXw3 T9eNyRzyoD6+xfKdkImC+r5/z4hNDTLL/YIZoFz9rGn2lH0/cx9qsUib/J6u935nUnfSuzI8 9h9VFFp6QLIv8z0++qqqU0zzyro5pnojZzuruXJd4m7zdp6Y3lF3WR70W2Tsud0xJ6SW8UQW 9vwJpIfoKH7QEAEdZ/SvwdrGckmK778Qr+s/DQjYPavM8aLI42UIOvQKwk+J0kitUOaukw6K 9x8zp8iycQ5Z/TNaBmw8c0b+/zeawx26xKU30zt3ZPzxr2T1VeYfFBfZd3gElJU327ywXaE+ W8Afe8APj4BBxFENwFSoCpvtICZioNRAMwEDBt7MztgKD0iKDqKPIij2AgbigPICpd0goyAg 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 oeRFbexW95PpK5QGE0RSmculXiJ5jqSTQqXqVRzDl09G3ubvJbrHctmbqCsbjnNb7wAiiEVA AR/oiiKD+UURQf3ggoA/gWCihCCqfAKheiRSMKFqBUCorIhIFQkaChdtMZ0zbjbYNuDtwds3 UAgQgISSIMkiIEgSKSgQKBRGooSCgpFpFkVCBACgqIBJIKwEoWSRFCgBAgilQaVBUqJAgyDI kiqqIRT0iMkiQEgMkgsIASSBEirSoKv5ERRB/2RAVB/xERRBndtt9vn31B+/fsAAAA/WqqtV VVVVVVVVVVVVVVVqAH71VVVVVVVVVXve9VVVVVVVVVVVqD+FfPe9VVVVVVVVVVVVVVV73vVV VVVVVVVVVVVVVe971VVVV73ve96qqgAGAAAAAPiAAAAChVgAAAAdVV9VV/ky77Fv7JKbJJSJ IK/ucy5mO7xd3d21xRVySKGSSW4qqqqgFkktfvvvk95czFZFXd0AzAHjb73rbiqqqqqoACoB ZJLUAN3cxAqB3pkkkxQAoG6AgYgGZveqqveq96vFQA70ZJLQySS3AA70VVAOAqoAUAKqqAZg BmLbbbVAMwDQMQDM0ABVVVVVVVVW8/fv37nD9z9+/cecGAAkEF2UigEP7KAf2RRFB/Z9+n4/ vMYxnnCfekifpJJJIsqgCqpHkJF73gAAetVRVKV57xVVKVVVUpVWqveq973vXnveb2SSSSSS SSSSSSSSSSSSSSSSQSSNtySSSSSSSOGSSSSSSSSSSSSSSSSSSSSSSSSSSCSSSSNtySSSSRmK RtuSSSSSSSSSSSSSSSSSSSSSSSSSSSSRtttttMtttttttttttttttttttttttttpJJJJD1j9 1fHO0r+ElJkkpEkA/yJJJSSVI22+riirkkUMkktxVVVVALJJa/fffTquZisiru6AZgDxt971 txVVVVVUABUAsklqAG7uYgVA70ySSYoAUDdAQMQDM3vVVXvVe9XioAd6MkloZJJbgAd6KqgH AVUAKAFVVAMwAWSLaySWhkkUAu6AAqqqqqq973ve97/URFEH/ZQDf6clVJJf0kQJHbG31AAA AS+lVVKAHqqqqqqr3veqqqqqqqqqqqqqqq973qqqqqqqqqqqqqqqve96qqqqqqqqqqqqqqr3 veqqqqAAAACqwVVUK+/PH9bTy7f64npCSUiaJXd1tuLxVVczMUVckihkkluKqqqoBZJLX777 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 BCIsgkiMIMikihJIKySAyEIhCAKKC/+AVFAYKCIo/AWgn9EUD+VAQggqIPQFMgKf7CiH+ooh /+gIB/0UBBB/1UQoFEFX/uCEVEEYAEQBEYCMARQLVAtRCkUpQEIApaqEAUiCoIMBT/UUQgoH /NVVUH/cAABGlQP7gqf0U/kVH+ioH9gf8AqGAATKCn7gKfwKf4EHgAJoAE0ACf4BU6qh/KIb UB0goeABNqqeBU2CpsATYIGwV6CpwFTgKnAEOggdAQOgAnQAToKnQVOgqdAegqdBDoAnQF6A AdBQ6Cj0F6CB0AXoD0EDoIvQFOgA9AToIHQQegh0EDoCPQA6AodBHoIHQQOgC9AeggcFF4KJ wEDQIGhQYIYUVyitIrtFLBAx/n/m1BJBGQUqAkiyKyKyK1FaisisisisisisisisgjIrIrIr IrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisgsgsgsiDIDIJIrIrIrUVqKyKSKyKyK1 FKisisisisiyKyK1FaisisisisislRWorIrIiSKyKyKyKyKyKyKyKyK1Faisisisisgsisgs gsiKSIyIyCyIFRWorIrIpIrIrUVqKyCSIsgtQSorIjIrIjIhIrIjIrIISKyIyC1AGorIjIrI rUVqKyKyKSKyK1FaikisisisitRSorIrIrIpIrIrIrIrIpIrIrIrIrIrIrIrIrUVqKyKyKyK yKyKyKyKyK1FaisisisisisisisisitRWopIrIrIrIrUVqKyKyKMitRWorIpIrIrIrUVJFai sisikisitRWorIsisisisijUVqKyKyLIrIrIrIrIrIrIrIrUUqKyKyKyKMisisisisisitRW oqSKyKyKyLIrIrIrIrIrIrIrUVqLUVqKyKyKyLIrIrIrIrIrIrIrUVqKSKyKyKyKSKyKyKyK yKyK1FaisiyKyKyKyKyLIrIrIrIrIrIrUVqKyLIrIrIrIqSKyKyKyKyKyK1FaipIrIrIrIrI rIrIrIrIrUVqKyKyLIrIrIrIoyKyKyKyLIrIrIrIrIrIrIrUVqLUVqKyKyKyKyCyCyCyCyCy AkisiMgsgsgsgsijIpIrIrIrIpIrIrIrIrJUVqKyCMisisisgkisiMisiMisiNRGoFREqIyK yIyIEiMisisisisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyAUoCH+SKigNooHAAAE cAqKA6/1/645/b2IT9/+2uZ/j/H7fvz1c3+d/j+np2/8p9ia79z8n64wtH1exn1+fNivz9h/ tf1efquz4/sirv7/Rv6+fX4fqpnNtnq7XP387HLr+f3+c+3O7D731t72Xz73P39/z/X+hD+g ohBEUQfvffvjX7/x+vz9/2/b+P3++73ve973//bu5u/3+/zMqqje8Z+/b+37d2N2d3f873tl 3bHve2ru7u7vdzMy7u7u7vdDdyIj77dnMzvfVXN2o/v93d3d2P8jIjvf3MjPs969czvPd7ze 5nvez1VXeIj7379vPqpCt57Nbfve9We973vZ6qrvNiPvfffbyOVSW85dpmIj2zbN2q7neczK dd5P3o/mVse+maz2c5MzOzeY2q7neczKdd5Pvoytj30zWeznJmZ2bzG1Xc7zmZTqY9+/md2u zPczPcmZnZvMbVdzvOZlOpj977O7FTM9zM5yZjYvMb3t8mbvriY/V9/b7v9qZnu5nOTMbF5j e9vkzd9cT/a/TfdqZnu5nuTMbF5je9vkzd9cT/a/TfdqZnu5nuTMbF5je9vkzd9cT/a/X3aq Znu5nOc5ydm8xvMmIzOYj+Kvu1UzPdzOc5zk7N5jeZMRmcxH8Vfdqpme7mc5znJ2bzG8yYjM 5iP4q+7VTM93M5znOTs3mN5kxGZzEfxV92qmZ7uZyZmNi8zZ9H33s3mJ/j11vvTM905MzGxe Yn0ffezeYn+PXW+9Mz3TkzMbF5ifR997N5if49db70zPdOTMxsXmJ9H33s3mJ/j11vve5yt3 dv3verPe973s9VV3iI+9999vIqkNmfZbkzMbFsxy5iGzmx/FX299Mz3TkzMbF5mOXMQ2c2P4 q+3vpme6cmZjYvMxy5iGzmx/FbWeyZnuqiI+33ru85cxG7ObH8Vfb+++lmxEfbt+9k+j7di1 fzK3924iJZsRH2773sn0fbsWr+ZW/u3ERLNiI+3fe9k+j7di1fzK3924iJZsRH2773sn0fbs Wr+ZWb9WTM8zfvvqVVXH34+rO/z3X7voiJsiI+VVXH34+rO/z3X7voiJsiI+VVXH34+rNr+3 V797Jme7v331bVVkfft36s2v7db+q4iOZuxEfbVVkej7dj0bX9ut/VcRHM3YiPtqqyPR9ux6 N/l926uIjmbsRH21VZHo+3Y9G/y+7dXERzN2Ij7aqsj0fbsejf5fd7573OU9q/e96s973vez 1VXebEfe+++3kV9TYir970zMZ73ucn0xqZ9O/3+926uIjmbtzMxvve5yfTG7M+nf7/e7dXER zN25mY33vc5PpjdmfT7f36tz2REd7u3MzG+97nJ9Mbsz6fb+/VueyIjvd9ER8qqd7z3JiIqK z9+7l1cRHe56Ij7Kqs73nuTERUVn793Lq4iO9z0RH2VVZ3vPcmIiorP37v7Lq5me57776sqq zvee5MRFRWfv3fZ/uriI73PREfZXc5yan0zM1NZ+/Vl+9ER3uc9MzGR3Ocmp9MzNTWfv1Zfv REd7nPTMxkdznJqfTMzU1k/fV9l+bbO/O+m3v5p+dz+P6bb+P83MPr8+/pts34khT6Zjl+9z nOe565++9V+iPu9ivux99PpmOX73Oc57nrn771X6I+72K+7H30+mY5fvc5znueuuRHvXcR9V R77sffTczHPe9znOe5665Ee977b3nLu9y/e93KqqqsrHvV3ZnYyIjsdn0e2PquO/dj9OxH3N 2773vfduq5Ee9dxH1VHvux+m4j7l3d973vu3VciPeu4j6qj33Y/TcR9y7u+9733bquRHp9dz MRUe+7H6biPuXd33ve+vvZ++9V+iPrqPfdj9NxHLu75znPX3s/fXV+iPrqPfdj9NxHLu75zn PX3s/fXV+iPrqPfdj9NxHLu75znPX3s/fX9V+mYuo99UfpuI567vnOc9fI/fr7dRH19jfRU/ cv7uZmTPvZzkV9dX6I+uoy4qfuZ93MzJn3s5yK+ur9EfXUZcVP3M+7mZkz72c5FfXV+iPrqM uKn7mfdzMyZ97Ocivrir9Mxf37LipiCOmZybtzkV9kRWe5yb5Hy59yIIrBybuP3f7fL7EfeR 89NciGRQcm7c5FfZWehMZ6Yi5rkQRQcm7c5FfZfvR5zmXe56r93KqqqsrHvV3ZnYyIjsdnbm /76Y9fORU1zvt+9u3MVWTMd+9/e4/qYz3ORc1zp94uYqsmY797+9x/Uxnucmb5Xfj7xcxVZM q+un3kxnucmb5Xfj7xcxVZMpqL/tI/qYz3OTN8rvx956Pu9uCvre/395MZ7kRc1z4+pUfd76 GTFTdJlMZfOTNcrvx956Pu9uN3eT7mbf+5nZhnIiprn279W1H3e+jdcn3Muqvara7yZiPT7n o3Y/ey5iq3dj70Z3ZnZg5yZrld7Go/e25iqiN3eT7nK2Z2dTMRU1zkbsfr25iqiN3eT7lbEb Gs5yZrld7G7H723MVURu7yfcrYjY1nOTNcrvY3Y/e25iqiN3eT7lbEbGs5yZrld7G7H723MV URu7yfc5WzOzqZiKmucjdj9e3MVURu7yfcrYjY1MxHZ7zkbsft25iqiN3eT7k/yoi/I5mZnq quO9yqrKx71d2Z2MiI72Pfe33o9Mxs1yu9n3I/ZtzHfvm7Oe5WxGxqZhNcrvZ3kft25jv327 s57n+62I3UR8iu13s7yP27cx377d2c9ytiN1EfIqq72d5H7duY799u7Oe5WxG6iIhNVVVO8j 9u5Md++3U57lbEbqIiE1VVU7yP27kx377dTnufq3+Ruoj5FVXezvI/btzHfvt3Zz3OfVv8n2 6mYiPe93s7yP17cx39u7Gen+/3uxnt3b5zlc5V3703yP27kx377dTUx3Yi/aX3ve85uZ703y P2smO/bqM9P87sRnt3b73vecq796b5H5uTHfvt1NT3/N++v2nuc5M7d1U+5H7dTHfvt1Oe5X +bEZe7t85yZu7qnL7P2wmO/fbqc9z6tmcvd3ve97zl3fvOZ2ftjJjv326nPc+rZnL3d73ve8 5d37zmdn7YyY799upz3Pq2Zy93e973vOXd+85nZ+2MmO/fbqc9z/f9r7+X5EjMuq5znHe9yr e9XdmUZER3sXcXvNzl973vec9l+9vM7P2xkx377dTnufVszl7u973vecu795zOz9sZMd++3U 57n1bM5e7ve973nLu/eczs/bGTHfvt1Oe5/fq2f2Xu73vezN3dUzOz9sZMd++3U57n9+rZ/Z e7ve97M+93q75P2xcx377WTvuf36tn9l7u973vec96qTfJ+2LmO/fazfT36tn9l7u973vec9 6qTfJ+2LmO/fazfT+rY9l7u973vec96qTfJ+2LmO/fayd9zmz7+c5l7u97znOcu6rec5P2R6 Y7+3MjfTMd3nM9u73ve973t37185yfti5jv2sjfT/div5Oe3d5ye85z3qrec5P2x6Y799uZO +5se/kzl7W7Vd73vbuqc5yftj0x377cyXufVszl7W7Vd73vbuqc5yftj0x377cyXufVszl7W 7Vd73vbuqc5yftj0x377cyXuej285mb7e95znOXfbc5yftj0x377cyXufVszl7W7Vd73vbuq c5yftj0x377cyXuV99fkyMy6rnOcd73LVXebmcSmZqKnP8yc3uZ7uZXe973Mqtd73kbNzFff ZWS9z+/f5Wzl7W7nee73uZVHe95GzcxX32Vkvc+rZnL2t3Peqqqsz3nu97yNm5ivvsyFTdbM 5e1u571VVVme893veRs3MV99mQqbrZnL2t3Peqqqsz3t26quzM3MV99mQqbrZnL2t3Peqqqs z3t26quzM3MV99mQqbrZnL2t3Peqqqsz3t26quzM3MV99mQqZut5zL32696qqqPebdVXZmbm K/Znyo/X3f7Oe2t3Pe73vcyq3fVVdmZ9MV99aFTH9+ut/vMvebr3u970qt31VXZmfTFfW+79 7mxF03dz3qqqrM95t1VdmZuYr77MhU/zt/72Zy95u57ve97mVW76qrszOzFffZkdjnv97EX5 u7nu973M73drve9mZ2Yr767jKm62Zy9rdz3qqqzKrd93vezM+mK++u4yputmcva3c96qqsyq 3fd73szPpivvruMqav285mb7cqu973M7m77ve9mZ9MV99dxlT3771JlmWuq5znHe9y1V3m5n EpmaipzJze5nu5nvVVVmVTfd5yIj0R3767jKn++rZXtbuVXfVWZVbvu85ER6I799dxlT6tmV 7W7nvVVVmVW77vOREeiO/fXcZU99/vZlfS65znLvvSu85EQiO/fXcZU/31J/L6XXOc5d96Vl d7MyiK++zFR/bq/75fS65znLvvSsrvZmURX32fOx/fd8X0vs1zl33pWV3szKIr77PnYj3fOL oyuc5zM73FZXezMoiv2fnfv7/fc8egvs1zl33p72equc4iPffV9z79XKyc8MrnOczO9Pez1V znER76v3P1TWRlC65znLvvce9nqrnOIj3336f3Z7kZRiuc5y77097PVXOcRHvvv0/uz3IyjF c5zl33p72equS++9X36f3Z7kZRiuc5y77097PVXJffer79P7s9yMoxXOc5d96e9nqrkvvvV9 +n9/P7/vuf75X9yjFRGZMnWequS++9U/z5GTsy9RdVznOZ3vcvarvNzOJTM1FT/b/y9m+c57 Lc5MzO85d6qu83M4lMz92PrvZ9znKunOTMzvOXmN96uzOZ1xMfq+/t93+1Mz27c5MzO85eY3 3q7M5nXHOfq+5db/fTM1fnOTMzvOXmN96uzOZ1xzn6vrrfemZq/OcmZnecvMb71dmczrjnJ+ qI/z/X+v8/1/n+V/iiH9VVVQf3AU/1FEMBAVFAcID/qIKiD/0EFRB/soKv8QgQikIMIkCSEk JCQkJGQkhIoy+6qqqu6qqqqq6qqq6uqqqq6666qqqqqqqqqqqqqqq+qqqqqq+7u+rqrq7qqq qqqr6qqqqqqvvu+67vvvuiKREQiIEGRkQCEBJCQAIkkAIQGSRGEBhAIRQkkEISEgKSApIqSR CEYySKQiEIEZJFZJESQkISDIRGEQJJAIEUGCEACQkRkJCSQkJIIEJJAkhJJIqhISEkkkhCEr ruqqq66ruqqqqqq6qqq6qqqrqqqqqqqqqqqqSSSSSSIishISEkhISEISEkurqrq6q6q6uquq urq6ru7vlAChBUQf/KKBtQURB/yFEP7oJlENAgfuCpkFHoIHwAv9BQf+BBcKgdFEP5zzfrxW MZFENiKAA7VAiCAfz/P88zjFYxd+qqqqqqqqqiqqqqqqqoVVVVVVVVfkADGAAAAAAABjAOKq qqqqqqrZqqqqqsAAABjAAAAAAAAxgAAAAAAAYwAAAAAAAMYAAAAAAAGAAH6lVVVVVVVVV9Vd VVVVVVVVXVX1V1dVdVVVVXV1VfVVVXVX1VVUyMkhJJ/UKUFEQf8AowVA/QqkFVUQf7oKP6/i YOV/Offwfv+/Mf456Q7W/3jvn7qfP+ERv2/z9qKXfa/Pn59XZ9/n3+q+3H6mc766vrfmfvd/ tdf0iEznu+9mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmZmGZmZd3d3dszMzMzL973vee955d 3d2zLe973ve973e973ve96uwAAAAAAAAAAAKqqqqqqoAAAAAAAAFVVVVVVUAAAAAAAAERERE AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAA++++++AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADMzMzMzMzMAAAGZmZmZmZmYzMzMzMzMzAAAAAADMu7u7u7tdru7u7u2ZmZmZmZmZmWz3ve9 +/fv373veXdgAAAAAAKqqqqqqoAAAAAAAAd73ve973oADMzMzMzMzMAAMzMzMzM73ve973vc zMABd3d3d3d3YAAu7u4g5znOAAAy7u7u7u7tgAAZ+/P6ALsAAF3d3d3d3dgMzMzOc45znOAz MwAAF3d3d3d3dgAAAAAAAAAAABVVVVVVVAAAAAAAAAqqqqqqp4ABgAAAAACqqqqqqqAAAAAA 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 zuhJX3A2wAAAAAz3o9Gv71ZOR8efM2rtG11/L4K0ciYZvZK0m3kZM6taOVsJzYgdsKiHICws s7WnphUqUUH1rFT2TreIZelViNpixQu7tEzhfH7KdrbdzGV9Z2U4blop+Gyrbe81cw8ix1fh 5ferbztG73rfbxcnK5nHOdO92CpepPKJ6vEzDnfXBVC+lU/QFinXlWo3bCTswKJhRklTspzW O73odkw9rJWbamtTl9ziQerxT1axdXmgt6xzvM6WdlWZdr6k5JnTIlWNOJ7T4V1dt6bR26qp TxjWjYY6WeazOeY83FWdcKl93eeqm722Zop1QD0pVWTuN9gKkPKJ68azv19l6rGK8Yc2VWqu rk1U92SetMJQaXJfNmx2f24/US5e/b6VGVhtCHD9KQHaq5r5jxEy8mkb23PlEIRh6VPes0rI 4/IH4X68N+qxx1r5H6HIEPEh3aESQ2UxmI4sIoHoiZfPDmuUfc9h7p3OuQRu5MmD0o2OhEbr 3nK6dQbHTH1PORUHCg6g3KrI+tTaZOGXSAHxH4fD4Lz7Z4o1VdHaG9tmas2Cj5l7nVcyupYp dtdbDbddIiKwHXKUmBSlffVdjFtSVHaK/VAhR7zyYfkda20FLko1q+qtrzNjMpIYRRCIJZ9Q 7L7PshsjTFfhBCKsL6s7riy2Vy8dIzlh+hxoZlru3sJs9yJsohrX61pu12qvbM3EO7LsYd9e nXb9n2LaFb72VJdXrVbxr6V1HeGM2YJvM5krAKnwifG+7vc3PiNmcX2Z1JdLAz+o+2jnZ+C6 6tuSdFXYuXO9JPbJVzb03t8Mmvn3Ho6m6g/Dj3rbfdPvCk7QJFTrUh20KIrVCcWbbvtbIir2 1eLOVmj8OxI3nmCRmDB6i6wjx8R7xVEWSRebTjvfuzNs8mfcmeBaNBT8TFHmpeiIdwGdl6nS 646U3Fvc9o5bNblW90OxtWJusZGrdbx28eAfAUPw+HwetQo+geHUvYcoVHad9eCtfmDDMGTN 3FCHmjqrUYnxNLoht3Be7Z27J2acvWe3uvTdzlHQ6yMp27TYoawvavI3pJpc4Xu7q1p87Z12 PUjklRScifnXS7SqueEsPNKEuK71ctVaQ9lmOqFxjV7ae1hPLsjIuZJitdzVy+YxFQIAJo8g nsXjWNY6YK2eOiYC5Ud0pr2a0RVv2nEDTN5dMUYMjN7zym19RNjMMFFlKlUu86XyvY4DvSgl 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 AAAASSSSS3MyZzdAEkru7SAAAAAB3dpJbobkmPybAA7oANJdwRJSAD7gAAAAAAEkkgEkm0lM p5mZM4xJKEgASSWpJLSAIAAIAmQABJLczM3SAJkAAmQJkAAmQAAAmQEkoSACAIAAbbbbzMxZ mAJJnJJAklgB3dwAAAABnve9EfxiIog45Jv9ffq5fMW+2VVVUlVVVVVVVVKm222222222222 222G2222222222222222222222222222222w/wJJJJJJJJJJJJJJJJJJJJJJJJKSSSSSSSSS SSSSSJKSSSSSSSSSSSSSSSSSSSSRttttttttttttttuJSNtttttttttttttttttttvbbbbbb bbbbt6972222wAAAAAA7e97wAAAAAAA957wAAAAAAAe894AAAAAAAPeAAD8e/P9Pz/PrG/zv sAbbbbAAAAAAAEkkkktzMmc3QBJVVJIAAAAAAEk3ikDUlIHgYAHdABpLuCJKQAfcAAAAAAAk kkAkk2kplPMzJnGJJQkACSS1JJaQBAABAEyAAJJbmZm6QBMgAEyBMgAEyAAAEyAklCQAQBHd 3du7u7vJJGZiMzN5pJdmZncB3dwAAAABce/jiPe9CgMH9hRD/MAA/8QgQgEIJCCEIDIsIoUo MIACQiisIACQgAJCAqQgKkIqhCIhCKAwiKwiChCAAkIqpCLCAqQgKkIAJCAgQgKwgKkICpCA qQgCEICBCAIEIACQgAJCAqQgKkICpCAMICpCAhCACQgCyIoID/6R98APh8Pv7/47P8f1+buX V/1T/v/iGSN7/Zttttt7bbbbbbbbbbbbYAAADbYAAAAAAADbb89ttttttttttttttttttttt ttsANvZ4AAAAAAAPb2eAAAAAAAD29ngAAAAAAA9vZ4AAAAAAAPb2eAAAAAAAD29ngAAAAAAA 9vbbbbbbbbba7/fv7/4X+fWfH9/YANtttgAAAAAACAAAaSqk3JIBd2BJJJJJO7u7uSTaWwIk pA8DAA7oANJdwRJSCS3uAAAAAAASSSASSbSUynmZkzjEkoSABJJakktIAgAAgCZAAEktzMzd IAmQACZAmQACZAAACZASShIAIAgABtttsSSbSWmZjbSS7MzO4Du7gAAAADIEUFP2RQP/Ioh/ siooD/kCooD/1BUUByiAAv9RRDAohgUQgoh//IoH/IFRQG0UD/RFARHIAACNiiH38fr+JLv+ P5/n+n98YxjFfz/f13d6xJJJJJJJJJJJJJJJJJJJJG22222222222222lHJG222222222222 222222222222222222lHJG222222222222222222222222223ttse3ve2222222wAAAAAW9v eAAAAFVVVXe973qqqqqqqqqqq973vVVVVVVVVVVV73veqqqqqqqqqqr3ve9VVVVVVVVRJJMk kkkkkkkkkkkkn74D74ffu+H+j83/Bv8/PwAbbbbAAAAAAO7MwSSSbSUymwBJVVJIAAADu7u7 Mw3M7lMzJA8CSS7ugA0l3BElIAPukkgAAAAAkkkAkk2kplPMzJnGJJQkACSS1JJaQBAABAEy AAJJbmZm6QBMgAEyBMgAEyAAAEyAklCQAQBAADbbbMzM3UlpmY20knmZmPu7u7gAAAAD+j0e iIiI976gVFAf/cUQ4go/8AqKA0AAAj/oCooD/hFAoFRQH5VVUHQAACP9RRD/5FEICooD/uKI aFEMIIog/6AqKIP+EUCIoH/L/4AQAR/9hFAUYigf6ooGgVFAf4FEP+AVFAdiiERQPhRD/QUQ wCiFgAAI/0AAAR/QAACOBRD/6FENgAAI5BUUB/9IoH/cRFEHgohgUQiCKINgIAI/2RQNAqKA /KqqoP90UDQKcFAiAogMBEYKIbQAXyKigMBQUBiKBaKigP9RRCCiFooGxRChRD/kCooD0RFE HYohkAABH/migdEFRB6KIf8xEUVByqqqDwRQFH//MUFZJlNZYxky7wD379uAdJBAA//1AAq/ 7d/QYMg/AAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAQ+ESBAFgAAAAAAAAAAAAAAAAAAAB4Pk7 Nm1IqqaNtpKlUIkmtTY0qEpZ4dD4B7gpRQo9aoCVFAFSVVVQJVngDwDe9TQzbVJBk0LZpqNl iaIAZ4DwDj3mzQCmDbTKU2sKoFsBohrBZjS0qqUrDwLwDvUldZU2tFtZLLYszVphtttqVmsq tYSikqrHgG8AvFXs1sNqmygASshtiWimlrRUCJY8AeAPPEoHrRagajWhNmsmzLWkIgkbwaKe Ab1HtpQiADYMJEtmUElSibwB4Bw89tTWCgFLZoDWkiSqqJJLR43gHeh1m2iKkmtKBWtAqRUC hKgbNUFKqhBEIVCSgSqoqUSkgVElJUFKglRCMDwA8A2AYBsDAIHsA7gDAMYGAYAApKP97YyN +pVVVDQAAAACqepT/3qh/qqpSQ01MmARkYEYETyGJSVUAgYRgTT0TIwin4IJSkqA0AaA0NBo FP2pVVNpvVHqo/VB6gAAAAESIBKiInppNTJiGammTTJ5ABBB/X9v1/h+uM/tV51g1WPztUQc UCKAj/ZGwkixSSqFFFWoAlwGQW4giLcCQYQVhAAkkVkCQBQAA/2AFVBgoKAjr9U/dAICgAj/ 7Bf8wX/dUD/0oKqD/mLQqoiDRQtCJSAQBE/+ICAIwRP8wWH/hAQBH/hAQBGn/FUD9gAT8gAn 8AAT9gAT/EAE/cAE/cAE/mACfzABOgAnQAToAJ0AE6ACdABOgAnQAToAJ0AE4ACcABOAAnAA TgAJwBHQbBAICB0FDgABwEDgIHAQOAAHAUOgJ0AHoCB0AXoD0EDoIvQVOgqdBU4AbBA0CrFi jkVwIoYEG+gAJ0VgokBX+0U/pFZFZFZFfRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKy K1FaisisisisisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1Faisisisi sisisisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1Faisisisisisisisisit RWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWorIrIrIrI rIrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWorIrIrIrIrIrIrIrIrUV qKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWorIrIrIrIrIrIrIrIKVFaisisisisis isisisitRWorIrIrIrIrIrIrIrIrUVqKyKyKyKyKyKyKyKyK1FaisisisisisisisisitRWo rIrIrIrIrIrIrIrIrUVqKyKyKyKyKyDUVqKyCyCyCyKyKyKyKyK1Faisisisisisisisikis isisikisisisisilRWorIrIrIrIrIrIoyKyKyKyLIrIrIrIrIpIrIrIrIpIrIrIrIrIrIrIr IrUUqKyKyKyKkisiNRGorIjIrIjIgyKyKyKyKyKyKyKyKSKyKyKyKyKyKyK1Fai1Faisisis iyKyKyKyKyKyKyK1FaikisisisitRWorIrIoyK1FaisikisisitRWorIrIrIrIrIrIrIrIrU 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 CSSSAzO3dyq5zK5vV537uszKqEkkkBmdu7lVzmVzer737uvfe5yZkJJAD03rX0m5Pe5776RK lzvZJJJAZnbu5Vc5lc3q8793WZlVCSSSAzO3dyq5zK5vV537uszKqEkkkBmdu7lVzmVzerzv 3dZmVUJJJIDM7d3KrnMrm9Xnfu6zMqoSSSQGZ27uVXOZXN6vO/d1mZVQkkkgMzt3cqucyub1 ed+7rMyqhJJJAZnbu5Vc5lc3q8793WZlVCSSSAzO3dyq5zK5vV537uszKqEkkkBmdu7nbuqy 65rue+9r2ZVQkkkgMzt3c7d1WXXNdz33tezKqEkkkBmdu7nbuqy65rue+9r2ZVQkkkgMzt3c 7d1WXXNdz33tezKqEkkkBmdupdVzmV7mu5772vZlVCSSSAzO3Uuq5zK9zXc997XsyqhJJJAZ nbqXVc5le5rue+9r2ZVQkkkgMzt1Lqucyvc13v7v3fe5yZkJJAD29618bK7zv3xJUud7JJJI DMrkrnN7zN/Xnc9r2ZVQkkkgMyuSuc3vM39edz2vZlVCSSSAzK5K5ze8zf153Pa9mVUJJJID MrkrnN7zN/Xnc9r2ZVQkkkgM5uc3vQc115msKqSSSSQGc3Ob3oOa68zWFVJJJJIDObnN70HN deZrCqkkkkkBnNzm96DmuvM1hVSSSSSAzm5ze9BzXXmawqpJJJJAZzc5veg5rrzNYVUkkkkg M5uc3vQc115msKqSSSSQGc3Ob3oOa68zWFVJJJJIDObnNfBvVuva8VUkkkkgM5uc18G9W69r xVSSSSSAzm5zXwb1br2vFVJJJJIDObnNfBvV3nfu5nOQEkgB7e9a+Nld5374kqXO9kkkkBnN 7+/ZmZNW69rxVSSSSSAzm9/fszMmrde14qpJJJJAZze/v2ZmTVuva8VUkkkkgM5vf37MzJq3 XteKqSSSSQGa1+/mZmTVD2vFVJJJJIDNa/fzMzJqh7XiqkkkkkBmtfv5mZk1Q9rxVSSSSSAz Wv38zMyaoe14qpJJJJAZ3e/v2ZrJqh7Xiqkkkkkkkke5v78ad1XB7fxVSSSSSSSSPc/fw+d1 wd0KqSSSSSSSR7m/vxp3VD2vFVJJJJJJJI9zf3407qh7Xiqkkkkkkkke5v78ad1Q9rxVSSSS SSSSPc39+NO6rg9v4qpJJJJJJJHufv4fO65mX9mZzkBJIAe3vWvjZXed/EnJUu5JJJAD2961 8bK7zv4k5Kl3JJJIAe3vWvjZXed/EnJUu5JJJAD29618bK7zv4k5Kl3JJJIAe3vWvjZXed/E nJUu5JJJAD29618bK7zv7+v6/t/Z/X9f2/t/cgIAj/oC2EAFVBv/QFABH/MFABHYiiP6qILI EhISEhJISEhJISSEhISEkhIEhISSEhISEhISEgICkhJJJCSSSSSSSXKq5y5cqrly5VVVVVcq 5VVVyqrnKquVVVVVyqqq5VVVVVVXa5VVd73neVVyrtVVVcqrtyrlVzlcrlVyuVVcrlUSEhJC SSEhJISEkkISSEhIIpISSEYyEhJISEkjJIQkkhJISMgAJIEhJIBJJJJCSSMJJJcqqrlVVV2u VVVyqq73vOcqrlVyqrlVVVXKqq5XeVVVQkkkJJJJJCSSIASEhJIMhJISEhISEhJISEhISSEk hISRRgKLJJCSSQkhJJJCQIAhBSQkJCQkkISQkkJJCKggDQKACP/1NoKKoP+QL+wAJ+QAT9gA T9AQOAi/8qJt2AtCiqA1JA73ve+ufl89wAAAAAAAVQqqqqqqqqqqoVVVVVVVVVVUKqqqqqqq qqqHgAAAAAAAMYAAAAAAAGMAAAAAAADGAAAAAAABjAAqqqqqqqqwAA+XtXaqqrtyqrv6hSIC qg/xUP3+7z8f2a9cmsGP4Vz9/3/fX8P5/x/P6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAANa1rWtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAffffffAAAAAMzMzMzMz3mZmZmZmMzMzMzMzMAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAF3d3d3d2AAAAAAAAC7u7u7u7AAAAAAAAC7u7u7u7AAAAAAAAAAAAAAAA AAAHe973ve973oAAAAAAAAa1rWtaAAAAAAAAALu7u7u7sAAAAAAAAF3d3d3d2AAAAAAAAAAA AAAAAAAAXd3d3d3YAAAAAAAAN73ve97AAAAzMz3ve9du97173veAAHve973ve973gAAZ73ve 973ve8zMzKqqql3dgAAAAAAAAAAAAAAAAAAC7u7u7u7AAAAAAAAAAAAAAAAAAANa1rWtAAAA AAAAAGta1rWgAAAAAAAAAAAAAAAAAAALu7u7u7sAAAAAAAAAAAAAAAAAAAd73ve973vegAAA AAAABd3d3d3dgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+9/eAAAAAAAAAAO973ve9 73vQAAAAAAAAAAAAAAAAAAAAAG973ve9gAAAAAAAAAAAAAAAAAAAAAA++++++AAAAAAAAAAA AAAAAAAAAf0AAAAAAAABX9VVe973qrx3dvO7ukkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk km7u7skkm7u7JJmSRttzG2wHmySZkkmY23T3d3W23u7JJJu1u6Bu7u62291JSNubuySJJPMz G3UkkkmZmZJCT3qqq7FQ53hGE0MY/h71V6qr3vUFnMu814cpfzbaV48zfAUAq75JnBitezf1 lXwAFN8JrGeYaG3rnH/Rn4e4ev9X1V9VEvtStIZ+arqAoTWFoweFfqPDzQqD7B8tZSFUvceH dmg91Fb9nrZvTSnzm19UNZ8kXtjRBUAkWcyAG5U3veM77XceUVBE67uiZol7svtXmqhqs7zW PQURQvWJRu99xc36qK5vPpd1s+e8iSzlQzSqJ1VYvJCoXtbuE1E66o3z33qr1VXveq+GLNCn a2jBdBNGzy05OrWuEvDE1mJ3EK6zUWMJjTgw7zgsSchS2MxYLy12dgUVO6Ws4xj298KNzlRC l7e9fN9Ww1IiwAXpWZY7dvikRJu3rEF1IVHT2dktzaGIIS33crvu5uZVwbS3eqSXwXb3c2aR vqSmGEV1be4lZLq8Wsm4SKS7JfI23Eqr76qqoc6Ow1WFxtgtVr3FN2dTk2jdgQVKvBLndxl9 0uUBartQtnUaD3oWaN07KrS+V7NfnxyzU3KQnSSucm7uWhtA9L1mWbeLcmtOddutXcblNtbQ MBTbhHEFHo2N4Lg4+G1s1t8Oy+PSutTqGWcBmBWVzVVVV99XcwbS4010FjSrOXncsyUscgcB NSWnjzATjvm3a3PVor2+GD2cO35CkDDsQqXLk36wxHsNQ3eOXo5673iDnXLdk0AGZMirmt9b uAWNCzPYfTDKOZKAxLlZerFglri6jxoMmY/pLKLJ7KzZU+eLtScMPqg+FMy8YCw94+pDlNzT t+J6tM7j2p0dFYnkTZwqUpV1mqKtPvVXqrfjGvSwuNwxC5mB2YjiqHvjWrrvc6OQ0faLH3q0 1YNx3wBCQj4kX5FE3K9H6818ElIcG2RdWKZNkbLWhWbV7k2YGm9vG8R7hFsICFaB8adMpaZR go1ou9Z1udrQGDVRApi6G1tqVLXvkaNMaT8DmfBPoRWYaow03USkc7ZuOqH3xr5g5e4nhxbU HwybqXdRSlZMgnS+JrFmSZldWmuDbTONWqewyiSizclXEr4FXHQ2KNHMvALJWnO5UMWiIzcf J0+22jV/UAXFeH672vK9FoLT8QsMZqCcSNBiuvJrCUa40gW/odDTjfnWMiJH5CLK8WwrOFDF hA1S+xldp7aUoEadYfE6xkMAulBuVloYwzU3u61MAEyRPXRs1oUzcHdlkJ1xzZtR6o9wpJdY +PFqighvxps4DpweoWJdTRwieqxnifG1tKwhoASErt5F3uHS7dAKhBVI4C+mD5U4WPdxt9nY ZKOlClmmOCrSW3ax6l48En15nFjagm5HkylDrXEwrluRUWvFJUxVT7Xe9dLRRFV8NHq+HvTs sCmKY9mZNZkZzUS9bXxduK6Xz6Es9d7PGRdagy3Wy7rGL5wVYZl8tiogKyOujcjdN2z1ga/V dmsu+Fzwp4ZkGJOuuKqjP1w0xVe54QZeKvPbEFSzCa7DViCl92UsJENAQQfCsCpHdNHSPvnM pX8/EUR7KFdlH0lug3lZuSkU6LwZLeza+rXqyhzQDvBKF+itysKDONHJvdrvmESGtMUuybVj MZQTJAuoZbupWz4wmmcgGXmc9YnS8wVMzm+9s3O2oqCJcrMwZKLxXZ3ddvW9Qd3ZKuneOuyo 8gDkWXyy8wAWYJmcwqYQ3HZnVqp2W+Irlro+tupgo8ThW9XPW39a13V0+ud8xI6uSd9m7fUU cT7cDacjnYszxuFwrUbZOOWWLMnO+GXjqEDg6vqtrS8q5yNtaYBI2lt6e4PWZpwURQlbIVyz RouamNXzBi+ZrnZyqzreWg0t8MLy6HvdFW7ncKsq0sH0Hxs0w6hK9qo0fM0pQH0DH0F+ahNj dleocPZqd8U/b2mpVTTzd3hd0rDNdq7mc60JWJVLd4TuDO+oN1dA04paqqjObch1BDQZ2TyO WgYQ0bdb4bijppYc9O3/Zmzqj1+XnIp5b6nJON1tDm5WE8+vCPt7RecFWHldM6rRy2MBMWgh ZYOsQRFBlzFXcXe8kM51q0tAyG+nXbnBNM8nfbSrOtCJ0Lq6Gc5isHg0Es1eRNve17DHq66v K3b0tsliX0xO81NuOmWmDHl+h6K9XdevTr7nsxcqXGohjvuJS2Dg7D0BAtAmInDFi4be9Fuq 8c5ZGicy7AnPVrlut6R5TceTKLoVuC90nRvO6nO1MbRO2tGnqgeCUr262cxKVniupdjX3ac7 WRfMbxtF4ucZpw1ixWzzVi8w6XxutHUhmUlOsjq2jbhoKdrtcSM6iq1So+JyuFJpYJdB2cVB nY9lmd0PXVzQ8y86c1Fe9RDZrJYqH2a1tFcR16juN1JWN95vFVmX3U5nM7/qG1BAVMA/zARA BHLkAE8ACdABPgQPgVPHe99ue/zqqqqqqqqqqqqqqqqqqqqqqqqqqqqqvmAB89ttttttq222 22222222222222222222222222222rbbbbJJJJJJJJJJJJJJJJJJJJJJJJJbbatttttttttt ttttttttttttttttttttttq222222222222222222222222AAqqqqqqqqqqqqqqqqqqqqqqt 73ve973vfta+fP5/1rB/5/P4u/n7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOc5z nOAAVXe1eqrnszM3vPKrvarvVVqgZmZgqqG9jewFVRmZnOVXAGnW3MzMkkru7u7uzMzO7uu7 u69XvVVV6vPv5foBpQA+Qq/NXIiOdcf6LAp4bFIrEs0TJ+68utkues5cYZp03jiLOpyklXXf fYKFt3Mit/1SvbCHmsmai055lHTk0IXY3JXv1WO9ns8e33rQR2ApFm121MjvhKvDgda+rZic gkvturoXMUMEe3Jyl0FibjnXnOhW5aTprghyIxXfWLO2OyXZwFRMGzwb7TlaNqlX8r6vqJQ7 sj6cJ0dzU8E+3ZmO8XpJihwLjkN5dIFMtldkal1dGHHQJnJKlSr9N0KvmqGvM749Zqby4POO 3Prnr8uTV+A0hn7RAeOjg8NihaALh+1U9ngj1uZg0rA99DmSnqsveybAjeGgz3WzZlAJcMm3 80UCpOV7k6oVj2I3neUyuHdvCIpbV4srWC3oYUr9X1fVeCVY5PeC4WJXq8onRb2hYQG1z2Qj eBY6pYLpsuVdq3rQ47vfuHmafStD4V54iPizXz9W9vumcCyhXze7XuhrSDdvfkiZatH2s3a1 urwHzLZHABtjVWTtoomqs3oW0YdYl3m1Y8lwnnuTsg5LJWzqfKrlc2frNYOxZhncWzymih0O Ov1fV9Ut8CJ+Y4V5xQVBx39o/DPC98F4gfDWWwbjptYWBYpDHhOi4xS1lUCfgEHcMYr2J2cw 7gVOQ5DkzHsK2VmXmgq6SLhbNXD9Y+8IK7EviKgoG0x9XD7RGbEzynORbl2ew6RiRZKP2qJZ idaHawoGMrFr2SVA2boHjxO3LZelQoVqaCPLNVba2jZzI+VQnqaJb7qWaevVeQx13HHSgums e2MFZRIK4rDGEVX76q+rJbJVv9BUH1QnNACkuXRZ+r3jwqsh+saKohM/BH6UKggC3h33GS6+ fVynXx6SwcP4ubWWW/XJBaadIZVxAOu9s1qdDMWta+uS1NMgexOnGExSNuQcouK64xa1uUbX VkUvUo1Azi6mlXWnJFjuSW75iWqits+2zdCp4bJW1pk953QZGbU1o4XrVS1har6jGjHfd175 0xOx5gx9qvRktncfR0q/eqvV+0ZxAo6fYEIjtflWW/tpz8echxQ/hApT2BrELpuXw68y+hmD KJTG277lqTY492KvqaO2a7SRyPtmWluWB66wVugqdivHQmKglKcJ5ZLnba3aUlPK063XtboX R04Qk264Zm4ze84S+MynqT0KUAavl0ema+eSrsbLV7dTGGoti1gWtpzsHERXfV3SZvPT+9Ve qUe046fVKJpeuR6+Zek55b1l3l/E2sWbyqAADDzdJAvjv2YyLgFpamtDV1mWmj1ZtCp0VpBd OrJOcWA5uOiBMR3R1SYLG8lgV0ghFyybxNQB5nZvHkzmFGRmy66LThdbOzlG4YEzU4JbnW+9 9VfU5uyveeh1Q861ZXst9x2cuuCtGfZeCny5tOo7DAzVD0HzNa7d1gtdkNYG5WrMsbF21q2t 63YhvlENlDiX9NqdHIM2pJm49H0b54dboQUamIcgSfu7t4x7SrJlS6wwZoezYXvDQw6Elp1I 3DF0PWNQygEpUzvVVfUex89n35g6/rC7ZdaGPoP1miMGcfJqnEKxUx/Cq94VwpCtHDLol/xY Z+X4n9WNSlhkJ4TPjvDdnEUM6hyq1WrUs+jX2DOrb1KbqKcWuYqE14aGLUQiu4R9r6TtzpNO mXY3SBpsuTkXZw11FC7zcpRGFykRca3Kkmp6MBzoiBYuWzoqAyq++/lVX1ZiF0EsJWJCiQNE 5FQLSsrrR+JtbRDJEV3lCgrjOoqrPdJvXuR8xPiKDTY5YQwFZo3io0HUIyY+5w5yLOLK0ICh zNaKzNnJzszqgwWKzllwprOOgD+VQdWa2C91+v0ldyzAX1bQDa2kq56b2aavDd9mW3aVRY9V q6JldavMDrhW8pfcIdWnenE800nl8ITq7XNlQR2KzWU9SHCQ3lZosC6kd3SkXS5mNbT04RMk TzC3u4LUrdNdbosYhPhMbrZoFXJmdnWXaUb0xXfLceE6O7oS1vC3h2mgokLfdNrOvHlRS9y4 +6UNrhnHDY2be2pfbjckS6v93iPUHXl513iMvO3xyYrLE+MEU3MwoPtDKK1Q8hhuZugURTip VYYmSVgd2rM5GHRgnXyKfDA7bl0jSrbulxuDrnHhh7KaLHWazTRnR31dT2YM7AIcmvx88HHO KE1nOerXY4CCUm8NtzkeESUvqs3G+q8K768g7b0oW+cyrxtljoCVwRV5mVqeM1lZk5LAmDzU lctDnSdsardYzNwPOk2oMKgzt3fbmsdrmu7qZOWY7claOgoB+AUWwAToAJoAE0AAaBU2d1JJ JJJJVVVVVVVVXsAAAAAAACgAAAAAAAKAAAAAAAAoAAAAAAACgAAAAAAAKAAAAAAAAoAAAAAA ACgAAAAAAAKqqr29vb6e/v9Pf38888888AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA c5znOcAAqu9q9VXPZmZveeVXe1XeqrVAzMzBVUN7G9gKqjMzOcquANO9732Zme972gDMzMH3 79fr4ob6Y3XL1dKKgie9Qoihnd9xvGrpwJ/aVrxub5m7mDbfVdgA483HKxsy4re7s3ux1xPU Xwal26ehKxcWtdmrTp88MuE1wjd9mrijSIgouXRJjkMWnLoiraupyutrqSv+vheelePTcM8K UQLEMkt1seMwbJ4NUBhsd1dEHh7hxbW4XlXfyofdmIEg1Gu0NzM3AzD773L+xXdaJr7BXCl3 7bTb5rDd+JaXnKy1WKvVldRmSZ8z1wJ0+ySZijNx5W4p2Cic11rtlKMN6HYxmsItu8ydfKba 6ddubJnSEHcm0K2EolAL3M/fHvZdtyq++uqeREV7D54aKhzd9QVL4T6g6w9Xzg+zjwVcQkYX XdWjs4aOzFY52i8TnQ6WWD3aVX73kKv9EBAEe93nmu4Ps/ameXdVys5+7nveb1smdC7ylZdq Ix5irsgzA9Ap9znY8Ooc+IpB7wijU0G6il3p1b69GdYpcOtaSCWDtNFUUQZyViWdEF12gqRv YuB9i1dwfdSGcdxC2V6v3veqgwB30pZ2SnhBWYevfatwxmlygw13PHxbLWLMnLCigaErqwOh 3W19OONQE0Xsw9mWT1lNXe9YZmngrM43fXsLVPp15kQ7rnVqiLFEXW47o5LnRYUI9zJX3qr1 YqXNtbnOkBQqcvOgO5Z2Y8I6luPnywXo1VJttYedE85TVMVaNMgZlnXm8tso0000kXSoobhU zurGiqN0IBQdPQ9OvalZCR21By7DeK61ukA96caJz31V9XUlEvNk8EHKCrnqGFTzxZd65Dtw K6s+o0ur99QIAjm9foqAI3AAUDUVUEG4Ki3BXEFUSXwmc4ur4c+1mZrWPXjVrcKkJhzCob/r RY2Gp/GmPtGQ2C7VVcP1in5qqg6n4Z5WiwfJuzFU9Ky8dZVm/pVOUQqKEam1tZCbWuFX/H6q 9X1ftP0P4IVBUFDSkWL/NffofwpjBwgNtTGqQqxU6jggqoKg+60vvhJa/AlpEmgM5yXS41li BUmsloiwfI2/Ft+I+pD7WIVUJqoPvgPl7y++g+o6uuvd7FZTWQo1FGL51bw2M+FMC5zm9bfb aoQTzssxG0a2fvVSfJ9DUTFnofcx3O9V9vRZqTH263c+3neL4HOqUIWjbdcay3pjdcVV06j6 lTW26Mm10YQ6KzvYi7M3VZFxV4aD86aF06sZ9d0R5B6a8x7yFUtn1n75UghXDbNdnXSBs0xw +qbfEilBnnfZbFZSACry1EjXWK62wlLvUQJSZyAJjZjQSGS3J++qvq88jqGM1Ufo+jr7GcNT 6zeOQ9hrn17qsb1X3NI2Sga1WSrWPEVWe9oqhzVQmuKqN7Co+93GExCpvHbXkc9167w8jczN VR7NAb1iyWXn2Wr3ru83nQyGDFC6ju6MzWdTOHsCt0HIcIXKknoZmJ7FOC+VztGRyZcFeOn1 QV6xWh8K0ZMxr1OH3YfUMu6I+PuX1hKtJ6tKpDAzQh9t1L8ndCsq3dWotRozZuxZKLxi4Ikz hI3D++qvq/WjwQ+DOSjypqSxfweab4c9MlT97mQLHrDC7xmisuKp1C+ymQNkd+p1HPi/d7ox PTcMdxaenY1E7NwJzFZ8ZTEcSQ16jEPRxBs4TdlZrcNwagVisTXfYwMhu/e1F5u7oiCtHsHq emqsERGmOVu3Msx+g8xWD3FXXDtPuW372iszYx2d3CAuZeFPKV1PXpZCINrCUbRZN3hsHCRy ZKuRXidJ3cRlHbAyxt3CantGLj7akWlYkA0amjReZ3R6kF0kMjq7XU7uXox5jwHeFa6FLRlQ TUtxBazdWJjauXOY04DXUlzsVph64RKCYokKXc5Vo2XZhJw53Z2RFYCzsw5KstZySmjrmIPK J2UNGSLEDHBUWDmrTx9U068sgXN7E0hvCPOrKczqtUJvdScYls6r3WecSlXehKwpEzqVOLLz Ky+XfQJO2ODI0HIqI5AYsJa3pyrEd5muyhttKLsVZyfOcXW06exOOdeEkzub3OMusyZrrjUs aormMcgMXAlt4uwionN+IrI3jhc3t1txZYCWMgS9ZOs83DxzYR8qUMGvUANupROTMKKlhYe7 SS3nU+EycL6q2Nnlznc/w6ACn4QTIRBJBVdqgQRIZABOgAmwEegofAqeEUP2Pxz3+dXec5Xe fOqqqqqqqkqqqqqqqqqqkqqqqqqqoABQAAAAAAAFAAAAAAAAUAAAAAAADgAAAAAAAHKqqqqq vcAAA58+a181v3vPfnfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHOc5znAAKrvav VVz2Zmb3nlV3tV3qq1QMzMwVVDexvYCqozMznKrgDTve99mZnve9ru7u7ubbfdxJ5ffV9X7w 5jWavI+50Ljik/qCkGKg/YaA08vj2WU6rOvxkAqoNs/O7QD93Qyq4U5FVbQ+UPzw1QFMMUOw ZgHqyO64YPWKtGqClkRGmK7SRSCRqpWMbMhiNT0DcDECo4h7ddh2O4msb3rLcA9AuIaiSO47 nJ6tc5jLndcmpyGIgUxGCx8h9fj9l5gdMBGhw8vlb7Pe6o3wOzBtVIvierdsXlZafOOcdUmG 2rsBO0FqaOulhs3EbsOrpsDG7WwitrqrxABIfKJ7t+zqF55XjO/tfaxh5nGOczvWDVSeLNVh y60EVUFEITbK/HspuiIJlqrVb6gMsoaEKe/Rza6rp+90PqsVSDZ0VvGn1DL8J3WX8OrKdYKs eIqxlCmTQhTPvIL6+XPq0UKlaK7jWinZ9oqkEKEJ01tu7CN5eeqI2APMersMGiozBQw+FPCV qogKiFpzCxwqD1aIj6kfrpn5fbU48PPmtLfc3WHdSbNtv6yG1SB1NS63huqA3JmrdwmjWjID Jj3LDSKoYWq14qoBPhEv15rOs498Eo9eJz2uZy3E3KjcKO92VUCFSHy6u/QDa5g8sSennWj1 Nmro0qi+rV6p9d+qfK7Hs0x/fNNwZ8a8RoqpmUQlmqtGiCvDwrQMxv4mpkCn1FmsflBolCo8 Ynjvt+sWK3WvkNhY+aZ0UY89dbbet4rLx9OVWEPBi+7MlW8NuvTd9ipJVxWWjBem9XncOAjC WL9KzHtbXq9hpx+NHaeGB5VpSzc2tpuZjyhmaGNixur3jOeqgbEBIACfCJ99OTfMdxc+hQYS vM9gWZmkc6qqr1a9DCTtCkKuyvxkKEbq+fV+1lVVVX1bt1m96R4BrsmKI4maPVdGqqq9TxlP 7bnNtA1enCM2VVVXqu9RWZO5l2kl86xPvVVV6orFRu/bQ5DnKa9WoXXbNTkagyFwznOuX7k6 ACcDGLqyiDmYrNuZ2ZhnFO44MarYAJg4Xh0QVo8R7Z9V0hX0PmKpMoIeqBm864ACZNb5epiP fUcmJvRSbhiF47YchmbjuvbvN+xAASa7HMDsxDExNx5C80Z9L0epo0hgu6gwnYMgO7Y6gPoH ctVDBqZ5rfKxvF1u71WJWcTwACuQASAAnwifDrXbD67MVV3znc60faxczU8ACcxtxt2gCmM2 tV3umvwuqqq+pzsk7W4OSVhO8me98hYqsDoVgqDys4N44OEFcKYqr1YMRWU3VVVfUr+cPBnM fzJ+gqWaoI3Ermbb3ze9lzlIAmxxmpNzcKgyFwkKmMUbxyqNgAmHcLmCqR7WbT109yZ5AATB W6dcpazSe9Riduk1NcxWZrtAAmi4YjyjtpiAdlVWISBqy8ZwAifjppmJ6xd8JfapuzKKbRmO 3Xqbyrm1XNUarOq1eMcvc6AqhoAEgIHwiG06tnOTBdHp2uaRVfVVeNfqwGeC+rB88099700U AAZCuUSigKjR6b5oFDISBcAxA3jtpvFByG4bg67Q1BvsMUdATCOd3a6hcNeKBxCRdQcRLmr7 3NkwADzSl8pKlQdRPRcZqQ9dKSBd6Kqp6Z90BA27mIJqMlQzAqZ37G+4yALp96g3AJD0MQKu jue+nAHVZ3Va+oUpNyq+qqlDxsOJcJu5zoW1gwkvabFnWqUlHXKDuKVeHN0Y62N4wVfVVKgb ABIK/CJrGMGe/YmonpcN6pK7n6ZrvanZuZyCB3rqqORkG96suCEzvd8+MmlPdo17NmIBUqDX e5vO8Aq6TETcQrNA1EN3m3OaUxCojKlXBuW98VjQrlNRxCoOJcAkMm5z03kNyQ73HcJiJyXO 9pwc9OiKGHcxXZn1TnMzBqjPbrEvoonMbYaq/Vnms4zkQcYnMy8ezH593vX7zvxt05LmoqrU 3ce7TqxjJt3QJuis5q4c8CvFQKABPhE+qHoHJyOI6hUJHkDMuB3vMavV6T6BUkc/UbjjVMqk wQaiYznFGFqXCs0ZiXij0L4hPdf1ipMVEVTH1QVRFU3ipEPRu7b4Z7qQ90X1ivWQPsZqBg4a A4fMVnIDn9XZ6OsocIPCoKY+oiqLfiEH9KH1VjKA9jrLfi7gApujTg5jLzBYPUFUkl2Kc3bx b3CgK7Pr8R6gPVyPhBiaG7s1YVuXBS9AjDl5cAlPbp24oyBalC7EtKnkhrd73wzwAEoAE+US a8khmFyepr6ipM1y9FrVViuY+yXC8nLGQuahuBczH7fDGakyFxvdENS8fVk1qkKujUb3y0L3 q+RE3AuBIkiXDd0SHoklQzglHJjVB6FZoxPZ9nm9EhcK3TI1qi4cujkWIKVSwqyz9ONdkwla av2qrsurIfo992B+zeFp6M0aPjQ8DJMjwvzFHjY8kaqwBXqQr2t/DhLA4V2lgilnzN1sjpWs maq85vmc4xJuzcOa3mtaqpzlUACUACfKJ4fXSaifRKgNw3HMJilxAkKxvOBNQ1G/Ue8UZmys 28uio3jtnJqP1Tl4JoimK+053SmPuFd3NkV72IBQ/UAgdP1wrObMTUKjIGM0XGVi3FUyJvea znOop6qZEvxSXAZD2tbzWJjLndPao3dNQXjUZArW3UsXS8ivuB0wVegwPBmOiL7vkl0xH4Yt mLflilAXCvrSE606AqmKYpabHeirwIrxNYKPsBp+Xs73nt9OGXEQlZWl3dN4LxAqoKJ4OOrM zZoGS5h2ulTbyNmEUW8d9hrKxhUcbeOgrt4b7YYiHMPYExBkWXM7671HSz28ky95Shirii1v IwQTdNXtqNLAKuiRo5ZV9BWGnWS7sbtcZyObmwxGJ6lNWnllkJU41G6uY0csgbC91Ec9edXd Z2c8o6RFfSD55c628ccux9nbWF0rHPLFwbEygYmrSzMzCCjvzCZePaxd21nLJDYYYo91bw4F K6zgQXYlDZJXcJhsa76OXgSuuSzn2RZdu5SV6t0jAavU+hJfZbd3hlaoLXCN7TCCB3Ezu5RI YZU7TpB7n2XOZuk3UTXFjbOrSOFFtbW/0ffWku8/UWhV3hWxrJRyqv153IvEq4kaBlXM5jW+ GuGjuJwQQBHIghkAE/CiQAEiiQAEiiQAEiiQAEiiQAEiiZdEABMgAnQEsAE6ACeFE6c3JJJJ JJJJJJJJJJVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV VVVfMAAAFAAAAAAAAUAAAABVSVVVVVVUVUkkkkkiAJAASa3vfvfnvAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAHOc5Q973gzMznK7mZnOdqre5mZnOVXCq1QKqhVUN7NAMzMwVVyq uANO970qg0AZmY+7iTyr6vq/nCx9+Rr1n84qg+r96Y7Gii9VfhY4Xu6UK32w+0UN4PGLZ4VX CI+elipeKsrOzZVaNx3jb+ljAhVOGp+fnYg+YrMPnpgYkLHzIE2PPHjWZGILobWD1RH0yvrr CfEWKwbDSuc6sOFgYPGzg4UAxRDh+l9SwEVY+nDlVhCtFi5SoU+KuE5Td14278RcEYo7Seqn RxuxYTeHPLN+8ouPVmBpj1cHhrdSysyj7+byeft8gxonDH79vD9eGbdJW6uXoU9WKaboOxjO OTWda3jd83yb1ib5jGu7ABLABPwIn24jh0Iliqa/OmBUGVNVEVA/1qojS05pMLHwrPx93N5o 8qFTTor5St+XXDK4SFBijEccWjR7BVaMNEj1dltpv1WLGjhVVAwwtBoggtqvneMDRPuBFisF YKYdCmTgyGstvPUb7IWqYYr4Vwr4V7SXxr4U4TR6IOiKpfCtH0FZ42E12hC9jlApAgM0zdWv VZo0ytoD4j7PKssSqcMHDBVQMQxD1UBmFapSoknq1wzJqY4eMe3lYb+p4Mgds69LGb6+62qL NE0MxPUUsmeY0ACbABPhE+S4drN9moZh96jcsUx1BBunZbH1Qfh9gp2agqafhQpCALuOXwut DWp29/bseTU7nHf3TLqBnVJ9B38U2afprCYqjELh71fQzDES6vPOWaDcORC4JnNEimIHLvHL xlqcnYa1zpzE1UrTYrcCKljPNTavwghnB8NdWAFrlg8jouxgOAbK3bFjasKKKncJaSspi2s3 euZ1O5ABOr+BEr7kXOaPu06jiP1UW3fjh8Bgr8zUFaNDSuqz5HK1ihH4Dy1/rfWQxXE/YTVy b5YzdPjVIAMcPqQqvCmfW4JbVV0IqIEYa8nab8atA2IokQeYu7O9m4ve9VVdfDSUou60aiVV VV6loW3Y1Fc/K6qqr1I6YTl/aGEPKAX1tM3fu9OpVAKlXG8LeZrkay93boy5BJoixNbxWuTk 2Y5nnJK3hQEwACbABPkE+OQwTMcwvVXA9OdrUzz7N5wXYAJ3RBTFFA6Hu3c+/Q1BXTsUdF2j VVVfVZDHuFvb4fDQmc4aAOnqqq9W1o4IWzBQxWZ1i5Csb7cI2ACYMzkfexzD6entUXKddABL 9edt3Xu45XMmb3V4ABN4zfpj1d2YqdwdqUACdwTWrxO8rOtznDjUABNvEdSZ+rdd8Ka1czW1 VVXqR1Tq2ojJ1/MazoYmenafeD7K1MpkW5Ud/a7wfXTs0GaD8Y9ITN47wgJnBEhk7Kzqqqr6 rABNAAnyCfYmI8hXOXmNTEcQ5Xu/YnJYAJrXOcx9ujGr0VgxLjiN7kABK9fxwUPj5pPKpPjE rktG0G9a9VVXqaN+5ms4uar2wATGzXb1e283o7EATMzjGSyTb3OqPKqqr1Y4Dq1Gpiwxdpse 9KwZd1jb9TCPMb9VVX1SphvCVWKoNFEVgM0vGNzcni6qqr1L30T+zlrKBHu7OPxxQyvsJy8e k7n1WoEVUssM71WpcqRVN15vM5vGpne8cABLABMAAnyCfXMZorlGs05m+avOSm7hv6cABMme XbX1TFHO3f267zNXierr7XJ3NVQAJu56NTsLlx1ZrQCODU1DMKgXVBg3NQAEvENRqNgikK9u DjW1X1VVTAxWiM8K8oJ7yeOtdvvV6qoNIZpOJXBVe9VRFs7tvIpdrbAANVVnKxjOTmd+N97y +HDiIFXn1erNVVOSEOnWGxYhQmroSvbmMMQO5lpjoZvw7jozpbTTaVj2x0Np5WDAKqqr1dVA JwED5BPnc5Mfavv1ZxQVms1ju/rzWN1X1VSeVoYAQ5mmOuKxaSsVmSg+XanQAGy6vfL5Xdm5 yGiOtVqa4Z0Chg7yjRu8vt/GCxXCwhjDwqqr6nVKFWaVD6CD2ZYqqqvg8HzPJipnikFfLoMX zFd01cAgZ3Oy+33HvFF4p3BMFHeaIALnEGPluSw9MjmStVyqr4iTiYsu6lmk8pVXqqtuQqNy vq6M0TWwRLEcrjbejdVw9YviVXRDIu87SF7XAPNVY6Z6NyhVVQnAASwRfkEre6m/exuSGuYw ipmjq1fZK+7u6GnQCdjMq6r3vU52XssH8xBDftuq+++q2Hgw+DmmvTVWXRxvXRHk6qqr6lRo EcIKg0azHq9x4YOCqceVY2xVVW1yNXpnGb10eNKGoKgznOpXXveI+o2PGuFZuVX1VXouYG5t mgXMsO7jbZrYrzNaunk1zuuDOFEQv1e97yFb2bpXzZpiYZfndXmoueSgh1h0bvF4ndJ2gYLR 1U5e91dYxij+OQATACP4QT8Z5i/x2vx6jQpVxtmv2Fia8/jVfffdfgZ6lToWKur5bLuwxdnD IdXU7CRXEcUK+XTW0F90n216vequ0JGt6VbQVbMa3DSr3q9WpoZNw3ubZrSqHvVXsWrme7Lg uPmsFV73pj7FRpTBAVCglKROgqvgIIxgwxLRA9dpoqsDZgryi8OGwp1M7LpcSeX1jQMODPeX yBGVuSxhXppHXaGeYw3zpURMCqZyQ0DJfE9tgGEO4cg1EqLcFdOmkxLTW9ZObUE4alNqV1Mz scRsaaQcd6OOVtrX3dcdHotrsG28TUNNZsblzq69JxjO53gUN10SdIdNp85V203loWe7cstb T1vhhBxvoBvaXxAPFPTOt1kWu7lm6YjRwDOhV8r/xi6mQ2o5k7slxeU45HkkTIpFJZpxTDi+ BNPszZedzjqd3Gsq2FLpW3WclxuzIxTusdWItsaMFk3sudjvckTJmDdI4rCExUtwcFZ3XrBB vvrkld1S30FLgKsb0YhuJ3ys1uFRFnctlovNCphp3LGUa2+fOUtvbUVLn2aldLHUN7w0GRuu raOxl9ywzdL3O651cWNVzpCdmt7bEcSe5emUVL0Rt4AoLoQlK8mYsh+j3Ctb2S50nZbG1VVX 1fgRICAQRICBFEgKEUSAAEUSAgRRMPQASAAnQQDIAOgDog9Ob3u7u7u7u7u7u7u7u7u7vbbb bbbbbbbbbbbbbbYDbYAAcBQAAADbYAAAAAAADbYAAAcKcKAADbYAAAAcKADgMVVVVVVVVVVY xVVVVVVVVVVW21VVVVVVVVVVbbVVVVVVVVVVVtttkkkkkkkkaqqr6l9X1VRzM3fZvd3d3d3c AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOc5UPe8DMzOcruZmc52qt7mZmc5VcKrVAq qFVQ3s0AzMzBVXKq4A073vSqDQBmZmD79+v1rXz5r93Pxr9+P7j9Y/BwyG1DSX4b6lv6/vBI GsFdxdkfbfw4Ny1f3r9AhVsgIDcyRIaK3UJNA0ZxnbcCw2PEMaXbFO4RM+FFkcTyvhYodae+ f0DNvakNJddInqFiCpIbraR8wvaSVmZTnKrvlcPCvpBHp7JV1rAOezKdL5WxmP0WpD7ONilz jLdy0XizqwJxGtIubfMRZzrGrBTu92OSt2gqOY3zecAAmgQPgUx3vq7tmasxjHM83Xa4kalX 9edmhXy1x7Mm7BywwrszS88+XLYtTwt3Os72mWch21e9skOt4cIkjdvnqnJwNZxbDSmWCHjm ZETCsGsjpsEAV6swWbs7DglCo9ga0coVrtPe2pnV3mu80akMvNczm99yACUAAeBTGsZqexvY 5kuZigjwI+i8AN1kE3jmCnDbUAPzqdCqqUL65R6076A9pW7EqUvqyrbKl5mh6GRyT5NKP9BU dvxoked1V4jB7MMWzPVhmTE48BIDTdW9xmReu6QnNLLIyoG+rJdNoSnR2GpserKEfSJ5nXL5 dAAnQUPgUneTl9hWJqp7u/bsIlgw/hH+1v51cBo58a8O6/aiR5fDIt97VO4SZzu3GaDd7upU cQuJPZ97B660knoX1S4TXw77bPyQymzRF0KdI3q1bIbRUPE8rQsJ83VmFXTsbY7bsewAn2s1 idKn74gCoeXsXhAlxmVte9YMGibMG6t5rNYzmcruqO2Z3e9Z4ZvmOc4gIAjgAEwAnyifbhc5 KgahUuFTXO7xUahmjRGCuH2n3ZMFAVTHyXL4tH93L1DQRY8ITc5JerMa3Wva2bxZRZDfVQKg AJIACXWNb2YOmNgAmsZqwATBAATHKABKxQACVAAScubwACbl1QAJrtAAmzV9wACZgAJIACZ3 qwAS+UACZ5SAJMUACTmbXsABMQAEvmZ3fe97OgAlQAEvN63kBAL5ywQQ7AQMb5YKHm6AAKYC BHEzn0yCBhgIGKZQAB28awChvtAJeqAB1dAIFeoAXl4sBqpzWAQLO8xmevvO9BF77dgqXknC wVKgKk1QAJRjmsIF6z3ArUBAnIZqwVas1g5vmtG1WVWK7YihjdCiVrPsV9VfOrNV9981PFVx 4cKcnvXhbF+B899dlIZtWOyOIqGgZE8Z+gNWdghZ52LuHe48ABKAB+UTn1yQ3KNUTFSzxnvO G3UrDTZFxNzC6gq0SMDon1mS0b+1/mrtzIFx0M9eGHprDf25FkFZZq2cHbbyxXdqKBXlooN3 9xoaRxpCxQFCkJdQIAVwIoiiO9q+9HppmzSGkG2XQ+hIFZnonBVzfZd2Ij8walqxTcWK/HZV YTVjRTwyhXoYKFG68OpA3x5enqOpYMHIY43vw6XzmHblLA6hqbhqa6qqr6pVV9QfKJz5797W Ox+lzW5RuY7m9zeZneDGpTWfrxnx3853D7F3VxPwQrB7R7zk3KqCldC55tgvUlC6BZQmPm16 lAa2SCeaRJsi7Qk6aLhne+dn6mJne9nPPq7xqtHhVCGqJPwEEH3ll+flGcudV2eE8pIaKoLd dWp1KJZRRujQzTW7qsgOm8u+1aA9951VV7373q9Ql9dqQZ1DtKWGrtgvARH8s/eGy9t+Qv3c ql0dFZ72366zTVe0omoAFHeKLlwKmI7ui4Z9zXu37fTrW43W7PdwZTq8PxFPyVVuNIUCC+9S rYulXs8HsHCvBD7x3Yjpbfty4mk2CMQPtlu9p+GdUmcrD6jp60yRDgrUWV9blB2yxu2dus45 rUKlsrgAJwB+BSuneGsanM6nKuQ5DHxxgwrMzz27RlljUi3q/Oh1CsvpPZz6u0IUeo8PkLsq zg0mhPYHwpjEYLh9B5ADa3MaBb9wbPtJpTLvdut9w66weGi+P33q8kfGtH1NYkF61VjBTXd2 Xo+9xXFTy8jQJrhWYRti0q8bsBw6eX3omZSfAHTaoV13k26wiTazcZtNXSVfJ1mXjWqyXiY7 NyzXDeMkABNggfIpo4+G33Rren0puSZc0Wsu7FlSyzoLnWuR/MYPD5itB3qVXWG7NDIqfj5n JeN+p+D33wIQUMoaED9RXzX1LL+6fI3AaYr4cNFP7NWHnHPg9De6xXDwsoYEO50wvgVVYFDA hLPkMT++mE3zpjgxjW923B33jQxsWzARnj2C6wCI8nUrERSugDsb7LEF1yrfbll1SsiiLi6x yGmA6qx1kcAa6R2xxsF0ei3ueRqVj0iscnTuTGTrnEUMvQu/j954vQZssrOO7Sej2Zycpx4H sF52MdFrOYKDzbYQUFYJxI1FTAecrAJzFELAJ3tieruG0sPLasevDblY1KUxUbIv5SG6imhW uaCrvnL04ZjAf3GAc5NFhqB22y1XIiK/huVdOkhq3oLYDo52RiRSNUi9OOr093dHnbnVNLyd jxFMlF7U5Tu3Om5Rlw4O1ns0ONa1S6nJewmauOjKoWbYqx3de75bRFWndTOpGgc4nj2MbV5Q rVsUs5zpqYFHQHaKwO+yV0bGzRIuM6+YOU60ZRFlEl0Qxg7kie7WtdCw8VZOXB042vYthHea 7jm7u+axW8Ai/hFICpEUgKkRSAqRFIACRFIARFMOwATwAJ4BDQCBwVyCv7ICAI9896r3AAAA AAABQAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqqhVVVVVVV VVVQAffv379+71rWtfNfdfPnx+35+fn5Od8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAc5znOcABmZnOV3MzOc7VW9zMzOcquFVqe932KhVUN7NAMzMwVVyquANO970qg3sAzMzB9 +/X61r581+3578/OzHM6zXsV7od5GrNyzrM4tydNVGGLM0jMSSstbk0V3VrzleJQEuR/19Dt yOG+1VB6VsuhJbmXT0qM59y+FcK98KXxzpddFzfUKjjJpuuvgRUv7ZukS5Q9om4mPvl3Uerh 7MdwVw1lEuS38vrPz+rR9PMZjug5514WGIKtQH2AoDh5iVJ13dQFL5SNTqwF/b4hA1GkTbWV sdlqqqq+pVX1VX6q96v1O8sw4OZgr5mvw4VCcZ39vI47KrRRRqConEe5e6rq8lHpFen3YL2l B3KWW5fO1YzbzOwtOteVpddPokI5vgHhkNX4ug7zXTRdvw3obQZKw1or1mvaee1no7HKqsJA 1oo1CxBwqcptZ9LqgKB5QV4Qd4/Ovb2vL2zVHRJasEAeFz1ivGQeqRhmG5lE2b0oMAPPrdSs dWMN5HetZuqM7vu+7qzXZjQAJ8CmfYmMlSsUStHpO8Chgnu15uqZNolxWqxy3wYEZpXuE0Ha 4DJ+98vvs8h5M+wUxwqyDRHqN2VRFAeC4gU1G+4THMNkoXC7QVQU5BHQVm2hYlWZQsbLVq1W CYau7VQQIkuKobVS2rHgxBzu98V6r7GRFLEdT2aLxL5xPmja7SNcWA0XM5XWSqr1edV73n4F Pq3q8y56GLrJ9UheK1++b1us+0XVC1I6ypLulX40dXHKyn11ekxMiZ7hnKP+LMsmL6qC3AAT HqABNY/G8AAJqAAlQAEwZoAEkABMwAEuAAAkgAJjlLdasAEs9QACVmgASqxjAAJuAI8gKoms UCBICg0QBNdoBFuAoMgoiEvFggfEBV9BXMAFZBBkBXJfcBfJj3o2V1+DsVaNL9X4PLB4AzTk qW7q9RvFV5xjpKvV3ov29nc0XqunAAT8Ap96EmJTX4VYrqfdqhH79RLYWM1jUdZmqrEH2rQ/ bZApjwQoQoVnGE2Pn6IDBVTmqRKyhzf3xFeRs1y0KhTBhrAhTBH1iiNv1+Q+C41un2YYjo7p fDhVMdZgpCrriXle8U9le5qzaDzseHIkszxapSuj1rtTvuswEAgr8Cn3YYxRUuXOkxHmKuGR oYYoj58YrjFkH96+D67G9KV/ipxpGUU1dtZaD+MhrLoodx0063btwnjaIJyyyD2nh09t+oXD Y8lU320lqqUwYvS7tb2UIQBvKIgENuyDWCVirhgd3aUczu77uaoLBA+BT73OeOz1Y9Xfp9u9 VquazmTETM3OzFV58aKLgne1qE3R2ajzurxKQ6Z97PEV74EU5gD+i7jXcfURgopZ9m8K4VSE oVoVCqEE6mrP1EVkN8dGDBXcn8c4uMw9aq7XrPZdSjdvAndELSW/cpC75u+XWK2ChkRQ+BT4 1LnY5lz3J1V0xOtyZUqm5HVWjX4fKZboQG7AJs6PcK0YKqSC69+s1wqnLnM4OS++YCv67Vjs fdtKtvYFk8G+hFtdhGRYetRV9VJHzFcC32ufcK+0V9g+raFK3M5eas1Or2PzlbxKTHFWjTzt 3VFZohYtZ2Vi65X1VQaFE+ETNa3o2exfqzjV37XubqtY1i+Zxyhsn6ChQpj3jxqvH74dlGGm z5mu77nNr6D4SwaVbXbRd7eom7QJWummug2ty0032t3baYKrc1q+F2JImhc2u2xWPLjt5M9g QwWPkNW0WTGn7BuJeXrwcpq4R1hSzSO3uRxuXd5ccMzudkjeiFV6qo14H4RPuQNSQ+++9g1N Q7DUMS4YgbqsxBFX7Ua+H78eHCl8fTj7eL+NZhQy9vwFExfQD3l4VM7unCgPru3MV3Lx0xgJ 6pHSWDyGY7waj65ttnzFIa9AKSaXJLOcCWys8yJq+osTtyVy7tWVNy8J20gL2nJBkp5KtgdJ Wo2pauZd3JtOSTKyFIu3fPn3HOe0+ZN3tzDHamOO7bagdVhOdaoqn0AQmX17HlbKxWHpgKHR m3eI3ZVRCk9JtW9dDhe65NIGU3HtIdMO4yXqhUTWa26BzAle85s7nms0CeYSi2hd6MRlPqy4 KDmvJckPae2W0Xh28PVMwmtQJipWNp1mSYHWgHy0TDmmRgLjrhXHgkdAfOxeybKGrjeroLPc bx5AGlcePIBi2WuN8LuuuZQdCyM6MitzhpvJlzeziZNZMnYZiMvEtktrGi1Xas15ibBcA4DA eZ2uOOpzEL3o7wDeFR8pHhuU6K2iKQfPa6Zz6NTuwUMwAh3JqwZ7SRR48iHyb28S3LaNnIK0 AUedLeJDzQLznyYG9osS8T2ikZIc5Zp5dFlWHexoGlT75HZNqXh5q5asDLa65ReO9ky+wDq6 Ao42i74Krys1ErYdqwA+jQi6+tR5t5c5rjcyGrR03RpW+7BX4FVioHQATAKGwBfAhz6d78vl VfIAAAAAAAFAAAAAAAAVttttttttttttttttttttttttttttttttW2222222222222222222 2222222222221bbbbJJJJJJJJJJJJJJJJJJJJJJJJJbbbDbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbYbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbDbbbJJJJJJJJJJJJJJJJJJJJJJJJJbbbYb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbAABc53nOXt9Pvepz3gAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAFVQAGZmc5XczM5ztVb3MzM5yq4VWp73fYqFVQ3s0AzMzBVXKq4A073vS qDewDG2+7iTyr6vqDx+foWd8k8HEKZas1meepfucts+WQGSxGom7IPzxZpl/CaKQopZ3SwOp d3Kr3W5O3E7oy3unHc5raKDZTTuGMkbjKAPcmGC1q18a3MecKsRORLYay7oOhlhUTUxVdi6l 9E/GoAM2joYo86svb3KVLnWUazbpPqEqVyjc3WM1nAIHwiexjFw99cxPH3eVjn3LN/evHsQG sk+PetVevtYFXQ1WqIJ9a1wLy0LKBIqwAZ1GNYMQHw9LNAYCKApYfvuS81fMqhwqj4eFeiR3 1S6glWq8Ysu1ZPto1mz5VD7ou5LKBEm0J9wuzdl7KgI4VeigHOvMbw1g1ZdSAuU9rsFMJ3Y1 oLsc3ty5VVVVX6vq+raPtt1+AcZ1c6aXluVvjRHwRIZM41zP70OEIC58RSu/KROsJoOgMK6Y 4g3diDfXAKebJdRm0J5TZfCsS3sIO1DMEmO6i3m8JuliQZ5dPLRiU2VNT2WL+3Nv5lDQ4Pu2 SfXPsCEUF2uDuDDR8mWu24OLYimhTqr3qr9Xq9U+v8meRQ0cPwsQbC1FtAZrDFAWNGCBw0x8 D8PxVs1dn9pl4qQA4IbDGV4Ua4VB6zgQdmoL8awIoikxDFURI+fi4eh32ybb1zUSmU+43wlu 41ldQxPKHlAHE7007jt5kFql9cJjtSXytzsjYci2uCb1CNXGIKxmgOu1yzP8Um4l6wPdPO90 +756+StRVhq6qvq/lfV9XvTFUZTJG6kfWm5kkwWpM85syizkCUE9V9aKmayb19bxoYOj3iuz abL1luyxCKpvdmS5k3+YK4fQVN2idu9E0rxY3dVplT3cnRwY8jG125uy03uuNuSHru8vzFEV NLFw7Z9oF8Kwrjm0cqA4rwl0qZ9SafjmO1V9JjhWsQ5zmarAAPwifPZvFem7rs1zaG6COo/D 9jZ6H4e2z5kpHYeEwXRIugKBMDBFYzo9gtpBG6v5vfiRo4QZQQgQwnx+mhfR0/jWi+IG0zWU L+UeYZhVBXbDs6KQ8rNaNu0bj2l7RTCFMWMFO7QBJTFdbgTPkMzL9owHi9gmVYmS6gBOAioI K55JRYmD67NimHWsQLezyx8yPMIZewKKssQ4W7rApTCclxC+pBCORkqU6qvqqv1fV9W5e+Lu oXXeXiniiw5ibSqwZuxwC8JFIXjjJCWB3h0WrzMLyXsIoFIm46ewXHuOYGMoMsVNpLQQMmXg oXC59u9xkqEGU+I3b8jARil0JyiZ7GbcAx6XmYedXkJvVOw9xmlQ3ZduNIMQPqUwo6Kqq++9 X1fUL0HUSDz8UpQlcGLQd+gusXD3aM7e/EAffAVtZwN0iarRXwrqHkT6D3quUa9x3dZy3yCt 8kpizS1TsFnR8Q6WMEdcvqGad4RS7FILrRAgg4cLzSQs2i2tjdzWOaw9L7nu83qsa7Od3WZZ AH5RNVj0+bi33NfE/fT99PvYK9g9UObPuuroeGGc2CF8rDGTgRfc6uphpCyHXYhY3nl5wluW 6KVjIyKDcxJZEgGNsxoLbI4GPVh7RkwngRrkcGVktc0RzW3E6udcWg4Wd6+L1ApLBKtaLbAm qbnS6iFZVeqq/e9Xq+3iaJtRrl21FjwjiaA2jN9LCHOX22e6VYu9ePWHJNwwWigPgSToID7W wm233bSxtHMy7aDSYaGDLrgmLXJOlgGgywcX5sgVbauXK4z73GpnufCqiNX4/OTdDyLhba6/ eOjAF11LHPFh0XZ1zqDWEN3IBRuWWdLejtRVikuenYbgN5N3F6bnTCbKVnqby3WsbDgizMqL gl3Yt8eG9kG6E7tB4QFL3le7vVg7lHJG6wSmS7mZtdGhx1zh8cPZTQmzskLM+7mVnXuy+Qdd slnYi3108vu3KilXwkQeqCdt8bkZQ1PFFWunCVCGa55Y4gLhWBjmunNGcniq+MBhyIviUO7h YqHA60Jous7jwgcPWc1WKG8O2M3EEEcrD2KokVyoDsDOS3j58rk0XnarTFt0J9oDdsdHpURQ B0zkAOnrm6surxrAOxSrzJnVdCDjOaF4e8RGXxly9x3m7zSjGPV1w5Q1XM4yWVnCIOpcsrVy 0d3ZZytoM2UjepcdcQQjxmsZomWeyIKcJmEGutGjFNsKyB24+XVr20mVgArdi6zjfaO0ck12 u7x8Kq9egAngATgAPPbnOc5zn05znfxc+nt7ewAAAAKqqqqoVVVVVVVVVVUKqqqqqqqqqqFV VVVVVewAAMYAAAAAAAGMAAAAAAADGAAAAAAABjAAAAAAAAxgAAAAAAAYAAfd3uvnz5rXzXzX 3Wvmvnz83d9+35+3fz34AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWZge8BVXKveq u99VapVXKq4zMze8D2ZmIVVGhoBVUKrmZmc4A073vXSSd3cB3d3d3Ntvu4k8qqvqP8sU6FBG vJpj59hf7DdViKHxFEfg8+c/cMymIj8lQ38/quWiLCumqqiCKuUh4i+M9dbhE8VhtG88ZLhV 4jsSOZiYUSFWFoQWFLez0w0yTQDuAzEi+t5DvlxSV8s3SdFZ2IZq3j2DdPKCcNBhHZb6N4Hv R+nTnF4upd3nV6kxi877zWa4ip8AlWd1dzPRZ6gRxspX5zMbuA2CIydaqCxdJXhvmWSGNV7W jueO+xC4IsKyzdZvKE5E8VZo6061Bdb6G7aSx/l8KY90I3ZgoigSBTRpj2UVywfDe5b33O8y bzS2TsrQcDvp1idgerpgnA6lsutuWqzKvePFGVM7vdczg1uqyCp8Anwbm5mfQwRxCu/fHBjd +dcKwAcKAVmhdV7xvdlL9MLrBBTzZJEa+vU3994fTrwBVvvMXz9U2o9WGW2UA6LFJAsMT2q+ IXDeejMcOE1PfGkrjeySfCkagZB85096LrPXk2lOFvoO01o0dgtzZWqDUgAjkC6GEdm43KTq vvvq/VVfV6jucyyHZmtnzqZlDvHHXBs5hly+oUxwIR8YJ5DjjHBOgwRZNrIsqU+znUXLQ42t 05hEXRsOzy6sIz92RcmqoimIIy0X5A2nRsgVbKyyqsK+51dkiXO9WYKy0YGMZ+BijQc9kg83 0wNW3Tyj8UWc0YRXgzF1PuzdJHY0Mi5zpQba1ucmxdGhFnbw6qqq+r9VV9SLsIFeS805iFqV G5sttW6N4jdXbStshse9uMPqvIAgtsoH9wikOcZmwVtVo+ll+5WPqXm+o+67eYOFishjJRSJ ECHGQhz5oIe+Z9nA6TWDBndOY++pT5Gq4euz8z9sO3znurRe4OE01SJqUEKSt3fr8/MV1QWP uFLSwQhSBmYhM0e7Nfg6xCK72XItp3io6AuqX1b2R8YGHWK9Z6ZvSMA+AT6pn6szn1OJqYn2 6zNZ1idySY99rVmym149irK7dzSgkEiUFueWgMatzUUTFSAbxasu8Nr14jlmVYQgYppZGjcG zuvC8UtkE2KWVD8rRUOLtDrTdMWqCRZab3jQtCQWjFUc2ypjEfYdLdg91X8z29DF18skyC5j s7faxSC57mFx4pK+++/VVfUM7xM2cp1+EjW2CQSCUaKJ2F4RDoYoJe11LDtq08chp25+qDwI xZvjPr01RFdZpD4nz966g+oDh91IwcNQeAurCFIPiwMNU0fpF4w9E4a2WaNe5+ruWLok4cs0 XpFttl5Uq3ry3s1mdQgfAJ8Y5i/TWSvoemd1r27zPd7VH1wzK9fz3cQKznHCuNMlVr7Niytm +CHI6b6SN0DcEuthCp6YBu3YbunC+kAs4s2rFlGnjLrutUrKuxN2pYGqmmUtrGhD55jk8H13 fZvgPWKXOmpY126u5xMReu6PE6zDCpt9F1rlDHWZ2mVgxRe/VVer95OO0D299f0FaXQBh20F 4YnWSvyVXtGyO3qjoA9SWU6hWQ5uW5DTbaZzpl8kDhc7knNjmCwHTPOt1EsDKnJm3NmSqwtp dZU7hGJHbS7NzTVpVE22tfMEDs54lT4y1x224yTkV6oLbfXA9nc9mWuvLp7tawttWM0bVe97 36qr1RotZnzEfnfV7t6aMxOTbL69YD0nmc2K2CYsY7kcLQIUZNGId2HNXKLlFwXSpJA+YOLU DZj7zvnHK07fG2Mvr1SY6und6mkyjfY6kG20so86O7qS4zpX77gB82cGk1jNFGsHq4Vdkb0h fRv19T+6cdGG5UrdrZaWuTL03vJbYyryM8oWG4dBcgc7g5pwSnNvZguG1p41pRyxvXgRbM29 xOrArYp2LlXFfCHW5oQl13AJcMpXOsmkR3dxsK1SzbbOanWcnTgU2x4YNQ2tqpQq5dYqlnIm Z7bcMOlWt6WLpNrLcafbUm7m3JYrhyzbPbfaIZCSuG6ru+0C5T5Y4k0nl09X2K+e6m0O7ezS sPM1I1mM1o5kEZN3au43K1zgpHVl1fbaKFwsiJVCND6NX28dqgney9NLoZwDt8SuZ5lgNPpk EijtbcMBCst0pclYkt6Drs92XawuC1tnt1O32SoyKLpnhktvuvIkhnJLkSaEH9Z5zmUrfvP6 3IrWLZep+01b2kPrw1jzmxQi6uY6+lajwcxt0EcVOdcYK22A6vr3hHRTldoCeZL6yAwFgVLE 41Hmfyq++r75fX6qqhIACcABOAgdBA4Cr0F6b3vEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklsAAAAAABtsACqqqqqqqptqqqqqqqqq qq22qqqq5c7y23ec5tdoF3doF3d3d3d3d3d3d3d3gURQqu98fn5+AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA0AAAAAAAAAVVAAVVyr3qrvfVWqVVyquMzM3vAKqhVUaGgFVQquZmZzgDTve9K oN7A7m233cSe/jr76qBGiuFYjTGFL7yQ+N8v2mhX48L7PxzjRa5CksjIA5XaGY7tx54g0tgg dcuI90sVZoGk48EwmaE/dSvQfPT6VKecSH7c57OpI/GiLOnC0zaNLeKrxW2xNRZLHLDipsV2 43SPdd3cuvB1KJrElgiaLb7N+O2e6S4aEBy7KXcNc5nW89LvW+5mNYvF87lq2aFfhQ7WvP1B AhYioPodr9Rq+uqyilgpeLhok8EjUR3affioCWhQsWKlZY9dOjYf0bO++hrtNe4eI9UBFVd/ Zu+2HxbW8xj9gqnppDsC45gYmYej2BiPu63c5vBe+XzWe6c5IcF1bVNFFB+UTtBYF9gNet6K 9d3RL2rMiNxrie2hlsdQQRL6+J5Uu1N7SlE77Cvdto/QLvQy5uCnLlZXKSJTeAiQxdXTiyzJ I+xn9X31VlbnL8xSC8udQd7XEB+1/sw8Id9Rw7PdJjOZBfj3nljB5AGrReGycPz6CU7Vzsi1 EXvaY8aaWpHRbUu+2QnspJNVOXVlFWTYrsB7BW+7FtAy6uIB7wehhy7tWtzXUdPetRWaxGh1 syo+NRddSrJ+06dqSw0XM3sJlGmVWDW8nYjXq96q/V71U/sW9O28zMBd6BUYy4i7dp2rZw+V WrMGU/oKFl0ya3bu8zy3mhwSdgv8hV3au+WBD55FcnrVOYNDZ8hWi9T2k358kIPgsAFcCEOH w4DjWP6fTRNoY/fI4IIHypfXvu3eoL6wcb4IYM41SkRH3r9jAzEtOPvU8yvUKIsVglmrvN2f NvgtXV4dZ61Z9YPTVxNCTKnCtcm75e+VzNTNzFGMXvd3uZxe1RPkQ+N9+Wj78K/XaoB3aMNQ S5b+I8KQqLJWYq2n8f0YvZlp4K/ZWs0adEqUsxzHDKPdDJZrlKNLOdy5s2JyfPMPI4aMV5jC 3Xnd4M0wbw3vx9dIRnE611BFalmtGYRqqboFfK6NoQbxKPqv75P6rchoVBBgmmD4hzzdWqj9 snvegsPLlEHbyzoSVL7zM+yJcx3LmN6ZZoLOtqV9Vffvq+qk8lcgbyIxtnez703MUR7Fb3LE bJoCn1Czroo4ThgvtZt8ailJVL509P0fZZ7JvXvHJwuNOM7OsYsrK7OxwdclRlo9YEyItR1C rvq3ou5DgvzEzuoVdaDwyuJPH2j1XY2/EAWq2soUlx35NaqfyP07goaMrFXMrUiNDE3jnB8A JM7SbYon7qr75+RD6obh3m7JVF+ou7t7jPdGTEhre8m7pixkNPPy0VtS97jJFdMWKgiMFIVU G737YZgdeg8ShtPjbXwvHY72xL53TNYVmV1LnwA1VTg4C2qxEsgWpLmlx2cas11uC1Lv31Mf Z56p439TH1ZGvqq7NMVVioPiUfYFvvKrtcVfgvlz6hd4tG8C1l4CJU7jNVym70Ybyd++r6q/ URgqmh7V57zXokAMV4F+nhgZ7TrvM5gDphhWOrjm86h3Xc9PGD21j9t1uXbnj1eyOoTSBFbk Ivz3OrOEQ3c8nZAisBqpN5rlnOuFXaBp+yk2T3B0RONZWiuzjBaear498Nh4Z3amI+w7W8sZ JlTK7ZsaLxU3kORnpLQZyWukFiWDva8FckblO9mzJXPv1ffVW3U7zCC2RV4+drvbHjS2gWN3 WT3XmUAbPLgiZYSSVgsuguLx0rxFGLUBS2+t47zDOrnMty7GSSK+NWa5FPsXIF9jlYXtF1qV qobruENzeuLtt8sYss6C5lw6W9IhlxdmQNkMc7o9fCYndyTVmp3keCnMu+2dkrt7CusHQqVt BVu22vfe96qOw0vj9X2pFT4V9vFKt0W+ndLbj5m+7E8NM9r69qyyrRvoew6UwbG3bZG7q0wn LnaNly+4zVSWWMQkhC9DsIbmQKSxO0VV5dIhU7l5e7iys0ycNPNTG+VTWtiyNWa1OuS6DfLb 5KnXX8w1SaVZyyGMOs3qwDRu9XWQHG73UV42XlRZyghqD0vLdG96trUdYCyVlTpq3E4C5V1z KIOdnTKis3qsMzFwPJPQe090atmXLhznDCCrxHlgqHsO9ZivxLVLLSyazcG0q1UbxbDqOKjY uMXYFQ2+vsfZ0dmXuY4l1I81t40ROZomRZDuFaDseNzjuFY1qOhXtgRlAXpdHGM9aurrU8g5 BrkmICMvt7TuV186lreZ7huFR9zVS2NnbhzMcWO4wcoptYFZ4vGDzFzrzpMfHC13IUbu67ne 5AHnNrAVOyTOgG9th5RfanvVjvd3X7O5MkrAu4imL05r6JKVtdXISuc8yCaFbehvLVazQ5m1 zhtgZDOXBqyVeChl9krdNsx5l6esF26FIVnVsp829AGykrJBPs3t0WGvE1Ag7zocqMK51cba 1X96ve9738UBAEea3JvW+y9Zv2qus6x9kv8/jus9q69VAp5ZpbhXZjz2q1iqa3MI4ooudig1 cXuYbwHrvRztX6eoD0W+j9ai3vTSj0uQtR9hs9yzG5y6Ib2TdwX0kfbMGk6aEwVskrc6tERw bRei3MxRC7a3QSYllBM45xpdQentQigM7eg4OZFU5VmuJRSTsMJ4PZeXnHACN5BOpAjNDs1g G47NgYZMFvekZ0I8FFOkuFG411o1hVHO2dLtZHBXai65dkqXMortkqLbc7MKmQceOtWzmSCG y19yyrpbDUrcQTxsgVncTkzDE+yludT2snZjhmN9pnEzuyJipnWTKfHpxTFPe6ZZdrJJmVgZ rnvOk7vqlZi1tYcW5xOa5ILmCmLfUg+Bgo90Irr7q6OsC63O1goDcCFG2RWqhTkpbVjGtA3E /ESZ1cIu6BbmbWU+eVWOVGeZAp8odGWyaszMGp5qrJucrnQyEERdrqYZx6aptI2MydovNxck ZauctnvOXo8OqT3fKw0ZYxa/Vm6+vaUj28FWhep1Fronmu2sq0qXF5q3xu3bti+rSldLLrJZ v6VzcpXioy5nRT4Plj7sp1lRJPnJ1Nbr7pAulY8xYaKuwxnDM6KdnS6Wyd11KyaG2u0K8x5n YJpHZDeLsGMxptE07rq1DRx0Db0YnWPWx2IUeGpZR651KtqY+7q3eVuuF2kCqS1Xgeproc1r lnOhpm3cyOStMUPNXd3LjuwGRwySsPPUd4xsTCc1I6mL2Cpxl9mX2DrIeHVJezumvZ2aU6Rt HpxEZ5zKyl6PSplyYuOgu1p7uii6yozeq08xFPbxKSAh7kpuXmYBK7t60Rql3eFzNORF9F22 InuWp3R4Ecxo6MAp3xfHpy45iP14U+SzVjSYqMpUpV1z19F1uZw54WMs5TW6miUVrVWrq1Rk O4BkPJQ5In2LaIBozMq5MdMZndxNaenZQ03wza4G7IdYsrugdwghngNxcK6Nmir3A9esUQQ8 327mnt7gutuBveQyhBne4GofLdrgfVtTb32SEjNxq1irzA2p1cU9paPltOm6O9EmbnKZqgFF HqMhzhFAO6UaeJjTW0lQ7ecpzDt1s+2S4wLLvGnkbUll3RrgboJKghEFN6SobIJdpzu50Yps dzQD7bNM7Fouurq6spDzJW2HYpCQ4zDfwoVfWji5qY80o6AHhAUYlOt9207vsY9wl7YGKjnV nNQm1zqXdYKKusJo0boFnhDoqeeEdHRdvdd9okKrt3MvlfK64c0qldXUN3EqlrNv0LIAnVvd qO+woBPOoXkR4nZOwKlvXtLAxMuL69+Yre6c7fSl1dCuctyCS6sAUql6qkzF1jFJHZk67Dym BgUO0YdZ7IiH1rCUTQ2XmPPHdQ7aq6sxOpy2JrZm9xbYg08Tvs4ToWQZMFVLyK6velHDdprn kesVid4QrXKxZAbYExUr4XfdV13snOiNN8Bc49UDk4Grh1ZyTo2FXY8NUL2mjihzd4beKMyS Zb8WWRmbUa02olndkd5Gw6izGFtTpgwc3bzJGV2aZ2Y6x5WWGYslijSIi2syJXuVJsQIzLKt N5dnhKZFDlC8FCZhULwE31nYbcPaNLUwvQg4uOrFKADXYDNaFFCSqluHA+revgu3sBpKDLmb KUBh45ZXzGrTr6FI3U5N4dwbjkrJhDQtLZmnsvlDCbvELDV1ql0J1Pu2By3nJyJcqjx7SB1x VwkqCSrQIEW1lubzoLkkJ9ylGa9AYhp4Fm5vaeQVLCkaWnZV0nbtdC7tSu7FssGYs7ZWH4Q8 mxgrjk6VlLK41tSSuq6UfXdXB58sl5kaYVTCkKvaLRw52yXjC6hnYsKnby7p15xStoS4hdY9 m3OFdL6XMyi+lJXu09JwP2kKDx7V2cqPo3dt0G7DLuuert13213NisJS3KnDYNbQh1sjFWyt m9guuI4KLk1zxDSbJ6sjray63iJTihWPbppR3gC5HaUWG3sudbLK0wHL3eoOHbly3gRy4nm2 JifQZoPF5tRUNnLbjTzrFKhRODa0Ud7dg3JzwpCcWKudV9ta1KMSvByx52HVqusQeFjmu6+P B5zqyQQmCaZcvsQrHwZtLFZ5Uq68VgpE6PaDOHEIwHVJh2RZU5tc8miSIrsMZ6z0paVaLLg5 25lYyNXOdO7tNSPuvd4UcAO6aMddUudCezQafpwQ62893qgytrRuoTFdyat+tW+5wVyqzGH1 aw3rCgF9fSSQIVhqZzlrSJfCnj2o+6TFSOQ/aKm4co4gyHYCUU2tNatDeMJmud3MIzuT6Fet 7YjQxrhibBm7xvHTtV1jhY1t0Ur7Ke8WOu9qEOKWmNCiTtc4xhmYGQuGvcorkqGKoU1hzHqO VELfHNUvEDbmW8acHXd5e9HTS96spuVz9q6r8uq2+pstGi9dHtWO5dX2DeqVddMbqVf3Sun2 2+53uGbFsPW5nG2ZdajWbgjFdlMOZOvqV2kzuqLkLrEcMRIorOSc3s2pdG7cq+e5lS1VjukC PPZRkyyV26zkrOQednY2kMxSDpxzWqcV5dx9crU+NmOrnIY2sCg7VSsVLYWS6l7m81iLrTbq 3S9DbtZmg6OpguXFRO3iFaWk7V8j1MO64jmOZWowaQDeGccrM7evlYpqBPWmA3mddGuemPJW pqnnfO+nPJ1ugAfhUTYbz1OtaozMeTJKG7st4UHzOFxNFITbANpAW9W1xkOZSyrkNmne8qhp ZgsqAdT3TSd5fbrdyI0MknPDORgoZVhU4O5ZNCS8Z2NIEFVL7MrUhj6Agza1i+WYqRWwJYbo YrZ5kMFvJpj6+h61YFgmsxPrVNPVUeXejGwQNOJruPYBjwub4ZBTqMoXucFtY33K0aW6KOdc 5O3zsPWu77K4XS7eusn0WUm9tvH0XdLXKboSwcF2kVkiZsVey6aViTr6FQ7u9ykaUtHbG+ez cqXvSVxqXUpZecB2PbN6Me5TjM3pWcpvdSrEYO51JYe72LlL5ALsDaxwgWundYw81qMrThzu JO7ZOPSIeb0znQ1IKCBWxZtzVOE5lY9avMZI03tXa0ihJkzp0Dbglc3XY66nMno725rDXGSR 54Ia9vLd1LM2akXdajGbQS22uuHpdbcZy3Fc5rsWkFRG7tPNQrLKKt0nt5t7Ra4A0XscG24e U3et3qy9LpN0rfK2ll5HkzhQHxeGu+mudd1qlKgrv7KRaS1W7Nau51tZwdXWGXyxmjialyEB 1tGpmHSXe7eRRvWMpXs2AylsjovavHw7sk5cKA7jTpO1oeqF0XdsDhc2zFJCGdMgs5TJoHFp xwS0ZmsEVrzsFaG4XwTYrjvC6b+Cg6ZrGunNJqBW6IW8iQrp9cQgXR4aa3pZFTNjPAoJ1buG zBr1S6E0RHO2y4tcrassPaVW46cutvX0ti5akULM0Ig9hpXNt86atpJmlRkjytrNutvaWBwe 17FddSbvCH5WgjMkovrlhRualUAoXFVjiFqIwbHkNZZ1KLkpWsVe65N1JuUTnOXd4udSAdSi duand3d3u4sfPg1YWLbtHpOACemGXFOHWymkvC6HbZJug0plSP1/YC/YsT3dit+VKSkvtWp5 My5iMSvpufbTqaAn0zaGruMVXOMzNpgUBKVame20nmvU0Tzmkb7QV1Cl44tGl0nTNrLu8Ol9 MRMwPH0y8Dwes1rknPcFdx1BqnW0w+T2Cwlcq9JU3zD3nSjASSF46AoE7K3ey3nbfQzejyr6 jnSU112suTr00jBkd8U7rsz4upceXHYA7cfXtPtOMbpySXghKc6O7b6K1MvKx40pTV0Uu1u4 BtOSXI+2sq7rszO6mlNY53nb0Y5nG9Z5rk0YMnchjaAgCP+oKACP6AoAI/sqoAD+YgKulQQB /KwBAXaiSIySCyKKRVBGkiQiySKskiASEgBAYkICopQAJACCsAAaAVNiiQQYCv6ACqg/1RFV B/oAKqc7c53vy5933vgAAAAAAAAAAAACIAPv7bbbbbbYbbbbbbbbbNs2222222223NsAAYwA iAAAAADGAAAAAAABjAAAAAAAAxgAAAAAAAYwAAAAAAAMYAAAAAAAGAD79+/fv7/ua/X8n77+ X938QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAAAABVUABVXKvequ99VapVXKq4zMzew /X6/X6e971VRoaAVVCq5mZnOANO970qg3O973ve9znOc573tVXbQCg/4Bf+AUAEfxz5evQAA KqqqqqqqhVVVVVVVVVVQqqqqqqqqqqoVVVVVVVVVVUKqqqqoAAAAAAAAAAAAAAAAAAAAAAAq qqqqqqqFVVVVVVVVVVAAAXr169fX169/PPPPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAAA AAAACqoACquVe9Vd76q1SquVVxmZm94BVUKqjQ0AqqFVzMzOcAad73pVBvYBVUPtUf7gCqg/ 1Bfwfj6SSSSSSSSSSSSVVVVVVVVVXoAAAFAAAAAAAAUqqqqqqqqqqkqqqqqqqqqqkqqqqqqq rvF3nOV3lVVVVVVVVVVVVVVVVVVVVVVXPXr169evXv55555555555554AAAAAAAAAAAAAAAA AAAAAAAAAAAAGgAAAAAAAACqoACq5mZ71Vz3qrVKrmZmc4qre4CqozMzBob2AqqFV3tV3oDT 3ve8qoN7AKqh9+/f4fNfNfO973nO/Xn1+lX1AAAAAAABQAAACqqqqpKqqqqqqqqqpKqqqqqq qqqpKqrvOrvO1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAEkkkgAAAACv379+/fv07u7u7u7 u7u7u7u4AAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAVVAAVXMzPeque9VapVczMznFVb3 AVVGZmYNDewFVQqu9qu9Aae973lVBvYBVUPv37/DWta+fPnz5rXz9wL/sn+4LSIqoP/QogCP 6n6/r+tVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVV VVVVVVVVUKqqqqqqqqqqAABz4+Pj4+Pj48888AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAA AAAAACqoACq5mZ71Vz3qrVKrmZmc4qre4CqozMzBob2AqqFV3tV3oDXe9731Ve97QAqqFVVJ 8n/AL/qAKqD/IAVUH/QAVUHIKACP9AXALgFgL/+T/EAVUG0/uFEARygIAjYL/X+R/L9pIgSd 59qqqqqqqqSqqqqqqqqqqSqqqqqqqqqqSqqqqq+AAAC2YAAAFVVVVcxVVVVVVVVVVwVVVVVV VVVVcFVVVVVVVVVXFVVV7d7zn4XPt9v5s/f/MfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAA AAAAAAAFVQAFVzMz3qrnvVWqVXMzM5xVW9h7MzM972ZmZ40N7AVVCq72q70Brve976qve9oA VnOc972qr+gKACPwAqoP/YF0of8gCqg0gIAj/eAKqD+6UAKqD1AQBHSAgCP/gF/wBYAKqD/+ BdAv/fKIqoMQAAEf5pE/uARAR/oooAjE/qmQBVQf1Bf9wBVQdAsTwL/eC4AW0BAEf4ICAI/h AQBHAL/gC7QEARyAKqD/0n+yIqoPAXALERVQbARAR/sTQAqoPwgIAj+yaQThFEFAZAVWLAXa IvgBVQYgCKDEsAVUH+ILAW02C0C/4gCqg9RFVB2C5QEAR/yToKACPQX/IBEAEcoCAI8UUAR/ /mKCskymss7x9HoLlmu3AOkggAf/6gAVf9u/oMGYPnwgAAAAAAAAABkgAAAAAAAAAAAAAAAA AAAACDEhCAJgAAAAAAAAAAAAAAAAAAA4eTj4oGitBtZEqohRLQpqoqBFnwC8A4D06YhQANND LVabahWo2NtlUKWeBvAOz0VQmwNtqmgQIoDVFK01QhVUMx4XgHb1lWqGigaFLYC2DIpVUUq2 gqQx4B3gEepGvVOmhltlUFNA1ooBpowqijPOQ3gHY9iwwKI1qEitgAGKkbNG0VGjElKYeA3l DvDpVmCkDWptgoyFC7AahUjjPA7wHA9Dm2VbY7sOqLYUNrFsGqgEx40reAceiqUlUlFIigHQ DUCkqw8LeA81QKUAU6NJdd2kC2DQoqCq7ncgXbKqQBCIlJJKpIRFUikLYaAqglQJUUipwegE 4ieA95x4d4Dx48nAd3OsHuA8d4R7wHh4eHvKHgAApP8m8GH6pVVVAGjBAABiJ6GmKlRNU00A AAAARVP9J+1D1VVJqABkAAAAanhApJURAgAyABoET9qipIoNEZMCNAGhkYESTQIomiBEaQ9T aZMU8SfQIHooqAD8/X5z6/KpeJ+KK/LXJ9IoPUQUIgKIjFIsYxiRiRSIXr169+LPlVVVVTFP VVSvVKr1UlVVVVVVVVVVeqpKqqqqr1YypZZV6qpVVZZkqqkRVez2Z6s9me9nsXveyswKiiAJ UJFZBKqlkEkWRkAkAJFJBZACQWqoZGoqYICySCskhIgwgrCAskiDILCMghJICySKEiBCCsID GCMkgAQgLJIqSDCLILJICyKIojiISCSDiAgqo/2UABBgqKijkcgK/dRV/VRVigAIPqqH9FUP 5Kof3UQf+UFEQf5KhQgCIDQolAJSCUoqwQT+oAkAEgqIoMQT+SqEFE/iKqqD/gVVUGhRPuIf +0V+yiv6I/mqDYL+wfmqhQqfmigfsqv5IK/srpEHxQMoCeAqaBU8BU2Cp4o8BA6CB1EDoKnV E6nQVOgqdUE6CB0VeoqRRIgh1QA6CB1FDoKnQVOqodBA6CB0EDgIHAQOAIHEBeKKcRU4CpxU T9wIHgIHQEDoIHQQOoCdVHoIHQQOoo+KPQQOoC9BU6oB0EDoIHUAeqh0EDoIHUVegqQAB6A9 BA6CL0FToAHQFegqaUHSi+bj++CASKyKyKyKyKyC1FaisisiDIrIrIrIrIrIrIrIIyKyKyKy KyKyKyK1FaisisgtREqKyKyKyKyKyKyCkisisisisisitQWRWorIrIJILIoSKyKyKyKyKyK1 FaisiyKyKyKyKNRWorIrIpIrIrUVqKMisisitRSorIrIrIrIrUVqKyKyKSKyK1FaipIrIrIr IsisisisisikisisisilRWorIrIrIpIrUVqKyK1FaisisijIrUVqKyKSKyKyK1FGorIrIrIp IrIrIrIoyAyCyKkgsgsgsgsgNQkVqIkiMisgJIrIjIrIjIrIjILURqCSIyKyIyC1FaiMisgh IrIjIrIjIrIjILUAaiMisgsitRWorIqSKyKyKyKVFaisisisisisisisikisisisikisisis isilRWorIrIpIrIrUVqKyKSKyKyK1FKisisisisikisisisikisisisisikisisisglRWorI IyKyKyKyKSKyKyKyKMisisisisisisisikisisisisisisitRWopIrIrIrIoyKyKyKyKyK1F aisikisisitRWopIrIrIrIpIrIrIrIrIpIrIrIrIpIrIrIrIrIrIrIrIrIpIrIrIrIoyKyKy KyKSKyKyKyKNRWorIrIsisisisisikisisisipIrIrIrIrIrIrUVqKkisisisiyKyKyKyKyK yKyK1FaikisisisitRWorIrIrIsisisisijIrIrIrIsisisisisisitRWorIsisisisisiyK yKyKyKMisisisisisisitRSorIrIrIjIjUVqKyKyLIrIrIrIlKKv7lAAQcAongqqoNqAAg+e +fpJ/L/r3le/zv7Y55e9fu+83z8bnz3uDm77+19/6Gv7+RuPntTrlcfYqe/5+7+/XHf8vmsz /O/dezWvnGZec98+v7UKya1Va7359R/fufuRk679qft7+73+z3O8nv25WsefN438+H19vms/ Xxz65zX15zuFUPwqhABRQfrvz79b1j6+3n3+vfvX23ve/v9+c536+vrnPrvPrnMY7+/ZUxHv c5mZF51P793vc1rmZrIzWfv36/2XkR73Z97O9O97WXWtVbP3f3P81GuRB73a97O97me96l3r Vwz939z/Nb9rznLqphzbe8u+S5ydzyeVneZL5yb3vK5VKhzetZVbi+cjccjk53ic+cm97yuV Soc3rWVW4vnI3HI5Od4nnz5yK3tPezcxfM03hys7zUbvdzye5P+d6ve8rvaVDmazeHKzvNRu 93PJ7k/53q97yu9pUOZrN4crO81G73c8nuT/ner3vK72lQ5ms3hys7zUbvdzye5MfPeXzmX3 vbXPM/ZrDlTv9mr1e/cz3+c4ne8nveyqeZ+zQ5U7/Zq9Xv3M9/nOJ3vJ73sqnmfs0OVO/2av V79zPf5zid7ye97Kp5n7NDlTv9mr1e/cz3+c4ne8nnJVG8/Zpd8dnms3d6jeRv588re8nnJy o2/Zpd8dnms3d6jeRvn375XOZ3nJyof2fl3Ls81m7vUbyN/Pnlb3k85OVG37NLvjs81m7vUb yN8+/fK5zm9wn1/z9dUp6u73vd3uON7+e5xXMqvdz3r73tPe9S71q4Z+7+5/lb5G45vczHt1 +rWVTr1d3ve7vccb38+eVvcb3Cfbv81dU69Xd73u73HG9/Pnlb3G9wn27/NXVOvV3e97u9xx vfz55rXta8ju6/NUcdnjOc4cnud5z58jN7jWoye7v9mrxx2eM5zhye53nPnyZznJ3qcru/fs 1eOOzxnOcOT3O858+TOc5O9Tld379mrxx2eM5zhye53nPnyZZ3tc3XK17+z9F469Pds73p2c 5vc/ftf2L7XN1yte/s/ReOvT3bO96dnOb3P37X9i+1zdcrXv7P0Xjr092zvenZzm9/PlVi+1 zdcrXtfs1F48iO7Z3vTs5ze/nyqxfa5uq/e/Z+9eOve1ec5y7qqd5z58u87fa5uq/RGs1F49 73tXnOcu6qnec+fLvO32ubqv0RrNRePe97V5znLuqp3nPny7zt9rm6r9EazUXj3e/rze5u6q nec+fLvO32uc5VajWs1F493savOcq+Zd3nu9j7ce9fuer0eqIrveO97S6b3c/vZr2u/5VdiO T3nOTGo1qdQt7vY1ec5V8y7vPd6+/fr3b7XOcqtR+z9F47HY1ec5V8y7vPd63/f389fa3vdV r37P03jsdjV5zlXzLu893vz4evmtama9rWau8en3p3ed7fvdy7vI77556+a1qZr2tZq7x6fe nd53t+93Lu8jvvnnr5rWpmva1mrvHp96d3ne373cu7yO++eevmtama9rWau8en3p3ed7fvdy 7vI77556/379M13Ws1d5iKiK5fe33vF3ee7756/V+/fpl3Ws1d5iKiK5fe33vF3ee7756/Ze taqs9rXdXeYioiuX3t97xd3nu++ev2XrWqrPa13V3mIqIrl97fe8Xd57vvnr9nb3vdUyd7ja cer3qq89573cERHvkfYuM9e97u2TvcbyT1e9VXnvPe7giI98+ev2dve91TM3uN5J6veqrz3n vdwREeffsIzze93eZrXtZC1e9VXnvPe7giI9779+9zla0pmfvZknar1cq8iER7CqmZibmI97 3no9URXe8vve0um93P72a9rvy7ueu61Mp/u1cZaq9XKvIhEewqpmY+fI9nb1pc5n72ZJ2q9X KvIhEewqpmY+fI9nb1pc5n72ZJ2q9XKvIhEewqpmYffsxnmtZM5/dIWqvZHbJlMxiZiI9f37 Hr9etciL7lxd5VVkdsmUzGJmIj0ffser1a1cz95l+usmfZHau5nJmMTMRHov+/pi4vWuTPMv 11kzOR2ruZyZjEzER75892u1+uIv+5l+u8V7I7ZMpnER73u/Pnez2f1xFf3Mv13ivZHbJlM4 iPe935872ez+uIr+5l+u8V7I7ZMpnER73u/Pnez2f1xFf3Mv13ivZHbJlM4iPe93++/e9ns7 1cV95l+v1R17k0iLhfvd72/nzvZ7O9XEV/dXFxc9e5V3EXC/e73t/Pnez2d6uIr+6uLi569y ruIuF+93vb+fO9ns71cRX91cXFz17lXcRcL97ve38+d7Pdfr96f7ivbqKnyO0iL8vvecvEGT EREej1RFd7y+97S6b3c/vZr2u3dz1r9J7+5T28ip9kdrIi/L73nLx9+e9XtfkRX9zL9u4qfZ HayIvy+95y8ffnvV7X5EV/cy/buKn2R2siL8vvecvH3571e1+f0RX7mXq4qe56qyIvy+93eP vzva7r8/vVX53G03XveqsiL8vvd3j7872u6/P71V+dxtN173qrIi/L73d4+/O9ruvz+9Vfnc bTde96qyIvy+93efHe13X5/eqvzGkXPe12qyZuHeavPjnKrX5/eqvaY2nk97XarJm4d5q8+O cqtfn96q9pjaeT3tdqsmbh3mrz45yq1+f3qr2mNp5Pe12qyZuHeavPjnKrX772Z6Y2nk97d+ u8qk+97u7z3173q1+++nhik8nvbv13lUn3vd3efHe9rX772Z6Y2nk97d+u8qk+97u7z473ta /fezPTG08nvbv13lUn3vd3efHe9rX772Z6Y2nnOXfarJm3ve7u8r1/c72ve97PVEZ3vHOVl0 3uo/Xmva7d3PWv30727tvJ5zl32qyZt73u7vPjve1r997VV4zN5XOcO3dzNve93d5X173r1+ ++u78zNZO9jt3czb3vd3eR9e96u71/eqvGZud73d8mURfe95pk/b971d3r+9VZDM1OtDlVUR fe95pmfXveru9f3qrxmane93fJmYiu97zV5n173q7vX96q8Zmp3vd3yZmIrve81eV9v3vV3e v71VkMze524dqoi+c5uWV7+uIivb1/RWeZmrnbh2qiL5zm5Z8vvezzev7szkGZzlc5w7VRF8 5zcsv7873s83r+7M4Zm9y5w7VRF85zcs+X3vZ5vXv3pnJM3ut72VXvXve7ll/fne9nm9e/em cM1qW9lV7173u5Z8vvezzevfvTOSZvdb3sqveve93LPl972eb1796ZyTN7re9lV7173u5Z8v vezzevfvTOSZvdb3s7VRF85dMrH07Xu9zte9ld45ysvlOcrUavNxv19ues3q/2TkzmZvdb3s 7VRF85dM+Oc5HN6n96ZyczN7re9naqIvnLpnxznI5vU/vTOTmZvdb3s7VRF85dM79d72O7n+ icjMxud73d9qohzl0z45zkc3P96ZyczN7ne93faqIc5dM+Oc5HNz/emcnMze53vd32qiHOXT PjnORzc/3pnJzM3ud73d9qohzl0zn13vZn3Pfv0Tk5maytaOVXvZzlzmfHOcme87+/emcrMz e61o5Ve9nOXOZ8c5yZ7zv796ZyszN7rWjlV72c5c5nxznJnvO/v3pnKzM3utaOVXvZzlzmfH OcmY932tRPMrMze/343M97nOVmZ8c5yZj3fa1E8yszN7/fjcz3uc5WZnxznJmPd9rUTzKzM3 v9+NzPe5zlZmd/fzvezMz2da1kZmZv9+u9xHeuczMzv13vZmY7GtayMzMzmtHJnub3Aqqrl5 3udr3srvHe9rL7TnL1Oozcb9fbnsrzsa1O5kZzmtHJnub3BH2+c5EXnY1qt5OZm9/sOTPc3u D5e9796877Wp3k5mZzmtHJnub3A+fXOciGd9e93yczNa/fruI41r1/5Ota5VOq3uuZWZm9/v xM8zWvFz/X3vYM7Le3JzP35+u4jjWvXfyt7327d9W91zKzM3v9+Jnma14jn9Xe98vOyc5zK3 jWfiZ5mteJ+1znPOZ313zl5eczVfvxM8zWvFffm976vO+u+cvuZzNa/fruI41r138ze99Xnf XfOX3Lzub3+/EzzNa8V9+b3vq87675y+5nM1r+u4jbWu3fzN731Wd9d85fcvO5vf8TO81rp/ nyt731Wd9d85fcvO5vf8TO81rrfyd73c5zLueX3Lzub3/EzvNa6fK3vfVZ313zl9y87m9/xM 7zWul1Mzys712veyu8d72svtOcvU6jNxv19ueyvOxd85fbt3N7/iZ3mtdPlb3vqs7675y+5e dze/4md5rXTf2uc51Wdi75zmVnMzf8TO81rp8re99erPRd973uXnc39JnV5vffz5O9768z0X fe97l53N/SZ1eb338+Tve+vM9F33ve5edzf0mdXm99/Pk73vrzPRd973uXnc39JnV5vffy/t c5zyO56LvvMvNzm/4iKzWu/rz59vnOdqvZ6LvvMvNzm/4iKzWu/v8nWtbiMz2Xfecy85Oc/i ZvNa7+e+1znOzxnou+7y83OV/Ezea138+Vve+TLPRfb93uXne1nfzU3n79z8+Tve0yz0X2/d 7l53tZ381N5+/c/Pk73tMs9F9v3e5ed7Wd/NTefv3Pzv2ec4njPRfb9zLznKy/zU3n79z8qq ab1EQcz3pzuX/f0ZP79v13+5+ye9nY7na97K7x3vay+05y9TqM3G/f5veuzyc96fVEZneZ3v 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 WUaj24MSGWhkVVSaaiCwmTG1tSDWamTNV46lSMQ3uWKKmkVd9iovSefPN301dy7UxgjmRmVm nRhtyHXTN3MfpN2/YS5Vzdz0tbWZx2veAAsQfADwzpM+5Pc/BSVa+F2bIMXZM6hxxJRDjdoN VwMJJR/A3AgKIR+uMKkCSRCxqAn31e3Nv7QKIHEKU/MikwvnPcKKdonyM5WcI285UX23dd9Q y8ltliCLHeU4ryO/qszLXJ2JsFLqOX1YzBOl6HfQXo46cvEddXKuQ0KuKbIpgk08c3hs1B7k N1l+djuS13eF85amDYKLmme7jt9j4ABVe7MXRDu3q6IEUnNSmyEGg+ENzFM5ITueKXVU0X1R qa8a7jOeGhfDi+FKiUaQfLGpc0bMgs4xgD9GLDACDoJ5YtRF7xyjhrQiYHpvlbsPlustunzG 2Tt3j9kOvKQb2xsboYz021kkoFujlvCly6pwsZhWUu0tXbXOwevz4neGurNhOSXEV2Z2FJkX nbl1yiN6YjXGPkH3J6VUu3dV21Ozos7QVZjp7eXcWFs5W6C1V46U1IVVVd65a6qjdq4o11HV YuVpwXu3nSqtBXeIWAKsxCsIYEgi5S+5EPgZeXvZN5Wa2849rR7lHQnWM3GlVw4IvBbsPc9c tXprqy1OwyV0q6D7EMsWiizSV5CnSpQfQEoopUKKVWlQiqBFQopFWlQopAClQ0YDKIPEQMqA HgIHAEDiAuwVMY+1+Vd3cqSv8k2rbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaLTbbbbbSSSSSS RJJqqqrd3aqqqqqqqqqt3dqqqqqqqqqs3WZmD8tVVVWgAAALdaAAAAAAALdaAAAAAAALdaB2 7u7u7u7u7u7oEQBFZwAB2/Mr1VT970b/Ik+faTy/Mu7kkkSSSSkky7VVAA6lA7uA7q5QDJJ3 AySZmgBdjSoAYB3Ae94AGSagyS7ySGVq1u68skkVpe3z8xW7WSSKgBgHcAgagIGoCBqBJJDZ JMwAzeAAWSTMAMUA3QOA1AQAzpJMwNknIUGABdncq3a0qqySRWlQCgVWlaVAAVAKruHdPe8B /P4crh+lbfXbHajfzczNbu1FWp6ZTLm8ReS3yT0YsSW6xhkuEh71usTdY5MVl4V/ik7n1oQw 99yv4gKUOpb06CqbF8WqH2fERq3KN7548ggX13LsfOpjpdIyrvJlX5uqpnUbaMuqlXN1BLJu 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 AgQiADCKoEIosP7qAAg/zVQ378fHLxi7lSqPjPzjGMYbbbbbbbbbbbbbbbbbbbbbbSSSSSSV tyNqNtttttttttttttttttttttt/4kkkkkbbbdU3VNtttttpAAAAKqnz58+fKqqqqqqqqqvn z58+fKqqqqqqqqiTVVVUSSfD1VVQACSSAASSQACSRtttttttttt5+1O8z/H+P8cku7u7szMz MzuX73lVczMzM6lAVczFu1QDdA4DUA3eAKBpUAySdwe94ADUBA1AuzSSTa5bvlVSSRW7eVUA BpUABUAySdwMkUGSKDJFD7774MADAAzpJJygBgAYySZgbJFBkkzNADAO4BAoMAKDuVpWlVUA BW7VAKBVaVu1c5znOe9u7u+97J3tgCfoqiKDznPfaq7v7X5MNzr8oF83QAAAPrd3W222225J I222222222222222222222222222222pFI22223kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjq lVVJJJJJJJJJJJJJJJG2293d3d3d0AB3zu4AAFWgAABzbQAAABERAGvnOAAAKqqqqrrtVVVV VWWWWVVW26qqqqqqqqqstaAIXf5z8SJF/h/kCSSSJJJJSSASSSd3d3c0oCrmYt2qAboHAagG 7wBQNKgGSTuD3vAAagIGoF2aABtPXfd3d3AAK3aqqAA0qAAqAZJO4GSKDJFBkih9998GABgA Z0kk5QAwAMZJMwNkigySZmgBgHcAgUGAFB3K0rSqqAArdqgFAqtK3aoACyT5W77381AAQflV D+wKJ/dFaBBgRFYRFAhFFYRVYRGEQVhFQYQRRRT/wRERH37/P2+sXd3XmKqsD789VVWVVVcA AAACVNltMttttJv/WSSSSSSSSSSSSSSSSSSSSSSSSSSSKSSSSNtttttttttttttttttttttt tttttttySRttttttttttttttttttttttt7u7u7u7rt3QAAAAAABu7oCqqqqqqqq0qqqqqqqq qqFVVVVVAAAAAAC69+37rPDW3vcv3fuAkkkiSSSUVu1VczMzMaUiqOLdqgG6BwGoBu8AUDSo Bkk7g97wAGoCBqFT774m7XNKqskkVbtVVAAaVAAVAMkncDJFBkigyRQ++8GTAMADOkknKAGA BjJJmBskUGSTM0AMA7gECgwAoO5WlaVVQAFbtUAoFVpW7VADPe3d3fe9k72xRPgFE/wqh/2o ACD+qgAIP/SgAIOQFEQf9lULVQtVCKof6UVf4qAAg4BRP4CIiI5FVVBwqh9e/j8sYxipVVR+ ck/Kkkkkkkkkkl/ubbbbbbbbaSSSSSSZbSSSSSSSSSSVttttJtttttttttttmKSNtttttttt tttttttttttttttttttpJmSNJJJJFIpFIpAAAAdd3aAAAABVVVddqqqqqqqqqqrbdVVVVVVV VVVbbqqqqqqqr2a3czM7u4AAfbM9nq9/Fn6H7xYQ9n30Pyf8QDbbcSSSSklSSSOZmZmKgqgr drJJmBskUAzuAKBu1QDdA4D3vEkmoMk5Cp998R1EAkkszMUdNtt5mZJKkhJJMkJJWgcBqAga gIGoCB994MmBkkmZwAHKAZJJmIAYB3AIGoBu8AZJO4GSXczACg1VpW7VVQAFbtZJLuKq3at2 skkVABW77z94CiIPqgAIP+yqHwCI/xUABBoVVUH+CgAIP6AolAgAg+iqqg6FVVB+6qH/CqEU ABB/wqhpVC1URQf4IAAoP6AokBRP3oAig/sKIijFFX+wKJ/FVDSgAIP3VQn+lAAQdqoQFE9V Q/3VQyKoYFVVB/AqqoPyKqqDaqH/CqGxVVQcggbiqogP/iir/VVEUHqqGVUIKqqDhAEUH81F XagAIPoKqqD+gKJoUOCiRFRQGCABFUNoqD6oACDEUAQYCiYUABB/JVCKoYBRNqoUqh/VVD/6 oACD4qiKDxVDQqqoP8VFXwQREHxVD/pBEVQciqqg9FERR//mKCskymsgINIhwKXjW3AMkggA f/6gAVf9u/oMGMPgAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAACAB8+1OAAAAAAAAAAAAAAAAAA AAFgfNbZJq20I00bMKKigKkq0DClFjwBfALvKbMWgZU0a002ZJUgSqVQqVN4OvAN08rWVaA2 mrFtVtsmmi20lKhLDwC8A416NCtSWzIhE2CmhJEsPDieAY8r1k21rWtNKA1EpQSqipKpmx47 wDvSkoO2NmKmFAC1QWlKWwAVUmeB4B7wj2qsllBQG2Blmas1rUi1TWzREFnnB3gGPXTUrKZZ GpAUKRrbVitmampqlKjeHZ4Bj1cbKBFJGtFVKWtICIDYaREix4B3gEeK9gzWmxq0swaxLQqj NWyKRVClFtqglCEpCqpSlJKUJCqUEQkkooqUqVSKipRGBi4BeAO4Du6A4B3dUcA4cFgEN0AO AcAAQqqf+p7e8TI/1SqqqYCZGExME00Kqfqqb/3qSf+qqqkxpqj1AGgAABqeQyKSqp+pMEaY EDTBNNCKfgglKlN6lRgAAAAMn72pVSmhHslPUAAAAARIgIoQgRE8Q9TSYMTqqCCD+D7fip+P r8XivgR2igOaUEARpgRIxjGKiiiSAqISAoEipJICSBJIqyIwjIqICj/0qKqDBREBH5Ef0EYq KqD+Yj/wI/uI/9ggf7Ciqg/ujQoCiDEYClCMARP+QBAEYAn7iP+gAgCP/oAgCP5oi/KfyVH4 BA/JBQ/VQcggfqiofqCp/MFT9VAP2BA6igdVXqCvQHqi9RV6p1BHqr1ETqg9RAOqgdQF4Cpw FTgKnFROAgcBA0gvQVNqjsEDaChtQdggbBA6gL1U6ip1ROooHVV6gr0FToAJ0FTinEEeKu0R NqDtEA0A9VTaCBtQDqIuwVNqrsEDoAUIhQKlKpwEDiKnFE4igdVXqCvQVOgqdUDqIhwUciAF DoVHxEr+Ap/GKyKyKyK7ilRWRWRWRWRWorUVkVJFZFZFZFSRWRWRWRWRWorUVkVJFZFZFZFZ FZFZFZFaitRWRWRUkVkVkVkVkVkVkVqKNRWRWRWRWorUVkVkUkVkVqK1FZFkVkVkVkVkVkVk VkVkVqK1FZFZFkVkVkVkVkUkVkVkVkVkVkVkVkVkVqK1FZFZFkVkVkVkUZFZFZFZFZFZFZFZ FZFaitRWRRkVkVqK1FJFZFZFZFaitRWRWRWRZFZFZFZFGRWRWRWRWRWRWRWRWorUVkVkVJFZ FZFZFZFZFZFaipIrUVkVkVJFZFZFZFZFZFZFaihUVkVkVkVkVkVqK1FSRWRWRWRSRWorUVkV kWRWRWRWRWRWRWRWRWopUVkVkVkUkVkVkVkVkVkVkBJFZFZFZFZFZFZFaitRSRWRWRWRWorU VkVkVkUkVqK1FZFJFZFZFaitRSRWRWRWRSRWRWRWRWRSRWRWRWRQkVkVkVqKVFZFZFZFZFai tRWRWRZFZFZFZFZFJFZFZFZFZFZFZFZFZFaitRWRWRZFZFZFZFGRWRWRWRZFZFZFZFZFZFZF aitRQkVkVkVkVkVqK1FZFSRWRWRWRWRWRWRWRWorUVkVkVJFZFZFZFZFZFZFaijUVkVkVkVq K1FZFZFZFZFZFZFZFZFaitRWRSRWRWRWorUVkVkSooVFZFZFZFZFZFaitQAkVkVkVkVkFkVk VkAZFZFZFZFJFaitRWRWRZFZFZFZFZFZFZFZFaiSLUVqK1FZFSRWRWRWRWRWRWRWRWorUVkV kVkVkVkVkVkVkVkBJFZBZFZEZAZFZBaiNQSRWRWRWRWorUVkVkVJFZFZFZFJFZBaEf4Ciqg6 AEARsUVUGxHAjBRVQfz/T7e7+Nefb7fX2/f4177v3fv9fe97v7n7z7nuc9XZmf8/adrsdj79 5z/nM3V3zNqq0qivbXpme9p2ux2Pv3nNmbq75m1WkJVVd2+8mT0Psy4+vcqZvdiM/IyLnaqr 23Jnfejfsy4+vcqZvdiM/x/IyLnZqr23Jnfejfsy4+vcqZvd+z8++yLnb5y9y11W+iP2759r N7yqyd+z8++yLnb5y9y11W+iP2759rN7yqyd+z8++yLnb5y9y11W+iP2759rN7yqyd+z8++y Lnb5y9y11W+iP2759rN7yqyd+z8iIybrbu7vnuTL77+1VO2yplMov8mZ7VUu7u+e5Mvvv7VU 7bKmUyi/yZntVS7u757ky++/tVTtsqZTKL/Jme1VLu7vnuTL77+1VO2yplMov8mZ7VUu2Zlr qqqI/f7W832b3lTvarZ7+VVVVVt3uZl7dVVRH7/a3m+ze8qd7VbPfyqqqqtu9zMvbqqqI/f7 W832b3lTvarZ7+VVVVVt3uZl7dVVRH7/a3m+ze8qq3vObXfzlVVVW97m973NyZn779/f2Vav vbmd9VbPffyp7VbTtbMy7TtdjsffvObM3V3zNqtpxThmO97jJmfvv39/Z2tX3tzO+qtnv52q qqre9x3vc3Jmfvv39/ZVq+9uZ31Vs9/O1VVVb3uO97m5Mz99+/v7KtX3tzO+qtnv52qqp3vb ZmXvsqqiP39/ac1nuRG9mfTn5lVVTubbMy99lVUR+/v7Tms9yI3sz6c/MqqqdzbZmXvsqqiP 39/ac1nuRG9mfTn5lVVTubbMy99lVUR+/v7Tms9yI3sz6c/Mqq9yt7ub3vczXec5Mx999zbt WeuZ31VU97+d5znr5vt73ve5mu85yZj777m3as9czvqqp7387znPXzfb3ve9zNd5zkzH333N u1Z65nfVVT3v53nOevm+3ve97ma7znJmPvvubdqz1zO+qqnvfztV7lb7czM93vdeu75UfffX s7PHIj2VVVWZ+Zznr5t7mZnu97r13fKj7769nZ45EeyqqqzPzOc9fNvczM93vdeu75UfffXs 7PHIj2VVVWZ+Zznr5t7mZnu97r13fKj7769nZ45EeyqqqzM5z1829zM9mZrvOc2+TERszm1a 5mcmZnMqe5zan3uKqt7vp997uR9dqrOZndmYjszN3zl6zMO85zb5MRGzObVrmZyZmcuZ9lbz bt7MzXec5t8mIjZnNq1zM5MzOXM+yt5t29mZrvOc2+TERszm1a5mcmdqu5VO85zePXd6xW8q PriItPPcmbiEzm5TvOc3j13esVvKj64iLTz3Jm4hM5uU7znN49d3rFbyo+uIi089yZuITObl O85zePXd6xW8qPriItPPRF/fIzNyneVtPc5zV37m3yc+++z0XczPIjZzN7T3K2nuc5q79zb5 OfffZ6LuZnkRs5m9p7lbT3Oc1d+5t8nPvvs9F3MzyI2cze09ytp7nOau/c2+Tn332ei7mZ5E bOZvaVOz7tVW85lOUz777Ni7mZ5EbOZvaVOz7tVW85lOUz777Ni7mZ5EbOZvaVOz7tVW85lO Uz777Ni7mZ5EbOZvaVOz7tVW85lOUz777Ni7mZ5EbOZvUxse7PdqslU7uREZF3ERzkbN1M9v ldne82qre76ffe7kfXaqzmZ3ZmIj6orUlVk7U+3IiMi7iI5yNm9zY+2O5ObVbKp3ciIyLuIj nI2b/u5v9+2O5ObVbKp3ciIyLuIjnNi9nNyNnsZszsW3c+++z03czPb2M2e9yNnsZszsW3c+ ++z03czPb2M2e9yNnsZszsW3c+++z03czPb2M2e9yNnsZszsW3c+++z03czPb2M/NnvcjZ7G bM7GY3ex91GZEc9exn52e9yNnsZszsZjd7H3UZkRz17Gfz+dnvcjZ7GbM7GY3ex91GZEc9e5 +djvczZ7GbM7GY3ex91GZEc9exn52e9yNnsZsz9d+Mj7PRdxHePr/OxmXCcjEz9djI+z0XcR 3j6/zsZlwnIxM/XYyPs9F3Ed4+v87GZcJyMTP12Mj7PRdxHePr/OxmXCcjEz9djvZjvpzIj1 vrjsLqtnc56qre76ffe7kfXaqzmZ3ZmZVU8qdgmfrvfb3sx305kR69+v89GZcdnIxM/XY72Y 76cyI9b6/z0Zlx2cjEz9djvZjvpzIj1vr/PRmMn1dnszP12O9mO+nHZln31/nozGT6uz2Zn6 7HezHfTjsyz76/z0ZjJ9XZ7Mz9djvZjvpx2ZZ99e/xPe72len0zP13u73sx305vZln317/E9 7vaV6fTM/Xexu97U99Pd9Ms++zN/m17z3OV6fTM/Xexu97U99Pd9Ms++zN/m17z3OV6fTM/X exu97U99Pd9Ms++zN/m17z3OV6fTM/Xexu97U99Pd9Ms++zN/k977tVPartVUbO1O73vKn09 30yz77M3+T3vu1U9qu1VRs7U7ve8qfT3fTLPvszf5Pe+7VT2q7VVGztTu97yp9Pd9Ms++zN/ k977tVPartVUbO1O73vKn0930yz77M3+T3vu1XZnszMbO1O7nuR6O76Os++zJ9Ps5zZ3vFVX e76ffe7kfXaqzmd2I/IQ7N1symZjs7U+3Pcj0d30dZ99mf43/E977s12Z7MzGztTu57keju+ jrPszf5He+72uzPZmY2dqd3Pcj0d30dZ99mf43/E977tdiOxFxs7U7uV937N7Gev62/yO992 ciMiOxs7U7uV937N7Gev762/ye992exHYi42dqd3K+79m9jPX99bf5Pe+7PYjsRcbO1O7lfd +zexnr++tv8nvfdnsR2IuNnandrOR2M2ZnPXEQjf8f4733Z7EdiLjZ2p3azkdjNmZ9z775v8 d77s9iOxFxs7U7tZyOxmzM564iG/ye992exHYi42dqd2s5HYzZmc9cRDf5Pe+7PYjsRcbO1O zdfZ9aZm+7ERuz3vuz2I7EXGztTs3X2fWmZvuxEbs977s9iOxFxs7U7N19n1pmb7sRG7Pe+7 PYjsRcbO1OzdfZ9aZm+7ERuz3vuz2O/fX9sbd1tZyI+tMzfdiIjsduqnaZfuc5zm76vRHvdm Mxznec77Zn8nY30zsb99770eu69WciPrTM33YiN2e992ex376/tjbutrORH1pmb7sRG7Pe+7 PY799f2xt3W1nIj60zN92Ijdnvfdnuz6IyIjbutrORH1pmb7sRG7Pe+7Pdn0RkRG3dbWciPr TM33YiN2e992e7PojIiNu62s5EfWmZvuxEbs977s92fRGREbd1tZyI+tMzfdiI3Z733Z7s+i MiI27razkR9aZm+7ER/N2e992u7PojIiNu62s5EfWmZvux9ux3vuzmz2I9ERt3W1nIj60zN9 2Ijdnvfdnuz6IyIjbutrORH1pmb7sRG7Pe+7Pdn0RkRG3dbWciPrTM33YiN2e992e7PojIiN u62s5EfWmZvuxEfzdnvfdruz6IyIjbutrORH1pmb7sfbsd77s5s9iPREbd1tZyI+tMzfdiI/ m7Pe+97ntpMdiI3MrKzkR9aZm+7H33fu3MztLv3Oc5zd9Xoj3uzGY5zvOd9sz+Tsb6qrcrZj 0RHsysrORH1pmb7sRG7Pe+96vbSY7ERuZWVnIj60zN92Ijdnvfe9XtpMdiI3MrKzkR9aZm+7 ERuz3vver20mOxEbmVN199lpmb7sRG7Pe+96vbSY7ERuZU3X32WmZvuxEbs9773q9tJjsRG5 lTdffZaZm+7ERuz3vver20mOxEbmVN199lpmb7sRG7Pe+96vbSY7ERuVnKvkfZiZnL2Ijdnv fe9XtpMdiI3KzlXyPsxMzl7ERuz3vver20mOxEblZyr5H2YmZy9iI3Z733vV7aTHYiNys5V8 j7MTM5exEbs9773q9tJjsfbk5U3UfZaZnLvZmd2ve571e2kx2PtycqbqPstMzl3szO7Xvc96 vbSY7H25OVN1H2WmZy72Zndr3ue9XtpMdj7cnKm6j7LTM5d7Mzu173Per20mO9mN7XeVlR93 EzOZmbVVUzN1U+pl+5znObvq9Ee92YzHOd5zvtmfydjfVVblbMe7Me7XeVlR93EzOZmbVV7e HCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN7XeVlR93E zOZmbVV7eHCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN7XeVlR93EzOZmbVV7eHCm0mO9mN 7XeVlR93EzOZmbVV7eHCm0mZ72p3vO3Xaj7MTM5mZtVXt4cKbSZnvane87ddqPsxMzmZm1Ve 3hwptJme9qd7zt12o+zEzOZmbVV7eHCm0mZ72p3vO3Xaj7MTM5mZtVXt4cKbSZnvane87PZ+ /btMzd33aqvbw4U2kzPe1O952ez9+3aZm7vu1Ve3hwptJme9qd7zs9n79u0zN3fdqq9vDhTa TM97U73nZ7P37dpmbu+7VV/Pbw4cbSZnvane87PZ+/btMzd33amYiLmZ9S79znOc3fV6I97s xmOc7znfbM+j3p9Xuc5m5t3VCX3e5H1+3vKrPbEdjvZ7Xec5m4u6rSX3e5H1+3vKrPbEfzsd 7Pa7XOZuLuq0l93uR9ft7yqz2/R2O9ntdrnM3F3VaS+73I+v295VZ7fu/d+yMuqvbcmd96N+ zLj69ypm92IzYj9CP5ACAIwR/dUVUH91RVQf9lRVQbQFRTKKERJJISEkhISEjISEISEgAsFC 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 pUHQIGkVcKeBA8goeFF8CBkEDoguhFMiqZBUyKJwEDgIGwQPCg8BU4Kh0RHor0BA6Kj0FToq HuogZUFygpwEDCjlTIIHFXbfzbb+dW2KioqKioqKxUVFRWioqKioqKjV+8rcqKio23K3Kioq KirlbcqKiorFRUVFRUVFRrYqKioqKioq5VysVFRUVYqKioqKioq5VirlRUVYqKioqKioq5W5 UVFRUVcq5UVFYqKuVcrRUVFXK3NRtsVFaKioqKioq5VysVFRUVcuVFRUVFRUVcq5XKuaiorF RVyrlRRUVFRUVFRUVFXKuVGooqKioqKxUVFRUaioqKirlXKjVioqKi2KioqKioq5VyooqKio qKjUVFRVyrlRUUVFRUW2KioqKisVFRUWioqKirFRUVGoqKuVcrRUVGrlyoqKiorFRUVFblXK ioqKKioqKsVFRUVFRUVc1Yq5UVFWKioqK2KioqNtuVcqNsVFRUVFblXKioqxUVFRWKioqNo1 cq5tua5a5VyoqKioqNRrFqLRtcq5qNRqKio1Go1FbmrcqKiosVFRUVGxUVFRUVFRVyrmsVFR qNaKioqKioqKi1FRUVFRVyrlRWKioq5VysVFRUVioqKiorFRUVFWKioqKxUVFRUVFXKuVFYq KirlblRUVFRWKioqKioq5VyrFRUVFRUVFRWioqKioqKuVcrFRUVFXK3JZFZFZFZSKh/EBFEG gAeIgAI4ARRB/03/D9/4Vj8fmV8/rn8335+d+5z9P13+ft9/5bpvUTe5+zFLzv97915eZzNx njPf7Xvu4pGvm+Z99/r6/FzPftr5X39+PnUV/KKwBBUHs+q5rEe++eR39rd19zvfv+f8/599 9+N0qL7ERETve973uu95/Y7n3e22Zmc5nczsd8Zftd1rm+Zm/e+zrWo1HbiL70b75U+ceub5 fd+99nURXlGbqJiXI175Je6jtb37ftbz4/WzNzExjka98kvdKje/b1OW/YNzEwcjXvkl7qFc j2/ayH7GZuYmMzka98nF7qFcj2/ayH7GZuYmMzka98nF7qFcj2/a1t+uqTuZibc7GvbdRkXG /M8nXftTPeb5yO33nY17bqMi435nkxvv6p7zXOb7fedjXtO9jIuN+Z5Ou/ame83zkdvvOxr2 3UZFxvzPJ3vv7nnY1Eb7XedjXvXWbvevM85rv2L7Gojfa7zsa966yIuN+5572uX2NRG+07Lm 9adZEXG/c8/ve1y+xqNdp3iN607lxHY37nnvYvu51EZ23YjXvrq4io37fnvY73c6iM7bsRr3 11cRUb9/a97973XNdjO27Ea99dXEVG/f33eb372svM7nd98qfOPXN8zOxruqcz7dxGovlnYj XvveriKjfv75r2+/u9nWoztuxGta07Gdma5Hv7Xt9/d7ud7jvb6iNa1p2FzNcj7915ffznNa glkRrWtYjLma5H39+19t+c5rUEsiNa1rEZc1G/v332rePea1GczMiNoiHOZdVXI+8/b3q3j2 da5nJzIjaIRGXMzEa/fvuvbePea1F8ZkRtEIjLmZiNfv33XtvHvNai+MyI2iERlzMxGv377r 23j3mtRfGZEbRCIy5mYjX79917bx7zWovjMiNohEZczMe/fv33y3j2Nai+LuI2iERlzMx79+ /ffLePY1qL4u4jaIRGXMzHv3797r3Ozrup3OV3mRER3nO85czMx798/fu613s67rm5yu8yIi O853nLnnOR7+/fv3da72dd03Su8REQ5zvOXMzOVO/JnOc95y8yuu775U+ceub5mdjXdV9+Yv Vbc1mp3mU52IiHOd5y55zJ5rz9+/d3vsanfdopHeIiIc53nLmZnKnfn79+7G+xqt93UUjvER EOc7zlzMzlTvzzzzzsb7vVb7uop2G972iu85czM5U7888887G+71W+7qKdhve9orvOXMzOVO /PPPPOxvvta7Wqd2re95Fd5y5mZ7U7888887G++1rtap3at73kV3nLmZntTv333777Gu813V a7erd3cVERnK7MzM87PNV7777Gu8juq129W7u4qIjOV2ZmZme1O/ffffY13nfa97d27u4qIr nK7znOcjveb99999jXeX7nvbu3d3FRFc5Xec5zkd7zbWtarcx2s9XmZXdXdRFc5Xec5zkd7z bWtarcx2s9XmZXdXdRFc5Xec5zkd7zbWtarcx2s9XmZl97BkzlTk85znIvvNta1qtzHaz1eZ mX3sGTOVOTznOci+8iG973URHaz1eZmX3sGTOVOTznOci+8iG97nPZ1rU2quu775U+ceub5m djXdV/azvcjfvMnM7fewZM5U5POc5yL7yIb3vdREdrPV5mZfewZOTzORERcX3kQ3ve6iI7We rzMy+9gycnmciIi4vvM5xERF8iO297bMy3YMnJ5nIiIuL7zOcRERfIjtve2zMt2DJyeZyIiL i+8znERHyL5znO213DGZ2DJyeZyIiLvsZEN3EXznOdtruBmdgycnmciIi77GRDdxfPnOc522 u4GZ2DJyeZyIiLvsZEN3FzP2Zme211QzOwZOTzOREXfd5vbdRWT9mZntt76obzsGTk8zkRF3 3eb23UVz5znOdrN77nRvOwZOTzORERd9jIhu4vnznOc7be+4G87Bk5PM5ERF32MiG7i/efec 572299wN52DJyeZyN7u+7zdt3F8+c5znbTEdw03nYMnJ5G9aqus3bdxfPnOc520xHcNN52DJ yeRvWqrrN2iL5c/JmZ7aYjo03nYy+XyNtaqus3aIvl+2+73vd1VdR3fffOecz2NRXe701P9q 6gyeXzl9xruyMvl8jbWqrrN2iL5c/Jm6ruK5zve913ZGXy+Q99qus3SIrlT8mVV3Fc53ve67 sjL5fIe+1XWbrvecub/V9qu3d4vnO9773WZu6iuRnvva6zdd7zlzdfKrt3eK5zve913ZGXy+ Q99qus3Xe85c3Xyq7d3iuc73vdd2Rl8vkPfarrN13vOXN18qu3d4rnO973XdkZfL5D32q6y4 vvZnKy/l327t2uc73ve6N5cXcPfarrLi+9mcrL+Xfbu3a5zve97o3lxdw99qusuL72Zysv5d 9u7t25nuu97o3l3e3lVXWXF97M5WX8u+3d27cz3Xe90by7vbyqrumXy+9qsur+Xfbu7duZ7r ve6N5d3t5VV3TL5fe1WXV/Lvt3du3M913vdG8u728qq7pl8vvarLry/t327u3cmZ7vO93pvL u9vJnvq6iu97WXV/Lvt3du3Mz3fe93pvLu9vJnvq6iu97WXd/Pl327u3bmZ7vve7ay7vTznO +lRXe9rLu+1ERERd3aO7775zzmexqK73emtT/buuGduqmZzeO7ay7vTznO+lRXe9rLu/ny77 d3bt1VV2DT3MzM28mXpcXbtZd38+Xfbu7duqquwae5mZm3ky9Li7drLu/ny77d3bt1VV2DT3 MzM28mXpcXbtZd3n37mdzMznbqqrsGnuZmZtMvC93btXd38+Xfbu7726qq7Bp7mZmfecycyl 27WXd/Pl327u3bqqrsGnuZmZ95zJzKXau3mZn98+ZnczMzt1VV2B5mZmfYjMzKXau3mZnn37 mdzMzO5VVXYxp7mZmfYzmZKqT3uZmfPmZ3MzM7dVVdg0zMzPsRnMzF2rt5mZ8+ZnczMzt1VV 2DTMzM+xGczMUntXd38+Xfb7mZ26qq7BpmZmfYjOZmKT2ru7+fLvt9zM7dVVdg0zMzPsRnMz FJ7V3d/Pl32+5mduqquwaZmZn2IzmZik9q7u/ny77fczO3VVXYNMzMz7EZzMrFq7eZmfPmZl 9zM7dVVdg0zMzPsRnMysWrt5mZVciIiLvuZHd99855zPY1Fd7vTWp/t3XDO3VVVVkO6ZmZn2 IzmZWLV28zM+fMzL7mZ26qq7BpmXeRGczKxau3mZnz5mZfczO3VVXYNMy7yIzmZWLV28zM+f MzL7mZ26qq7BpmXeRkZk4pPavuZ8+ZmX3Mzt1VV2DTMu8jIzJxSe1fczX37mZfcznbqqrsGm Zd7vd3y047V9zPnzMy+5mduqquwaZl3u93fLTjtX3M+fMzL7mZ26qq7BpmXe73d8tOO1fcz5 8zMvuZnbqqrsGmZd7vd3y047V9zPnzMy+5mdu7u77xvTMu93u75acdq+5nz5mZfczO3d3d94 3pmXe73d8tOO1fcz58zM7d32qqqrvM3rMy73e7vl9nHavuZ339+Gru+3dVVd5m9ZdVXtVuu8 vOrZnz5mZ27vtVVVXeZvWZlarVVFd5btWzPnzMxd32qqqrvM3rMytVqqiu8t2rZnzMxd32qm qrtTkbz3K1WqqK7y3atmVXIiIi7Zkd333znnM9jUV3u9Nan+uoy+zzicqsqUbz3K1WqqK7y3 atmfMzF3faqaqu1ORvy59n2Zyu8t2rZnzMxd32qmqrtTkb8ufZ9mcqKxNZd/Lu8u7VU1VKnI 35c+z7M5UViay7/vl3eXdqqaqlTkb8ufZmcrdY5OVny7vLu1VNVSpyN+XPs+zOVFYmsu/l3e XdqqaqlTkb8ufZ9mcqKxNZd/Lu8u7VU1VKnI35c+z7M5UViay7+Xd5d2qpqqVORvy59n2Zyo rE1l38usqqTPJkqcjflz7PszlRWJrLv5dZVUmeTJU5G/Ln2fZnKisTWXfy6yqpM8mSpyN+XP s+zOVFYmsu/l1lVSZ5MlTkb8ufZ9mcqKxNZd/LrKqkzzhPM3nlz7PszlRWJrLvz7dZVUqucJ 5e88udT7M5UbxmVXypyZknnCeZvPLn7rU6mcqYxOVSZ5ERFdZm7298555y+b5He936zV/17q u8iHOLnjby5+61OpnKmMTlV8qbmZJ5wnmbzy55+3ud+zlTGJyv6eXznDnOZk8vby55+3ud+z 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 tQjToMNnCL1fCgvdIWSQqQFlxfCpfuoQ+1E6fgj80gCTfMknN5HZA7HsTMDsQK77Wb17G0fR DUGRdxDN45fObmzkLnp2MyXz1Y5m8COONjyu+ujonRakKnbFEOo9B7JlhRk8QuVu2LF2Msvv GOrx2NfGj5bi2h6hdZ4VO+1fpneyub5NaoPR92jUD0TmjuzOTsE3OTkMQJH0M63nnNJuFRDm bsKg6x3eq7nnuDyFROx1dE9SZhkNb8bvGq2ya9716L+YAH2xsoqI2Xdmo62A3xqLjTM66DxT Dpq6y7smoBj1x9pzxjplxPhzyYB3Y7dDu7l1b0pcV6LcM6yRitd3UcrdlltZW7J5cFsS5G93 aBpOpyKsO5lSwmrG7eMdmXcUWFOTPsd3lVm2Lu2NVZajzMpu7IVNuPu470W48vg8RmhdKu7X M6cgeHb3lqq1Yxu+6IdnQNdN3t7tuU+rkdb5WxmkPAOUtaxy6LxyOtBlSVC2hEBSmggat4LI EKY5DpINuFcuY2ucwmlDahJ7HjhKzGbfF5y27aw405zq2+zYVu1Jj7O9NFNXbkAOLtzcq9RO C9VVn1zEypGXFgv7RhvOpxkW8r19UinTp1R3ZjtV6K2jfA6HeHMrGtE4Z1LhSbjXbMo90Lld 15Fyo7ZA6+uY3lJ9w5PJvThFqEFzcZZN09E9axoQ80WWIoNXbZ10yC8OKtuWk9y5hnURSpnL uTQeStd19danWFaJkGpXkOMqVfNX/YDIgofuqIqoPihVgmgATKivNiAZBUyghxUHoIHwPvvh /u/yD/pfj/f2E/xJJJJJJJJJJJJJJJJJJJJJBJJJLW2222222222222222222222222mW3sk kkkjbbbbbbbbbbbbbbbbbbbbbbbbckkbbbbbbbbbbbbbbbbbbbbbbbbbSSSUbaSSSSSSSSSS SSSSSSSSSSSSbbSSSSSSSSSSSSSSSSSSSSSSTbaSSSSSSSSSSSSSSSSSSSSSSbbSSSSSSSSS SSSSSSSSSSSSSTkkSbbbbbbbLbSbbbbbLbSbbbbbu7u7u5d3jEkkkkn2RX8qifEAVTJX1VU9 3dz/P5AGkk2kl/GkkDbc4A7m2230AO7m2+rpLuSSSAASQA3QOA2AG7wB3c233XcgAXZJJJJ0 uTd3dkkklSQCSSSASSSSSQCQCTd1NhQOSQA7ucSUgA4kkpJUku5IAboXYJJXa3QDdL9fgN2A GpJNydJJdyRJJSSACkk7u5JJSQAGB3AQCgYAHdADdA4AH1dJJIksY73uc5znWc5wogKDnWvx RrRMbMez30/sL7x4N2KY0ORLQVmaPrR7n9m3enAsypiWt3+tVVe1DuKR6+g/eg3b/Mf43uVl sgzewq12ohn4rOz1ng6axbph559WCqQ9Wjz05fNM+Zwepi6VdW0ra8ownW090bqFc5zuDPdY kxjGJWsYdqCbQBVPsCHx3PvnaxflP1pz7h1aJhbh/ZarvwjwngQLyB8cfqY3Pj0GLPWflK1g qAtaQERCEfn23nqpivbNdMGhTzgJgVaYXNvtL54D9mHYpqxnTvHhd4qNCti3IwthWasOEb3n OlQtEFAD4oHr9U9nXsYk7PVnmJUaoYlvszRl5j7qFoTVyRda+Jd03IVrByTkAKnVixodheUI dw7NgRGZbhJN3sVRHceoywkhDcKO1lNVBmc8i41V5pFM2W9jgMFPEsru6rpObdreygjUkVQ0 AAr5QN1e+8zyTMlarONaJ75U0f3IMjogK68zo7o1SHH7jRBNNImu/eVBmj9up6gse3g4rcqW mjhp22FkcX0qkSLF2blqvZVwSnh5FkE/c+dGjpG14KSV1MegrBhtm/VuZaWXu1kooMT5vUZ2 eW8vYUvENDub9htLMU7U/ZuHPKO2nzMO3vc5LvlbQX4oHflw+VRqaj3Wc51d+ql7xRYw2v28 eqC1EVAlbexVjo9t7KWORdAlGKuzVMXBanKs41d5Mm27gKl0qcd8IdUzrmZRpi0xkSih67x2 FR3qt54ATpvO3TSnnu9NVqZvu+Y9vIp4UuyT2wKZyhuqqcl0EqSYCSkiaXY81vAPgB+++ACk 8vZ0tGnNqDFnzXtNObj3049liknMjwVHHWvlUyEdlbjrJaEU7tru9H0fsdrzzOia6+VdHU95 02z2OI0L/X1e97ZjorW8V7R++I18ijbrDywFrub03y0WsG6dmJ7pKLvcGmr9b61nqO6d23qj FWBTLOYHkS3oyCYbFx1N2DdvoaFUupG/h8Ph+HwAVS8XYroEGuu75retjMt+06jX3FqDHN65 VzutO+FRpE0tkgiUckExqUC6hgiq093MAA+02IszkjiItinmvUqJ/S3udrxG/LtHACczZJz6 iyGapCHKQDPh3o+9WPbJ9SllXVbM97LDNw7X+OHijHrxqdrunvjyFtEMhEofD78PgB+suq9N MPzI/ct23RF4pWa/SWWVVQMLljV1BfAXVdd8n2sXt71+YKX2RCjRzLKoOM9aZENHDDRJFpfS kKK4UwTpDN0uOFC9/TiQkMP2+T5cRhHJPMoHedijvS59feuxL72Ke9o2xR4VbVoVryHu0hNI 3epaFR3CDg0EECzr7gVmu4lsJdXV67LGVaPW0Mvppu+IA+/D4ARMTbr1A7dh8FmZXq2Dt/Ci KlugdOEn7x0/QwiOsr6vr5fBxImR/W/DJ9PIPETfPWUvq8mVvzK2RvteDLSQzBflvXtaWJor w+lu16h9VxicvvRC0gSFaHrYiygIbNHD8x66uSox1ev1bgL+X3JAvTbdZclKroTTe+RrbphZ c2ldvrAH33374ABP3r2H6imaULHh5XZ+VFfUliXkpSZJdZUEtVMyDWnPKgZNV0nG6d5IR+KX xlR86EMIXsbL8hZ9SAlTN7s0Pe9LMJy/C6GHi/IbV2Fl1nLcpAxfYXilDGLKw/wAFiqzA/O6 O9JuWMrfS8hNXpGJ0xzyWjOuqBq5S52LOXmbiDbpOgtV3wQSa7jJWK1QMwbFFx7ZHKpS9eXL L2XRL2zjou5YvhVt2mXVvLzT2Otzkx38O5Fq/hn33U/HEaSN13xjWQUc59QJ2E5KfQ6Vc5pz 27a1VcNunSfDa7DGeLuvLMWqHO1OzWa1tbWtbWCVik0VskGOROoh5QmzK5dY50hN2vAw9UjR xvn6peCpaZp58cjDlDQBjzDegrjd4Dg59mPtulh5UqCF5Is1x0+ozmqbwO7S1O1hfbHu92U1 1LS0zZMudFlmVhVSnUZiuPjnVmN3fh9KHm9vKxLrftIq1KmutxndWNxJUNzdeS2dtctNdd23 TM6YtLOwOb1YTOwvdUWNq4ldKp5Zua6fGs7LEMJhF1Mzngc2oXpvlm3dSGpf8de97xqve95E fugA5AcKC/FAcdVDgIHQdt+Wq2/XW/l/dn7t+H4fiAAAX5gDnAAzW7u227uv2B93d3d3dySS SSSSSSSSUkkSSSSSSSSSSSSSSSSSSUbbbbRjTSSSSSSSSSSSSSSSSSSSSSSRbTSSSSSSSSSS SSSSSSSSSSSSRbTSSSSSSSSSSXdwAA84AAAAElSSSSSfsKvkQUAMAgYMzWsfb7ZyDSSbSS/K SQNt/twB3NttvoAd3Nt9XSXckkkAAkgBugcBsAN3gDu5tvuu5AAuySSSSS7kSSUkkkqSXckk ku5JJJJJdyXciSTYUDkkAO7nElIAOJJKSVJLuSAG6F2CSV2t0A3S/X4DdgBugG7JKkku5Ikk pJABSSd3cABJABpLuCJK7TYAGxJJsNSSb2pJJIABJABpJgBD7yT00XXbrCAKpyIgoAZugAA+ ++zfRGWzdbgwkTENlFJ7TYu1pFU8t2xaIuR0RZw+PQUegh1R9Ld2txcY1ZiFZL0a7KRcutR6 VdkYo4mEXB0SJiliYJfdudjFkYhIcy3Ji9ys3XWXFJ21m50wYT3K5BvGNbOzXgd3Z7bAAHwP vvgAVldH3pcEutoKx72iouVrGtVWKu7pZA8L0QpiwMnbWqwUOfLJq0OMKT6gashQ0Jcs1SP+ giT8bauCiIQNRrd51Wa7VFwc5qJpqmrj8CNo2nVlsSFq+DuSb8bOQNLs3rynrT07oPy1za5r fLna3XNd3nqnwQOfsKAAjjmsau+Y7rPqsZ6LbGJD+fWWR9m50ARq1rQo0WRlnBn8dBkpAYcI ELIfbco2QD2v7xFEaertgNI2C50Zd+KDvbPoo57AhaVq1dWZ3Gygr61Rybb4pulpWbW2b4O+ dWKPNYN/17fV2+MLJu+iZ9Glo9ZrXzqxKRS+zJhbA+AH9D4ANsdbMLx9Yu9pmD1A3leXLbO3 vr3Skok63IqUg5FOt2bfE7WUMieccEy44LoZpZhjBy7NjjZ+d2VcEc4c+y3gWPTJWsOxTJDe XTBsjpqtatQGAxWXjIrQ5CTo0l3Eb6bmVp2VW3VjoB8APD4AH7vVfSgZy9gu6zy9IdQ7VjbF WbqBi+wd/M1aQNKMBkX0LGEzwvc29RwiG9UIEKPiHd+vwz3XXfDij84nF8MeLvZ5jM1D5n6n KER4/R3T9SNEDGm0Mu2PXj+oVuXtWzhFHSI1NzLlz17lzho2a7nqmzyfu2wvXSQ9fjswE34T qzPse2F1qhMB7WXara0t315wQuhHCx8B99+A+AxvKS/DnYu7n79byxuJ1Ww0U3+YI/LLV22h PSSMLb2XZCzmyrIzK3x49wdf0iAAj0xigrFNblFXizE9fO9vePnzvRqq1CSaq7oM69mq7Lya iVP2RBRkUAAkBVWQEQKgIgVXbQAAuAoPfdOfMfPmxQHkUBGRVVJEQB9FUWoCB8iiKFQFRZAE QBZHiiN1XrM9iqnYwgEhkynDR+R6/127lhuC9earsu3q79MrusZe32LW6G25XF3t1mZb0KI4 ghOg1i+bHw++H9fD4DusU+ta6DEh6ezMyqZ27hbHqVblvdsO/0xfVRh2QiHFTul8CfpUkouz 7PZOWfEgOZ2wVWD2ZpA2zZBEHobQQQRXK8atmkaTmMcZFIo1HmOE7c9W33R7t7xefHtpIvEn hJMzu05IHWAUa6xegbd7gKcqY8OVTMmuxuW+W29dh/fffAD8B8Bz97IY8n0Kw314bd3kx3lr Fbst+lS1nt43xWd3p9fttmeEVaXJ9i9EXqys3HzgGq11jROqsD1HKjHGqzGjIVmVBJmW8YOq lTtYd1De3FUe4wsHca7oeAViLq2+Kt3WSkTlVbTK2yxV3VKb9D8ddSZCHjvcCkzR9998PAfA V1EryvxO3ZaQVUQl1y5Rx51eaiQUbF8aYq7GVQudOrXhljTcWsvnCagbSrYCDdKla/Qg952a HL6SO6MGrNp4jxSTy9nUKeF7zq1rldK93BPUpdQ0mK0u65860g3wknN2TBuVViJhqrtVAr3s FnF26ZG0D7zoNVQe0tFX3WK3xo489kZ9FtGJSYcSxvDWIsEQ3FMWZE5LSA+++H4D4D8L1eN2 hn5ZiM5sgxAn9bxUEW6bULxYdun9lqRDSbUi795Sb5W1hoiy7Q6heyrX1FD3kGLS4GzqW0tI iKZC03avOPOYWDnLTilQXVL2XYy0dckpcNUCyni3cNrCbNQiqu1yr1Z19E12QV5lpO5MOOKE kdrzzp+3RDDWkjk029S2ZIAsKRObsbulsxZaZl4m5jJEN5VBDQarG8dnczc3XMFSlkmvSQVy 7eFEWxRwFQ1bdbx5Ym0GgfWk/XY0zql9qvjesUKDKZncBR7XM0OtzTHTx4r2bWXstUdyVFUN jPGcjR4sep5zO7Kla8XWxKods208yigTFtXYmarGLGyesR4lMtZub2ibsAOnTUqJqsVOk6GC JccWDQV3XbvcySCfS+MQwFueumqSzea7uzTLhMMm04uwxpe1t7g93ZYQU6a6SO1jDGWyc2EJ dtyaeC6ry01LrRM47SDIG6lwWsvWju2Ol06eXPSjRuuQNvHg7DEZS7Azj6ZU7vY81B3vMtar 1p1fMYnlkWoTbkvlQvqfXvWSppHbkXYW6XUBtvh0s0Gs4bcx6513N8M45ukBVA+AinAEYAmH KK8QXYDtENggeVQyir4EDYO2/i9+ju/Tffs/Ln4gAAAAOcAAAa7utftB73vAAAAAe897uAAA AB5wAAAAd3dx3d3dySSSSSSSSSSSSSSSSSSSSJSRJIAAAAAB7u7u7u7uqqqqqqqqqqqqqqkh Ukk6AArBRMlfVVH6PMZ+rAP00A3Ukv2SSBtvuAO5ttt9ADu5tvq6S7kkkgAEkAN0DgNgBu8A d3Nt913IAUEkkkkl3Ju7skkbpuASSSQCSSSSSpIBJu7rYUDkkAO7nElIAOJJKSVJLuSAG6F2 CSV2t0A3S/X4DdgBugG7Oru7rvuzMzukgApJO7uAAkgA0l3BEldpsADYkk2GpJN7UkkkAA7u qqq5JYA+Ff0aSoasGM2Lr67TnmvWbat69ruN/ZtjQ+lKdmB12yPDh2SViDna4fbaukrreYr9 xgjzi1pP2rxKZzVzQ+UFlrELp44nNasJFGnjk1qQSpDjWOMlGM5q8ZwQEDCKvkE5rk5vRNt+ rvPHVHHXVNZFtp0gTOrY6qhZcq1/bK1BK0fuqoVkc1Ikdx3YO2elikr8z5b1xx2dbdOXHDUh GOOGPdoXLZtMxLqdQ27o9SctVHDfO1LuorE5FCuajm5q+cmcVk3vOtF8zia1uXN3nBlEDKIH wT4VllR1+Zo0f1fpVDxWawfU+IsHNWOmNIZIffsdAOkMMIZiCGHCOV3fnH5POi1IeIsgL3PD 9Dd7nEezPvH7mqIFlFmC7rmfXR+hfIdFu8/qIOelXYRcj32v6EBELEa8DBZHYuwvzWXJiJsP LzIpCnXK/xziHu0y6AJHUTzfduZ2u3TqJ75qQvdZ1WcaznHJdZ1zm9a5Lw0CBsFT4gjRf4al fs9BRson9+39QsjfLSMB+RRArzos3rvDD8EeN04boWYRL9ee+9WzowsqMmqU14alMt7d+mEX jGVyTl1vBZTs5qgyChVrrGThJXYEKiwuUwsunLDTPbKlKFg2hLTNKs24W7iO90fUevdtbqOL zvRgquaOZ7OXJLOig6U+IJvvNzPq5dkn60ugrrt59mx8xOW23dnC2mwq23WepSYyTX3nKxQq 0pXbd2+wyvfKMt5MTdocIl3WwxZ3t3I5cxVNeasBt0ycgOC6rHZfIUDLvrCay+SwajNdODmH UrlRiNLsBPm0gQRhpU3nUeFo1vdXdovcx1NgqcBA8qGTmq53GscvFt3eLmMdjY83QWRD1bUy q7NpTqj7qcUy6XK2q5vqQoGHImlpHF4q22huOuXQTONYHMMtY23vcL3kisVRJTqlmR5cvLeu 8V9mXhFURvV3Y3a61Lkg0ZDRvISuwwr93svK97drs58ZRmDKU0aF5WISw3btjrGM3nV+DoqG kACj4Amu9zu9VVwzZ116/5CPFfl9ZdGn8SqeWzov4WQDiARFrWN7NOY5hUCQhkwWXHUKj6OJ cmNc3YPWNIwiiaQd0wHXu3Lry4iiNP3ejhHiMZry5eu+pk/MhlLoqtY5c2Pqp+QxqKIO5pan vImHLwLWPWgx7RMoslS8GVExVJLBFj03u0rlaipiUAzHAzo+HwcqC/BE5fzPcbK98NZz8uyZ vXs94Z5MYyaeFnvzwj03S93xpDbQe37sqtwmovg0ouYhJZ+L66o+HdNOUh44QMSOeenxNKKs fV960EdLMPFzGOOdwPpuoYQTp+kNhW98vqrZPQj1meMrH2onAfpU6HVWZdk/ZwOCLHtLKpZB tl2+PVYx/KVgfRsE71V3zO91iFXWjWSVyVUM1XCs0q0gp0/D4fD99uqj+xDH6KE9qJ/Nbm8r oabNmyNL/LljBPqXxw+OXbN4fpZWkMu0Th+9dP13XbS5CdoFn7CNeu/e+Itbj+9cPCrd35RS 8W3cwry7ds5eCsbQqnx2r04ENssjXaUzHYOJdus4Ss15K3UWgRKvJKQqiklJhEC2B9Lx9/E2 iqpXjgfu3DKTK3W97MXiOOYzuUe3ZuZ7jHcb6AgUor9AD4eD7Name99EavtvaeZpxx6aO5Zo uD1RJaVkodu3mZMHLA8eLFJUbrEkpV3Vi0UeIeHlwAuXuusAc17RrTN45roItCurFV8F7BgJ W4tNtYl3Be7KUxWr1V55fnSikd773e1zHeQx2eifSUl0CaPJ96mWx5bkXWli1qrnTMm3o53r xeYjkoxSxQ5R3lnHKQBWRhbuTJMpnKDsWSxR6PAojKfDZJYzaw8MsGq1CkvlYfXLLdJJPadu 0u7chzoRfOEE6icEF9Rx9eixZVx9skBtljVmZmru2Imcjc35HWsullRwGwbh1ZSge3tYUqV5 yYldkszLom7yKPBijQQsZ9lYN3ag1L6W6WDQsJEkorcvLOc64HODlBt120jZWZU4HTd9RtON ipdWMKHEFiOPg2atKZGF8t3y8zZeyTE69K8otcznLhnWqT4FZm1LKKyQZUJGZO3oLVmlROgi RUm/asd+9VmPcec52olCNWJHZupbxr3snbgGKpwKNGth7pubAo6wtTndJxTNLSd3k7qgq4Yd DO3uJ7wAN904hSGWCbvhWs3IYMYq+dZO43vR+wjEQAEcIIoWA/EE0UgtIJ4aVVpBKQoFSlEo RoFSFApFQoFSFApBEpgA+VV6Cp8UENqgeQXgoOkQPgIH4+XKr8Ga9VVJJBaKPwokkkkkkk/k kkkoZI0kkkkkku7u7u7u7gAPvfffAAAAAfffffAAd3d3d3d3d3d3d3d3JJSKRJJJJJJJJJJJ JIkkkkkkyd4AAAAB73eAAAAAe93gAADXveAAAA973q9nqr1V+Yzvb3fhJKRJKW7u/pu6gbb7 gDubbbffoAd3Nt9XSXckkkAAkgBugcBsAN3gDu5tvuu5ACgkkkkku5EklJJJKkl3JJJLuSSS SSpJdyJJNhQOSQA7ucSUgA4kkpJUku5IAboXYJJXa3QDdL9fgNiSTaS7ZOrpJdyZmZJJAWSS bs4ACSADSXcESV2mwANiSTYakk3tSSSQACSADSTqvvqv9Vfq3fe9lvcR2HNn239QaU6wpRj6 tpt7SWi+X7eABPLTmZAwcv3ZEeP1KO0MN+xOapd3aDu96bPq7TLkW1e4rgUyJ2YXuMaRPGzk vUS6VHUNGyiPGiOHLlYf3GjcR1fJVrJ9Q3UOI0k3p9aggKBg9m7Ue3nnrotPSoTzbBpvSM1e mZlHEP9AAfGqFaJZjNDy7xgIdlxWaGTMRrxbyVmKzu3KDxZeas5i5rfDkvM5jJRzdFzF1kxr FQFSlWvfp71eprYuz6ofuzH2j52UjmXGTBHmZy2hV7kMZ+jwVotanMipizmHMmybYy3oxwHL pFibN6nVXfXcCF9HE6rk7kRK8AS1wcT15T6cO4dry72ryZhmHNWlQBXORzYsFNXna2rVZiLh WZwccmVeGsmOSybLN68HUq3OLEeibdj774CwPvvho8B98OHtgzdtep543kkoZeu4UltHw7TQ 6tmhVqaIm9BwVDJzacxDhCuu9PabCm/ytVgkXfrRW3zRPw22+IUpLs3JJTNma0RcuedDwXUr VZMqVMXWuXKVQvCiY0HRJDEF1ekc5FqnVY05apFvJdvnLol5OYxqqxnZeddu7ncAI8gIHwFN 58vdNoym1rvhccOcPvvvvk8J8rsfvGyDOzpnvIgbxN6ue6Z3JM6rW6uMKFUokb22KJQXuXwu mMJ++E4wxL7TpJwxIIiY3n0oEDPoSG5W6arNWXD2jnuHvSd0IAA72RsWtcJ1bfS08oid98B9 9bzccBG7HOPcxdTlZ9Ve9XHrfc+9pmAzFPer3vPIGlt4SJKPZDseS0NROidVyj6zZ2XV4by+ rYUKglOWrrYEhOClVfarerQPgVyKLEEPgKd7O99XelYmMz257mb8+96vZAgczjdc6GV73vV3 IaDxLKt4uPQ7suyrrW+bkpiguNZldnwN6nqx45YDrkp2fhZFSP5RDL2w/cyB998LREgy3w4e 9Xgt9J98AJ2bhY7Vnw+HwF110aV88s05q9teX1fV8e1OKCcMwW/OrUG4vK6nJ4ZvGK6XDWjR NS9WY3wsyWKIsAYoIfEUs7DOeyqkvvtaqva6oPNG8T0o+e9T7fUQL1dV01b6FXyz2t9waj2s ygQLCOGG4vUgSKNLdS97wHwAweIIIfInDUXGyfIWdyonaA+AFaePqrdhxVv1/AfD3eNcCB8f vtvKr3vVZ7pjrQVRym1iogJVpfY3Mu3gO+r1VV4o9ZOghdooci8D7c7pWPHm1egtpZYtrJsL st7lp5Ft2OAUHoKkBA+Iprnu1qHu8lzfbMagIkpMzELquXncATGdXvBevOqJmaVQ1qEmd6Mo Ljeqe8N4xib2CBWJ2FbqQPSokPvh8KGyrjAOFRWPh8amUhIVeWlUQuSqrzvm83KdZtSCZK96 veLfRXn5w9w8zdV1HtnyPdzK+Jd6+qwrP2mUdurSOpIha0uzHQ0Zawdm1y5cUFPVXq972+9V EEU+Ip8DcNR1Hs9CqxYdjyM3TPlBkx8z1vsVQNHZyLuO9w1qu1WNd6d+c6Kpvhe+4rOec2XN c0Cpuc13FbrBzutbVPUyq3kVdbYUAyHO01XqqtPVtukaYPOLgPgAZ3Pw4hDOvuA+AFwu9YPL 7x3t6uN4z6qmhQbxJXa0Y6VyGeVVm0VLrGtwWm7sOsy3HntqgJRaGyYXvHtmRHLG5q61qs5r Wed3qc0ErXbxoBEDRhEQpFD4imaxq5zd43nt41kze6z2883zdHGwB/HIeyrmJv3VCUJG+iC1 tLmy3Hh5R+SRHEywauZZ09esGChFpqOqe9StjNo7j082nZAvMzAazITXUu2w0lrFRGrcsOqv dnassSMPcagXPCzt2qDWI5fUXVrGJBGc0ffD7w+++HDqrxF9XoZ2ol7Qvy0ylmvY6TIFNfIG clJVHc009zV+ohGqTJJM8Yfb15oQw2RCCaKOGsl+oO54BS6QJiQo+1CEYV4oLyENUvmRcxim h7VpHsZx8qHj4ryhDPnz8X5XPMUdrY+ixT2JoWWWfdLNak/j9lS6VpXpT3vZdq1Tp8aTS1+G g3L1MvLx3Cqe1njmJVuTsdODVmywUT1X203LehUVnGG1xWSjjMS59OCosciQK666nlZWl0Vk ZwcIVfLGrnWO7bMXPAKPsJEi2VlAoclEdm7DitMW7Du+zaWWjuLCIdV19Ea2c95B6Kmr2tVS YF1ob5r1eyn4mT2GVTy01ZUMy4Zm9qrrPRtw4tyYHdaKgFoNNbbUJo6mnzxm+EGqksv14Lsi zt3UUNXlkUy9dasVxBvlvQ5xrnmPvOrvp3FM9oL6mVmnHwioEXF3NbworGCFoKb6geLvEdWm AFhxA5KR20xbx8Tc0o1TXnqE2+5ybTd7k9saoXZMAXCj6TGSbvs6w5ivtHOZtccllQ1seK+2 bw3f8eo7vMe2iV67lum689uqwR0PDSZeUxOaeXDEJaFPu7E3t93RVXqqv0r3vUPIoQVIikFT JQgFIpRSgNCpEQiKZBU4Cp1QOKDxADoIHhBegqfn9CfofT9pJJJAZD6kkkAAADu4AD8e7u7u 7u7kkkkkl/G25JI22222222222222222222222222220o20kkkkkkkkkkkkkkkkkkkkkk22k kkkkkiSQAAe7gAADXM18AAAH769Xr96q9Vfs/Wr/Tlie/sRJP6oklIkkxJJjbfcAdzbbb5JL u7t3d67kl3JJJAAJEkmw1JSAD7gDu5tvq6QAoJJJJJUkAAkkkl3JLuSSSpJJJJJUku5AAYFA 5JAO7hwDgAfAAdJdyS7kSSErtJgF2NJJs97wDiSTYA5JKklSTMzJJEkpJJ3dwAEkAGku4Ikr tNgAbEkmw1JJvakkkgAEkAGknX331XN388ewrK/HsFnw9SXtNXrcLBkzqFFSpBdQ5kqz8cph RQ3k2qdS1BKt4XpqQMFVd2KHBTdo0u5QGljvNeBXU3ZRhN7ThRKQVhahCOiwVLKhl9rmQtX1 7BHv/zXsuhb1fi78d5dis8bSDB0wiyYvSux5aYj+zKYXryE5z3b7EbIqkvH2nr311alNsyUf PKbo79kOGibZKLx5ehqha1+11GMuusd1QfiKfHHNFzxiVr3M95ordfM53nlXgzr5cYRKs4ZD p3WlnZjStYxe864p6Ct7FcKXoXW+7HMya5GQI6eGzRFn59YrqAq/MYWePGEdq3nQ31Y+TuWx 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 9n/ZuZk/uqqq/2AB6Ae94G29SS3dbbbcADu7d3d67kqSSSJJKSAAwO4CAA+SS3dbb2uiSV2p JJJJKkgAEkkkqSpJJJUkkkkkAkgEhJKRJAKkb2EtvlAiSpNwACSpJUkbbbSpJAFAwBqkk3AA YAPu7u6u7szMkkACSTu7uAAkSSbDUlIFAwAO6ADSXcAPuu5JJIABIkk2Bv1V/Cqr6q+++qvr /v+tbb/tf2ksHvEkkk6kkkkkkkkkkkkkkkk0y0kkkkkljbbbbbbbbbbbbbbbbbbbbcUijbbb bbbbbbbbbbbbbbbbbbbbbbbbbbcUijbbbbbbbZbaSSSSSSSSSSjbbbbbcMkbbbbbbbbbbbba SSSSSSSSSSSSSiTSSSSSSSSSSSSSSSSSSSSSSSTSaSSSSSSSSSSSSSSSSSSSSSSSaTSSSSSS SSSSSSSSSSSSSS7j3veAAAAA94APfojA/QAP2AB6Ae94G29SS3d3d3d3f2AO7m2+rvzKkkkg AEkAGku4Ikk3oAd3bu7vXciSV2pJJJJLuSAASSSVJAJJJIBJJJJJAJJd3ISSkSXZuyRJLu7t gDgFG6kkpJUkqSNtvMu8xgFAwBq7STcAGkk3JJJKkmZmSSAEkm7uwACRJJsNSUgUDAA7oANJ dwA+67kkkgAEiST1nOdi+QRRBgn3RX/cQP+IKSEYKbbMzMzNmaZrM2ZszQgQiUAiiDZAAf/E QUEf5/n6/XuPe++/R27v1fmLbG235ucH593d3AAkkk6kkkk5JEkkkkkkkkkkkkkkkkkkkkkl JJEkkkkkkkkkkkkkkkkkkkkklJJEkkkkkkkkkkkkkkkkkkkkklJJEkkkSSSSSYkkkkkkkkkk oW0kkkkkkkkkkkkkkkkkkkkkkmW0kkkkkkm222222222222222222222iQR9/n/ZVLuqqqq6 qqq/8Ek3dk93ct3dSSSSSX7iSW33dzp/vlSSSQACSADSXcESSb0AO7t3d3ruRJK7Ukkkkl3J AAJJJKkl3JJJLuSSSSSASS7uQklIkgFKSbu622oSOAUbqSSklSSpI228y7zGAUDAGt94Ddgk 8aTc7u7q7uSSXSQAkk3d2AASAAwO4CAUDAA7oAboHAA+rpJJEklJAAYBv31V+6qqq+/6+pX/ VBFEH+KCKIOBf6oIogwfpEABH8orlFcorEV/7RUP1QRRBsAH+SIKCOUQAEbRX95IP9zCXf5/ z/htttttttttttttttttttttttpJJEkkpJpEkkk/fD/P/QlUdUqSSSSSSSSSSSSRJJJJJJqp VUSSSSQAAB+H4fh+H4fgAAAAkkpJVVOqSptttttttttttttttttttttttttttttVTqU22222 22222222222222222222222221VOpTbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbVU6lNttttttt tttttJJJJJJJJJJJJJKqbbbbbbbbbbbGfffffffvqtxvd/eANJJvQD3vA23/DgDu7d3d3d// gHdzbfV0lSSSQACSADSXcESSb0AO7t3d3ruQALskkkkku5ISSTJJJUkAkkkgEkkkkkAkAkhI boUG7JEku7u2AOAUbqSSklSSpIAZl3mDAoGAartJNwAaSTc7u7rvu5JJd0gBJJu7sAAkABgd wEAoGAB3QA3QOAB9XSSSJJKTuc5znWc5zsA+IgAIwU+IIog/3orQdVV/yQRRBtEABH+SCKIP 8AAaARRB+woACO0QAEf7Ir/gisARRB/5RXSK4QQVB/+IoooP8AAYAD/eoCqD/FEBRGIqH9AA f8kV0AiiD+UV/7QRRB2isAB+Ir/JFcCK2iAAj+UQAEfsiAAjhFf8EV2iAAjkBFEH/xFQ/mAg qDxFcIrBQAEbUBVB/ZFQ0AiiD8UQAEf4AA6VDgAxABEGACERXYCgeARRBiKCIMABtBFEH9UV iK2ADtFaRX/ZFf/qCKIPgEFQeIrpEABH+aKh4UEUHyK/6KiKqDkUABHqICiP/8xQVkmU1kPi puDAN2724B1kEAD//UACr/t39BgyP8AAAAAAAAAABKAAAAAAAAAAAAAAAAAAAAAEAAHwB9n3 gAAAAAAAAAAAAAAAAAAAJ9ej213ddm2lrVETQyEoSUrZikIigTPlJd4DvOpKSlKkgqqFUqqS JAltkpIQzwUd4D2SlIemVNjbKjYBm0ogolCojHg96vYCxQpIkK9G2GqAoAUiopAx5O7wExSi kgpIRUoCjsy0ZAihh7zs57wF4kqilSK6DbDTTLAKMygoiFMDcBwa6xGgoi0W2VAKEqlRRLPA DvAeGqSkCj1WUKqm1bZjU2okVqimpVRM8KG8AvHrQyNmC2LWbbLDbVQjTSVBIpAseq3gHsqg hJ21UQhNgmVWo2xqjSUpIzYKISSVElFSKFRRQkhSShCFJAJJUKlJVKWAAOAXnQD3gPHCXcBe 6nk7wHBzAMYCwHYAAIU9qe9kYn+qlVSmgA0AaAAZVP/0qf+1G1VVRGR6jUBgAATTDU9BiUlE lBMgAAAANU/TEEpSiRp6gAAAAGU/96UqlHqMNUYRoNAAAAhSICUmQ0JqmnoTT2pPQDKfEFVA H8Pr9vvX6cazPy3r6iBsQACVUQRpmmDjPvOkJtawzVqtJZVZTTk1hmNWVVWVZVVVVljRZlVV VlVZVlVVVVVVqzSqBShSBkoKAZZmGSmStNOSqOTStAFC0gtAFA0DQmSiIJqFqgTUJqQEQyBM 1gDVAkQpqyCqFaoUqlUDUIoJqcg1VSIAGSqoahVRoQpQyFBUF/4EARBgAARH8VVD9lVCEARB 8AB9EDYAP9RA/gQP+RED+iAAoP8IGCgigOCriBiCYqoSgJ/ugCqDKh/AgSq/6AAqg/9oAqg4 Kv3UT7ooH3VX6ggfmgGwASD9B/EVHD/IB4AQNggbBA/VETag8Agf5oKdAAn3A0BAQEDBDMCp io+oAHq8qi8IHKgPAKnCPAIHqqvQdp2CB2oB2Cp2Cp2gp2CB2CB6oh6Cp4Cp4gJ2qr2A9gqd gqdoIdggdggdqqGC4KmAgdiqeCJ4IhsFTYAJsAE0Kr2CB2CB2Ij2K9AgdCo9CPYqh2KnYiB2 Cp2InICBsRXYDsFTYKnYqHYocgqYIh4CugQPBQP5AfvIHco0rkrStK0rStK0jkLkrQtC0rSt K0rStItK0rStKUrStK0qUrStK0rStK5K5KlK0rStKlK0rStK0rSuSuSpStK0rStK0rStK0rk rkrSOSuStK0iUrStK0rStK0rSuSuStK0rSlC5A5C0OShkrStK0rStKNC0LQtK0rQtC0BkLkA UrStK0rStK0rkrkrStLStK0rStK0rStK5KZK0rStK0rStK0rSlK0rStKUrStK0rSlK0rStKU rkrkrStLStK0rSjStK0rSlK5K5K0rStK0rStK0rSuSpSuStK0pStK5K5K0pStK0rkpkrStK0 rQ0jQuQuSjStK0KUrStK0rStK0rkrk0rStK0rStK5K5K0pStK0rkoZK0rStKNK0rStK0rQtI 5K5I0i0JSNK0jSNmKGStK0rS0rStK0I0rStK0rSuSuStKNK0rkrkpStK0rSjStK0rSlK0rSt KNK0rStKZK5K0rSjSuSuStKUrStC5KmStK0rShStK0rStK0rSuSpSuStK0pStK5K5KNK0rSu SmStK0rSjStC0rSlK0rStKNK0rStK0rStK0rSjStK0rQpkrkrSpStK0rSpStK0rStK5K5K0q UrStK0pkrkrSpStK0rQtC0LStK5K5K0rSpStK0rQmSuStK0o0rkrkrStK0rStK0rStK5K5K0 rStK0rStK0rQBStC4qoff+SACIO0VfwQBVB4EAR/Pz+u/P7ucz6f88/w+R/Ic9Xzf39v/CL5 zP3Pudr/PvM/nz5n3+787+Z7ke5H2dV75Fb5Pb3nz957XNfs1Xb+d1+3+XH5ydb39vfPe/wv w5/D7fPt1rO93vzXf09uRA/IQJVUX8/P61Nxzu/br+39v7e9/bmV7vre5vnve9733IrVV73u Tfft3HpnuXyPIiOzl3e+73+T2btOZGX9qoTPbrkOxEJzd3fO85vvN+7zvqru51mmTK677PtV rXOcm65+eyt+7z3q7Mfcz2TNcz3s1VRHObm657K37vPequd5uMj0zNcz3s1VRHOOby692+c7 z3qrnebjI9MzXM97NVURzjnOZd+7lVznvVXO83GR6ZmuZ72aqojnHOcy793KrnPequd5uMj0 zNcxf3nNe5xznMu/dyq5z3ru67XJmPTM1zF/ec17nzjnOZd8927uq97MyubiNejs1zF/ec17 nzjnOZd/vu1Vc5711dc3Ea9CaxX83vXt/Nuc5fb92qrnPeu7rm4jXoTXMX95zce+fOOc5l3+ +7VVv3q5XN3Ea9CaxX83uY98+bc5y+37tVW/eqq5u4iI9LdRi/vObj3z5xznMu/dqq371VXN 3ERHpbqMX95zce+fOOc5l37tVW/eqq5u4iI9LdRGL19nXvnzbe95VeyuT73Oc3lxER6Va1it fY1758xve8qvZXJ97nObzd73ve/cXrWL19jXvnw3veVX57OTPvb8nM+3cJm7rke7EQnN3d87 zm+89Oe5zm723ve9uL1rF6+xr3z4b3vKr+r9+1yfe5zIuIiL9a4jF61yY98+HOc5Vey7rfvV Vc7vN73vfuVrWrVEa7Hvnw5znKr8v13W/eqqru83ve9+5WtWrWt9j3z4c5zlV7Lut+9VVzu8 3ve9+5WtatURrse+fDnOcqvz2Xdb96q32cmZnPc+/ftua+9175873e3Kr2Xdb96qrhzvOc5z 1ffv3Pc19a78+d7vblV7Lut+9VVw53nOc56vv37nua+td+fO93sq793MvnPVVcOd5znOer79 +57mvrXfnzvd7Ku/z3cy+c9VbN93ve++retaz76o0jvz53e9lXfu5l856q2b7ve999W9a1n3 1RpHfnyZl3lV7Lu+cVW++33e9776t61rPvqjSO/Pkw7uueyqrnFVvPb7ve999W9a1n31RpHf nyYd3XPZVVziq3nt93ve++reta/nua+nfnyYd3XPZVVxzk56e93vffVvWtfz3NfTv7MO7rn7 7LquObnPT3u9776t6+/Pc+/Tv7MO7zn89nt717e/N+zWsyW95l8jyNZGTd3vvOfu+757fubl kvb3vvq3r789z79O/sw7vOey6rjnJz097ve++retaffVGp95+7nzmVWft1WUqud9s3vb3t61 q/vajU+8/dz5zKy7qspVc533Dm3uTetX97Uan3n7ufOZWXdVlKrnO+4c29yb1q/vajU+8/dz 5zKrLqspVb533Dm3uTetX97UT7z9mPN5mXdXeWu6rfuHNvcm9av72on3n7MebzMu6u8td1W9 933m+ubvWr+5cSP2YN5mXdXeWu6re+77zfXN3rV/cuJH7MG8zLurvLXdVvfd95vrm9XEXrLj Y/Zg3mZd1d5fbuq3vu+831P29avWVGD9mDeZl3V3l9u6re+77zfU/b1q9ZUYP2YN5mXdXeXV c5M5Od31P29avWVGD9mDeZl3V3l1XOTOTnd9TOriLjNYP2LN5mXdXeXVc5M5Od31M6uIuM1g /YszMquVWVlc5M5Od31M6uIuM1g/Yvt3fPR6W9+7v3tazJb3mXyPIiMnN7u7rtVzu6r1VVc5 Mpe330zq4i4zWD9i+3e7/eb5y2VyIyM7PUzqoivTke9737GMz8znN85fs3uIyMd76Z1cX6O6 773v39i1s5znOX7N7iMjHe+mdXEX6ex33vfv7GMz8znOc5fs3uIyMd76Z1cX6O6773v39i1s 5znOX7N7iMjHe+mdXEW9tLXvfv7GMzWc5z7y/ZvcRkY730zq4i3tpa9+ejGZ+5znOcv2b3EZ GM9EfaW9KGve/f2LMznOc5fs3uIyMd9Efa0t7aWve/f2MZn7rOc595fs3uIyMZ6I+0t6UaR7 89Nmc5znL9kzrMjHfRH2lvSjSPfnpsznOc5fsmdZkZnta9S3pRpHvz02ZznOcv2TOsyMz2te pb0o0j356bM5znOX7JnWZGZ7WvUt6UaR789Nmc5zd+yI1dxd+7Eetj0+jXor89Nmc5zd+yI1 dxd+7Eetj0+jXor89NmfnOZHpb92fezWZPt7zL15rWsyZqq53nO93ze9xGvIWRHrY9Po16K/ PTZn85zm79kRq9xd+7Eetj0+yY9N/ntyve9zXriNUi792I9bHp9kx6b/PbzbOc5u/ZEau4u/ diPWx6fZMem/z282znObv2RGruLv3Yj1sen2THpv89vNs5zm79kRq7i792I9bHpuNIr8Te+3 znN+9kRq7i792I9bHpuNIr8XPb3vc+9cRrLi792I9bHpuNIr8XPb3vc+9cRrLi792I9bHpuN Ir8XPb3vc+9cRrLi792I9bGe3kwm/zdz253+7n3riNZcXfuxHrYz28mIqajK/Jbn3riNZcXf uxHrvt+m4js1upz297n3riNZcXfuxHrYz28mE3u57f5ve5964jWXF37sR67vue3kzNTUZ6Zu feuI1lxd+7EetmO+53czc3Hbmbn3riNZcX7utert33Pczczc3HrmaqW+853fn33ez7e8y9ea 1rMmaqud5zvd83vcRryBrXq7d9z3M3M3Nx65m5964jWXF+7rXqqsv27m97vdz70zk+9kRrtx feoj13fc3u5ve73c+9M5PvZEa7cd61r1VWXvfpve73c+9/JnJ97IjXdx3rWvVVZe9+m97vce 9EXHvXEaz0d61r1VWXvfpve73c+9Mx7161rKjHUR67vd736b3u93PvTMe9etayox1Eeu73e9 +m97vdz70zHvXrWsqMdRHru93vfpve73c+9Mx7161rKjHURHru+Xzm/bznM5k+9Mx671rWVG OoiPXd8vnN+3nOZzJ96Zj13rWsqMdREeu75fOb9vOczme9Ea9da1rORbERHru+Xzm/bznM5n vRGvXWtazkWxER67vl8n05vebv3ojXrrWte5FsREeu75fJ9Ob3m796I1661rXuRbERHru+Xy fTm95u/eiLRmOcb+vrMlv2ZmvNa1mTNVXO853vJmda15Hc72Ij13fL5Ppze83fvRGvXWta9y LYiI9d3zl1v285ze796I1661rXuRbERHru+cut+3nOb3fvRGvXWta9yLYiI9d3zl1v285ze7 96I1661rXuRbERHru+cut+3nOb3fvRGvXWta9yLYiI9db3XJ9N5M372s1661rXuRbERHrre6 5PpvJm/e1mvXWta9yLYiI9db3XJ9N5M373zWa9da1r0xbERHrre65PpvJn3vt/fVzWte9FsR Eeut7rk+lnd7z0azXrrWte5FshMz665znJ9LO73noyP3XrrX33LZpEc9Wc5zk+lnd7z0azXr rWte5bNIivXXOc5PpZ3e89Gs1661rXuWzSIqub3vcJ7eb3aM+rrmtOX9ZCZqt73vcJ7eb3aM +rrmtOX9ZCZqt73vcJ7eb3aI3OX3eR6qb+vuZkt+zM15r7mRFVW+85m4iO617vfudjszVb3v e4T283u0Rml1WtK39ZCZqt73vcy3285zaIzS6rWlb+shM1W973uZb7ec5uEzkLmtaVv6yEzV b3ve5lvt5zm4TOQua1pW/rITNVve97mW+3nObhM5C5rWlb+shM1W973EJ7eb3uEzcLmaiO1z 73ITN3ve9xCV5ve47M3C5mojtc+9yEzd73vcQleb3uOzOr/VzNRHa597iIu5meRCV5ve47M/ y4X9mojtc+9yEzczM60xeb3uOzOr/VzNRHa597iIu5meRCV5ve47M3C5mojtVWu5Le8ze97i E3eb3uOzN/kLma12qqu5Le8ze97iE3eb3uOzNwuZqI7VVruS3vM3ve4hN3MzrsRUKmUR2qrX clveZve9xCbuZnXYioVMojteu4d37nO93ve4j03czOkQvvd5iqb+59zMlv2ZmvNazIiqrfb5 m4iI7EeepHW3Od7ve9xHpu5mdIiKn1b36I7fsyE+3vMmW4j0szdc5MzMR6pn0R2vXcJ9veZM txHpZm65yZmYj1TPojvqrSPT3MmW4j0szdc5MzMR6pn0R31VpHp7mTLcR6WZuucmZmI9Uz6I 76q0j09zJluIjt3PN7mZmIcmURiqiOy33MmW4iO5k83uZmYhyZ7EYqojst9zJluIjuZPN7mZ mIcmexGKqI7LfcyZbiI7mTze5mZj8hyZ7rFVquy33MmW0zLvd1zczMxHOTPdYqtV2W+5ky2m Zd7uuXze977vd3vf2lVVdlvuZMtpmXe7rl83ve5mqme6pVarst9zJltMy73dcvm973M1Uz3V KrVdlvuZMkRDvZ5l83ve/5M1X2e6pVarst9yINaO9nmXze97j797WuRf2f5St851Pb1p3XWZ G173vfuuV/OcT6q9v7n13s+u7eau9a4qe1zva37vHqru51mvd7vbMx5rWZEVVb7fKnvbry9+ u5j7n32Z3bMx5rM1qqqe1zva37vHqru51mvd7vbLe79u9a5zk5XMyt+7z3qru51mvZMrrvs+ 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 W8tmS7lVXc7h6+XPVuiZVXdImOK8F1AVXSdmjntSw520FlLa7kIc0NVdTbhm4z1VwzJxXWKS Nm3wtOqSSs7sS2ySe0GySurewrXyQ5XivKWjhTRyNjCGN3eTxO7u7vr2K3zYi8twIMHhI01m UjO7Z1Vwu1vMcMkEtg7ovG7fK1LYcHMK9vstXKsRQzqXSgbsjKFQUtb0IbtpJi0uDKV3y7De hW8ywXTWh9xcj6CxEtyTbmXtQXQvO6ddUmxea26gPXAn3cWGL3bebCHNczHlkW26trXj0djZ YdZudyDDCp+b19oNOtqJzuPhiGh92RYJaCC3KwR0rsPK57iLxTKyKzh6lredJnC6q1dMpUkR iyFVyprFHFawIb1UeGUKm663W7gNbaEanXjxc7aauE1BqNanQynJkpq92RXe2pkW5m9NnTpM f+szMq6bsTBJe9vtSd3LudykqswStzZIGksTM1hyqvIo5aNPVz2JzOkkutu7vj3c+dZlWmpe Vt1RLL18cyhYj1rjy7BYJ6VMx86W9WERrpxxLu20cNKg0GqJO5Jt8dCbNnNu+tJVw5dVczmG Q5z5PLJFXkruu867tkunTWRLap7rd87vKsYuu0latdy6U4tBRYgzciOTarYpLGWeIoiOryZV xhbxruk4RG8hR7SSUOkVq5zNI5HXC3kTyB5EOvcylUMZfLbeWW867O86ESaG0rRsxyq6ClcV rlvFBdqOXTewEw9IGNTErqVS+o+XNZJnRnadg3u032BXeZwbC4ahKzpqb51IOggsqXG5lULv b7t5ZnCUTa1kki83dV11fHuonaeCJ9wcZkcqAwRNLQ+51j72itqmE9/J59uT64q3VmZ99XJW t18zfdG5M7Hbrdmp0l1a93likh7jc11x1B5CS5h17UsMZY4rptU5glVKkZltmRXL57VHYnPR JdmLJaoidZpyZmXdPnamd2wWvtiJ3Gq6CrUbVK+zcW0o9uhNsYFWbjNsitczgsqZDAmoslcM Q4cOQsWHlycrSauc3l1lYuNchvWS5BV13FaabGSFjg0kqze6rupcvpnXzFurvLwFTQ7MLbjg d2Fq2g3m3L13fRa+vledMBtTM2lmWhJYec47HEGqD68Ma7as3wnbojzgxevuoinUFZ3iOsru cqjSYdSxVaKMrRd4qazaFTMCgTMv27oxZ0J2XuXJu8uqVC10pOUE9eZU3aKzZq7nyJklHTM2 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 WKoZFEsAOAEC4IvQToAPQE6AgaBB0CEBAoRGAAlJpVHiDwTQC6AANAoaBR0C4E/c/vgjIjIL IrIrILIj5FaisitRWoDIrIrIrIrIrIrIrIoSKyKyKyKyKyKyK1FajIrIrIrIrIrIrUVqKyLI rIrIrIrIrIrIrIrIpIrIrIrIrIrIrUVqKyNRWorIqSKyKyKyKyKyKyKyK1FaisisipIrIrIr IrIrIrIrUUaisisisitRWorIrIqSKyKyKyKyKyKyK1BQqIyCyKyAEisisisisisitRUkVqKy KyLIrIrIrIrIDIrIrIrUWorUVqKyKMisitRWotRWorIrIrIDIrIrIrIrIrIrUVqKyKyKyKyK yKyKyKyCkiMisisisisisisipIrIrIrUUqKyKyKyKyKSKyKyKyKSKyKyKyKyKSKyKyKyKSK1 FaisisisisisisiyKyKyKyK1CRKisisisisisisgrIrIrIrIrIrIrUVqASAyCyIyAslQGorI jIrIjIrIrIrIrIrUVqKyKyLIrIrIrIrIrIrIrIrUUqKyKyKyKMisisisisisitRWopUWorUV qKyKMisitRWopIrIrIrILSqg/uUFAAsoI4EEVAuoKAB8/0t7evxa3/eP01Wfn7b183+u2158 /Va+ceunfPMyx5/T4vvvvudj3P75rzVclN/zvnb/Teb7zrUZTn7W+ufVkc59HnKmY+j2brrP r/sf43m8vnav95579vPv5y6xPOfq+7LP67/P79VfTd8+/l+V/eV9rI/tu8veZuE71+rzzfrz 39vjO97PWMewKD8goMFABA77+3cz2M+/z/lmZ/f7EMu/f898y7ew3Pua1qkq/z999555/f75 U7zPb5zj6f1Zmb199nv3Od/nf368871ma0eejqZnPu9+73vfPPPKqqnnOc++/n333e971ERE R9zn33333333333332ta1rX3333333333988/effy69/m9/33+/t7+zk71pMdiruZm4uNaXZ PtfquqRUOpmbi41pdk+1+qru473WtVPnne61OfsyqqMzWtVPnmZrU5+zKqozNa1U+eZmtTn7 MqqjM1rVT55ma1OZlV9cd7vervzzvdanMmcreZveqrzzM1qcyZyt5m96qvPMzWpzJnK3mb3q q88zNez5mTrJjM17Wfsz3n7MycmMzXtZ+zPefszJyYzNe1n7M95+zMnJjM17Wfsz3n7MycmM zXtZ+zyMzMnJjM17Wfs8jMzJyYyM3qs/Z5zOZk5MZGb0vvnfP0tTk7+j6O/Jmbi4127Oe+85 c/ZCG9Zmed+9pRaoQ3pbw9pRaoQ3pbw9pRaoQ3pbw9pSuzv5CNreHtqUnZCNreHvlqU3shG1 jzVqU3shG1jyyVc2HIhj317ZLnNhyIY99e2S5zYciGPfXtkuc2HIhj317b8RGwRC3vr234iN giFvfXtvxEbBELe+vbfiI2CIW3rS73X18iPo79kzNxv33Krsfv0fRETi97+rGtfNm9mxENn2 9/fR99vf32/vvoj7f3329/fR99vf32/vvoj7f3329/f36Pvt6++3999H2vvvtX9f3Pvoj6N/ ffRH2/vvt7+v99z76NfRsiGhq1uLiEbIiJQIhk8XEI2RESgQzkL3aNkREoEM5C92jZERKBDO Qvdo2REVTg5GchFxcb73e91XedvvIzkdi4uN97ve6rvO33kZyOxcXG+93vdV3nb7yM5HYuLj fe73uq7zt9meZ+fo7HdxGR9fOcrf3v1U3+/XFuVtes2v7nb+meZPCeZGzV7u3FpnmTwnmRs1 e7txaZ5l1JU95t7erpCkzy553s8yN99rVV2O12Z5c872eZG++1qq7Ha7M8ued7PMjffa1Vdj tdmeXPO9nmRvvtaqux2uzPL8nnezrI332tVXY7XeRf7kd7zM5vvs6qux2uzF/3kd7yL5vvvd VXY7XZnl/v0872eZO++1qq72u83f9i+95F8333uqrva7zkfZ75OFb7zb29VRSNs/cwnvebe3 qqKc5DPfJwrfedhrN3F8U5Dnn79u9/biKj6uc5W/MmWu577n3fqzf3rVbq8r6Z4n9OFT3nYa zdxfFJnif04VPedhrN3F8UmeJ/ThU952Gs3cXxSZ4n9OFT2Od43kRF8UmeJ/ThU9jneN5ERf FJniffJwrfY53jeREXxTkOfuYT3sc7xvIiL4pM8T+nCp7HO8byIi+KTPE/pwqexzvG8iIvik zxP6cKnsc7xvIiL4pM8T+nCp7HO8byIi+KTPEx5OF12J7xvsRF8ykzxMeThddie8b7ERfMpM 8THk4XXYnvG+xEXzKTPEx5OF12J7xvsRF8zLVUq5+/fsj6IjIu+c5W/POzLd+eX9iYz7n2+x EXzMv6qlXM9vtstFOa7ve6jLpVSrj2+2y0U5ru97qMulVKueVlduuxPeN9iIvMtM8TzXs5S9 5EuN9iIvMtyHIr2cpe8iXG+xEXmW5DkecyVZkS432Ii8y0zxPL9rLZfYpzXd77F9y1VMzzPa y+5fYqGu732L7lqqZnj2u2y+xUNd3vsX3LVUzPPJyu3WRLjfYjvM73FVMzyvay2XES433fYz vcTMzPPJul0iXG+77Gd7iZmZ55N0ukS433fYzvcTMzPPJul0iXG+77Gd7iZmZ55N0ukS433f YzvcTMzPP379UfREXF3znKyPfVVvd+eX9iYz7n2+77Gd7n0zMzzybpdIlxvu+xne4mZmeeTd LpEuN932M73EzMzzybpdIlxvu+xne4mZmbneq9pe0S4iOx3md7xznOXz2fJVaJcRHY7zO94m Zmbn2vKXSJcRHY7zO94mZmbn2vKXSJcRHY7zMhznOcp7XlLpEuIjsd5mQ5znOU9ryl0iXER2 O8zIc5znKe15S6RLiI7HeZkOc5zlPa8pdIlxEdjvL2iIiJevKXSJcRHY7y9oiIiXryl0iXER 2O8vaIiIl68pdIlxEdjvL2iIiJXp7bLRUN773dab3MRLzz9XPuchGZznKuPfezrXc99tm+Rf 3PojPovX2q3uXryVWiXER3sXpvdREvXlLpEuIjvYvTe6iJevKXSJcRHexem91ES9eUukS4iO 9i9N7qIl68pdIlxEd7F6b3URL15S6RLiI72L03uoiXryl0iXER3sXpvdREvXlLpEuIjvYvTe 6iJevKXSJcRHexem91ES9eUukS4iO9i9N7qIl68pdIlxEd7F6b3URVI29tm0VXHOc73l6ave 7tp5WXiKrjnOd7y9N7uIu2nl5loquOc53vL03u4i7aeXmWiq45zne8i9oi+cuXvv7J+mY+jv ec5Vx779OtX55X1/ci/ufc5zPuRe/oi4vj15WXSKrjnOY5F7RFxfH7emqy9oqKc5zHOXtu9o ytPay9oqJc5zEXpq7RnrycrEVzkpmcRmmsxGe98nKxFc5KZnEZprMRnvfJysRXOSmZxGaazE Z73ycrEVzkpmcRmmsxGe98mbbmI4TOIzTWYjPe+TNtzEcJnEZprMRnvfJm25iOEziM01mIz3 vkzbcxHCZxGaazEZ73yZtuYjhM4jNNZiM975M23MRwmcRmmsxGe98mbbmI4TOIzTWYjO7/b8 9mbbrfDnG69du0c8zOfTMfZkRFXfvv061UfsmZyJzIiLrzzOa1OfsmZyMze91PnmZrU5+yZn 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 gKoof/i7kinChIOxmTNY --NyChO5MpGs3JHJbz-- From bfoster@redhat.com Thu Aug 20 11:25:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6F9487F50 for ; Thu, 20 Aug 2015 11:25:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5DD688F8052 for ; Thu, 20 Aug 2015 09:25:33 -0700 (PDT) X-ASG-Debug-ID: 1440087931-04cb6c278339310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1d7Bb9evAtWJKGup (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 20 Aug 2015 09:25:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id B13728CF79; Thu, 20 Aug 2015 16:25:31 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7KGPVpC030184; Thu, 20 Aug 2015 12:25:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CBD8C123E78; Thu, 20 Aug 2015 12:25:29 -0400 (EDT) Date: Thu, 20 Aug 2015 12:25:29 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150820162529.GB13033@bfoster.bfoster> X-ASG-Orig-Subj: Re: v5 filesystem corruption due to log recovery lsn ordering References: <20150819183904.GB49174@bfoster.bfoster> <20150819224453.GL3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150819224453.GL3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440087932 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 20, 2015 at 08:44:53AM +1000, Dave Chinner wrote: > On Wed, Aug 19, 2015 at 02:39:05PM -0400, Brian Foster wrote: > > Hi all, > > > > Here's another issue I've run into from recent log recovery testing... > > > > Many on-disk data structures for v5 filesystems have the LSN from the > > last modification stamped the associated header. As of the following > > commit, log recovery compares the recovery item LSN against the LSN of > > the on-disk structure to avoid restoration of stale contents: > > > > 50d5c8d xfs: check LSN ordering for v5 superblocks during recovery > > > > This presumably addresses some problems where recovery of the stale > > contents leads to CRC failure. The problem here is that xfs_repair > > clears the log (even when the fs is clean) and resets the current LSN on > > the next mount. This creates a situation where logging is ineffective > > for any structure that has not yet been modified since the current LSN > > was reset. > > Well, that was a bit of an oversight... > > .... > > > > > The larger question is how to resolve this problem? I don't think this > > is something that is ultimately addressed in xfs_repair. Even if we > > stopped clearing the log, that doesn't help users who might have had to > > forcibly zero the log to recover a filesystem. Another option in theory > > might be to unconditionally reset the LSN of everything on disk, but > > that sounds like overkill just to preserve the current kernel > > workaround. > > Well, it's relatively easy to detect a log that has been zeroed if > the cycle count is more than a cycle or two lower than the LSN in > important metadata, but I'm not sure we can reliably detect that. > > > It sounds more to me that we have to adjust this behavior on the kernel > > side. That said, the original commit presumably addresses some log > > recovery shutdown problems that we do not want to reintroduce. I haven't > > yet wrapped my head around what that original problem was, but I wanted > > to get this reported. If the issue was early buffer I/O submission, > > perhaps we need a new mechanism to defer this I/O submission until a > > point that CRC verification is expected to pass (or otherwise generate a > > filesystem error)? Or perhaps do something similar with CRC > > verification? Any other thoughts, issues or things I might have missed > > here? > > The issue that the LSN ordering fixes is that of unsynchronised > recovery of different log records that contain the same objects. > e.g. ordering of inode chunk allocation (in buffers) vs inode object > modification (in inode items). v4 filesystems have a serious problem > where inode chunk allocation can be run after the inode item > modifications, resulting in recovery "losing" file size updates that > sync flushed to the log. > Hmm, so I would have expected these kind of operations to generally occur in order. I'm clearly still missing some context on the overall log item lifecycle to understand how this might occur. Using the inode chunk allocation and inode modification example... clearly the transactions have to commit in order because the inodes must be allocated before they can be used/modified. At what point after that is reordering possible? Are we talking about reordering of the items from the cil/log buffers to the on-disk log, or reordering of the items during recovery (or both)? > i.e. create just the right number of small files, sync, crash and > recovery gives a number of zero length files in certain inode chunks > because the ordering of item recovery was wrong. > > Another problem with inode logging is the flushiter field, which is > used to try to avoid replaying changes in the log that have already > been flushed to disk. This could also lead to lost inode > modifications after a sync because the flushiter is reset to zero > after each time the inode item is recovered. This was mostly avoided > by logging all inode modifications and using delayed logging, but > could still occur... > > There was a long history of these sorts of problems occurring (I > first analysed the inode allocation/inode item update failure mode > back in 2006), and I found several other possible issues like this > to do with the inode flushiter at the same time. I also suspected > that there were problems with directory recovery due to the same > inode item vs buffer item ordering issues, but could never pin them > down. > > So the solution was to record the LSN of the last modification in > every item as it is written to disk, thereby ensuring we knew > exactly what transaction the item was last modified in. This means > we can skip modifications in transaction recovery that are already > on disk. > Given the reordering is possible (despite my lingering questions wrt to exactly how, above) this makes sense as a mechanism to address that problem. > ---- > > The first thing we need to do is not zero the log in xfs_repair when > the log is clean to minimise future exposure to this issue on > existing systems. > Eh, I'm not really sure this helps us that much. We still have to deal with the issue so long as current xfsprogs versions are out there. We also have no real way of knowing whether a filesystem could have been affected by the problem or not. FWIW, xfs_metadump also results in similar behavior, which means that technically it's possible for different behavior on a restored metadump from the original fs. That's less critical, but clearly not ideal and something to be aware of. That said, I think it is somewhat strange for xfs_repair to zero the log unconditionally, this issue aside. So I'm not really against that change in general. I just think we need a kernel fix first and foremost. > Then, on the kernel side, we need is a reliable way to detect that > the log head/tail pointers have been reset in the kernel. This means > we can - at minimum - issue a warning during log recovery that this > has been detected. > > Finally, we need to work out how to handle recovery in the situation > that the log has been zeroed and the filesystem has a mix of new and > old, stale LSNs. I think the simplest way around this is not to > handle it in log recovery at all, but to avoid it altogether. > > That is, when we find the log head/tail point to a zeroed log, we > pull the current LSN from, say, the superblock (and maybe other > metadata such as AG headers) and initialise the log head/tail to the > cycle number + some offset so that every new transaction is > guaranteed to have a cycle number more recent than any other LSN in > the filesystem and ordering is preserved, even if the log has been > zeroed. > That's an interesting idea, but I wonder if it truly fixes the problem or just makes it potentially more difficult to reproduce. One concern is that even with this in place, all it takes to reintroduce the problem is for a filesystem to run a bit on an older kernel in a situation where the LSN is reset and enough modification has occurred to update whatever key metadata we determine as important with the reset LSNs. A mount alone is enough to pollute the superblock in this manner. Further modification is probably necessary to affect the agi/agf headers, however. It might not be the most likely scenario, but what is more concerning is that if it does occur, it's completely invisible to our detection on updated kernels. Would we want to consider a new ro-incompat feature bit for this mechanism to prevent that? Another concern is that we're assuming that the key metadata will always have the most recent LSN. I think the closest thing to a guarantee we have of that is the superblock being updated on umount and every so often by xfs_log_worker() to cover the log. After a bit of playing around, I'm not so sure that is enough. Not all workloads result in superblock or AG header updates. Further, such an adverse workload that runs in a constant manner seems to defer covering the log indefinitely (not to mention that the frequency is also user-configurable via /proc). Consider the following example along with some observations: - mkfs, mount - create a directory d1, populated with files - create a directory d2, populated with files and hard links - run a constant non-sb, non-ag header updating workload (e.g., repeated file truncates that do not involve allocation) on d1 - wait a bit... The superblock and/or AG headers are updated to LSN X at some point here due to the inode allocations for the directory creations and whatnot. The constant truncate workload continuously pushes the log forward without ever updating the LSN of any AGI/AGF or the superblock. After some time passes, the current LSN pushes forward to some increased value Y. At that point: - unlink a hard link from directory d2 - wait a bit once more... After some more time passes, the d2 directory blocks are written back and the LSN of those blocks is updated to Y. Note that the superblock and AGI/AGF headers are still at LSN X. From here: - shutdown the fs, umount - repair and force zero the log - mount the fs So now we have reset the LSN according to the log. Presumably the mount now inspects the superblock and each AG header and inherits the largest LSN plus some offset as the current LSN: LSN X+N. Directory d2 still has LSN Y, however, and we have no guarantee that N > Y-X. In other words, I think we can end up right back where we started. Make a modification to directory d2 at this point, crash the fs, and recovery might or might not replay a log record with LSN X+N against a target directory buffer with LSN Y. Again, that's a contrived and probably unlikely scenario, but could be extremely difficult to detect or root cause if it ever does occur. :/ Thoughts? Is there something further we can do to mitigate this, or am I missing something else? Brian P.S., After running through the above, I noticed that xfs_repair zeroes the LSN of the agi/agf and associated btrees and whatnot. I also noticed that lazy sb counters can avoid superblock updates for many allocation operations (xfs_trans_mod_sb()). While this probably mitigates ag corruption due to this issue, I suspect this means that the above workload might actually be able to get away with some allocations without inhibiting the ability reproduce. Also, a random thought: I wonder if an update to the log zeroing mechanism to ensure that a subsequent mount picked up the LSN where it left off would be enough to get around much of this. That could mean stamping the log appropriately in repair, or adding something like a new continue_lsn field in the superblock to be used by anybody who zeroes the log and picked up on the next mount, etc... > This means dirty log recovery requires no changes at all, we only > need to change xlog_recover() to detect the empty, clean log and > set: > > l_curr_cycle > l_curr_block > l_last_sync_lsn > l_tail_lsn > reserve_head > write_head > > appropriately for the new cycle number we've given the log. This is > pretty much how it is already done in xlog_find_tail() with the > initialisation information coming from the log record found at the > head of the log - we're just making it up a different source. ;) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From htejun@gmail.com Thu Aug 20 11:55:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 308817F54 for ; Thu, 20 Aug 2015 11:55:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 027AF8F804C for ; Thu, 20 Aug 2015 09:55:42 -0700 (PDT) X-ASG-Debug-ID: 1440089739-04cbb033033e1e0001-NocioJ Received: from mail-pa0-f41.google.com (mail-pa0-f41.google.com [209.85.220.41]) by cuda.sgi.com with ESMTP id aU8lBJh2lLoGIwF1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 20 Aug 2015 09:55:40 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com Received: by pacdd16 with SMTP id dd16so23665256pac.2 for ; Thu, 20 Aug 2015 09:55:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=SuRJI9bLIUKqfcKzB7/oQUJ0sKsmBnCwkh/mOneb7SU=; b=AxIIXVJwAoqCaakuFzMDUonhBXzrhX9qu9eT7o/aLFGg8AauRtLY+DbnAOXQf2BsKc VGH/oxPi/El6yIJ8zY2W1jRw1FjcnaV8UplN1E2lajTJLkR5g3QEyhSdWj6c216/0qwt hewcIgh6BQ99V7Vvjvyr6b+Iwq0oW+4Chaoy2KpT1BkPfYV5IooD41q+FnH7llucDPCZ pcPNmD+qKVMUoT0aSV9+tKYgAi4ajYk6qSP3u1P/lNIuH/vM5TDrNK0ZNNnHgSai4vtq TlN5U43NRA4QCamdYCFkq1H7OzdzlnJs6Ht+DLBMamIVJFoqlCscgqz1z36nnkzh9PEy 664w== X-Received: by 10.69.14.227 with SMTP id fj3mr8131706pbd.144.1440089739616; Thu, 20 Aug 2015 09:55:39 -0700 (PDT) Received: from mtj.duckdns.org ([69.84.245.29]) by smtp.gmail.com with ESMTPSA id fj6sm4961862pdb.21.2015.08.20.09.55.38 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 20 Aug 2015 09:55:38 -0700 (PDT) Sender: Tejun Heo X-Barracuda-Apparent-Source-IP: 69.84.245.29 Date: Thu, 20 Aug 2015 09:55:37 -0700 From: Tejun Heo To: Eryu Guan Cc: Dave Chinner , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150820165537.GA2044@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-pa0-f41.google.com[209.85.220.41] X-Barracuda-Start-Time: 1440089740 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Eryu. Thanks a lot for the trace. So, this is from the end of the trace from the failed test. ... kworker/u8:1-1563 [002] 22016.987530: xfs_writepage: dev 253:6 ino 0xef64fe pgoff 0x9ff000 size 0xa00000 offset 0 length 0 delalloc 1 unwritten 0 kworker/2:1-49 [002] 22017.373595: xfs_setfilesize: dev 253:6 ino 0xef6504 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ... Maybe I'm misunderstanding the code but all xfs_writepage() calls are from unbound workqueues - the writeback workers - while xfs_setfilesize() are from bound workqueues, so I wondered why that was and looked at the code and the setsize functions are run off of a separate work item which is queued from the end_bio callback and I can't tell who would be waiting for them. Dave, what am I missing? Thanks. -- tejun From sandeen@sandeen.net Thu Aug 20 13:07:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6A0E77F56 for ; Thu, 20 Aug 2015 13:07:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 489B0304062 for ; Thu, 20 Aug 2015 11:06:58 -0700 (PDT) X-ASG-Debug-ID: 1440094017-04cbb03303401d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZOadEvW7C7uiIaBO for ; Thu, 20 Aug 2015 11:06:57 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B894F61D1A43 for ; Thu, 20 Aug 2015 13:06:56 -0500 (CDT) Message-ID: <55D61740.9070507@sandeen.net> Date: Thu, 20 Aug 2015 13:06:56 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/4] xfsprogs: fix some xfs_repair memory leaks Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH 0/4] xfsprogs: fix some xfs_repair memory leaks Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440094017 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This fixes the fairly trivial "definitely lost" leaks spotted by valgrind on a trivial xfs_repair run, two of which are coverity-spotted. Dave, I *did* do a quick test via ./check -g quick, this time. :) Thanks, -Eric From sandeen@sandeen.net Thu Aug 20 13:08:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EDE57F56 for ; Thu, 20 Aug 2015 13:08:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CAE87AC008 for ; Thu, 20 Aug 2015 11:08:28 -0700 (PDT) X-ASG-Debug-ID: 1440094106-04cbb032fc40270001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id S0DJnw7xfPA7cJav for ; Thu, 20 Aug 2015 11:08:27 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D8F4F61D1A43 for ; Thu, 20 Aug 2015 13:08:26 -0500 (CDT) Message-ID: <55D6179B.1040701@sandeen.net> Date: Thu, 20 Aug 2015 13:08:27 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 1/4] xfsprogs: Free all data in libxfs_umount; call from xfs_copy as well References: <55D61740.9070507@sandeen.net> X-ASG-Orig-Subj: [PATCH 1/4] xfsprogs: Free all data in libxfs_umount; call from xfs_copy as well In-Reply-To: <55D61740.9070507@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440094106 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 libxfs_umount was failing to free a handful of resources; fix that up. Call it from xfs_copy as well, while we're at it; every other libxfs_mount has a libxfs_umount counterpart, at least on a clean exit. Signed-off-by: Eric Sandeen --- copy/xfs_copy.c | 2 ++ libxfs/init.c | 9 +++++++++ 2 files changed, 11 insertions(+), 0 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index e13f468..4497b7f 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -1165,6 +1165,8 @@ main(int argc, char **argv) } check_errors(); + libxfs_umount(mp); + return 0; } diff --git a/libxfs/init.c b/libxfs/init.c index 2859f94..c7f9dc8 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -832,6 +832,15 @@ libxfs_umount(xfs_mount_t *mp) pag = radix_tree_delete(&mp->m_perag_tree, agno); kmem_free(pag); } + + kmem_free(mp->m_attr_geo); + kmem_free(mp->m_dir_geo); + + kmem_free(mp->m_rtdev_targp); + if (mp->m_logdev_targp != mp->m_ddev_targp) + kmem_free(mp->m_logdev_targp); + kmem_free(mp->m_ddev_targp); + } /* -- 1.7.1 From sandeen@sandeen.net Thu Aug 20 13:09:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A67D87F56 for ; Thu, 20 Aug 2015 13:09:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8228A304059 for ; Thu, 20 Aug 2015 11:09:23 -0700 (PDT) X-ASG-Debug-ID: 1440094161-04bdf070b23ec00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id s1lDxH9OokEtSqWd for ; Thu, 20 Aug 2015 11:09:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 494AD61D1A43 for ; Thu, 20 Aug 2015 13:09:21 -0500 (CDT) Message-ID: <55D617D1.7070405@sandeen.net> Date: Thu, 20 Aug 2015 13:09:21 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 2/4] xfs_repair: free msgbuf on exit References: <55D61740.9070507@sandeen.net> X-ASG-Orig-Subj: [PATCH 2/4] xfs_repair: free msgbuf on exit In-Reply-To: <55D61740.9070507@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440094161 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 Just to keep valgrind less noisy, and make it easiser to spot more things that actually matter ... Signed-off-by: Eric Sandeen --- repair/xfs_repair.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index db703d0..85a012b 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -946,5 +946,7 @@ _("Repair of readonly mount complete. Immediate reboot encouraged.\n")); pftrace_done(); + free(msgbuf); + return (0); } -- 1.7.1 From sandeen@sandeen.net Thu Aug 20 13:10:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 32AF47F56 for ; Thu, 20 Aug 2015 13:10:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0A14AC00E for ; Thu, 20 Aug 2015 11:10:10 -0700 (PDT) X-ASG-Debug-ID: 1440094208-04bdf070af3ec60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id B3KTKR7ATDZ0KNw9 for ; Thu, 20 Aug 2015 11:10:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BC3A461D1A43 for ; Thu, 20 Aug 2015 13:10:08 -0500 (CDT) Message-ID: <55D61800.2080802@sandeen.net> Date: Thu, 20 Aug 2015 13:10:08 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 3/4] xfs_repair: call IRELE(ip) after libxfs_trans_iget calls References: <55D61740.9070507@sandeen.net> X-ASG-Orig-Subj: [PATCH 3/4] xfs_repair: call IRELE(ip) after libxfs_trans_iget calls In-Reply-To: <55D61740.9070507@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440094208 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Commit 260c85e libxfs: dont free xfs_inode until complete changed the alloc/free convention a bit: Originally, the xfs_inode are released upon the first call to xfs_trans_cancel, xfs_trans_commit, or inode_item_done. This patch does the following: 1) Removes the iput from the transaction completion and requires that the xfs_inode allocators call IRELE() when they are done with the pointer. But that change missed several callers in xfs_repair phase6; fix that up. Addresses-Coverity-Id: 1315100 Addresses-Coverity-Id: 1315101 Signed-off-by: Eric Sandeen --- repair/phase6.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index 9cfedbf..04638c2 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -585,6 +585,7 @@ mk_rbmino(xfs_mount_t *mp) error); } libxfs_trans_commit(tp); + IRELE(ip); } static int @@ -654,6 +655,7 @@ _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime bitmap inode % } libxfs_trans_commit(tp); + IRELE(ip); return(0); } @@ -714,6 +716,7 @@ fill_rsumino(xfs_mount_t *mp) do_warn( _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime summary inode %" PRIu64 "\n"), bno, map.br_startblock, mp->m_sb.sb_rsumino); + IRELE(ip); return(1); } @@ -726,6 +729,7 @@ _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime summary inode } libxfs_trans_commit(tp); + IRELE(ip); return(0); } @@ -846,6 +850,7 @@ mk_rsumino(xfs_mount_t *mp) error); } libxfs_trans_commit(tp); + IRELE(ip); } /* @@ -920,6 +925,7 @@ mk_root_dir(xfs_mount_t *mp) libxfs_dir_init(tp, ip, ip); libxfs_trans_commit(tp); + IRELE(ip); irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino), XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino)); -- 1.7.1 From sandeen@sandeen.net Thu Aug 20 13:11:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6A2BF7F56 for ; Thu, 20 Aug 2015 13:11:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 533D130405F for ; Thu, 20 Aug 2015 11:11:22 -0700 (PDT) X-ASG-Debug-ID: 1440094280-04cbb032fc403c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6IS9FhClKKabDprT for ; Thu, 20 Aug 2015 11:11:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D36D461D1A43 for ; Thu, 20 Aug 2015 13:11:20 -0500 (CDT) Message-ID: <55D61848.7070607@sandeen.net> Date: Thu, 20 Aug 2015 13:11:20 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 4/4] xfs_repair: unconditionally free blockmaps when threads complete References: <55D61740.9070507@sandeen.net> X-ASG-Orig-Subj: [PATCH 4/4] xfs_repair: unconditionally free blockmaps when threads complete In-Reply-To: <55D61740.9070507@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440094280 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 blkmap_free() doesn't actually free the block map unless it's inordinately large; this keeps us from constantly freeing and re-allocating blockmaps for each inode, which makes sense. However, once the threads which have allocated these structures exit, we should actually free them; they can grow up to 2MB for each of the data and attr maps, for each thread, and not be freed through the normal blkmap_free() test. Signed-off-by: Eric Sandeen --- repair/bmap.c | 17 ++++++++++++++++- repair/bmap.h | 1 + repair/phase3.c | 2 ++ repair/phase4.c | 1 + 4 files changed, 20 insertions(+), 1 deletions(-) diff --git a/repair/bmap.c b/repair/bmap.c index 2655632..abe9f48 100644 --- a/repair/bmap.c +++ b/repair/bmap.c @@ -82,7 +82,8 @@ blkmap_alloc( * extents) then free it to release the memory. This prevents us from pinning * large tracts of memory due to corrupted fork values or one-off fragmented * files. Otherwise we have nothing to do but keep the memory around for the - * next inode + * next inode. + * When the thread is done, it should do an unconditional, final free. */ void blkmap_free( @@ -103,6 +104,20 @@ blkmap_free( free(blkmap); } +void +blkmap_free_final(void) +{ + blkmap_t *blkmap; + + blkmap = pthread_getspecific(dblkmap_key); + pthread_setspecific(dblkmap_key, NULL); + free(blkmap); + + blkmap = pthread_getspecific(ablkmap_key); + pthread_setspecific(ablkmap_key, NULL); + free(blkmap); +} + /* * Get one entry from a block map. */ diff --git a/repair/bmap.h b/repair/bmap.h index 973081a..501ef6b 100644 --- a/repair/bmap.h +++ b/repair/bmap.h @@ -58,6 +58,7 @@ extern pthread_key_t ablkmap_key; blkmap_t *blkmap_alloc(xfs_extnum_t nex, int whichfork); void blkmap_free(blkmap_t *blkmap); +void blkmap_free_final(void); int blkmap_set_ext(blkmap_t **blkmapp, xfs_fileoff_t o, xfs_fsblock_t b, xfs_filblks_t c); diff --git a/repair/phase3.c b/repair/phase3.c index 20786af..76c9440 100644 --- a/repair/phase3.c +++ b/repair/phase3.c @@ -27,6 +27,7 @@ #include "err_protos.h" #include "dinode.h" #include "progress.h" +#include "bmap.h" static void process_agi_unlinked( @@ -75,6 +76,7 @@ process_ag_func( wait_for_inode_prefetch(arg); do_log(_(" - agno = %d\n"), agno); process_aginodes(wq->mp, arg, agno, 1, 0, 1); + blkmap_free_final(); cleanup_inode_prefetch(arg); } diff --git a/repair/phase4.c b/repair/phase4.c index e0571e8..1a7d7b5 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -138,6 +138,7 @@ process_ag_func( wait_for_inode_prefetch(arg); do_log(_(" - agno = %d\n"), agno); process_aginodes(wq->mp, arg, agno, 0, 1, 0); + blkmap_free_final(); cleanup_inode_prefetch(arg); /* -- 1.7.1 From sandeen@sandeen.net Thu Aug 20 14:52:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 279F07CBE for ; Thu, 20 Aug 2015 14:52:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16AE28F8059 for ; Thu, 20 Aug 2015 12:52:17 -0700 (PDT) X-ASG-Debug-ID: 1440100336-04cbb032f642c80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fu89d3VMrRsiw9L1 for ; Thu, 20 Aug 2015 12:52:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 036A3661D58C for ; Thu, 20 Aug 2015 14:52:15 -0500 (CDT) Message-ID: <55D62FEF.3020404@sandeen.net> Date: Thu, 20 Aug 2015 14:52:15 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfsprogs: remove self-assignment in libxfs/util.c Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfsprogs: remove self-assignment in libxfs/util.c Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440100336 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We don't have percpu counters in userspace, so libxfs plays tricks. Rather than calling percpu_counter_set() in xfs_reinit_percpu_counters, we just directly assign the values in mp->m_sb to the counters in mp. But this was already handled by #defining the percpu counters in the mount structure to those in the superblock, i.e.: #define m_icount m_sb.sb_icount #define m_ifree m_sb.sb_ifree #define m_fdblocks m_sb.sb_fdblocks so we actually end up with pointless self-assignment. Define away the xfs_reinit_percpu_counters() function, because it's a no-op. Addresses-Coverity-Id: 1298009 Signed-off-by: Eric Sandeen --- diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 1b01764..105290e 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -494,7 +494,8 @@ struct xfs_buf *xfs_trans_buf_item_match(struct xfs_trans *, #define xfs_mod_frextents(mp, delta) \ libxfs_mod_incore_sb(mp, XFS_TRANS_SB_FREXTENTS, delta, 0) int libxfs_mod_incore_sb(struct xfs_mount *, int, int64_t, int); -void xfs_reinit_percpu_counters(struct xfs_mount *mp); +/* percpu counters in mp are #defined to the superblock sb_ counters */ +#define xfs_reinit_percpu_counters(mp) void xfs_trans_mod_sb(struct xfs_trans *, uint, long); void xfs_trans_init(struct xfs_mount *); diff --git a/libxfs/util.c b/libxfs/util.c index 8272609..c9f9175 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -729,12 +729,3 @@ xfs_verifier_error( bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", bp->b_bn, BBTOB(bp->b_length)); } - -void -xfs_reinit_percpu_counters( - struct xfs_mount *mp) -{ - mp->m_icount = mp->m_sb.sb_icount; - mp->m_ifree = mp->m_sb.sb_ifree; - mp->m_fdblocks = mp->m_sb.sb_fdblocks; -} From david@fromorbit.com Thu Aug 20 18:05:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1AED37F67 for ; Thu, 20 Aug 2015 18:05:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B2AB8F8065 for ; Thu, 20 Aug 2015 16:04:56 -0700 (PDT) X-ASG-Debug-ID: 1440111893-04cbb0330347130001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id txrV8JAyTH0aZroj for ; Thu, 20 Aug 2015 16:04:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DQCgDBW9ZVPEDvLHldgxuBPYZToxcBAQEBAQEGm1cEAgKBPE0BAQEBAQEHAQEBAUABP4QjAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhOIJgfQFAEBAQcCIBmGB4UzhQoHhCwFhyKGbIcbjGyOaYtVhDUsM4JMAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Aug 2015 08:34:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSYt9-0001Rs-Nf; Fri, 21 Aug 2015 09:04:51 +1000 Date: Fri, 21 Aug 2015 09:04:51 +1000 From: Dave Chinner To: Tejun Heo Cc: Eryu Guan , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150820230451.GT714@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> <20150820165537.GA2044@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150820165537.GA2044@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1440111894 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21784 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 20, 2015 at 09:55:37AM -0700, Tejun Heo wrote: > Hello, Eryu. Thanks a lot for the trace. > > So, this is from the end of the trace from the failed test. > > ... > kworker/u8:1-1563 [002] 22016.987530: xfs_writepage: dev 253:6 ino 0xef64fe pgoff 0x9ff000 size 0xa00000 offset 0 length 0 delalloc 1 unwritten 0 > kworker/2:1-49 [002] 22017.373595: xfs_setfilesize: dev 253:6 ino 0xef6504 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 > ... > > Maybe I'm misunderstanding the code but all xfs_writepage() calls are > from unbound workqueues - the writeback workers - while > xfs_setfilesize() are from bound workqueues, so I wondered why that > was and looked at the code and the setsize functions are run off of a > separate work item which is queued from the end_bio callback and I > can't tell who would be waiting for them. Dave, what am I missing? xfs_setfilesize runs transactions, so it can't be run from IO completion context as it needs to block (i.e. on log space or inode locks). It also can't block log IO completion, nor metadata Io completion, as only log IO completion can free log space, and the inode lock might be waiting on metadata buffer IO completion (e.g. during delayed allocation). Hence we have multiple IO completion workqueues to keep these things separated and deadlock free. i.e. they all get punted to a workqueue where they are then processed in a context that can block safely. > kworker/u8:1-1563 [002] 22016.987530: xfs_writepage: dev 253:6 ino 0xef64fe pgoff 0x9ff000 size 0xa00000 offset 0 length 0 delalloc 1 unwritten 0 There will be one of these per page that is submitted to XFS. There won't be one per page, because XFS clusters writes itself. This trace is telling us that the page at offset 0x9ff000 was submitted, the in-memory size of the inode at this time is 0xa00000 (i.e. this is the last dirty page in memory) and that the it is a delayed allocation extent (i.e. hasn't been written before). > kworker/2:1-49 [002] 22017.373595: xfs_setfilesize: dev 253:6 ino 0xef6504 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 There will be one of these per IO completion that extents the inode size. This one tells us the in-memory inode size is 0xa00000, the current on-disk inode size is 0, and the IO being completed spans the offsets 0 to 10481664 (0x9ff000). Which means it does not include the page submitted by the above trace, and after the setsize transaction, isize=0xa00000 and disize=0x9ff000. Note that these two traces are from different inodes - you need to match traces from "ino 0xef6504" with other traces from the same inode. Also, note that the trace is not complete - there are many, many missing trace events in the output.... What is interesting from the trace is that all the file size updates have this pattern: kworker/2:1-49 [002] 22017.377918: xfs_setfilesize: dev 253:6 ino 0xef64fd isize 0xa00000 disize 0x0 offset 0x0 count 10481664 kworker/2:1-49 [002] 22017.378438: xfs_setfilesize: dev 253:6 ino 0xef64fd isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 There are two IOs being done - one for everything but the last page, and one for the last page. This is either a result of the writeback context limiting the number of pages per writeback slice, or the page clustering that XFS does in xfs_vm_writepage() not quite getting everything right (maybe an off-by-one?). However, this doesn't appear to be a contributing factor. The 9 files that have the wrong file size at the end of the test match up exactly with the last 9 writepage submissions and IO completions; they happen after all the IO completions occur for all the good files. This implies that the sync is either not submitting all the inodes for IO correctly or it is not waiting for all the inodes it submitted to be marked clean. We really need the writeback control tracepoints in the output to determine exactly what the sync was doing when it submitted these last inodes for writeback.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 20 19:42:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DCAAE7F6A for ; Thu, 20 Aug 2015 19:42:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4C5FFAC009 for ; Thu, 20 Aug 2015 17:42:27 -0700 (PDT) X-ASG-Debug-ID: 1440117743-04cb6c278244600001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FpCM7O4g6AETtrYT for ; Thu, 20 Aug 2015 17:42:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DsCgC6ctZVPEDvLHldgxuBATyGU6MXAQEBAQEBBptXBAICgT5NAQEBAQEBBwEBAQFAAT+EIwEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTG4gLB89+LBmGB4QwgQOESEIHhCwFkheDEodxhHuBTYdKiHaIMYI0HIFlLDOBB4FFAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Aug 2015 10:04:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSaID-0001aB-7z; Fri, 21 Aug 2015 10:34:49 +1000 Date: Fri, 21 Aug 2015 10:34:49 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150821003449.GU714@dastard> X-ASG-Orig-Subj: Re: v5 filesystem corruption due to log recovery lsn ordering References: <20150819183904.GB49174@bfoster.bfoster> <20150819224453.GL3902@dastard> <20150820162529.GB13033@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150820162529.GB13033@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440117743 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 20, 2015 at 12:25:29PM -0400, Brian Foster wrote: > On Thu, Aug 20, 2015 at 08:44:53AM +1000, Dave Chinner wrote: > > On Wed, Aug 19, 2015 at 02:39:05PM -0400, Brian Foster wrote: > > > Hi all, > > > > > > Here's another issue I've run into from recent log recovery testing... > > > > > > Many on-disk data structures for v5 filesystems have the LSN from the > > > last modification stamped the associated header. As of the following > > > commit, log recovery compares the recovery item LSN against the LSN of > > > the on-disk structure to avoid restoration of stale contents: > > > > > > 50d5c8d xfs: check LSN ordering for v5 superblocks during recovery > > > > > > This presumably addresses some problems where recovery of the stale > > > contents leads to CRC failure. The problem here is that xfs_repair > > > clears the log (even when the fs is clean) and resets the current LSN on > > > the next mount. This creates a situation where logging is ineffective > > > for any structure that has not yet been modified since the current LSN > > > was reset. > > > > Well, that was a bit of an oversight... > > > > .... > > > > > > > > The larger question is how to resolve this problem? I don't think this > > > is something that is ultimately addressed in xfs_repair. Even if we > > > stopped clearing the log, that doesn't help users who might have had to stori> > > forcibly zero the log to recover a filesystem. Another option in theory > > > might be to unconditionally reset the LSN of everything on disk, but > > > that sounds like overkill just to preserve the current kernel > > > workaround. > > > > Well, it's relatively easy to detect a log that has been zeroed if > > the cycle count is more than a cycle or two lower than the LSN in > > important metadata, but I'm not sure we can reliably detect that. > > > > > It sounds more to me that we have to adjust this behavior on the kernel > > > side. That said, the original commit presumably addresses some log > > > recovery shutdown problems that we do not want to reintroduce. I haven't > > > yet wrapped my head around what that original problem was, but I wanted > > > to get this reported. If the issue was early buffer I/O submission, > > > perhaps we need a new mechanism to defer this I/O submission until a > > > point that CRC verification is expected to pass (or otherwise generate a > > > filesystem error)? Or perhaps do something similar with CRC > > > verification? Any other thoughts, issues or things I might have missed > > > here? > > > > The issue that the LSN ordering fixes is that of unsynchronised > > recovery of different log records that contain the same objects. > > e.g. ordering of inode chunk allocation (in buffers) vs inode object > > modification (in inode items). v4 filesystems have a serious problem > > where inode chunk allocation can be run after the inode item > > modifications, resulting in recovery "losing" file size updates that > > sync flushed to the log. > > > > Hmm, so I would have expected these kind of operations to generally > occur in order. I'm clearly still missing some context on the overall > log item lifecycle to understand how this might occur. They do now for v5 filesystems - all the changes that led up to where we are now got us to this point... > Using the inode chunk allocation and inode modification example... > clearly the transactions have to commit in order because the inodes must > be allocated before they can be used/modified. At what point after that > is reordering possible? Are we talking about reordering of the items > from the cil/log buffers to the on-disk log, or reordering of the items > during recovery (or both)? Both. Look at inode allocation buffers, which are pinned in the AIL so they can't be moved forward by subsequent modifications (e.g. inode unlinks) until the newly initialised buffers have been written to disk. Look at them again in log recovery, where they are re-ordered to the start of a transaction so they are replayed before inode log items and inode unlink buffer operations. > > i.e. create just the right number of small files, sync, crash and > > recovery gives a number of zero length files in certain inode chunks > > because the ordering of item recovery was wrong. > > > > Another problem with inode logging is the flushiter field, which is > > used to try to avoid replaying changes in the log that have already > > been flushed to disk. This could also lead to lost inode > > modifications after a sync because the flushiter is reset to zero > > after each time the inode item is recovered. This was mostly avoided > > by logging all inode modifications and using delayed logging, but > > could still occur... > > > > There was a long history of these sorts of problems occurring (I > > first analysed the inode allocation/inode item update failure mode > > back in 2006), and I found several other possible issues like this > > to do with the inode flushiter at the same time. I also suspected > > that there were problems with directory recovery due to the same > > inode item vs buffer item ordering issues, but could never pin them > > down. > > > > So the solution was to record the LSN of the last modification in > > every item as it is written to disk, thereby ensuring we knew > > exactly what transaction the item was last modified in. This means > > we can skip modifications in transaction recovery that are already > > on disk. > > > > Given the reordering is possible (despite my lingering questions wrt to > exactly how, above) this makes sense as a mechanism to address that > problem. Yup, that's what we have done in the past with hacks and algorithm fixes. What the LSN stamping also gives us iis the freedom to move beyond logging every change we make in full to the log. e.g. intent based logging using ordered buffers that move through the AIL and hence pin the log until they are written (e.g. swap extents BMBT owner change). > > ---- > > > > The first thing we need to do is not zero the log in xfs_repair when > > the log is clean to minimise future exposure to this issue on > > existing systems. > > > > Eh, I'm not really sure this helps us that much. We still have to deal > with the issue so long as current xfsprogs versions are out there. We > also have no real way of knowing whether a filesystem could have been > affected by the problem or not. Yup, so let's take steps to ensure that the future xfsprogs don't cause us problems, and then we can also tell users to upgrade to the latest xfsprogs to solve the issue. > FWIW, xfs_metadump also results in > similar behavior, which means that technically it's possible for > different behavior on a restored metadump from the original fs. That's > less critical, but clearly not ideal and something to be aware of. So we fix metadump, too. > That said, I think it is somewhat strange for xfs_repair to zero the log > unconditionally, this issue aside. So I'm not really against that change > in general. I just think we need a kernel fix first and foremost. Most users won't/can't upgrade to a kernel that will solve the problem - it's often much easier to get them a userspace package that minimises their exposure to a problem caused by their current userspace package.... > > Then, on the kernel side, we need is a reliable way to detect that > > the log head/tail pointers have been reset in the kernel. This means > > we can - at minimum - issue a warning during log recovery that this > > has been detected. > > > > Finally, we need to work out how to handle recovery in the situation > > that the log has been zeroed and the filesystem has a mix of new and > > old, stale LSNs. I think the simplest way around this is not to > > handle it in log recovery at all, but to avoid it altogether. > > > > That is, when we find the log head/tail point to a zeroed log, we > > pull the current LSN from, say, the superblock (and maybe other > > metadata such as AG headers) and initialise the log head/tail to the > > cycle number + some offset so that every new transaction is > > guaranteed to have a cycle number more recent than any other LSN in > > the filesystem and ordering is preserved, even if the log has been > > zeroed. > > > > That's an interesting idea, but I wonder if it truly fixes the problem > or just makes it potentially more difficult to reproduce. One concern is > that even with this in place, all it takes to reintroduce the problem is > for a filesystem to run a bit on an older kernel in a situation where > the LSN is reset and enough modification has occurred to update whatever > key metadata we determine as important with the reset LSNs. We can't prevent that - that horse has already bolted. > A mount > alone is enough to pollute the superblock in this manner. Further > modification is probably necessary to affect the agi/agf headers, > however. It might not be the most likely scenario, but what is more > concerning is that if it does occur, it's completely invisible to our > detection on updated kernels. Would we want to consider a new > ro-incompat feature bit for this mechanism to prevent that? We could, but preventing people from downgrading from new kernels because of a problem 99.9% of current users are never going to see? And with a fixed and upgraded userspace, it will be problem that they'll never see, either? > Another concern is that we're assuming that the key metadata will always > have the most recent LSN. I think the closest thing to a guarantee we > have of that is the superblock being updated on umount and every so > often by xfs_log_worker() to cover the log. After a bit of playing > around, I'm not so sure that is enough. Sure, I just threw it out as a way to get a more recent LSN. The only way to reliably get the highest LSN is to walk all the metadata in the filesystem. We can't do that at mount time, so perhaps it is best to just refuse to mount read-write and issue a warning to upgrade xfsprogs and re-run xfs_repair. > So now we have reset the LSN according to the log. Presumably the mount > now inspects the superblock and each AG header and inherits the largest > LSN plus some offset as the current LSN: LSN X+N. Directory d2 still has > LSN Y, however, and we have no guarantee that N > Y-X. In other words, I > think we can end up right back where we started. Make a modification to > directory d2 at this point, crash the fs, and recovery might or might > not replay a log record with LSN X+N against a target directory buffer > with LSN Y. These scenarios all result from running xfs_repair. It's the source of the problem, so let's treat it primarily as a bug in xfs_repair. The number of users that run xfs_repair are very small compared to the wider user-base, so having the kernel say "upgrade xfsprogs and repair" is probably the most reliable way to fix the problem. So, to repair: have it record LSNs as it walks the metadata and at the start of phase 5 have it select a new cycle number higher than the highest LSN found in the filesystem. Stamp the log with that cycle number as well as all metadata that is being rebuilt in phase 5, and all the superblocks. Problem solved. > Again, that's a contrived and probably unlikely scenario, but could be > extremely difficult to detect or root cause if it ever does occur. :/ > Thoughts? Is there something further we can do to mitigate this, or am I > missing something else? IMO, you're over-complicating the situation. We can't go back and change history, nor make people upgrade to systems that won't suffer from this problem. Hence we're just going to have to live with it, just like all the other log recovery bugs we've lived with since finding and fixing them. If we do the simple thing and just detect zeroed logs in the kernel and refuse read-write mounts, that's something we can easily backport to all stable kernels that we support CRCs on (i.e. 3.16 to present). And with a fixed xfs_repair, the problem goes away as users and distros pull new in the new package, even if they are running old kernels. > Also, a random thought: I wonder if an update to the log zeroing > mechanism to ensure that a subsequent mount picked up the LSN where it > left off would be enough to get around much of this. That could mean > stamping the log appropriately in repair, or adding something like a new > continue_lsn field in the superblock to be used by anybody who zeroes > the log and picked up on the next mount, etc... Sure - that's just a variant my first suggestion (of don't zero the log in xfs_repair). Remember that you said "I don't think that helps us very much". :) And, FWIW, my "read the LSN from metadata and use the highest" idea above is just a further refinement of the two, so we can fix zeroed logs from existing xfs_repair binaries without needing to do anything extra in the kernel other than detect a zeroed log... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 20 19:51:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2306C7CBE for ; Thu, 20 Aug 2015 19:51:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13026304066 for ; Thu, 20 Aug 2015 17:51:49 -0700 (PDT) X-ASG-Debug-ID: 1440118306-04cb6c2780447f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id n7QBHRf6LTWU8Yo7 for ; Thu, 20 Aug 2015 17:51:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BACwA7ddZVPEDvLHldgxuBPYZToxcBAQEBAQEGm1cCAgEBAoE+TQEBAQEBAQcBAQEBQAE/hCMBAQEDASMPASMjBQsIAw4HAwICBSECAg8FJQMHGhOIJge5Y5YVASsZgQmEfoQwgQOFCgeCaYFDBYUwjGeDEoo+gi6aPoQ1LDOCTAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Aug 2015 10:12:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSaQ2-0001ao-Ll; Fri, 21 Aug 2015 10:42:54 +1000 Date: Fri, 21 Aug 2015 10:42:54 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build Message-ID: <20150821004254.GV714@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build References: <1439979814-18934-1-git-send-email-david@fromorbit.com> <20150820113200.GA13033@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20150820113200.GA13033@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440118306 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 20, 2015 at 07:32:00AM -0400, Brian Foster wrote: > On Wed, Aug 19, 2015 at 08:23:34PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Fix CONFIG_LOCKDEP=n build, because asserts I put in to ensure we > > aren't overrunning lockdep subclasses in commit 0952c81 ("xfs: > > clean up inode lockdep annotations") use a define that doesn't > > exist when CONFIG_LOCKDEP=n > > > > Only check the subclass limits when lockdep is actually enabled. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_inode.c | 16 ++++++++++++++-- > > 1 file changed, 14 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > > index dd584da..30555f8 100644 > > --- a/fs/xfs/xfs_inode.c > > +++ b/fs/xfs/xfs_inode.c > > @@ -362,6 +362,17 @@ int xfs_lots_retries; > > int xfs_lock_delays; > > #endif > > > > +#ifdef CONFIG_LOCKDEP > > +static bool > > +xfs_lockdep_subclass_ok( > > + int subclass) > > +{ > > + return subclass < MAX_LOCKDEP_SUBCLASSES; > > +} > > +#else > > +#define xfs_lockdep_subclass_ok(subclass) (true) > > +#endif > > + > > FYI, there's a compile warning with debug and verbose warnings disabled: > > ... > CC [M] fs/xfs//xfs_super.o > fs/xfs//xfs_inode.c:367:1: warning: ‘xfs_lockdep_subclass_ok’ defined but not used [-Wunused-function] > xfs_lockdep_subclass_ok( > ^ > ... Yeah, I know. I've got another patch to fix that. I didn't test all 6 different combinations of the relevant config parameters before pushing the change. (I turned off CONFIG_XFS_DEBUG, but turned on CONFIG_XFS_WARN, so the function was still used). I haven't pushed it yet, becuse it's just a useless warning rather than a full build breakage and there's been other stuff I've needed to deal with. (I don't work at all efficiently when I have to context switch all the time. And there's so many things I nee dto pay attention to that I'm context switching every few minutes...) > Perhaps it's best to just use the #define in both cases? -#ifdef CONFIG_LOCKDEP +#if (defined(DEBUG) || defined(XFS_WARN)) && CONFIG_LOCKDEP is how I fixed it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 20 19:51:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D8F407F6F for ; Thu, 20 Aug 2015 19:51:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C93E98F8068 for ; Thu, 20 Aug 2015 17:51:52 -0700 (PDT) X-ASG-Debug-ID: 1440118306-04cb6c2780447f0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VDGuDS8BENIkIaEB for ; Thu, 20 Aug 2015 17:51:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DnFgA7ddZVPEDvLHldgxuBPYZToxcBAQEBAQEGm1cCAgEBAoE+TQEBAQEBAQcBAQEBQAE/QQODYAEBBCMPASMjEAgDDgoCAgUhAgIPBSUDBxoTiC25Y5YVAQEIAgEfGYEJhH6FM4UKB4JpgUMFlSmMbJo+hDUsM4JMAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Aug 2015 10:13:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSaQZ-0001ax-31; Fri, 21 Aug 2015 10:43:27 +1000 Date: Fri, 21 Aug 2015 10:43:27 +1000 From: Dave Chinner To: Jan Tulak Cc: Christoph Hellwig , xfs-oss Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Message-ID: <20150821004326.GW714@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150818214557.GC3902@dastard> <20150819080940.GA13130@infradead.org> <20150819102623.GK3902@dastard> <20150820002251.GN3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440118308 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 20, 2015 at 09:33:33AM +0200, Jan Tulak wrote: > On Thu, Aug 20, 2015 at 2:22 AM, Dave Chinner wrote: > > > On Wed, Aug 19, 2015 at 08:26:23PM +1000, Dave Chinner wrote: > > > On Wed, Aug 19, 2015 at 01:09:40AM -0700, Christoph Hellwig wrote: > > > > On Wed, Aug 19, 2015 at 07:45:57AM +1000, Dave Chinner wrote: > > > > > Hmmm, looks like I accidentally comitted an earlier version of this > > > > > patch yesterday. Jan, can you send delta patches to what I committed > > > > > to address more recent review comments? Sorry, my bad. > > > > > > > > Can you revert it for now? I think most of these changes are incorrect > > > > and should either be dropped for now by disabling fsx or will need > > > > a major rework. > > > > > > I'll just rebase the for-next branch, I guess, and remove it > > > completely from the history. I've got another lockdep fix that needs > > > to be pushed before it all hits tomorrow's linux-next build, anyway. > > > > Getting my trees mixed up. I'll revert the patch on the next push. > > > ​And as I noticed, ' > xfsprogs: Add includes required for OS X builds > ​' was ​also > selected in an older version. Other patches looks OK, though. :-) > Should I send delta patch for that one? It is just about three #includes. Yes. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ae@a.wandaec.net Thu Aug 20 23:26:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,FREEMAIL_FROM, UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D60357F73 for ; Thu, 20 Aug 2015 23:26:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73AFAAC003 for ; Thu, 20 Aug 2015 21:26:00 -0700 (PDT) X-ASG-Debug-ID: 1440131154-04cb6c2783480d0001-NocioJ Received: from a.wandaec.net ([101.205.78.84]) by cuda.sgi.com with SMTP id qFhLTHgYpDXSEaHt for ; Thu, 20 Aug 2015 21:25:55 -0700 (PDT) X-Barracuda-Envelope-From: ae@a.wandaec.net X-Barracuda-Apparent-Source-IP: 101.205.78.84 Received: from 58.251.146.162 (HELO VSTEBKELQ); Fri, 21 Aug 2015 12:25:54 +0800 Date: Fri, 21 Aug 2015 12:25:34 +0800 From: "jane" <3207947485@qq.com> Reply-To: sales@shop-led.net To: "xfs" Subject: LED Tube Message-ID: <201508211225346255937@a.wandaec.net> X-ASG-Orig-Subj: LED Tube X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[101.205.78.84] X-Barracuda-Start-Time: 1440131154 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.83 X-Barracuda-Spam-Status: No, SCORE=0.83 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, RDNS_NONE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21791 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers RGVhciBzaXJzIG9yIG1hZGFtLA0KDQpUaGlzIGlzIGphbmUgZnJvbSBTaGVuemhlbiBSdWlzaGVu ZyBJbnRlcm5hdGlvbmFsIEluZHVzdHJpYWwsd2hvIHNwZWNpYWxpemUgaW4gbWFudWZhY3R1cmlu ZyBMRUQgbGlnaHQgLGJ1bGIsZG93biBsaWdodCBhbmQgc29tZSByZWxhdGVkIGl0ZW1zLA0KDQpB bGwgb2Ygb3VyIGl0ZW1zIGFyZSB3aXRoIGV4Y2VsbGVudCBxdWFsaXR5IGFuZCByZWFzb25hYmxl IHByaWNlIUhvcGUgdG8gZW50ZXIgYnVzaW5lc3Mgd2l0aCB5b3UhDQoNCg0KRW5jbG9zZWQgaXMg b3VyIGNvbXBhbnkgY2F0YWxvZ3VlLlBscyBraW5kbHkgY2hlY2sgYW5kIHJldmVydCBhdCB5b3Vy IGVhcmxpc3QhDQoNClRoYW5rcyBhbmQgYmVzdCByZWdhcmRzLA0KamFuZQ0KDQpTaGVuemhlbiBS dWlzaGVuZyBJbnRlcm5hdGlvbmFsIEluZHVzdHJpYWwgTGltaXRlZA0Kd2ViOnd3dy5zaG9wLWxl ZC5uZXQgDQptYWlsOmphbmVAc2hvcC1sZWQubmV0ICAzMjA3OTQ3NDg1QHFxLmNvbQ0KUlVJIFNI RU5HIElOVEVSTkFUSU9OQUwgSU5EVVNUUklBTCBMSU1JVEVEDQpGICsgODYtMDc1NS04MzE0Njgx MiAgICBNKyA4Ni0xMzEzODU5ODgyOQ0KU2t5cGU6amFuZUBzaG9wLWxlZC5uZXQgICAgIFFROjMy MDc5NDc0ODU= From simonxiaomg@gmail.com Fri Aug 21 04:05:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D8FF77F75 for ; Fri, 21 Aug 2015 04:05:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CB6E30405F for ; Fri, 21 Aug 2015 02:05:04 -0700 (PDT) X-ASG-Debug-ID: 1440147901-04bdf070af513b0001-NocioJ Received: from mail-io0-f181.google.com (mail-io0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id SuQiT0cgw0oU3xRM (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Aug 2015 02:05:01 -0700 (PDT) X-Barracuda-Envelope-From: simonxiaomg@gmail.com Received: by iodt126 with SMTP id t126so75100184iod.2 for ; Fri, 21 Aug 2015 02:05:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=WfxrMZFufK92afeDRyNZ2zMYJMe+NlgLCxD6dOowgSI=; b=npyY9hu3bX8PZhaVrgDcUjxU1eP3vc92r5Kh7RPCIS8fWY64Ci8w8tmg9ur8N8UueG LAhXM75afe083Mqtghf+Ly2yinKw+SElTYpIjDD4FJddYwAjfzgLZKeHTKzWrWGAxdFJ qh2sKFqLgwiYtq4tGI79nHRLfnI6sgl4r7UcC56Yf60/YoY/O+DD3syrJCQPNSSkEAbW 55vxkbOzSvoJZKVky3mgQ9JW92rgkfK9aTFNR09aPfxwWo68eI3oXmbHFyC84WLQuvq6 Hq/sGxkbGjucgRdoKhJF1uCcdF0e8skTxurfLgtD0e8pJ2ww9F236WY+lHhDtLWyLbMN lx1A== MIME-Version: 1.0 X-Received: by 10.107.152.81 with SMTP id a78mr6318110ioe.145.1440147900902; Fri, 21 Aug 2015 02:05:00 -0700 (PDT) Received: by 10.107.12.70 with HTTP; Fri, 21 Aug 2015 02:05:00 -0700 (PDT) Date: Fri, 21 Aug 2015 17:05:00 +0800 Message-ID: Subject: xfs directory quota doesn't work From: Simon Xia X-ASG-Orig-Subj: xfs directory quota doesn't work To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a114043c60eb392051dce9020 X-Barracuda-Connect: mail-io0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1440147901 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21795 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a114043c60eb392051dce9020 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable hi, everyone, I encounter a problem when using xfs now I have two tasks and I wanna run them in different directory and limit the directory=E2=80=99s size. I use xfs=E2=80=99s project quota to achieve = this. I follow the steps from here: https://solidlinux.wordpress.com/2012/12/09/xfs-quota-managament/ here is detail of my two config files /etc/projects: 11:/home/xiameng.xm/xfs_dir/task1 12:/home/xiameng.xm/xfs_dir/task2 /etc/projid: task1:11 task2:12 and here is my step: touch test_xfs dd if=3D/dev/zero of=3Dtest_xfs bs=3D1000000 count=3D1 mkfs.xfs test_xfs mkdir xfs_dir mount test_xfs ./xfs_dir -o pquota,loop xfs_quota -xc 'project =E2=80=93s task1' /home/xiameng.xm/xfs_dir xfs_quota -xc 'project =E2=80=93s task2' /home/xiameng.xm/xfs_dir xfs_quota -x -c 'limit -p bhard=3D2m task1' /home/xiameng.xm/xfs_dir xfs_quota -x -c 'limit -p bhard=3D10m task2' /home/xiameng.xm/xfs_dir here is the output of xfs_quota -x -c 'report /home/xiameng.xm/xfs_dir' Project quota on /home/xiameng.xm/xfs_dir (/dev/loop1) Blocks Project ID Used Soft Hard Warn/Grace ---------- -------------------------------------------------- task1 0 0 2048 00 [--------] task2 0 0 10240 00 [--------] the question is no mater how large I create a file in ./xfs_dir/task1 or ./xfs_dir/task2, it success! the quota limit doesn=E2=80=99t work! Any help will be appreciated :) ps: I also post my question here: http://unix.stackexchange.com/questions/224606/xfs-directory-quota-doesnt-w= ork ---- Best Regards Simon Xia =E2=80=8B --001a114043c60eb392051dce9020 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

hi, everyone, I encounter a problem when us= ing xfs

now I have two tasks and I wanna ru= n them in different directory and limit the directory=E2=80=99s size. I use= xfs=E2=80=99s project quota to achieve this.

I follow the steps from here:htt= ps://solidlinux.wordpress.com/2012/12/09/xfs-quota-managament/

here is detail of my two config fil= es

/etc/projects:

11:/home/xiameng.xm/xfs_d=
ir/task1
12:/home/xiameng.xm/xfs_dir/task2

/etc/projid:

task1:11
task2:12

and here is my step:

touch test_xfs
dd if=3D/dev/zero of=3Dtest_xfs bs=3D1000000 count=3D1
mkfs.xfs test_xfs

mkdir xfs_dir
mount test_xfs ./xfs_dir -o pquota,loop

xfs_quota -xc 'project =E2=80=93s task1' /home/xiameng.xm/xfs_dir
xfs_quota -xc 'project =E2=80=93s task2' /home/xiameng.xm/xfs_dir

xfs_quota -x -c 'limit -p bhard=3D2m task1' /home/xiameng.xm/xfs_di=
r
xfs_quota -x -c 'limit -p bhard=3D10m task2' /home/xiameng.xm/xfs_d=
ir

here is the output of = xfs_quota -x -c 'report /home/xiameng.xm/xfs_dir'<= /code>

Project quota on /home/xi=
ameng.xm/xfs_dir (/dev/loop1)
                               Blocks
Project ID       Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
task1               0          0       2048     00 [--------]
task2               0          0      10240     00 [--------]

the question is no mat= er how large I create a file in ./xfs_dir/task1 or = ./xfs_dir/task2, it success!

the quota limit doesn=E2=80=99t wor= k!

Any help will be appreciated :)


ps: I also post my question here:=C2=A0http://= unix.stackexchange.com/questions/224606/xfs-directory-quota-doesnt-work=

----

Best Regards
Simon Xia

=E2=80= =8B
--001a114043c60eb392051dce9020-- From eguan@redhat.com Fri Aug 21 05:21:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 660907F75 for ; Fri, 21 Aug 2015 05:21:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E46DBAC00A for ; Fri, 21 Aug 2015 03:20:58 -0700 (PDT) X-ASG-Debug-ID: 1440152457-04cbb03303540c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RcXL9aIRevQysb60 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 03:20:57 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id E68888CF56; Fri, 21 Aug 2015 10:20:56 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LAKs8E015826; Fri, 21 Aug 2015 06:20:55 -0400 Date: Fri, 21 Aug 2015 18:20:53 +0800 From: Eryu Guan To: Dave Chinner Cc: Tejun Heo , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150818215611.GD3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440152457 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 19, 2015 at 07:56:11AM +1000, Dave Chinner wrote: > On Tue, Aug 18, 2015 at 12:54:39PM -0700, Tejun Heo wrote: [snip] > > I'd suggest looking at some of the XFS tracepoints during the test: > > tracepoint trigger > xfs_file_buffered_write once per write syscall > xfs_file_sync once per fsync per inode > xfs_vm_writepage every ->writepage call > xfs_setfilesize every IO completion that updates inode size > > And it's probably best to also include all the writeback > tracepoints, too, for context. That will tell you what inodes and > what part of them are getting written back and when.... I finally reproduced generic/048 with both xfs and writeback tracepoints enabled, please download the trace dat file and trace report file from http://128.199.137.77/writeback/ Thanks, Eryu From bfoster@redhat.com Fri Aug 21 06:09:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AC65C7F62 for ; Fri, 21 Aug 2015 06:09:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 922ED8F8073 for ; Fri, 21 Aug 2015 04:09:10 -0700 (PDT) X-ASG-Debug-ID: 1440155347-04cb6c278050140001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WTDXylFB2YK4xcGC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 04:09:08 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id CDDBAABB09; Fri, 21 Aug 2015 11:09:07 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LB97Sq014491; Fri, 21 Aug 2015 07:09:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8BA42123E8A; Fri, 21 Aug 2015 07:09:06 -0400 (EDT) Date: Fri, 21 Aug 2015 07:09:06 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build Message-ID: <20150821110906.GA46372@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: inode lockdep annotations broke non-lockdep build References: <1439979814-18934-1-git-send-email-david@fromorbit.com> <20150820113200.GA13033@bfoster.bfoster> <20150821004254.GV714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150821004254.GV714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440155348 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 21, 2015 at 10:42:54AM +1000, Dave Chinner wrote: > On Thu, Aug 20, 2015 at 07:32:00AM -0400, Brian Foster wrote: > > On Wed, Aug 19, 2015 at 08:23:34PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > ... > > > Perhaps it's best to just use the #define in both cases? > > -#ifdef CONFIG_LOCKDEP > +#if (defined(DEBUG) || defined(XFS_WARN)) && CONFIG_LOCKDEP > > is how I fixed it. > Sounds good to me. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 21 06:21:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 62DE37F7C for ; Fri, 21 Aug 2015 06:21:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3B15AC003 for ; Fri, 21 Aug 2015 04:21:21 -0700 (PDT) X-ASG-Debug-ID: 1440156079-04cb6c278050630001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HmqDaqDMVnq5vuoC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 04:21:20 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id C1C188EA57; Fri, 21 Aug 2015 11:21:19 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LBLJaf006581; Fri, 21 Aug 2015 07:21:19 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A5D0E123E8A; Fri, 21 Aug 2015 07:21:18 -0400 (EDT) Date: Fri, 21 Aug 2015 07:21:18 -0400 From: Brian Foster To: Simon Xia Cc: xfs@oss.sgi.com Subject: Re: xfs directory quota doesn't work Message-ID: <20150821112118.GB46372@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs directory quota doesn't work References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440156080 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 21, 2015 at 05:05:00PM +0800, Simon Xia wrote: > hi, everyone, I encounter a problem when using xfs > > now I have two tasks and I wanna run them in different directory and limit > the directory’s size. I use xfs’s project quota to achieve this. > > I follow the steps from here: > https://solidlinux.wordpress.com/2012/12/09/xfs-quota-managament/ > > here is detail of my two config files > > /etc/projects: > > 11:/home/xiameng.xm/xfs_dir/task1 > 12:/home/xiameng.xm/xfs_dir/task2 > > /etc/projid: > > task1:11 > task2:12 > > and here is my step: > > touch test_xfs > dd if=/dev/zero of=test_xfs bs=1000000 count=1 > mkfs.xfs test_xfs > That looks small, I can't even mkfs a file that small. I ran through this using 'bs=1M count=100.' > mkdir xfs_dir > mount test_xfs ./xfs_dir -o pquota,loop > > xfs_quota -xc 'project –s task1' /home/xiameng.xm/xfs_dir > xfs_quota -xc 'project –s task2' /home/xiameng.xm/xfs_dir > I don't see where you've created the directories yet..? I get the following: # xfs_quota -xc 'project -s task1' /mnt/ xfs_quota: cannot find mount point for path `/mnt/task1': No such file or directory ... until I create the task1/task2 directories. This is required because the project quota command has to set the project id on the directory inode. It won't work if the directory is created after this point, regardless of whether the quota limit is specified. Once I create those directories and run the project command, everything seems to work. I can write up to 2MB to task1 and 10MB to task2. Brian > xfs_quota -x -c 'limit -p bhard=2m task1' /home/xiameng.xm/xfs_dir > xfs_quota -x -c 'limit -p bhard=10m task2' /home/xiameng.xm/xfs_dir > > here is the output of xfs_quota -x -c 'report /home/xiameng.xm/xfs_dir' > > Project quota on /home/xiameng.xm/xfs_dir (/dev/loop1) > Blocks > Project ID Used Soft Hard Warn/Grace > ---------- -------------------------------------------------- > task1 0 0 2048 00 [--------] > task2 0 0 10240 00 [--------] > > the question is no mater how large I create a file in ./xfs_dir/task1 or > ./xfs_dir/task2, it success! > > the quota limit doesn’t work! > > Any help will be appreciated :) > > > ps: I also post my question here: > http://unix.stackexchange.com/questions/224606/xfs-directory-quota-doesnt-work > > ---- > > Best Regards > Simon Xia > ​ > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eb444114.1dw1.1gPf.cp.1yGAmwsuD0+xfs=oss.sgi.com@bnc3.mailjet.com Fri Aug 21 07:39:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,LOTS_OF_MONEY, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C6307F54 for ; Fri, 21 Aug 2015 07:39:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FC018F8065 for ; Fri, 21 Aug 2015 05:39:08 -0700 (PDT) X-ASG-Debug-ID: 1440160745-04cb6c278051d00001-NocioJ Received: from o117.p8.mailjet.com (o117.p8.mailjet.com [87.253.233.117]) by cuda.sgi.com with ESMTP id gKLlp7cN9b7mOamT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 05:39:06 -0700 (PDT) X-Barracuda-Envelope-From: eb444114.1dw1.1gPf.cp.1yGAmwsuD0+xfs=oss.sgi.com@bnc3.mailjet.com X-Barracuda-Apparent-Source-IP: 87.253.233.117 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/simple; q=dns/txt; d=bnc3.mailjet.com; i=indongo=3Dministryofmagicdev.com@bnc3.mailjet.com; s=mailjet; h=message-id:mime-version:from:reply-to:to:subject:date:list-id:list-unsubscribe: precedence:x-csa-complaints:content-type; bh=3kLkZ1rk3kaelGkORqAS/8Jpq8Q=; b= K7yIbA1rA2FbU3VpRreJIikDJOzPGVn4t1/QzaBpUNvfCG1Lhqs9obl5+dGb Lrfe1BLELd1b9Lz8odLRk6cYv2onUaHEe8Dzg8vLBae3pBouv+swti1e4C4w CvD+bryctlO9pY5LnYv3TsRjwq1SZ6fq2WUA91NALyueiLHMOk0= Message-Id: MIME-Version: 1.0 From: Indongo Reply-To: henri@ministryofmagicnam.com To: xfs@oss.sgi.com Subject: Indongo Toyota Date: Fri, 21 Aug 2015 12:39:05 +0000 X-ASG-Orig-Subj: Indongo Toyota List-Id: List-Unsubscribe: Precedence: bulk X-CSA-Complaints: whitelist-complaints@eco.de Content-Type: multipart/alternative; boundary="=-Ry3nySDxKhs9PEtzaL1L" X-Barracuda-Connect: o117.p8.mailjet.com[87.253.233.117] X-Barracuda-Start-Time: 1440160746 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21799 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --=-Ry3nySDxKhs9PEtzaL1L Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Special offer from Indongo Toyota View online version [http://omi3.mjt.lu/nl2/omi3/gp.html?a=3D1yGAmwsuD0&b= =3Deb444114&c=3Domi3&d=3D0b12ef5f&e=3D79a42972&email=3Dxfs@oss.sgi.com][htt= p://omi3.mjt.lu/img/omi3/b/ot/q4.jpeg] Save on a new Corolla! Save up to N$= 36,600 on this limited time offer! This e-mail has been sent to xfs@oss.sgi.com, click here to unsubscribe [[[= UNSUB_LINK_EN]]] .= --=-Ry3nySDxKhs9PEtzaL1L Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable Indongo Toyota
Special offer from Indongo Toyot= a
<= /tbody>
 
=
=C2=A0=
= 3D""
=C2=A0
<= tr>
=C2=A0
Save= on a new Corolla!
=C2=A0
=C2=A0
=C2=A0
Save up to N$36,600 on this limited time offer!=
=
<= /tbody>

This e-mail has been sent to xfs@oss.sgi.com, click here to unsubscribe.<= /span>

<= !--[if mso]> <= /table>
3D"" = --=-Ry3nySDxKhs9PEtzaL1L-- From shamikbasu@shamikbasu.servers.prgn.misp.co.uk Fri Aug 21 07:51:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 33B9B7F83 for ; Fri, 21 Aug 2015 07:51:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 189178F8037 for ; Fri, 21 Aug 2015 05:51:05 -0700 (PDT) X-ASG-Debug-ID: 1440161463-04cbb032fc581d0001-NocioJ Received: from shamikbasu.servers.prgn.misp.co.uk (shamikbasu.servers.prgn.misp.co.uk [185.96.93.61]) by cuda.sgi.com with ESMTP id r9qdaXWiXLzWXyhI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 05:51:04 -0700 (PDT) X-Barracuda-Envelope-From: shamikbasu@shamikbasu.servers.prgn.misp.co.uk X-Barracuda-Apparent-Source-IP: 185.96.93.61 Received: from [115.187.46.207] (helo=shamikbasu.com) by shamikbasu.servers.prgn.misp.co.uk with esmtpsa (UNKNOWN:AES256-GCM-SHA384:256) (Exim 4.72) (envelope-from ) id 1ZSlmi-0001Hy-Te for xfs@oss.sgi.com; Fri, 21 Aug 2015 12:51:05 +0000 Date: Fri, 21 Aug 2015 14:50:39 +0200 To: xfs@oss.sgi.com From: Shamik Reply-To: Shamik Subject: Web Design Project Message-ID: <4d72e0321abeb15b06e65d08e980d278@localhost> X-ASG-Orig-Subj: Web Design Project X-Priority: 3 X-Mailer: PHPMailer 5.2.9 (https://github.com/PHPMailer/PHPMailer/) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Sender: shamikbasu@shamikbasu.servers.prgn.misp.co.uk X-Barracuda-Connect: shamikbasu.servers.prgn.misp.co.uk[185.96.93.61] X-Barracuda-Start-Time: 1440161464 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21799 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, My name is Shamik, I was looking for some niche business names and web designing companies on google and came across your email and thought of dropping you an email. I am an experienced php, wordpress and a frontend developer. At the moment i am looking for some work/project. Please let me know if you have any requirement for web development, web app, eCommerce website, website management/maintenance or may be looking to outsource some project. Also please let me know if you want to see my portfolio. Regards, Shamik Basu Kolkata, India skype id: lucas.kent Development, wordpress, PHP, Design P.S: This is not a spam email even though it might look like one but trust me it's not. I didn't get your email through any purchased list or anything. But if you would prefer to not receive any email from me in the future, please reply to this message with UNSUBSCRIBE in the subject line. From giovanni.fulco@gmail.com Fri Aug 21 07:53:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, TVD_SPACE_RATIO,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 075DE7F83 for ; Fri, 21 Aug 2015 07:53:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8F7F1AC002 for ; Fri, 21 Aug 2015 05:53:30 -0700 (PDT) X-ASG-Debug-ID: 1440161608-04bdf070b256900001-NocioJ Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id A2tHXjIZUnR5yl7n (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Aug 2015 05:53:29 -0700 (PDT) X-Barracuda-Envelope-From: giovanni.fulco@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] Received: by widdq5 with SMTP id dq5so15420362wid.0 for ; Fri, 21 Aug 2015 05:53:28 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=8MVBCykAVBxrv66+5WntCjsd5ui0wZqNUL7hlCMgWHQ=; b=TTBXc3gJ5Rb8BTVrWWIPzi7QeENni0XnoqFx7uC79YEJzuEcnXs01WB6nJBjca8shW QGjx2kjmdv/xaYhV7GjMDgC3y3TKt8RMflNVVNxI2iR6Z+p227u/UvvjGWSyfLNuqOgk WJVLrL3asTzP8e+Ct/hOsdWf+KnI6bl017wULqg4kBfMMHc0j4KNNC6YH5yIKEXV5EfR PB1DEERbIEJp32HDQAbeV1eBawt8G12Op+CubkPmHz5rF2RBUoomEdZTUYWHO6Lx8DEb 5V221whXjIio5Knl/W4N/4KjDplwgXNHLi7obSeABkZaj3+K0J0T+pr7hIAAgeRcMgVM fuFg== X-Received: by 10.180.86.73 with SMTP id n9mr5952696wiz.78.1440161607847; Fri, 21 Aug 2015 05:53:27 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.127.145 with HTTP; Fri, 21 Aug 2015 05:53:08 -0700 (PDT) From: Fulco Giovanni Date: Fri, 21 Aug 2015 14:53:08 +0200 Message-ID: Subject: unsubscribe To: xfs@oss.sgi.com X-ASG-Orig-Subj: unsubscribe Content-Type: multipart/alternative; boundary=f46d0442806e0e1334051dd1c14b X-Barracuda-Connect: mail-wi0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1440161609 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0669_1, BSF_SC0_MV0669_2, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21799 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.30 BSF_SC0_MV0669_2 Custom rule BSF_SC0_MV0669_2 1.30 BSF_SC0_MV0669_1 Custom rule BSF_SC0_MV0669_1 --f46d0442806e0e1334051dd1c14b Content-Type: text/plain; charset=UTF-8 unsubscribe --f46d0442806e0e1334051dd1c14b Content-Type: text/html; charset=UTF-8
unsubscribe
--f46d0442806e0e1334051dd1c14b-- From rjohnston@sgi.com Fri Aug 21 09:01:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C21D29DF5 for ; Fri, 21 Aug 2015 09:01:08 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8AAA4AC002; Fri, 21 Aug 2015 07:01:04 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id 3EA507002707; Fri, 21 Aug 2015 09:01:04 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 2421760F1CD26; Fri, 21 Aug 2015 09:01:04 -0500 (CDT) Message-Id: <20150821193047.661578219@gulag1.americas.sgi.com> User-Agent: quilt/0.47-15.17.1 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp Date: Fri, 21 Aug 2015 09:01:04 -0500 (CDT) The memset in cb_add_inogrp will segfault when the index oldsize overflows. In cb_add_inogrp(), the temp variables used in calculating the new i2gmap segment offset should be int64 instead of intgen_t (int32). A second bug also occurs because we already compensate for the length of each item in oldsize so are 32bit wrap becomes a 40bit wrap. From rjohnston@sgi.com Fri Aug 21 09:01:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2CD8C29DFE for ; Fri, 21 Aug 2015 09:01:12 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1330304043; Fri, 21 Aug 2015 07:01:08 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id A4EB17002707; Fri, 21 Aug 2015 09:01:08 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 9772860F1CD26; Fri, 21 Aug 2015 09:01:08 -0500 (CDT) Message-Id: <20150821193241.899709228@gulag1.americas.sgi.com> User-Agent: quilt/0.47-15.17.1 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfsdump: use 64bit local variables in inode.c References: <20150821193047.661578219@gulag1.americas.sgi.com> Content-Disposition: inline; filename=xfsdump-use-64bit-local-variables-in-inode-c.patch Date: Fri, 21 Aug 2015 09:01:08 -0500 (CDT) The memset in cb_add_inogrp will segfault when the index oldsize overflows. In cb_add_inogrp(), the temp variables used in calculating the new i2gmap segment offset should be int64 instead of intgen_t (int32). Fix this: a. simplify the calculation of oldsize by moving it before hnkmaplen is incremented. b. change the index variables int64 to prevent overflow. Signed-off-by: Rich Johnston --- dump/inomap.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) Index: b/dump/inomap.c =================================================================== --- a/dump/inomap.c +++ b/dump/inomap.c @@ -71,7 +71,7 @@ static intgen_t cb_context( bool_t last, drange_t *, startpt_t *, size_t, - intgen_t, + int64_t, bool_t, bool_t *); static void cb_context_free( void ); @@ -96,7 +96,7 @@ static off64_t estimate_dump_space( xfs_ /* inomap primitives */ -static intgen_t inomap_init( intgen_t igrpcnt ); +static intgen_t inomap_init( int64_t igrpcnt ); static void inomap_add( void *, xfs_ino_t ino, gen_t gen, intgen_t ); static intgen_t inomap_set_state( void *, xfs_ino_t ino, intgen_t ); static void inomap_set_gen(void *, xfs_ino_t, gen_t ); @@ -160,7 +160,7 @@ inomap_build( jdm_fshandle_t *fshandlep, xfs_bstat_t *bstatbufp; size_t bstatbuflen; bool_t pruneneeded = BOOL_FALSE; - intgen_t igrpcnt = 0; + int64_t igrpcnt = 0; intgen_t stat; intgen_t rval; @@ -449,7 +449,7 @@ cb_context( bool_t last, drange_t *resumerangep, startpt_t *startptp, size_t startptcnt, - intgen_t igrpcnt, + int64_t igrpcnt, bool_t skip_unchanged_dirs, bool_t *pruneneededp ) { @@ -949,14 +949,14 @@ struct i2gseg { typedef struct i2gseg i2gseg_t; typedef struct seg_addr { - intgen_t hnkoff; - intgen_t segoff; - intgen_t inooff; + int64_t hnkoff; + int64_t segoff; + int64_t inooff; } seg_addr_t; static struct inomap { hnk_t *hnkmap; - intgen_t hnkmaplen; + int64_t hnkmaplen; i2gseg_t *i2gmap; seg_addr_t lastseg; } inomap; @@ -1040,7 +1040,7 @@ SEG_GET_BITS( seg_t *segp, xfs_ino_t ino /* context for inomap construction - initialized by map_init */ static intgen_t -inomap_init( intgen_t igrpcnt ) +inomap_init( int64_t igrpcnt ) { ASSERT( sizeof( hnk_t ) == HNKSZ ); @@ -1066,7 +1066,7 @@ inomap_getsz( void ) static inline bool_t inomap_validaddr( seg_addr_t *addrp ) { - intgen_t maxseg; + int64_t maxseg; if ( addrp->hnkoff < 0 || addrp->hnkoff > inomap.lastseg.hnkoff ) return BOOL_FALSE; @@ -1093,13 +1093,13 @@ inomap_addr2seg( seg_addr_t *addrp ) return &hunkp->seg[addrp->segoff]; } -static inline intgen_t +static inline int64_t inomap_addr2segix( seg_addr_t *addrp ) { return ( addrp->hnkoff * SEGPERHNK ) + addrp->segoff; } -static inline intgen_t +static inline int64_t inomap_lastseg( intgen_t hnkoff ) { if ( hnkoff == inomap.lastseg.hnkoff ) @@ -1125,8 +1125,11 @@ cb_add_inogrp( void *arg1, intgen_t fsfd lastsegp->segoff = 0; if (lastsegp->hnkoff == inomap.hnkmaplen) { - intgen_t numsegs; - intgen_t oldsize; + int64_t numsegs; + int64_t oldsize; + + oldsize = inomap.hnkmaplen * SEGPERHNK + * sizeof(i2gseg_t); inomap.hnkmaplen++; inomap.hnkmap = (hnk_t *) @@ -1140,8 +1143,6 @@ cb_add_inogrp( void *arg1, intgen_t fsfd return -1; /* zero the new portion of the i2gmap */ - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); - memset(inomap.i2gmap + oldsize, 0, SEGPERHNK * sizeof(i2gseg_t)); @@ -1199,8 +1200,8 @@ static bool_t inomap_find_hnk( seg_addr_t *addrp, xfs_ino_t ino ) { hnk_t *hunkp; - intgen_t lower; - intgen_t upper; + int64_t lower; + int64_t upper; lower = 0; upper = inomap.lastseg.hnkoff; @@ -1231,8 +1232,8 @@ static bool_t inomap_find_seg( seg_addr_t *addrp, xfs_ino_t ino ) { seg_t *segp; - intgen_t lower; - intgen_t upper; + int64_t lower; + int64_t upper; if ( !inomap_validaddr( addrp ) ) { inomap_reset_context( addrp ); From rjohnston@sgi.com Fri Aug 21 09:01:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B5A8329E04 for ; Fri, 21 Aug 2015 09:01:19 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51A93AC002; Fri, 21 Aug 2015 07:01:16 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id F244B7002707; Fri, 21 Aug 2015 09:01:15 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id E219160F1CD26; Fri, 21 Aug 2015 09:01:15 -0500 (CDT) Message-Id: <20150821193241.973348815@gulag1.americas.sgi.com> User-Agent: quilt/0.47-15.17.1 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfsdump: don't do pointer math twice References: <20150821193047.661578219@gulag1.americas.sgi.com> Content-Disposition: inline; filename=fix-pointer-math-in-cb_add_inogrp.patch Date: Fri, 21 Aug 2015 09:01:15 -0500 (CDT) The pointer math when calculating the address for the call to memset is incorrect, so we are clearing the wrong memory location. i2gmap is of type i2gseg_t oldsize has already computed the pointer offset oldsize = inomap.hnkmaplen * SEGPERHNK * sizeof(i2gseg_t); the memset call is using inomap.i2gmap + oldsize == &inomap.i2gmap[oldsize] so we were doing the pointer math twice. We already compensate for the length of each item in oldsize so adding need to add a (char *) cast to the memset parameter. --- dump/inomap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/dump/inomap.c =================================================================== --- a/dump/inomap.c +++ b/dump/inomap.c @@ -1143,7 +1143,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd return -1; /* zero the new portion of the i2gmap */ - memset(inomap.i2gmap + oldsize, + memset((char *)inomap.i2gmap + oldsize, 0, SEGPERHNK * sizeof(i2gseg_t)); } From bfoster@redhat.com Fri Aug 21 09:39:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5AAA47F56 for ; Fri, 21 Aug 2015 09:39:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4F7BB8F8035 for ; Fri, 21 Aug 2015 07:39:29 -0700 (PDT) X-ASG-Debug-ID: 1440167965-04cbb032f05aed0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id L2ekhITnCgAjSwUi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 07:39:28 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 6D2D4223; Fri, 21 Aug 2015 14:39:25 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LEdOqk029488; Fri, 21 Aug 2015 10:39:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CCD00123E8A; Fri, 21 Aug 2015 10:39:23 -0400 (EDT) Date: Fri, 21 Aug 2015 10:39:23 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150821143923.GC46372@bfoster.bfoster> X-ASG-Orig-Subj: Re: v5 filesystem corruption due to log recovery lsn ordering References: <20150819183904.GB49174@bfoster.bfoster> <20150819224453.GL3902@dastard> <20150820162529.GB13033@bfoster.bfoster> <20150821003449.GU714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150821003449.GU714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440167967 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 21, 2015 at 10:34:49AM +1000, Dave Chinner wrote: > On Thu, Aug 20, 2015 at 12:25:29PM -0400, Brian Foster wrote: > > On Thu, Aug 20, 2015 at 08:44:53AM +1000, Dave Chinner wrote: > > > On Wed, Aug 19, 2015 at 02:39:05PM -0400, Brian Foster wrote: ... > > Using the inode chunk allocation and inode modification example... > > clearly the transactions have to commit in order because the inodes must > > be allocated before they can be used/modified. At what point after that > > is reordering possible? Are we talking about reordering of the items > > from the cil/log buffers to the on-disk log, or reordering of the items > > during recovery (or both)? > > Both. Look at inode allocation buffers, which are pinned in the AIL > so they can't be moved forward by subsequent modifications (e.g. > inode unlinks) until the newly initialised buffers have been written > to disk. Look at them again in log recovery, where they are > re-ordered to the start of a transaction so they are replayed before > inode log items and inode unlink buffer operations. > Thanks, I'll dig into this... ... > > Most users won't/can't upgrade to a kernel that will solve the > problem - it's often much easier to get them a userspace package > that minimises their exposure to a problem caused by their current > userspace package.... > Perhaps... I think it's debateable that it's caused by the userspace package, but I really don't care as much where it's fixed as opposed to that the overall fix is comprehensive. I wasn't initially expecting a userspace fix because the recovery reordering mechanism seemed like the problem. A userspace change seems reasonable with the approach of maintaining the current log recovery behavior and fixing up the current LSN such that it is always correct. > > > Then, on the kernel side, we need is a reliable way to detect that > > > the log head/tail pointers have been reset in the kernel. This means > > > we can - at minimum - issue a warning during log recovery that this > > > has been detected. > > > > > > Finally, we need to work out how to handle recovery in the situation > > > that the log has been zeroed and the filesystem has a mix of new and > > > old, stale LSNs. I think the simplest way around this is not to > > > handle it in log recovery at all, but to avoid it altogether. > > > > > > That is, when we find the log head/tail point to a zeroed log, we > > > pull the current LSN from, say, the superblock (and maybe other > > > metadata such as AG headers) and initialise the log head/tail to the > > > cycle number + some offset so that every new transaction is > > > guaranteed to have a cycle number more recent than any other LSN in > > > the filesystem and ordering is preserved, even if the log has been > > > zeroed. > > > > > > > That's an interesting idea, but I wonder if it truly fixes the problem > > or just makes it potentially more difficult to reproduce. One concern is > > that even with this in place, all it takes to reintroduce the problem is > > for a filesystem to run a bit on an older kernel in a situation where > > the LSN is reset and enough modification has occurred to update whatever > > key metadata we determine as important with the reset LSNs. > > We can't prevent that - that horse has already bolted. > Well, the feature bit can potentially do that. I'm not terribly fond of it (overkill) and the goal was't to fix older kernels so much as to prevent the problem from being reintroduced on newer kernels going forward (provided newer kernels implemented this mount-time LSN inheritance scheme). In other words, the proposed solution depends on trust of the metadata LSNs. One way we can trust those metadata LSNs is to prevent older kernels/xfsprogs from messing with them. > > A mount > > alone is enough to pollute the superblock in this manner. Further > > modification is probably necessary to affect the agi/agf headers, > > however. It might not be the most likely scenario, but what is more > > concerning is that if it does occur, it's completely invisible to our > > detection on updated kernels. Would we want to consider a new > > ro-incompat feature bit for this mechanism to prevent that? > > We could, but preventing people from downgrading from new kernels > because of a problem 99.9% of current users are never going to see? > And with a fixed and upgraded userspace, it will be problem that > they'll never see, either? > I'm just trying to explore what might be necessary for a comprehensive fix, even if we didn't ultimately implement all the way through (e.g., if it wasn't worth the usability/compatibility tradeoffs, etc.). That said, I don't really agree with the assertion that upgraded userspace alone sufficiently alleviates the problem. A filesystem that's been around a while and has more recently been repaired is susceptible to this problem for the foreseeable future, upgraded userspace or not, until either all metadata with stale LSNs is updated or the problem is identified and repaired explicitly. > > Another concern is that we're assuming that the key metadata will always > > have the most recent LSN. I think the closest thing to a guarantee we > > have of that is the superblock being updated on umount and every so > > often by xfs_log_worker() to cover the log. After a bit of playing > > around, I'm not so sure that is enough. > > Sure, I just threw it out as a way to get a more recent LSN. The > only way to reliably get the highest LSN is to walk all the metadata > in the filesystem. We can't do that at mount time, so perhaps it > is best to just refuse to mount read-write and issue a warning to > upgrade xfsprogs and re-run xfs_repair. > Indeed, that sounds like a nicer approach to me. We're really only considering the superblock at mount time though (note that repair resets AG header LSNs), so we're not going to be guaranteed the mount fails for all affected fs'. What do you think about also firing a (one-time, probably) warning if we ever update a bit of metadata with a smaller LSN? That bit of metadata is now "fixed" once written out, but the point is that the log item for this metadata was probably not effective and to notify the user that the fs' LSNs are potentially out of whack and a repair is in order. > > So now we have reset the LSN according to the log. Presumably the mount > > now inspects the superblock and each AG header and inherits the largest > > LSN plus some offset as the current LSN: LSN X+N. Directory d2 still has > > LSN Y, however, and we have no guarantee that N > Y-X. In other words, I > > think we can end up right back where we started. Make a modification to > > directory d2 at this point, crash the fs, and recovery might or might > > not replay a log record with LSN X+N against a target directory buffer > > with LSN Y. > > These scenarios all result from running xfs_repair. It's the source > of the problem, so let's treat it primarily as a bug in xfs_repair. > The number of users that run xfs_repair are very small compared to > the wider user-base, so having the kernel say "upgrade xfsprogs > and repair" is probably the most reliable way to fix the problem. > That sounds fine to me. > So, to repair: have it record LSNs as it walks the metadata and > at the start of phase 5 have it select a new cycle number higher > than the highest LSN found in the filesystem. Stamp the log with > that cycle number as well as all metadata that is being rebuilt > in phase 5, and all the superblocks. > > Problem solved. > Yeah, I was thinking of just using the current head of the log, as described in my random note. Using the LSN from the metadata is probably necessary in the cases where the log might be corrupted, however. > > Again, that's a contrived and probably unlikely scenario, but could be > > extremely difficult to detect or root cause if it ever does occur. :/ > > Thoughts? Is there something further we can do to mitigate this, or am I > > missing something else? > > IMO, you're over-complicating the situation. We can't go back and > change history, nor make people upgrade to systems that won't suffer > from this problem. Hence we're just going to have to live with it, > just like all the other log recovery bugs we've lived with since > finding and fixing them. > > If we do the simple thing and just detect zeroed logs in the kernel > and refuse read-write mounts, that's something we can easily > backport to all stable kernels that we support CRCs on (i.e. 3.16 to > present). And with a fixed xfs_repair, the problem goes away as > users and distros pull new in the new package, even if they are > running old kernels. > The situation is what it is, I'm just trying to cover all the angles. :) I'm not claiming to have the right fix, so don't read too much into my initial ideas. I'm throwing those out there hoping you'll come up with improvements. ;) As noted above, the goal was not explicitly to prevent downgrading and things as opposed to preventing the problem going forward (e.g., if an fs can't be mounted with an old kernel, then it can't be broken in this manner for newer kernels). The solution of detection in the kernel and a fix in repair sounds pretty good to me provided the detection is robust (e.g., the point above wrt a warning). Then we have something in current kernels that can effectively handle the problem regardless of how it might have been (re)introduced and it's fairly simple as well. > > Also, a random thought: I wonder if an update to the log zeroing > > mechanism to ensure that a subsequent mount picked up the LSN where it > > left off would be enough to get around much of this. That could mean > > stamping the log appropriately in repair, or adding something like a new > > continue_lsn field in the superblock to be used by anybody who zeroes > > the log and picked up on the next mount, etc... > > Sure - that's just a variant my first suggestion (of don't zero the > log in xfs_repair). Remember that you said "I don't think that helps > us very much". :) > The first suggestion was to not zero the log by default as a means of problem mitigation. I still don't think that helps us very much. :) (IMO, neither does doing the above without the kernel detection side of things.) In fact, I think we've reached a prospective solution that technically could preserve the current repair log clearing behavior. At least, I view that as a separate change at this point. The only difference now is that "clearing the log" means to stamp in log records that effectively bookmark the current LSN for v5 filesystems. As usual, thanks for the feedback. Brian > And, FWIW, my "read the LSN from metadata and use the highest" idea > above is just a further refinement of the two, so we can fix > zeroed logs from existing xfs_repair binaries without needing to do > anything extra in the kernel other than detect a zeroed log... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From xtfdhly@mmre.com Fri Aug 21 10:46:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 493EA7F8A for ; Fri, 21 Aug 2015 10:46:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E5ED9AC00B for ; Fri, 21 Aug 2015 08:46:36 -0700 (PDT) X-ASG-Debug-ID: 1440171993-04bdf070ae5af30001-NocioJ Received: from guery.com ([114.96.78.247]) by cuda.sgi.com with ESMTP id 3NoAC3mZ8fxEWbNR for ; Fri, 21 Aug 2015 08:46:33 -0700 (PDT) X-Barracuda-Envelope-From: xtfdhly@mmre.com X-Barracuda-Apparent-Source-IP: 114.96.78.247 Received: from SKY-20150201SFT ([127.0.0.1]) by localhost via TCP with ESMTPA; Fri, 21 Aug 2015 23:46:15 +0800 MIME-Version: 1.0 From: Frank Sender: Frank To: xfs@oss.sgi.com Reply-To: Frank Date: 21 Aug 2015 23:46:15 +0800 Subject: =?utf-8?B?SGlnaCBxdWFsaXR5IEJsdWV0b290aCBwcm9kdWN0cw==?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?SGlnaCBxdWFsaXR5IEJsdWV0b290aCBwcm9kdWN0cw==?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[114.96.78.247] X-Barracuda-Start-Time: 1440171993 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21802 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150821154636.71677A4217A@cuda.sgi.com> PGh0bWw+PGJvZHk+PFA+SGVsbG8sPEJSPlRoaXMgaXMgRnJhbmsgZnJvbSBFdmVycmljaCBF bGVjdHJvbmljcyAoSEspIExpbWl0ZWQuIDwvUD4NCjxQPldlIGhhdmUgbWFqb3IgaW4gcHJv ZHVjaW5nIEJsdWV0b290aCBzcGVha2VyLCBCbHVldG9vdGggZWFyYnVkLEJsdWV0b290aCBo ZWFkcGhvbmUgbWFueSB5ZWFyLjwvUD4NCjxQPkJlbG93IGFyZSBvdXIgbGF0ZXN0IHByb2R1 Y3Rpb24gZm9yIHlvdXIgcmVmZXJlbmNlLCBpZiB5b3UgaGF2ZSBpbnRlcmVzdGluZywgSSB3 aWxsIHNlbmQgeW91IG91ciBjYXRhbG9nIGxhdGVyLCB0aGFuayB5b3UgdmVyeSBtdWNoITwv UD4NCjxQPkZvciBtb3JlIGluZm9ybWF0aW9uICxwbGVhc2UgdmlzaXQgb3VyIHdlYnNpdGUm bmJzcDsgYW5kIGNvbnRhY3QgdXMgdG9kYXkhIEZvciBmYXN0IGNvbW11bmljYXRpb24sIHBs ZWFzZSBza3lwZSBtZS48L1A+DQo8UD48QlI+S2luZCByZWdhcmRzLDxCUj5GcmFuayBZb3Vu ZyAoQ0VPKSA8QlI+RXZlcnJpY2ggRWxlY3Ryb25pY3MgKEhLKSBMaW1pdGVkPEJSPnRlbDog KDg2KSA3NTUtMjc1MSAwODY1PEJSPmZheDogKDg2KSA3NTUtMjc1MSAwNjg1PEJSPkluLUhv dXNlIFIgJmFtcDsgRCB0ZWFtIHwmbmJzcDsgSVNPOiA5MDAxOiAyMDAwIGNlcnRpZmljYXRl ZCBmYWN0b3J5LjwvUD48L2JvZHk+PC9odG1sPg== From sandeen@sandeen.net Fri Aug 21 10:47:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 21F7629DFE for ; Fri, 21 Aug 2015 10:47:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 010C8304059 for ; Fri, 21 Aug 2015 08:47:12 -0700 (PDT) X-ASG-Debug-ID: 1440172031-04cbb033035cb20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cxCIewGF8sR5Qdvf for ; Fri, 21 Aug 2015 08:47:11 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CD2E36096FAA; Fri, 21 Aug 2015 10:47:10 -0500 (CDT) Message-ID: <55D747FE.4070401@sandeen.net> Date: Fri, 21 Aug 2015 10:47:10 -0500 From: Eric Sandeen MIME-Version: 1.0 To: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp In-Reply-To: <20150821193047.661578219@gulag1.americas.sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440172031 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21802 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: > The memset in cb_add_inogrp will segfault when the index oldsize > overflows. In cb_add_inogrp(), the temp variables used in > calculating the new i2gmap segment offset should be int64 instead > of intgen_t (int32). > > A second bug also occurs because we already compensate for the > length of each item in oldsize so are 32bit wrap becomes a 40bit > wrap. Hi - Are there any testcases for these? xfsdump is alien code, I swear; I'm not quite sure offhand how to tickle any of these bugs. Thanks, -Eric From rjohnston@sgi.com Fri Aug 21 11:38:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 38BE67F85 for ; Fri, 21 Aug 2015 11:38:42 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2924F304059; Fri, 21 Aug 2015 09:38:39 -0700 (PDT) Received: from [134.15.0.158] (134.15.0.158) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 21 Aug 2015 11:38:38 -0500 Message-ID: <55D7540D.7060700@sgi.com> Date: Fri, 21 Aug 2015 11:38:37 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Eric Sandeen , Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> <55D747FE.4070401@sandeen.net> In-Reply-To: <55D747FE.4070401@sandeen.net> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.158] On 08/21/2015 10:47 AM, Eric Sandeen wrote: > On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: >> The memset in cb_add_inogrp will segfault when the index oldsize >> overflows. In cb_add_inogrp(), the temp variables used in >> calculating the new i2gmap segment offset should be int64 instead >> of intgen_t (int32). >> >> A second bug also occurs because we already compensate for the >> length of each item in oldsize so are 32bit wrap becomes a 40bit >> wrap. > > Hi - > > Are there any testcases for these? xfsdump is alien code, I swear; > I'm not quite sure offhand how to tickle any of these bugs. > > Thanks, > -Eric > No I thought simple examination shows the bug. It was a customer bug. The number of inodes that we needed before wrapping was a couple hundred inodes. From sandeen@sandeen.net Fri Aug 21 11:39:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C93A7F85 for ; Fri, 21 Aug 2015 11:39:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D648304032 for ; Fri, 21 Aug 2015 09:39:54 -0700 (PDT) X-ASG-Debug-ID: 1440175188-04cbb032f05df30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id iNk5AwFKVVY9Et3l for ; Fri, 21 Aug 2015 09:39:48 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 09CF06096FAA; Fri, 21 Aug 2015 11:39:48 -0500 (CDT) Message-ID: <55D75454.1060003@sandeen.net> Date: Fri, 21 Aug 2015 11:39:48 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Rich Johnston , xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> <55D747FE.4070401@sandeen.net> <55D7540D.7060700@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp In-Reply-To: <55D7540D.7060700@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440175188 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 11:38 AM, Rich Johnston wrote: > On 08/21/2015 10:47 AM, Eric Sandeen wrote: >> On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: >>> The memset in cb_add_inogrp will segfault when the index oldsize >>> overflows. In cb_add_inogrp(), the temp variables used in >>> calculating the new i2gmap segment offset should be int64 instead >>> of intgen_t (int32). >>> >>> A second bug also occurs because we already compensate for the >>> length of each item in oldsize so are 32bit wrap becomes a 40bit >>> wrap. >> >> Hi - >> >> Are there any testcases for these? xfsdump is alien code, I swear; >> I'm not quite sure offhand how to tickle any of these bugs. >> >> Thanks, >> -Eric >> > No I thought simple examination shows the bug. Nothing is simple in xfsdump, IMHO. At least to the uninitiated. :) > It was a customer bug. > > The number of inodes that we needed before wrapping was a couple hundred inodes. I did eventually manage to hit the segfault, thanks. -Eric From rjohnston@sgi.com Fri Aug 21 11:49:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 861377F88 for ; Fri, 21 Aug 2015 11:49:54 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56099304062; Fri, 21 Aug 2015 09:49:54 -0700 (PDT) Received: from [134.15.0.158] (134.15.0.158) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 21 Aug 2015 11:49:53 -0500 Message-ID: <55D756B0.30402@sgi.com> Date: Fri, 21 Aug 2015 11:49:52 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Eric Sandeen , Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> <55D747FE.4070401@sandeen.net> <55D7540D.7060700@sgi.com> <55D75454.1060003@sandeen.net> In-Reply-To: <55D75454.1060003@sandeen.net> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.158] On 08/21/2015 11:39 AM, Eric Sandeen wrote: > On 8/21/15 11:38 AM, Rich Johnston wrote: >> On 08/21/2015 10:47 AM, Eric Sandeen wrote: >>> On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: >>>> The memset in cb_add_inogrp will segfault when the index oldsize >>>> overflows. In cb_add_inogrp(), the temp variables used in >>>> calculating the new i2gmap segment offset should be int64 instead >>>> of intgen_t (int32). >>>> >>>> A second bug also occurs because we already compensate for the >>>> length of each item in oldsize so are 32bit wrap becomes a 40bit >>>> wrap. >>> >>> Hi - >>> >>> Are there any testcases for these? xfsdump is alien code, I swear; >>> I'm not quite sure offhand how to tickle any of these bugs. >>> >>> Thanks, >>> -Eric >>> >> No I thought simple examination shows the bug. > > Nothing is simple in xfsdump, IMHO. At least to the uninitiated. :) > :) >> It was a customer bug. >> >> The number of inodes that we needed before wrapping was a couple hundred inodes. ^^^^ make that *million* > > I did eventually manage to hit the segfault, thanks. > > -Eric > From sandeen@sandeen.net Fri Aug 21 12:03:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 108FE7F91 for ; Fri, 21 Aug 2015 12:03:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FFD8AC001 for ; Fri, 21 Aug 2015 10:03:26 -0700 (PDT) X-ASG-Debug-ID: 1440176596-04bdf070b25cca0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4dXE7SGkD2hkGQ5Q for ; Fri, 21 Aug 2015 10:03:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1263C6096FAA; Fri, 21 Aug 2015 12:03:16 -0500 (CDT) Message-ID: <55D759D4.8060101@sandeen.net> Date: Fri, 21 Aug 2015 12:03:16 -0500 From: Eric Sandeen MIME-Version: 1.0 To: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsdump: use 64bit local variables in inode.c References: <20150821193047.661578219@gulag1.americas.sgi.com> <20150821193241.899709228@gulag1.americas.sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsdump: use 64bit local variables in inode.c In-Reply-To: <20150821193241.899709228@gulag1.americas.sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440176596 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: > The memset in cb_add_inogrp will segfault when the index oldsize > overflows. In cb_add_inogrp(), the temp variables used in > calculating the new i2gmap segment offset should be int64 instead > of intgen_t (int32). > > Fix this: > a. simplify the calculation of oldsize by moving it > before hnkmaplen is incremented. I think it'd make more sense to put a) in the second patch; it's unrelated to the variable size changes. Still wrapping my head around what these variables are for, but makes sense at first glance. Thanks, -Eric > b. change the index variables int64 to prevent overflow. > > Signed-off-by: Rich Johnston > --- > dump/inomap.c | 41 +++++++++++++++++++++-------------------- > 1 file changed, 21 insertions(+), 20 deletions(-) > > Index: b/dump/inomap.c > =================================================================== > --- a/dump/inomap.c > +++ b/dump/inomap.c > @@ -71,7 +71,7 @@ static intgen_t cb_context( bool_t last, > drange_t *, > startpt_t *, > size_t, > - intgen_t, > + int64_t, > bool_t, > bool_t *); > static void cb_context_free( void ); > @@ -96,7 +96,7 @@ static off64_t estimate_dump_space( xfs_ > > /* inomap primitives > */ > -static intgen_t inomap_init( intgen_t igrpcnt ); > +static intgen_t inomap_init( int64_t igrpcnt ); > static void inomap_add( void *, xfs_ino_t ino, gen_t gen, intgen_t ); > static intgen_t inomap_set_state( void *, xfs_ino_t ino, intgen_t ); > static void inomap_set_gen(void *, xfs_ino_t, gen_t ); > @@ -160,7 +160,7 @@ inomap_build( jdm_fshandle_t *fshandlep, > xfs_bstat_t *bstatbufp; > size_t bstatbuflen; > bool_t pruneneeded = BOOL_FALSE; > - intgen_t igrpcnt = 0; > + int64_t igrpcnt = 0; > intgen_t stat; > intgen_t rval; > > @@ -449,7 +449,7 @@ cb_context( bool_t last, > drange_t *resumerangep, > startpt_t *startptp, > size_t startptcnt, > - intgen_t igrpcnt, > + int64_t igrpcnt, > bool_t skip_unchanged_dirs, > bool_t *pruneneededp ) > { > @@ -949,14 +949,14 @@ struct i2gseg { > typedef struct i2gseg i2gseg_t; > > typedef struct seg_addr { > - intgen_t hnkoff; > - intgen_t segoff; > - intgen_t inooff; > + int64_t hnkoff; > + int64_t segoff; > + int64_t inooff; > } seg_addr_t; > > static struct inomap { > hnk_t *hnkmap; > - intgen_t hnkmaplen; > + int64_t hnkmaplen; > i2gseg_t *i2gmap; > seg_addr_t lastseg; > } inomap; > @@ -1040,7 +1040,7 @@ SEG_GET_BITS( seg_t *segp, xfs_ino_t ino > /* context for inomap construction - initialized by map_init > */ > static intgen_t > -inomap_init( intgen_t igrpcnt ) > +inomap_init( int64_t igrpcnt ) > { > ASSERT( sizeof( hnk_t ) == HNKSZ ); > > @@ -1066,7 +1066,7 @@ inomap_getsz( void ) > static inline bool_t > inomap_validaddr( seg_addr_t *addrp ) > { > - intgen_t maxseg; > + int64_t maxseg; > > if ( addrp->hnkoff < 0 || addrp->hnkoff > inomap.lastseg.hnkoff ) > return BOOL_FALSE; > @@ -1093,13 +1093,13 @@ inomap_addr2seg( seg_addr_t *addrp ) > return &hunkp->seg[addrp->segoff]; > } > > -static inline intgen_t > +static inline int64_t > inomap_addr2segix( seg_addr_t *addrp ) > { > return ( addrp->hnkoff * SEGPERHNK ) + addrp->segoff; > } > > -static inline intgen_t > +static inline int64_t > inomap_lastseg( intgen_t hnkoff ) > { > if ( hnkoff == inomap.lastseg.hnkoff ) > @@ -1125,8 +1125,11 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > lastsegp->segoff = 0; > > if (lastsegp->hnkoff == inomap.hnkmaplen) { > - intgen_t numsegs; > - intgen_t oldsize; > + int64_t numsegs; > + int64_t oldsize; > + > + oldsize = inomap.hnkmaplen * SEGPERHNK > + * sizeof(i2gseg_t); > > inomap.hnkmaplen++; > inomap.hnkmap = (hnk_t *) > @@ -1140,8 +1143,6 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > return -1; > > /* zero the new portion of the i2gmap */ > - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > - > memset(inomap.i2gmap + oldsize, > 0, > SEGPERHNK * sizeof(i2gseg_t)); > @@ -1199,8 +1200,8 @@ static bool_t > inomap_find_hnk( seg_addr_t *addrp, xfs_ino_t ino ) > { > hnk_t *hunkp; > - intgen_t lower; > - intgen_t upper; > + int64_t lower; > + int64_t upper; > > lower = 0; > upper = inomap.lastseg.hnkoff; > @@ -1231,8 +1232,8 @@ static bool_t > inomap_find_seg( seg_addr_t *addrp, xfs_ino_t ino ) > { > seg_t *segp; > - intgen_t lower; > - intgen_t upper; > + int64_t lower; > + int64_t upper; > > if ( !inomap_validaddr( addrp ) ) { > inomap_reset_context( addrp ); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Aug 21 12:24:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABE4C7F91 for ; Fri, 21 Aug 2015 12:24:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8CADE8F804B for ; Fri, 21 Aug 2015 10:24:56 -0700 (PDT) X-ASG-Debug-ID: 1440177894-04cbb032f65f060001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id teRKuzJWxJJP35CO for ; Fri, 21 Aug 2015 10:24:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 49BB16096FAA; Fri, 21 Aug 2015 12:24:54 -0500 (CDT) Message-ID: <55D75EE6.4080703@sandeen.net> Date: Fri, 21 Aug 2015 12:24:54 -0500 From: Eric Sandeen MIME-Version: 1.0 To: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfsdump: don't do pointer math twice References: <20150821193047.661578219@gulag1.americas.sgi.com> <20150821193241.973348815@gulag1.americas.sgi.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfsdump: don't do pointer math twice In-Reply-To: <20150821193241.973348815@gulag1.americas.sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440177894 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: > The pointer math when calculating the address for the call to memset > is incorrect, so we are clearing the wrong memory location. > > i2gmap is of type i2gseg_t > > oldsize has already computed the pointer offset > oldsize = inomap.hnkmaplen * SEGPERHNK * sizeof(i2gseg_t); > the memset call is using > inomap.i2gmap + oldsize == &inomap.i2gmap[oldsize] > so we were doing the pointer math twice. > > We already compensate for the length of each item in oldsize so > adding need to add a (char *) cast to the memset parameter. What about just doing: memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, SEGPERHNK * sizeof(i2gseg_t)); which more clearly shows that we're setting the new array members to zero. (could do oldsegs = inomap.hnkmaplen * SEGPERHNK; prior to the hnkmaplen++, if that makes it any more readable...) *shrug* it seems a little clearer to me, anyway. Thanks, -Eric > --- > dump/inomap.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/dump/inomap.c > =================================================================== > --- a/dump/inomap.c > +++ b/dump/inomap.c > @@ -1143,7 +1143,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > return -1; > > /* zero the new portion of the i2gmap */ > - memset(inomap.i2gmap + oldsize, > + memset((char *)inomap.i2gmap + oldsize, > 0, > SEGPERHNK * sizeof(i2gseg_t)); > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From jack@suse.cz Fri Aug 21 12:55:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4257C7F4E for ; Fri, 21 Aug 2015 12:55:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D1006AC001 for ; Fri, 21 Aug 2015 10:55:42 -0700 (PDT) X-ASG-Debug-ID: 1440179739-04bdf0239900780001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id z5uXCMqHtx3ZfE5b (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 10:55:40 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 976CAAB9F for ; Fri, 21 Aug 2015 17:55:39 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id E191A82823; Fri, 21 Aug 2015 19:55:35 +0200 (CEST) From: Jan Kara To: xfs@oss.sgi.com Cc: Jan Kara Subject: [PATCH] xfs: Fix file type directory corruption for btree directories Date: Fri, 21 Aug 2015 19:55:22 +0200 X-ASG-Orig-Subj: [PATCH] xfs: Fix file type directory corruption for btree directories Message-Id: <1440179722-6029-1-git-send-email-jack@suse.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440179740 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Users have occasionally reported that file type for some directory entries is wrong. This mostly happened after updating libraries some libraries. After some debugging the problem was traced down to xfs_dir2_node_replace(). The function uses args->filetype as a file type to store in the replaced directory entry however it also calls xfs_da3_node_lookup_int() which will store file type of the current directory entry in args->filetype. Thus we fail to change file type of a directory entry to a proper type. Fix the problem by storing new file type in a local variable before calling xfs_da3_node_lookup_int(). Reported-by: Giacomo Comes Signed-off-by: Jan Kara --- fs/xfs/libxfs/xfs_dir2_node.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c index 41b80d3d3877..1006710a7c92 100644 --- a/fs/xfs/libxfs/xfs_dir2_node.c +++ b/fs/xfs/libxfs/xfs_dir2_node.c @@ -2132,6 +2132,7 @@ xfs_dir2_node_replace( int error; /* error return value */ int i; /* btree level */ xfs_ino_t inum; /* new inode number */ + int ftype; /* new file type */ xfs_dir2_leaf_t *leaf; /* leaf structure */ xfs_dir2_leaf_entry_t *lep; /* leaf entry being changed */ int rval; /* internal return value */ @@ -2145,7 +2146,12 @@ xfs_dir2_node_replace( state = xfs_da_state_alloc(); state->args = args; state->mp = args->dp->i_mount; + /* + * We have to save new inode number and ftype since + * xfs_da3_node_lookup_int() is going to overwrite them + */ inum = args->inumber; + ftype = args->filetype; /* * Lookup the entry to change in the btree. */ @@ -2183,7 +2189,7 @@ xfs_dir2_node_replace( * Fill in the new inode number and log the entry. */ dep->inumber = cpu_to_be64(inum); - args->dp->d_ops->data_put_ftype(dep, args->filetype); + args->dp->d_ops->data_put_ftype(dep, ftype); xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); rval = 0; } -- 2.1.4 From jack@suse.cz Fri Aug 21 13:06:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4AC257F99 for ; Fri, 21 Aug 2015 13:06:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39D62304039 for ; Fri, 21 Aug 2015 11:06:33 -0700 (PDT) X-ASG-Debug-ID: 1440180390-04cb6c4a2b00ae0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id xooWkIdBfJRS143l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 11:06:31 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4579BAC48 for ; Fri, 21 Aug 2015 18:06:30 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id D50D682823; Fri, 21 Aug 2015 20:06:26 +0200 (CEST) Date: Fri, 21 Aug 2015 20:06:26 +0200 From: Jan Kara To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix file type directory corruption for btree directories Message-ID: <20150821180626.GB6730@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix file type directory corruption for btree directories References: <1440179722-6029-1-git-send-email-jack@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440179722-6029-1-git-send-email-jack@suse.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440180391 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 21-08-15 19:55:22, Jan Kara wrote: > Users have occasionally reported that file type for some directory > entries is wrong. This mostly happened after updating libraries some > libraries. After some debugging the problem was traced down to > xfs_dir2_node_replace(). The function uses args->filetype as a file type > to store in the replaced directory entry however it also calls > xfs_da3_node_lookup_int() which will store file type of the current > directory entry in args->filetype. Thus we fail to change file type of a > directory entry to a proper type. > > Fix the problem by storing new file type in a local variable before > calling xfs_da3_node_lookup_int(). > > Reported-by: Giacomo Comes > Signed-off-by: Jan Kara BTW, this is a stable material. Forgot to add CC... Honza > --- > fs/xfs/libxfs/xfs_dir2_node.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c > index 41b80d3d3877..1006710a7c92 100644 > --- a/fs/xfs/libxfs/xfs_dir2_node.c > +++ b/fs/xfs/libxfs/xfs_dir2_node.c > @@ -2132,6 +2132,7 @@ xfs_dir2_node_replace( > int error; /* error return value */ > int i; /* btree level */ > xfs_ino_t inum; /* new inode number */ > + int ftype; /* new file type */ > xfs_dir2_leaf_t *leaf; /* leaf structure */ > xfs_dir2_leaf_entry_t *lep; /* leaf entry being changed */ > int rval; /* internal return value */ > @@ -2145,7 +2146,12 @@ xfs_dir2_node_replace( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > + /* > + * We have to save new inode number and ftype since > + * xfs_da3_node_lookup_int() is going to overwrite them > + */ > inum = args->inumber; > + ftype = args->filetype; > /* > * Lookup the entry to change in the btree. > */ > @@ -2183,7 +2189,7 @@ xfs_dir2_node_replace( > * Fill in the new inode number and log the entry. > */ > dep->inumber = cpu_to_be64(inum); > - args->dp->d_ops->data_put_ftype(dep, args->filetype); > + args->dp->d_ops->data_put_ftype(dep, ftype); > xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); > rval = 0; > } > -- > 2.1.4 > -- Jan Kara SUSE Labs, CR From sandeen@sandeen.net Fri Aug 21 13:22:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 625F27F9B for ; Fri, 21 Aug 2015 13:22:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 50C298F804C for ; Fri, 21 Aug 2015 11:22:04 -0700 (PDT) X-ASG-Debug-ID: 1440181322-04cbb07cbe011b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FiaCdK4chEBn5hHR for ; Fri, 21 Aug 2015 11:22:03 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 876FC6096FAA; Fri, 21 Aug 2015 13:22:02 -0500 (CDT) Message-ID: <55D76C4A.20203@sandeen.net> Date: Fri, 21 Aug 2015 13:22:02 -0500 From: Eric Sandeen MIME-Version: 1.0 To: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfsdump: use 64bit local variables in inode.c References: <20150821193047.661578219@gulag1.americas.sgi.com> <20150821193241.899709228@gulag1.americas.sgi.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfsdump: use 64bit local variables in inode.c In-Reply-To: <20150821193241.899709228@gulag1.americas.sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440181323 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 9:01 AM, rjohnston@sgi.com wrote: > The memset in cb_add_inogrp will segfault when the index oldsize > overflows. In cb_add_inogrp(), the temp variables used in > calculating the new i2gmap segment offset should be int64 instead > of intgen_t (int32). > > Fix this: > a. simplify the calculation of oldsize by moving it > before hnkmaplen is incremented. > b. change the index variables int64 to prevent overflow. Ok, so looking at how we count inode groups, it's down this path: inomap_build( ... igrpcnt ...) inogrp_iter( fsfd, cb_count_inogrp, (void *)&igrpcnt, &stat ); cb_context( ... igrpcnt ... ) inomap_init(igrpcnt) We fill in igrpcnt with the inogrp_iter() call, which does bulkstats in groups / sizes of INOGRPLEN, which is: #define INOGRPLEN 256 and for each "group" of 256 inodes, igrpcnt increments by one, right? so I guess that means that if we have more than 2^31 inode groups, i.e. 2^31 * 256 = 500 billion inodes, (int) igrpcnt could overflow. That's probably not what you're trying to solve, right? So does igrpcnt really need to be 64 bits? If this is just about overflowing oldsize because it's in bytes, maybe my suggestion for patch number 2 solves that without the need for a bunch more 64 bit vars - in fact it getse rid of "oldsize" altogether. But more questions below... (Sorry, I don't really grok xfsdump, just trying to follow things through by rote, so bear with me ...) > Signed-off-by: Rich Johnston > --- > dump/inomap.c | 41 +++++++++++++++++++++-------------------- > 1 file changed, 21 insertions(+), 20 deletions(-) > > Index: b/dump/inomap.c > =================================================================== > --- a/dump/inomap.c > +++ b/dump/inomap.c > @@ -71,7 +71,7 @@ static intgen_t cb_context( bool_t last, > drange_t *, > startpt_t *, > size_t, > - intgen_t, > + int64_t, > bool_t, > bool_t *); > static void cb_context_free( void ); > @@ -96,7 +96,7 @@ static off64_t estimate_dump_space( xfs_ > > /* inomap primitives > */ > -static intgen_t inomap_init( intgen_t igrpcnt ); > +static intgen_t inomap_init( int64_t igrpcnt ); > static void inomap_add( void *, xfs_ino_t ino, gen_t gen, intgen_t ); > static intgen_t inomap_set_state( void *, xfs_ino_t ino, intgen_t ); > static void inomap_set_gen(void *, xfs_ino_t, gen_t ); > @@ -160,7 +160,7 @@ inomap_build( jdm_fshandle_t *fshandlep, > xfs_bstat_t *bstatbufp; > size_t bstatbuflen; > bool_t pruneneeded = BOOL_FALSE; > - intgen_t igrpcnt = 0; > + int64_t igrpcnt = 0; > intgen_t stat; > intgen_t rval; > > @@ -449,7 +449,7 @@ cb_context( bool_t last, > drange_t *resumerangep, > startpt_t *startptp, > size_t startptcnt, > - intgen_t igrpcnt, > + int64_t igrpcnt, > bool_t skip_unchanged_dirs, > bool_t *pruneneededp ) > { > @@ -949,14 +949,14 @@ struct i2gseg { > typedef struct i2gseg i2gseg_t; > > typedef struct seg_addr { > - intgen_t hnkoff; > - intgen_t segoff; > - intgen_t inooff; > + int64_t hnkoff; > + int64_t segoff; > + int64_t inooff; What are these offsets "into?" Can these offset values really exceed 32 bits? I'll have to admit I'm lost, but I don't see it yet in the code. OTOH, if they can, then things like static inline intgen_t inomap_lastseg( intgen_t hnkoff ) { if ( hnkoff == inomap.lastseg.hnkoff ) return inomap.lastseg.segoff; else return SEGPERHNK - 1; } would need these type changes chased through as well, right? > } seg_addr_t; > > static struct inomap { > hnk_t *hnkmap; > - intgen_t hnkmaplen; > + int64_t hnkmaplen; hnkmaplen is initialized in inomap_init as: inomap.hnkmaplen = (igrpcnt + SEGPERHNK - 1) / SEGPERHNK; so if 32 bits is sufficient for igrpcnt, it's sufficient for hnkmaplen too. (after init, it only increments one at a time). > i2gseg_t *i2gmap; > seg_addr_t lastseg; > } inomap; > @@ -1040,7 +1040,7 @@ SEG_GET_BITS( seg_t *segp, xfs_ino_t ino > /* context for inomap construction - initialized by map_init > */ > static intgen_t > -inomap_init( intgen_t igrpcnt ) > +inomap_init( int64_t igrpcnt ) > { > ASSERT( sizeof( hnk_t ) == HNKSZ ); > > @@ -1066,7 +1066,7 @@ inomap_getsz( void ) > static inline bool_t > inomap_validaddr( seg_addr_t *addrp ) > { > - intgen_t maxseg; > + int64_t maxseg; ... maxseg = ( addrp->hnkoff == inomap.lastseg.hnkoff ) ? inomap.lastseg.segoff : SEGPERHNK - 1; so maxseg just needs to be the same type as segoff.... > > if ( addrp->hnkoff < 0 || addrp->hnkoff > inomap.lastseg.hnkoff ) > return BOOL_FALSE; > @@ -1093,13 +1093,13 @@ inomap_addr2seg( seg_addr_t *addrp ) > return &hunkp->seg[addrp->segoff]; > } > > -static inline intgen_t > +static inline int64_t > inomap_addr2segix( seg_addr_t *addrp ) > { > return ( addrp->hnkoff * SEGPERHNK ) + addrp->segoff; > } > > -static inline intgen_t > +static inline int64_t > inomap_lastseg( intgen_t hnkoff ) > { > if ( hnkoff == inomap.lastseg.hnkoff ) > @@ -1125,8 +1125,11 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > lastsegp->segoff = 0; > > if (lastsegp->hnkoff == inomap.hnkmaplen) { > - intgen_t numsegs; > - intgen_t oldsize; > + int64_t numsegs; > + int64_t oldsize; > + > + oldsize = inomap.hnkmaplen * SEGPERHNK > + * sizeof(i2gseg_t); > > inomap.hnkmaplen++; > inomap.hnkmap = (hnk_t *) > @@ -1140,8 +1143,6 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > return -1; > > /* zero the new portion of the i2gmap */ > - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > - > memset(inomap.i2gmap + oldsize, > 0, > SEGPERHNK * sizeof(i2gseg_t)); > @@ -1199,8 +1200,8 @@ static bool_t > inomap_find_hnk( seg_addr_t *addrp, xfs_ino_t ino ) > { > hnk_t *hunkp; > - intgen_t lower; > - intgen_t upper; > + int64_t lower; > + int64_t upper; > > lower = 0; > upper = inomap.lastseg.hnkoff; > @@ -1231,8 +1232,8 @@ static bool_t > inomap_find_seg( seg_addr_t *addrp, xfs_ino_t ino ) > { > seg_t *segp; > - intgen_t lower; > - intgen_t upper; > + int64_t lower; > + int64_t upper; > > if ( !inomap_validaddr( addrp ) ) { > inomap_reset_context( addrp ); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Fri Aug 21 15:08:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E16967F9D for ; Fri, 21 Aug 2015 15:08:46 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay2.corp.sgi.com (Postfix) with ESMTP id D180C304039; Fri, 21 Aug 2015 13:08:43 -0700 (PDT) Received: from [134.15.0.158] (134.15.0.158) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 21 Aug 2015 15:08:42 -0500 Message-ID: <55D7854A.9030706@sgi.com> Date: Fri, 21 Aug 2015 15:08:42 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Eric Sandeen , Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> <55D747FE.4070401@sandeen.net> In-Reply-To: <55D747FE.4070401@sandeen.net> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.158] On 08/21/2015 10:47 AM, Eric Sandeen wrote: > Hi - > > Are there any testcases for these? xfsdump is alien code, I swear; > I'm not quite sure offhand how to tickle any of these bugs. > > Thanks, > -Eric > Hey Eric, Many thanks for taking the time to review these patches. I take a look at all your responses and get a V2 out early next week. Thanks --Rich From sandeen@sandeen.net Fri Aug 21 15:11:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 37EAD7F9D for ; Fri, 21 Aug 2015 15:11:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 176F0304032 for ; Fri, 21 Aug 2015 13:11:20 -0700 (PDT) X-ASG-Debug-ID: 1440187878-04cb6c4a2803240001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 3poFfqhxYSxiijbQ for ; Fri, 21 Aug 2015 13:11:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E31F865476E1; Fri, 21 Aug 2015 15:11:18 -0500 (CDT) Message-ID: <55D785E7.8050503@sandeen.net> Date: Fri, 21 Aug 2015 15:11:19 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Rich Johnston , xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> <55D747FE.4070401@sandeen.net> <55D7854A.9030706@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp In-Reply-To: <55D7854A.9030706@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440187878 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21807 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 3:08 PM, Rich Johnston wrote: > On 08/21/2015 10:47 AM, Eric Sandeen wrote: >> Hi - >> >> Are there any testcases for these? xfsdump is alien code, I swear; >> I'm not quite sure offhand how to tickle any of these bugs. >> >> Thanks, >> -Eric >> > > Hey Eric, > > Many thanks for taking the time to review these patches. > I take a look at all your responses and get a V2 out early next week. Sounds good. If I was off track about the need for the extra 64-bit vars, just educate me. ;) -Eric From sandeen@redhat.com Fri Aug 21 16:15:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B121D7F6F for ; Fri, 21 Aug 2015 16:15:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A26F2304039 for ; Fri, 21 Aug 2015 14:15:54 -0700 (PDT) X-ASG-Debug-ID: 1440191750-04cbb07cbd04be0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iyurrHfDagktsTic (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 14:15:50 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 22CF18E676 for ; Fri, 21 Aug 2015 21:15:50 +0000 (UTC) Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LLFmiE017551 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 17:15:49 -0400 Message-ID: <55D79504.6040305@redhat.com> Date: Fri, 21 Aug 2015 16:15:48 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: collapse allocsize and biosize mount option handling Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs: collapse allocsize and biosize mount option handling Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440191750 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The allocsize and biosize mount options are handled identically, other than allocsize accepting suffixes. suffix_kstrtoint handles bare numbers just fine too, so these can be collapsed. (In other news, though, maybe biosize needs to be deprecated? XFS_IOC_SETBIOSIZE and XFS_IOC_GETBIOSIZE are deprecated, and "biosize" was removed from Documentation/ back in 2005 ...) Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 1fb1656..4bd6c0d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -261,16 +261,8 @@ xfs_parseargs( mp->m_rtname = kstrndup(value, MAXNAMELEN, GFP_KERNEL); if (!mp->m_rtname) return -ENOMEM; - } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) { - if (!value || !*value) { - xfs_warn(mp, "%s option requires an argument", - this_char); - return -EINVAL; - } - if (kstrtoint(value, 10, &iosize)) - return -EINVAL; - iosizelog = ffs(iosize) - 1; - } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { + } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE) || + !strcmp(this_char, MNTOPT_BIOSIZE)) { if (!value || !*value) { xfs_warn(mp, "%s option requires an argument", this_char); From sandeen@redhat.com Fri Aug 21 16:35:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E3E57F82 for ; Fri, 21 Aug 2015 16:35:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7DE4C304043 for ; Fri, 21 Aug 2015 14:35:56 -0700 (PDT) X-ASG-Debug-ID: 1440192954-04cbb07cbe05110001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5Q0TgqCqG5r6HiUt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 14:35:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id ACFB98CF42 for ; Fri, 21 Aug 2015 21:35:54 +0000 (UTC) Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LLZruB005460 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 17:35:54 -0400 Message-ID: <55D799B9.8040002@redhat.com> Date: Fri, 21 Aug 2015 16:35:53 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfsprogs: document dax in xfs.5 and other minor fixes Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfsprogs: document dax in xfs.5 and other minor fixes Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440192955 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Document the dax option, fix whitespace around logdev/rtdev, and add missing qnoenforce. Signed-off-by: Eric Sandeen --- diff --git a/man/man5/xfs.5 b/man/man5/xfs.5 index 3214455..fc1b776 100644 --- a/man/man5/xfs.5 +++ b/man/man5/xfs.5 @@ -140,6 +140,12 @@ devices that support write barriers. .sp Barriers are enabled by default. .TP +.BR dax +Use direct access (no page cache) for block devices which are +memory-like, performing reads and writes directly to the storage +device. See Documentation/filesystems/dax.txt in the kernel +documentation for more information. +.TP .BR discard | nodiscard Enable/disable the issuing of commands to let the block device reclaim space freed by the filesystem. This is @@ -229,7 +235,7 @@ stripe unit configured at mkfs time. The default value for version 1 logs is 32768, while the default value for version 2 logs is MAX(32768, log_sunit). .TP -.BR logdev=device and rtdev=device +.BR logdev=device " and " rtdev=device Use an external log (metadata journal) and/or real-time device. An XFS filesystem has up to three parts: a data section, a log section, and a real-time section. The real-time section is @@ -260,7 +266,7 @@ read-only snapshots. Forcibly turns off all quota accounting and enforcement within the filesystem. .TP -.B uquota/usrquota/uqnoenforce/quota +.B uquota/usrquota/uqnoenforce/qnoenforce/quota User disk quota accounting enabled, and limits (optionally) enforced. Refer to xfs_quota(8) for further details. .TP From sandeen@redhat.com Fri Aug 21 16:36:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3D0127F90 for ; Fri, 21 Aug 2015 16:36:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BEF33AC003 for ; Fri, 21 Aug 2015 14:36:55 -0700 (PDT) X-ASG-Debug-ID: 1440193014-04cbb07cbc05150001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QvoEmUPgWwoGq3Hu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 14:36:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 71A5649 for ; Fri, 21 Aug 2015 21:36:54 +0000 (UTC) Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7LLaqia005683 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 17:36:54 -0400 Message-ID: <55D799F5.9020304@redhat.com> Date: Fri, 21 Aug 2015 16:36:53 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: document dax mount option Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs: document dax mount option Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440193014 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add dax to the list of mount options in xfs.txt. Signed-off-by: Eric Sandeen --- diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 8146e9f..e7e935d 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -58,6 +58,11 @@ default behaviour. This allows for drive level write caching to be enabled, for devices that support write barriers. + dax + Use direct access (no page cache) for block devices which are + memory-like, performing reads and writes directly to the storage + device. See Documentation/filesystems/dax.txt. + discard nodiscard (*) Enable/disable the issuing of commands to let the block From david@fromorbit.com Fri Aug 21 17:52:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EB7E67FA1 for ; Fri, 21 Aug 2015 17:52:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BCAA58F804C for ; Fri, 21 Aug 2015 15:52:53 -0700 (PDT) X-ASG-Debug-ID: 1440197571-04bdf0239706270001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GVzZ34z7w48LK0v5 for ; Fri, 21 Aug 2015 15:52:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CjEwCvqtdVPEDvLHldgxuBPYZToywBAQEBBptWAgIBAQKBLU0BAQEBAQEHAQEBAUABP0EDg2ABAQQ6HCMQCAMYCSUPBSUDBxoTiC3ODAEBCAIgGYYIhTOFCgeELAWSGoMTjGyaSIQ1LDOCTAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Aug 2015 08:22:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSvB2-0003kR-S0; Sat, 22 Aug 2015 08:52:48 +1000 Date: Sat, 22 Aug 2015 08:52:48 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: document dax in xfs.5 and other minor fixes Message-ID: <20150821225248.GQ3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: document dax in xfs.5 and other minor fixes References: <55D799B9.8040002@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D799B9.8040002@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440197571 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21810 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 21, 2015 at 04:35:53PM -0500, Eric Sandeen wrote: > Document the dax option, fix whitespace around logdev/rtdev, > and add missing qnoenforce. > > Signed-off-by: Eric Sandeen No, I don't want the DAX mount option documented. As the code says: #define XFS_MOUNT_DAX (1ULL << 62) /* TEST ONLY! */ The mount option needs to go away and be replaced by on-disk inheritable per-inode flags. I have the kernel patch to do this, but I have not written the xfs_io patch to get/set/clear the flags yet. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Aug 21 18:05:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 575AD7FA3 for ; Fri, 21 Aug 2015 18:05:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D89F5AC001 for ; Fri, 21 Aug 2015 16:05:52 -0700 (PDT) X-ASG-Debug-ID: 1440198350-04cbb07cbb06820001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id uE2sMclAAI3LE0St for ; Fri, 21 Aug 2015 16:05:50 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8223D65476E1; Fri, 21 Aug 2015 18:05:50 -0500 (CDT) Message-ID: <55D7AECE.8010201@sandeen.net> Date: Fri, 21 Aug 2015 18:05:50 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfsprogs: document dax in xfs.5 and other minor fixes References: <55D799B9.8040002@redhat.com> <20150821225248.GQ3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: document dax in xfs.5 and other minor fixes In-Reply-To: <20150821225248.GQ3902@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440198350 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21810 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/15 5:52 PM, Dave Chinner wrote: > On Fri, Aug 21, 2015 at 04:35:53PM -0500, Eric Sandeen wrote: >> Document the dax option, fix whitespace around logdev/rtdev, >> and add missing qnoenforce. >> >> Signed-off-by: Eric Sandeen > > No, I don't want the DAX mount option documented. As the code says: > > #define XFS_MOUNT_DAX (1ULL << 62) /* TEST ONLY! */ > > The mount option needs to go away and be replaced by on-disk > inheritable per-inode flags. I have the kernel patch to do this, but > I have not written the xfs_io patch to get/set/clear the flags yet. > > Cheers, > > Dave. > Ok. I'll resend the other minor fixups on their own. -Eric From david@fromorbit.com Fri Aug 21 18:12:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 999A67FAB for ; Fri, 21 Aug 2015 18:12:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8AC8C304032 for ; Fri, 21 Aug 2015 16:12:01 -0700 (PDT) X-ASG-Debug-ID: 1440198716-04cb6c4a2905fa0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Ow2FGdn7Xu2mJJBu for ; Fri, 21 Aug 2015 16:11:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CTCQBmr9dVPEDvLHldgxuBPYZToywBAQEBBptWAgIBAQKBLU0BAQEBAQEHAQEBAUABP4QkAQEEJxMcIxAIAw4KCSUPBSUDBxoTiC3OCwEBAQcCAR8ZhgiFM4QlZQeELAWVLYxsmkiENSwzgQWBRwEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Aug 2015 08:41:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSvTW-0003mR-U3; Sat, 22 Aug 2015 09:11:54 +1000 Date: Sat, 22 Aug 2015 09:11:54 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix file type directory corruption for btree directories Message-ID: <20150821231154.GR3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix file type directory corruption for btree directories References: <1440179722-6029-1-git-send-email-jack@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440179722-6029-1-git-send-email-jack@suse.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440198717 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21810 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 21, 2015 at 07:55:22PM +0200, Jan Kara wrote: > Users have occasionally reported that file type for some directory > entries is wrong. This mostly happened after updating libraries some > libraries. After some debugging the problem was traced down to > xfs_dir2_node_replace(). The function uses args->filetype as a file type > to store in the replaced directory entry however it also calls > xfs_da3_node_lookup_int() which will store file type of the current > directory entry in args->filetype. Thus we fail to change file type of a > directory entry to a proper type. > > Fix the problem by storing new file type in a local variable before > calling xfs_da3_node_lookup_int(). > > Reported-by: Giacomo Comes > Signed-off-by: Jan Kara So this is being triggered by a rename() operation on a large directory? node format is the optimised form form for large dirs, so I suspect that's why only few people see this. Can you see if you can write a reproducer for it baseed on a large single directory and renaming two files of different types (e.g. BLKDEV over REG) to see if the cause is that simple? i.e. I'm looking for something that can be put into a regression test, because vlealry we don't cover this case right now.... > --- > fs/xfs/libxfs/xfs_dir2_node.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c > index 41b80d3d3877..1006710a7c92 100644 > --- a/fs/xfs/libxfs/xfs_dir2_node.c > +++ b/fs/xfs/libxfs/xfs_dir2_node.c > @@ -2132,6 +2132,7 @@ xfs_dir2_node_replace( > int error; /* error return value */ > int i; /* btree level */ > xfs_ino_t inum; /* new inode number */ > + int ftype; /* new file type */ > xfs_dir2_leaf_t *leaf; /* leaf structure */ > xfs_dir2_leaf_entry_t *lep; /* leaf entry being changed */ > int rval; /* internal return value */ > @@ -2145,7 +2146,12 @@ xfs_dir2_node_replace( > state = xfs_da_state_alloc(); > state->args = args; > state->mp = args->dp->i_mount; > + /* > + * We have to save new inode number and ftype since > + * xfs_da3_node_lookup_int() is going to overwrite them > + */ > inum = args->inumber; > + ftype = args->filetype; > /* > * Lookup the entry to change in the btree. > */ > @@ -2183,7 +2189,7 @@ xfs_dir2_node_replace( > * Fill in the new inode number and log the entry. > */ > dep->inumber = cpu_to_be64(inum); > - args->dp->d_ops->data_put_ftype(dep, args->filetype); > + args->dp->d_ops->data_put_ftype(dep, ftype); > xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); > rval = 0; > } The change looks sane (i'll add whitespace around the comments when i commit) and I'll also add the stable cc. I would like to have a reproducer to test it, though ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 21 19:30:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC6927FAD for ; Fri, 21 Aug 2015 19:30:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B72B8F804B for ; Fri, 21 Aug 2015 17:30:30 -0700 (PDT) X-ASG-Debug-ID: 1440203427-04bdf02398077f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nVDl8sd3uuf2y3sA for ; Fri, 21 Aug 2015 17:30:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BoCwAgwtdVPEDvLHlegxtUZwKpcQEBAQEGg0OFXFGLbYV5BAICRWhNAQEBAQEBBwEBAQFAAT+EJAEBBCcTEQEKIxAIAw4FBQklDwURFAMHGhOILbJvAY95AQEIAgEfGYYIhTOFCgeELAWMZohHhQWHZ4FNhC6IboQvhzCCMR+BZSwzAYJLAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Aug 2015 10:00:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZSwhV-0003rd-Ux; Sat, 22 Aug 2015 10:30:25 +1000 Date: Sat, 22 Aug 2015 10:30:25 +1000 From: Dave Chinner To: Eryu Guan Cc: Tejun Heo , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150822003025.GS3902@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440203427 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL On Fri, Aug 21, 2015 at 06:20:53PM +0800, Eryu Guan wrote: > On Wed, Aug 19, 2015 at 07:56:11AM +1000, Dave Chinner wrote: > > On Tue, Aug 18, 2015 at 12:54:39PM -0700, Tejun Heo wrote: > [snip] > > > > I'd suggest looking at some of the XFS tracepoints during the test: > > > > tracepoint trigger > > xfs_file_buffered_write once per write syscall > > xfs_file_sync once per fsync per inode > > xfs_vm_writepage every ->writepage call > > xfs_setfilesize every IO completion that updates inode size > > > > And it's probably best to also include all the writeback > > tracepoints, too, for context. That will tell you what inodes and > > what part of them are getting written back and when.... > > I finally reproduced generic/048 with both xfs and writeback tracepoints > enabled, please download the trace dat file and trace report file from > > http://128.199.137.77/writeback/ OK, so only one inode the wrong size this time. The writeback tracing is too verbose - it captures everything on the the backing device so there's a huge amount of noise in the trace, and I can't filter it easily because everything is recorded as "bdi 253:0" even though we only want traces from "dev 253:6". As such, there are lots of missing events in the trace again. We do not need these writeback tracepoints: writeback_mark_inode_dirty writeback_dirty_inode_start writeback_dirty_inode writeback_dirty_page writeback_write_inode And they are the ones causing most of the noise. This brings the trace down from 7.1 million events to ~90,000 events and brings the test behaviour right into focus. The inode that had the short length: kworker/u8:1-1563 [002] 71028.844716: writeback_single_inode_start: bdi 253:0: ino=15688963 state=I_DIRTY_SYNC|I_DIRTY_DATASYNC|I_DIRTY_PAGES|I_SYNC dirtied_when=4356811543 age=18446744069352740 index=0 to_write=34816 wrote=0 kworker/u8:1-1563 [002] 71028.844718: wbc_writepage: bdi 253:0: towrt=34816 skip=0 mode=0 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff kworker/u8:1-1563 [002] 71028.844740: xfs_writepage: dev 253:6 ino 0xef6503 pgoff 0x0 size 0xa00000 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:1-1563 [002] 71028.845740: wbc_writepage: bdi 253:0: towrt=32257 skip=0 mode=0 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff kworker/u8:1-1563 [002] 71028.845741: xfs_writepage: dev 253:6 ino 0xef6503 pgoff 0x9ff000 size 0xa00000 offset 0 length 0 delalloc 1 unwritten 0 kworker/u8:1-1563 [002] 71028.845788: writeback_single_inode: bdi 253:0: ino=15688963 state=I_SYNC dirtied_when=4356811543 age=18446744069352740 index=2559 to_write=34816 wrote=2560 And so we can see that writeback pushed all 2560 pages of the file to disk. However, because of all the noise, the xfs io completion events are missing for this inode. I know that at least one of them occurred, because their is this transaction in the log: INODE: #regs: 3 ino: 0xef6503 flags: 0x5 dsize: 16 size 0x9ff000 nblocks 0xa00 extsize 0x0 nextents 0x1 It is, however, the last inode to be updated in the log before the unmount record, and it is the only one that does not have a size of 0xa00000 bytes. It has the right block count, but it it appears that we haven't captured the final IO completion transaction. It was most definitely not the last inode written by writeback; it was the 6th last, and that is ordered correctly given the file name was "993", the 6th last file created by the test. However, I see completions for the inode written before (0xef6502) and after (0xef6504) but none for 0xef6503. Yet from the trace in the log we know that at least one of them occurred, because there's a transaction to say it happened. As it is, there is an off-by-one in the page clustering mapping check in XFS that is causing the last page of the inode to be issued as a separate IO. That's not the cause of the problem however, because we can see from the trace that the IO for the entire file appears to be issued. What we don't see yet is what is happening on the IO completion side, and hence why the sync code is not waiting correctly for all the IO that was issued to be waited on properly. Eryu, can you try again, this time manually specifying the writeback tracepoints so you exclude the really noisy ones? You can also drop the xfs_file_buffered_write and xfs_file_fsync tracepoints as well, as we can see that the incoming side of the code is doing the right thing.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Fri Aug 21 23:46:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 253AC7FAA for ; Fri, 21 Aug 2015 23:46:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 147B0304032 for ; Fri, 21 Aug 2015 21:46:16 -0700 (PDT) X-ASG-Debug-ID: 1440218775-04cb6c4a280a510001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v9oIwCYJlX7YrNnD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Aug 2015 21:46:16 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 1E81D96D8; Sat, 22 Aug 2015 04:46:15 +0000 (UTC) Received: from localhost (vpn1-7-210.pek2.redhat.com [10.72.7.210]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7M4kCun024060; Sat, 22 Aug 2015 00:46:13 -0400 Date: Sat, 22 Aug 2015 12:46:09 +0800 From: Eryu Guan To: Dave Chinner Cc: Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, linux-fsdevel@vger.kernel.org, Jan Kara , Tejun Heo , kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150822003025.GS3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440218775 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 22, 2015 at 10:30:25AM +1000, Dave Chinner wrote: > On Fri, Aug 21, 2015 at 06:20:53PM +0800, Eryu Guan wrote: [snip] > > Eryu, can you try again, this time manually specifying the writeback > tracepoints so you exclude the really noisy ones? You can also drop > the xfs_file_buffered_write and xfs_file_fsync tracepoints as well, > as we can see that the incoming side of the code is doing the right > thing.... I excluded the writeback tracepoints you mentioned writeback_mark_inode_dirty writeback_dirty_inode_start writeback_dirty_inode writeback_dirty_page writeback_write_inode and left all other writeback tracepoints enabled, also dropped xfs_file_buffered_write and xfs_file_fsync. This time I can reproduce generic/048 quickly and please download the trace info from below http://128.199.137.77/writeback-v2/ Thanks, Eryu From lendingtree_partners-xfs=oss.sgi.com@catswallpaperhd.com Sun Aug 23 10:16:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_QP_LONG_LINE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BFE027F37 for ; Sun, 23 Aug 2015 10:16:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A387B8F8037 for ; Sun, 23 Aug 2015 08:16:22 -0700 (PDT) X-ASG-Debug-ID: 1440342975-04cbb07cbe2b020001-NocioJ Received: from mail.catswallpaperhd.com (hst-62-49-25-185.ist.lt [185.25.49.62]) by cuda.sgi.com with ESMTP id 1PPBxFsxKAdH3GxL for ; Sun, 23 Aug 2015 08:16:19 -0700 (PDT) X-Barracuda-Envelope-From: lendingtree_partners-xfs=oss.sgi.com@catswallpaperhd.com X-Barracuda-Apparent-Source-IP: 185.25.49.62 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=catswallpaperhd.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=lendingtree_partners@catswallpaperhd.com; bh=pwS5+iQsBVFORsOstwdk6Vcs4gQ=; b=cdyRkJRLRpqBuOu7eclCJ15mwZ6ZOZy8Q68qcLJMVFH3TupcETb4jwpDKiX4PEtJpF2jLqJzApHJ 1t1uU8Jhp5xg6FZkNjFQ7nYkuwwHyAr+QoQtYzpmO1FXvWiYqcZnrJcOc/aujQL1vWTmT5Czjdtk HVwlEzgOMAXWnkmOIVs= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=catswallpaperhd.com; b=by/IEeeHjP/8ynLNid1ro0fHuF7xty2VqsFmZqCvI/WTymbG/Uswe0MwNfBshYHufnrQsqBCyL9/ fZawV/8exIkI/sJzrJE1ZTz8SUtu2IKUA4EXyOKT9jZJytIYENMBvd57kYGRI67U3DvjoaqE/JSg iE+DwlnvG3BS5OQBNV4=; Received: by mail.catswallpaperhd.com id hr7hs80001gp for ; Sun, 23 Aug 2015 06:09:31 -0700 (envelope-from ) Date: Sun, 23 Aug 2015 06:09:31 -0700 From: "LendingTree Partners" To: Subject: Rates won't stay this low. Refi now. Don't miss out. MIME-Version: 1.0 X-ASG-Orig-Subj: Rates won't stay this low. Refi now. Don't miss out. Content-Type: multipart/alternative; boundary="----=_Part_13303_2123063447.1440334898504" Message-ID: <0.0.0.2D7.1D0DDA4F3399598.645672@mail.catswallpaperhd.com> X-Barracuda-Connect: hst-62-49-25-185.ist.lt[185.25.49.62] X-Barracuda-Start-Time: 1440342975 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.59 X-Barracuda-Spam-Status: No, SCORE=2.59 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC2_MV0250, BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 1.00 BSF_SC2_MV0250 Custom rule MV0250 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_Part_13303_2123063447.1440334898504 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Rates won't stay this low. Refi now. Don't miss out. http://www.catswallpaperhd.com/in/4c28IL61b9G8ZsnFjnn0ntv0Mjh419 Update Preferences- http://www.catswallpaperhd.com/22d8OT61bah5ZsnFjnn0ntv0Mjh1df/right ------=_Part_13303_2123063447.1440334898504 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: quoted-printable =20 LendingTree=20 =20 =20
=20

Rates won't stay this low. Refi now. Don't miss out.

=20
=20 =20 =20 =20 =20 =20 =20
View as webpage | Update Preferences
=20 =20 =20 =20 =20 =20 =20
3D""
=20 =20 =20 =20 =20 =20 =20
 
=20 =20 =20 =20 =20 =20 =20 =20 =20

Shop for it.

=20

3D"30  3D"15  3D"5/1
=20 =20 =20 =20 =20 =20 =20
3D""
=20 =20 =20 =20 =20 =20 =20 =20 =20 =20 =20 =20 =20

  View Multiple Offers Now!

 
 
=20 =20 =20 =20 =20 =20 =20 =20 =20
 

Advertising Disclosures

LendingTree, LLC dba LendingTreePar= tners.com is a duly licensed mortgage broker, as required, with its main of= fice located at 11115 Rushmore Dr., Charlotte, NC 28277, Telephone number 1= -877-703-8733. NMLS Unique Identifier #1136. LendingTreePartners.com is kno= wn as LT Technologies in Lieu of true name, LendingTree, LLC in NY. For a c= urrent list of applicable state licensing & disclosures, see the Lendin= gTree website or call for details. This is a commercial email from LendingT= reePartners.com and may be recurring.

LendingTreePartners.com: Update Preferences | Privacy Policy= | Terms of Use | Disclosures and Licenses

 
=20
=20
=20
=20
=20
=20
=20
=20
=20
 =20

=20

=20 =20 ------=_Part_13303_2123063447.1440334898504-- From faith@heartdeeds.com Sun Aug 23 11:03:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 05A0C7F37 for ; Sun, 23 Aug 2015 11:03:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6023AC004 for ; Sun, 23 Aug 2015 09:03:55 -0700 (PDT) X-ASG-Debug-ID: 1440345833-04bdf0239728c60001-NocioJ Received: from host.bfenterprises.biz (host.bfenterprises.biz [69.16.221.253]) by cuda.sgi.com with ESMTP id a4BcvmLQoJz8yJy9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 23 Aug 2015 09:03:53 -0700 (PDT) X-Barracuda-Envelope-From: faith@heartdeeds.com X-Barracuda-Apparent-Source-IP: 69.16.221.253 X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network Received: from vfyhke (unknown [37.9.53.154]) by host.bfenterprises.biz (Postfix) with ESMTPSA id C21121C04A73; Sun, 23 Aug 2015 12:03:50 -0400 (EDT) Message-ID: <222791C2C91D3BD8040148F2C68F8696@ncnkjos> From: =?windows-1251?B?zuHg/+3o5SDh8/Dm8+Dn6Og=?= To: , , , , , , , , , Subject: =?windows-1251?B?zuHg/+3o5SDh8/Dm8+Dn6Ogg4iDi4Pjl7CDw?= =?windows-1251?B?5ezu7fLlIQ==?= Date: Sun, 23 Aug 2015 18:59:12 +0400 X-ASG-Orig-Subj: =?windows-1251?B?zuHg/+3o5SDh8/Dm8+Dn6Ogg4iDi4Pjl7CDw?= =?windows-1251?B?5ezu7fLlIQ==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1ED2_01D0DDD5.CCD26F20" X-Priority: 3 X-Barracuda-Connect: host.bfenterprises.biz[69.16.221.253] X-Barracuda-Start-Time: 1440345833 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21851 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1ED2_01D0DDD5.CCD26F20 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D0=E5=EC=EE=ED=F2 =E8 =EE=F2=E4=E5=EB=EA=E0 =EA=E2=E0=F0=F2=E8=F0, =E4=EE= =EC=EE=E2, =EA=EE=F2=F2=E5=E4=E6=E5=E9, =E0 =F2=E0=EA=E6=E5 =ED=E5=E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9 =E2= =CC=EE=F1=EA=E2=E5 =E8 =CF=EE=E4=EC=EE=F1=EA=EE=E2=FC=E5. =EA=F0=F3=E3=EB=EE=F1=F3=F2=EE=F7=ED=EE +7(985)2273654, +7(926) 6958875, = 2273654 @ gmail.com =CF=D0=CE=D4=C8 =CC=CE=D1=CA=C2=DB =C8 =CE=C1=CB. =F2=EE=EB=FC=EA=EE =F1 = =E4=EE=E3=EE=E2=EE=F0=EE=EC =C2 =F4=EE=F0=EC=E0=F2=E5 =AB =D1=EA=F0=EE=EC=ED=EE=E5 =EE=E1=E0=FF=ED=E8= =E5 =E1=F3=F0=E6=F3=E0=E7=E8=E8=85=85=BB- =EE=F2 5000 =F0=F3=E1. /=EC2 =C2 =F4=EE=F0=EC=E0=F2=E5 =AB =CD=C5 =F1=EA=F0=EE=EC=ED=EE=E5 =EE=E1=E0=FF= =ED=E8=E5 =E1=F3=F0=E6=F3=E0=E7=E8=E8=85=85=BB- =EE=F2 8000 =F0=F3=E1./=EC= 2 =C2 =F4=EE=F0=EC=E0=F2=E5 =AB =CD=C5 =C4=CB=DF =C2=D1=C5=D5!!!!=BB =EE=F2= 10000 =F0=F3=E1./=EC2 /=D5=D3=C4=CE=C6=C5=D1=D2=C2=C5=CD=CD=DB=C9 =D3=D0= =CE=C2=C5=CD=DC =F0=E0=E1=EE=F2=E0=E5=EC =E2 =F5=E8=F0=F3=F0=E3=E8=F7=E5=F1= =EA=E8=F5 =EF=E5=F0=F7=E0=F2=EA=E0=F5/ =C2 =AB=CD=C0=D0=CE=C4=DB=D5 =D4=CE=D0=CC=C0=D2=C0=D5=BB - =EE=F2 1500=F0= =F3=E1/=EC 2(=EA=EE=F1=EC=E5=F2=E8=EA=E0) =CF=F0=E8=E2=E5=E4=E8 =EA=EB=E8=E5=ED=F2=E0 =E2 =E4=EE=E3=EE=E2=EE=F0 - =CF= =CE=CB=D3=D7=C8 =CF=D0=C5=CC=C8=DE =EE=F2 10.000=F0=F3=E1.! =C0=CA=D6=C8=DF: =EB=E5=F2=EE-2015- =CC=CE=CB=CE=C4=CE=C6=C5=CD=C0=CC, =CE= =C4=C8=CD=CE=CA=C8=CC =C6=C5=CD=D9=C8=CD=C0=CC, =CF=C5=CD=D1=C8=CE=CD=C5=D0= =C0=CC - =CE=D1=CE=C1=DB=C5 =D3=D1=CB=CE=C2=C8=DF.!!!!!! =CD=CE=C2=CE=D1=D2=D0=CE=C9=CA=C8 - =D1=CA=C8=C4=CA=C0 =E4=EE 15% =C0=EA=F6=E8=FF: =F0=E5=EC=EE=ED=F2 =ED=E5=E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9= =E5=ED=E8=E9 - =EE=F2 1000=F0=F3=E1/=EC2 (=EA=EE=F1=EC=E5=F2=E8=EA=E0) =CF=E5=F0=E2=FB=E9 =E2=FB=E5=E7=E4 =E4=E8=E7=E0=E9=ED=E5=F0=E0 =E8 =E7=E0= =EC=E5=F0=F9=E8=EA=E0 - =E1=E5=F1=EF=EB=E0=F2=ED=EE. =C4=E0=EB=E5=E5 =EF=EE= =E4=EE=E3=EE=E2=EE=F0=F3. =D1=EC=E5=F2=E0 =E2 =F2=E8=EF=EE=E2=FB=F5 =F1=EB= =F3=F7=E0=FF=F5 - =E1=E5=F1=EF=EB=E0=F2=ED=EE. =CF=E5=F0=F1=EE=ED=E0=EB=FC= =ED=FB=E9 =EF=F0=EE=F0=E0=E1. =C6=E5=F1=F2=EA=EE=E5 =E2=FB=EF=EE=EB=ED=E5= =ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=E0 =E8 =EF=F0=EE=F1=F2=EE =F7=E5=EB=EE=E2= =E5=F7=E5=F1=EA=E0=FF =EF=EE=F0=FF=E4=EE=F7=ED=EE=F1=F2=FC. =CF=E5=F0=E2=FB= =E9 =E7=E0=E2=EE=E7 =F7=E5=F0=ED=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE=E2= =EF=EE =E4=EE=E3=EE=E2=EE=F0=F3 - =E1=E5=E7 =EF=F0=E5=E4=EE=EF=EB=E0=F2=FB= . =D7=E5=F0=ED=EE=E2=FB=E5 =EC=E0=F2=E5=F0=E8=E0=EB=FB - =EF=EE =EE=EF=F2= =EE=E2=FB=EC =F6=E5=ED=E0=EC! =CF=EE=EB=ED=E0=FF =EF=EE=E4=E4=E5=F0=E6=EA= =E0 =E2 =E2=FB=E1=EE=F0=E5 =F7=E8=F1=F2=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8=E0= =EB=EE=E2 ,=F1=E0=ED=F2=E5=F5=ED=E8=EA=E8, =FD=EB=E5=EA=F2=F0=E8=EA=E8(=E8= =EC=E5=E5=EC =E4=E8=F1=EA=EE=ED=F2=FB =E2=EE =EC=ED=EE=E3=E8=F5 =F2=EE=F0= =E3=EE=E2=FB=F5 =EC=E5=F1=F2=E0=F5) =D1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8=E5 = (=EF=EE=EC=EE=F9=FC) =E2 =EE=F4=EE=F0=EC=EB=E5=ED=E8=E8 =ED=E5=EE=E1=F5=EE= =E4=E8=EC=FB=F5 =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2 =E8 =E4=E5=E9=F1=F2=E2=E8=E9= . =D2=F0=E0=ED=F1=EF=EE=F0=F2=ED=FB=E5 =F0=E0=F1=F5=EE=E4=FB - =F2=EE=EB=FC= =EA=EE =E1=E5=ED=E7=E8=ED =D0=E5=EC=EE=ED=F2 =EA=E2=E0=F0=F2=E8=F0 =EF=EB= =EE=F9=E0=E4=FC=FE =E1=EE=EB=E5=E5 100=EC2-=F1=EE =F1=EA=E8=E4=EA=EE=E9 =E4= =EE 12 % =C2 =F0=E0=E1=EE=F2=E5 =E1=F0=E8=E3=E0=E4 =EA=EE=ED=F2=F0=EE=EB=E8= =F0=F3=E5=F2=F1=FF =E6=E5=F1=F2=EA=E0=FF =F2=E5=F5=ED=EE=EB=EE=E3=E8=F7=E5= =F1=EA=E0=FF =E8 =E2=ED=F3=F2=F0=E5=ED=ED=FF=FF =E4=E8=F1=F6=E8=EF=EB=E8=ED= =E0. =C3=E0=F0=E0=ED=F2=E8=FF =ED=E0 =EE=E1=F9=E5=F1=F2=F0=EE=E8=F2=E5=EB= =FC=ED=FB=E5 =F0=E0=E1=EE=F2=FB =E4=EE 24 =EC=E5=F1=FF=F6=E5=E2 =CF=F0=EE= =F0=E0=E1=FB, =FD=EB=E5=EA=F2=F0=E8=EA=E8, =F1=E0=ED=F2=E5=F5=ED=E8=EA=E8= - =F2=EE=EB=FC=EA=EE =EB=E8=F6=E0, =EF=F0=EE=E6=E8=E2=E0=FE=F9=E8=E5 =EF= =EE=F1=F2=EE=FF=ED=ED=EE =E2 =CC=EE=F1=EA=E2=E5 =E8=EB=E8 =EE=E1=EB. =D2=E5=EB.(926)6958875, +7(985)2273654 =EA=F0=F3=E3=EB=EE=F1=F3=F2=EE=F7=ED= =EE 2273654 @ gmail.com =96=CF=C8=D8=C8=D2=C5! ------=_NextPart_000_1ED2_01D0DDD5.CCD26F20 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D0=E5=EC=EE= =ED=F2=20 =E8 =EE=F2=E4=E5=EB=EA=E0 =EA=E2=E0=F0=F2=E8=F0, =E4=EE=EC=EE=E2, =EA=EE=F2= =F2=E5=E4=E6=E5=E9,

=E0=20 =F2=E0=EA=E6=E5 =ED=E5=E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9 =E2 =CC= =EE=F1=EA=E2=E5 =E8 =CF=EE=E4=EC=EE=F1=EA=EE=E2=FC=E5.

=EA=F0=F3=E3= =EB=EE=F1=F3=F2=EE=F7=ED=EE=20 +7(985)2273654, +7(926) 6958875, 2273654 @ gmail.com

=CF=D0=CE=D4= =C8=20 =CC=CE=D1=CA=C2=DB =C8 =CE=C1=CB. =F2=EE=EB=FC=EA=EE =F1 =E4=EE=E3=EE=E2=EE= =F0=EE=EC

=C2=20 =F4=EE=F0=EC=E0=F2=E5 =AB =D1=EA=F0=EE=EC=ED=EE=E5 =EE=E1=E0=FF=ED=E8=E5 = =E1=F3=F0=E6=F3=E0=E7=E8=E8=85=85=BB- =EE=F2 5000 =F0=F3=E1. /=EC2

=C2=20 =F4=EE=F0=EC=E0=F2=E5 =AB =CD=C5 =F1=EA=F0=EE=EC=ED=EE=E5 =EE=E1=E0=FF=ED= =E8=E5 =E1=F3=F0=E6=F3=E0=E7=E8=E8=85=85=BB- =EE=F2 8000 =F0=F3=E1./=EC2<= /P> =C2=20 =F4=EE=F0=EC=E0=F2=E5 =AB =CD=C5 =C4=CB=DF =C2=D1=C5=D5!!!!=BB =EE=F2 100= 00 =F0=F3=E1./=EC2 /=D5=D3=C4=CE=C6=C5=D1=D2=C2=C5=CD=CD=DB=C9 =D3=D0=CE=C2= =C5=CD=DC =F0=E0=E1=EE=F2=E0=E5=EC =E2=20 =F5=E8=F0=F3=F0=E3=E8=F7=E5=F1=EA=E8=F5 =EF=E5=F0=F7=E0=F2=EA=E0=F5/

=C2=20 =AB=CD=C0=D0=CE=C4=DB=D5 =D4=CE=D0=CC=C0=D2=C0=D5=BB - =EE=F2 1500=F0=F3=E1= /=EC 2(=EA=EE=F1=EC=E5=F2=E8=EA=E0)

=CF=F0=E8=E2= =E5=E4=E8=20 =EA=EB=E8=E5=ED=F2=E0 =E2 =E4=EE=E3=EE=E2=EE=F0 - =CF=CE=CB=D3=D7=C8 =CF=D0= =C5=CC=C8=DE =EE=F2 10.000=F0=F3=E1.!

=C0=CA=D6=C8= =DF:=20 =EB=E5=F2=EE-2015- =CC=CE=CB=CE=C4=CE=C6=C5=CD=C0=CC, =CE=C4=C8=CD=CE=CA=C8= =CC =C6=C5=CD=D9=C8=CD=C0=CC, =CF=C5=CD=D1=C8=CE=CD=C5=D0=C0=CC - =CE=D1=CE= =C1=DB=C5=20 =D3=D1=CB=CE=C2=C8=DF.!!!!!!

=CD=CE=C2=CE= =D1=D2=D0=CE=C9=CA=C8=20 - =D1=CA=C8=C4=CA=C0 =E4=EE 15%

=C0=EA=F6=E8= =FF:=20 =F0=E5=EC=EE=ED=F2 =ED=E5=E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9 - =EE= =F2 1000=F0=F3=E1/=EC2 (=EA=EE=F1=EC=E5=F2=E8=EA=E0)

=CF=E5=F0=E2= =FB=E9=20 =E2=FB=E5=E7=E4 =E4=E8=E7=E0=E9=ED=E5=F0=E0 =E8 =E7=E0=EC=E5=F0=F9=E8=EA=E0= - =E1=E5=F1=EF=EB=E0=F2=ED=EE. =C4=E0=EB=E5=E5 =EF=EE =E4=EE=E3=EE=E2=EE= =F0=F3. =D1=EC=E5=F2=E0 =E2 =F2=E8=EF=EE=E2=FB=F5=20 =F1=EB=F3=F7=E0=FF=F5 - =E1=E5=F1=EF=EB=E0=F2=ED=EE. =CF=E5=F0=F1=EE=ED=E0= =EB=FC=ED=FB=E9 =EF=F0=EE=F0=E0=E1. =C6=E5=F1=F2=EA=EE=E5 =E2=FB=EF=EE=EB= =ED=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=E0 =E8 =EF=F0=EE=F1=F2=EE=20 =F7=E5=EB=EE=E2=E5=F7=E5=F1=EA=E0=FF =EF=EE=F0=FF=E4=EE=F7=ED=EE=F1=F2=FC= . =CF=E5=F0=E2=FB=E9 =E7=E0=E2=EE=E7 =F7=E5=F0=ED=EE=E2=FB=F5 =EC=E0=F2=E5= =F0=E8=E0=EB=EE=E2 =EF=EE =E4=EE=E3=EE=E2=EE=F0=F3 - =E1=E5=E7=20 =EF=F0=E5=E4=EE=EF=EB=E0=F2=FB. =D7=E5=F0=ED=EE=E2=FB=E5 =EC=E0=F2=E5=F0=E8= =E0=EB=FB - =EF=EE =EE=EF=F2=EE=E2=FB=EC =F6=E5=ED=E0=EC! =CF=EE=EB=ED=E0= =FF =EF=EE=E4=E4=E5=F0=E6=EA=E0 =E2 =E2=FB=E1=EE=F0=E5=20 =F7=E8=F1=F2=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE=E2 ,=F1=E0=ED=F2=E5=F5= =ED=E8=EA=E8, =FD=EB=E5=EA=F2=F0=E8=EA=E8(=E8=EC=E5=E5=EC =E4=E8=F1=EA=EE= =ED=F2=FB =E2=EE =EC=ED=EE=E3=E8=F5 =F2=EE=F0=E3=EE=E2=FB=F5=20 =EC=E5=F1=F2=E0=F5) =D1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8=E5 (=EF=EE=EC=EE=F9= =FC) =E2 =EE=F4=EE=F0=EC=EB=E5=ED=E8=E8 =ED=E5=EE=E1=F5=EE=E4=E8=EC=FB=F5= =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2 =E8 =E4=E5=E9=F1=F2=E2=E8=E9.=20 =D2=F0=E0=ED=F1=EF=EE=F0=F2=ED=FB=E5 =F0=E0=F1=F5=EE=E4=FB - =F2=EE=EB=FC= =EA=EE =E1=E5=ED=E7=E8=ED =D0=E5=EC=EE=ED=F2 =EA=E2=E0=F0=F2=E8=F0 =EF=EB= =EE=F9=E0=E4=FC=FE =E1=EE=EB=E5=E5 100=EC2-=F1=EE=20 =F1=EA=E8=E4=EA=EE=E9 =E4=EE 12 % =C2 =F0=E0=E1=EE=F2=E5 =E1=F0=E8=E3=E0=E4= =EA=EE=ED=F2=F0=EE=EB=E8=F0=F3=E5=F2=F1=FF =E6=E5=F1=F2=EA=E0=FF =F2=E5=F5= =ED=EE=EB=EE=E3=E8=F7=E5=F1=EA=E0=FF =E8=20 =E2=ED=F3=F2=F0=E5=ED=ED=FF=FF =E4=E8=F1=F6=E8=EF=EB=E8=ED=E0. =C3=E0=F0=E0= =ED=F2=E8=FF =ED=E0 =EE=E1=F9=E5=F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=E5 =F0=E0= =E1=EE=F2=FB =E4=EE 24 =EC=E5=F1=FF=F6=E5=E2=20 =CF=F0=EE=F0=E0=E1=FB, =FD=EB=E5=EA=F2=F0=E8=EA=E8, =F1=E0=ED=F2=E5=F5=ED= =E8=EA=E8 - =F2=EE=EB=FC=EA=EE =EB=E8=F6=E0, =EF=F0=EE=E6=E8=E2=E0=FE=F9=E8= =E5 =EF=EE=F1=F2=EE=FF=ED=ED=EE =E2 =CC=EE=F1=EA=E2=E5 =E8=EB=E8=20 =EE=E1=EB.

=D2=E5=EB.(9= 26)6958875,=20 +7(985)2273654 =EA=F0=F3=E3=EB=EE=F1=F3=F2=EE=F7=ED=EE

2273654=20 @ gmail.com =96=CF=C8=D8=C8=D2=C5!

<= /HTML> ------=_NextPart_000_1ED2_01D0DDD5.CCD26F20-- From betterthanbotox-xfs=oss.sgi.com@megatrainingtoday.com Sun Aug 23 11:43:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=HTML_IMAGE_ONLY_16, HTML_MESSAGE,HTML_SHORT_LINK_IMG_3,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 561A07F37 for ; Sun, 23 Aug 2015 11:43:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49CD28F8054 for ; Sun, 23 Aug 2015 09:43:25 -0700 (PDT) X-ASG-Debug-ID: 1440348201-04cb6c4a292a130002-NocioJ Received: from mail.megatrainingtoday.com (204.152.221.98.static.quadranet.com [204.152.221.98]) by cuda.sgi.com with ESMTP id SyUtzcuPF5Q9lVIM for ; Sun, 23 Aug 2015 09:43:23 -0700 (PDT) X-Barracuda-Envelope-From: betterthanbotox-xfs=oss.sgi.com@megatrainingtoday.com X-Barracuda-Apparent-Source-IP: 204.152.221.98 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=megatrainingtoday.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=betterthanbotox@megatrainingtoday.com; bh=p6Wi3B1RM6PBKi1zSXxci49ZAa0=; b=TNu4dXeydwKhz/FPIEcFWS3OKCF/m3bKi0sY/EnL7Pmnrp2ZtBnGvrfKpDxaeXr9UyL+zV8ZVlOx 29iCGI1kKowXpHMZWSX4vrG4Tq9kU3BbJhN6o1H6qZjIjp34fu8qudA8hOynzNpy44a0vouRfZY/ AidpkK5h9eNfQjFz+TM= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=megatrainingtoday.com; b=B7nHjik9TDtPeTfs4CW2sG1sV71DhYAIOw693c8kFDLsY2E3QgkWNmtoKYtrfDZ4NK4763HBuBB4 q86aadPQ1qgeS1xo/UyA/8u6cRb14THTtmuOZwe1oyU9Z3KNb0S0dUNtkxKllK/FeklX3ZkzIMH9 HXtMQbjNkuvbbuTZTBA=; Received: by mail.megatrainingtoday.com id hr7s2o0001gq for ; Sun, 23 Aug 2015 09:10:37 -0700 (envelope-from ) Date: Sun, 23 Aug 2015 09:10:37 -0700 From: BetterThanBotox To: Subject: How To Lift Sagging Skin MIME-Version: 1.0 X-ASG-Orig-Subj: How To Lift Sagging Skin Content-Type: multipart/alternative; boundary="----=_Part_19657_433652461.1440345323692" Message-ID: <0.0.0.419.1D0DDBE3FDD6820.2E2704@mail.megatrainingtoday.com> X-Barracuda-Connect: 204.152.221.98.static.quadranet.com[204.152.221.98] X-Barracuda-Start-Time: 1440348203 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.69 X-Barracuda-Spam-Status: No, SCORE=2.69 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0702, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_16, HTML_MESSAGE, HTML_SHORT_LINK_IMG_3, HTML_SHORT_LINK_IMG_3_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21852 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 1.50 BSF_SC0_MV0702 Custom rule MV0702 0.00 HTML_SHORT_LINK_IMG_3 HTML is very short with a linked image 0.56 HTML_SHORT_LINK_IMG_3_2 HTML is very short with a linked image ------=_Part_19657_433652461.1440345323692 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit How To Lift Sagging Skin http://www.megatrainingtoday.com/check/e7c8H6-1ba7ZsnFjnn0ntv0Mjhc4c Update Preferences- http://www.megatrainingtoday.com/197X86P1BbaZcZsnFjnn0ntv0Mjh438/self ------=_Part_19657_433652461.1440345323692 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

How To Lift Sagging Skin

 

Update Preferences

3660 Center Rd #364 - Brunswick, OH 44212









 


------=_Part_19657_433652461.1440345323692-- From bounce@boomjets.fr Sun Aug 23 15:40:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=HTML_IMAGE_ONLY_28, HTML_MESSAGE,T_DKIM_INVALID,T_KHOP_FOREIGN_CLICK autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D9E387F37 for ; Sun, 23 Aug 2015 15:40:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3D53304039 for ; Sun, 23 Aug 2015 13:40:33 -0700 (PDT) X-ASG-Debug-ID: 1440362429-04cb6c4a2b2d010001-NocioJ Received: from adedata.eurowh.com (adedata.eurowh.com [212.83.188.4]) by cuda.sgi.com with ESMTP id 6XHaSTn5bVfGtV3P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 23 Aug 2015 13:40:30 -0700 (PDT) X-Barracuda-Envelope-From: bounce@boomjets.fr X-Barracuda-Apparent-Source-IP: 212.83.188.4 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=boomjets.fr; s=default; h=Content-Transfer-Encoding:Content-Type:List-Unsubscribe:MIME-Version:Reply-To:From:Date:Message-ID:Subject:To; bh=PD4+KJBB2udSN8Y84dMjOb3+u8rfbHI70iwRU4nXpxQ=; b=dSHR1PAKEGDpahWcGT7KDGU14kLQaKi9ywGxft1KIrNX5fUc5UgxRvASqz6Le+kMrYo7MB1sJZte3F3BRix1ksfirWHFUXMwi0UZmAV0KsnItcoqB6nHQILLnDPM93sRoMOS1Cf0gOYZ8hUsjkJHCH9oUnVZUxjwqgpRNyvKK0jTZZtEhIHLSC09qijS92sVR6NvJQ9pgTz3/idI0oFXL2XMbaoboOX+wq/baQVy5upp+lOnAZJobzlmnbrFAz5S+V0JMN9CQadMKKrIlgObD4b5Zjp9D3ftfZe3R1HPSis622P6hj+QrzGx2tHPoCcAKlUYXoaOTuurvck58Oxb4w==; Received: from boomjeto by adedata.eurowh.com with local (Exim 4.85) (envelope-from ) id 1ZTc45-00007g-Lx for xfs@oss.sgi.com; Sun, 23 Aug 2015 22:40:29 +0200 To: xfs@oss.sgi.com Subject: =?UTF-8?B?VW4gbm91dmVhdSBzaXRlIGludGVybmV0IHBvdXIgbGEgcmVudHLDqWUgPw==?= Message-ID: X-ASG-Orig-Subj: =?UTF-8?B?VW4gbm91dmVhdSBzaXRlIGludGVybmV0IHBvdXIgbGEgcmVudHLDqWUgPw==?= Date: Sun, 23 Aug 2015 18:10:35 +0000 From: "Altech" Reply-To: referencement@boomjets.fr MIME-Version: 1.0 X-Mailer-LID: 3,4,5,6 List-Unsubscribe: X-Mailer-RecptId: 318730 X-Mailer-SID: 16 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_a6ccdc8c92fe9ba1dd66285c011f2f13" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - adedata.eurowh.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [505 505] / [47 12] X-AntiAbuse: Sender Address Domain - boomjets.fr X-Get-Message-Sender-Via: adedata.eurowh.com: authenticated_id: boomjeto/from_h X-Barracuda-Connect: adedata.eurowh.com[212.83.188.4] X-Barracuda-Start-Time: 1440362430 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.73 X-Barracuda-Spam-Status: No, SCORE=0.73 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_28, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21860 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.73 HTML_IMAGE_ONLY_28 BODY: HTML: images with 2400-2800 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message --b1_a6ccdc8c92fe9ba1dd66285c011f2f13 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Bonjour, Nous vous offrons un site internet pour toute souscription à un pack de référencement Naturel Google chez nous. En effet, si votre site est déjà vieux, nous vous offrons un autre site internet responsive. Implanter dans le 11ème arrondissement de Paris, nous intervenons auprès des TPE / PME pour apporter une réponse personnalisée à leurs besoins en communication sur Internet : Sites vitrine, e-commerce, référencement naturel. Pour plus d'informations : Cliquez-ici Offre limité : Du 15 Août au 15 septembre En vous remerciant pour votre attention, nous restons à votre disposition pour tous renseignements complémentaires. Cordialement. Service client Ne plus recevoir de message :http://boomjets.fr/unsubscribe.php?M=318730&C=c02b43b01fec9c30da8e38de8531a05c&L=3&N=16 --b1_a6ccdc8c92fe9ba1dd66285c011f2f13 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Fichiers professionnels de France




Bonjour,

Nous vous offrons un site internet pour toute souscription  à un pack de référencement Naturel Google chez nous.
En effet, si votre site est déjà vieux, nous vous offrons un autre site internet responsive.

Implanter dans le 11ème arrondissement de Paris, nous intervenons auprès des TPE / PME pour apporter une réponse
personnalisée à leurs besoins en communication sur Internet : Sites vitrine, e-commerce, référencement naturel.


                         Pour plus d'informations : Cliquez-ici


                                Offre limité : Du 15 Août au 15 septembre

En vous remerciant pour votre attention, nous restons à votre disposition pour tous renseignements complémentaires.

Cordialement.

 Service client
 

Ne plus recevoir de message 

--b1_a6ccdc8c92fe9ba1dd66285c011f2f13-- From dave@fromorbit.com Sun Aug 23 17:58:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BFEAD7F37 for ; Sun, 23 Aug 2015 17:58:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40763AC002 for ; Sun, 23 Aug 2015 15:58:48 -0700 (PDT) X-ASG-Debug-ID: 1440370723-04cb6c4a292e9e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HuWcED76uly13G5y for ; Sun, 23 Aug 2015 15:58:43 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CFCQCTT9pVPEDvLHldgxuBPYZTox4BAQEBBp0DTQEBAQEBAQcBAQEBQT+EUS87GGoDBy2ILaBqpT2GI45xBZU0mxmMKYFwAQsBNxyBZiwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 08:28:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZTeDp-0006zC-Ar for xfs@oss.sgi.com; Mon, 24 Aug 2015 08:58:41 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZTeDp-0006Ee-9i for xfs@oss.sgi.com; Mon, 24 Aug 2015 08:58:41 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix non-debug build warnings Date: Mon, 24 Aug 2015 08:58:41 +1000 X-ASG-Orig-Subj: [PATCH] xfs: fix non-debug build warnings Message-Id: <1440370721-23931-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440370723 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There seem to be a couple of new set-but-unused build warnings that gcc 4.9.3 is now warning about. These are not regressions, just hte compiler being more picky. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 4 +--- fs/xfs/xfs_buf_item.c | 20 +++++++++++++------- fs/xfs/xfs_buf_item.h | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index d7dbd81..c46166b 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -438,7 +438,6 @@ _xfs_buf_find( xfs_buf_flags_t flags, xfs_buf_t *new_bp) { - size_t numbytes; struct xfs_perag *pag; struct rb_node **rbp; struct rb_node *parent; @@ -450,10 +449,9 @@ _xfs_buf_find( for (i = 0; i < nmaps; i++) numblks += map[i].bm_len; - numbytes = BBTOB(numblks); /* Check for IOs smaller than the sector size / not sector aligned */ - ASSERT(!(numbytes < btp->bt_meta_sectorsize)); + ASSERT(!(BBTOB(numblks) < btp->bt_meta_sectorsize)); ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_meta_sectormask)); /* diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 919057e..7e986da 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -746,13 +746,13 @@ xfs_buf_item_free_format( * buffer (see xfs_buf_attach_iodone() below), then put the * buf log item at the front. */ -void +int xfs_buf_item_init( - xfs_buf_t *bp, - xfs_mount_t *mp) + struct xfs_buf *bp, + struct xfs_mount *mp) { - xfs_log_item_t *lip = bp->b_fspriv; - xfs_buf_log_item_t *bip; + struct xfs_log_item *lip = bp->b_fspriv; + struct xfs_buf_log_item *bip; int chunks; int map_size; int error; @@ -766,12 +766,11 @@ xfs_buf_item_init( */ ASSERT(bp->b_target->bt_mount == mp); if (lip != NULL && lip->li_type == XFS_LI_BUF) - return; + return 0; bip = kmem_zone_zalloc(xfs_buf_item_zone, KM_SLEEP); xfs_log_item_init(mp, &bip->bli_item, XFS_LI_BUF, &xfs_buf_item_ops); bip->bli_buf = bp; - xfs_buf_hold(bp); /* * chunks is the number of XFS_BLF_CHUNK size pieces the buffer @@ -784,6 +783,11 @@ xfs_buf_item_init( */ error = xfs_buf_item_get_format(bip, bp->b_map_count); ASSERT(error == 0); + if (error) { /* to stop gcc throwing set-but-unused warnings */ + kmem_zone_free(xfs_buf_item_zone, bip); + return error; + } + for (i = 0; i < bip->bli_format_count; i++) { chunks = DIV_ROUND_UP(BBTOB(bp->b_maps[i].bm_len), @@ -803,6 +807,8 @@ xfs_buf_item_init( if (bp->b_fspriv) bip->bli_item.li_bio_list = bp->b_fspriv; bp->b_fspriv = bip; + xfs_buf_hold(bp); + return 0; } diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 3f3455a..f7eba99 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -61,7 +61,7 @@ typedef struct xfs_buf_log_item { struct xfs_buf_log_format __bli_format; /* embedded in-log header */ } xfs_buf_log_item_t; -void xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); +int xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); void xfs_buf_item_relse(struct xfs_buf *); void xfs_buf_item_log(xfs_buf_log_item_t *, uint, uint); uint xfs_buf_item_dirty(xfs_buf_log_item_t *); -- 2.5.0 From david@fromorbit.com Sun Aug 23 19:12:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4881C7F37 for ; Sun, 23 Aug 2015 19:12:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E36F1AC003 for ; Sun, 23 Aug 2015 17:12:26 -0700 (PDT) X-ASG-Debug-ID: 1440375143-04bdf0239a2fa70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 3EtfIScFEILGxgRj for ; Sun, 23 Aug 2015 17:12:24 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BeCgDwX9pVPEDvLHldgxuBATyCV4N8ox4BAQEBBo0cinyDQgQCAoEhTQEBAQEBAQcBAQEBQT+EIwEBAQMBJxMcIwULCAMOCgklDwUlAwcaExuICwfFcQErGYYKhTSESEIHhCwFlTSGK4FHhH2BTodMiQaIM4I0HIFmLDOBB4FFAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 09:40:36 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZTfLP-000755-Kd; Mon, 24 Aug 2015 10:10:35 +1000 Date: Mon, 24 Aug 2015 10:10:35 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150824001035.GZ714@dastard> X-ASG-Orig-Subj: Re: v5 filesystem corruption due to log recovery lsn ordering References: <20150819183904.GB49174@bfoster.bfoster> <20150819224453.GL3902@dastard> <20150820162529.GB13033@bfoster.bfoster> <20150821003449.GU714@dastard> <20150821143923.GC46372@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150821143923.GC46372@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440375143 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 21, 2015 at 10:39:23AM -0400, Brian Foster wrote: > On Fri, Aug 21, 2015 at 10:34:49AM +1000, Dave Chinner wrote: > > On Thu, Aug 20, 2015 at 12:25:29PM -0400, Brian Foster wrote: > > > On Thu, Aug 20, 2015 at 08:44:53AM +1000, Dave Chinner wrote: > > > That's an interesting idea, but I wonder if it truly fixes the problem > > > or just makes it potentially more difficult to reproduce. One concern is > > > that even with this in place, all it takes to reintroduce the problem is > > > for a filesystem to run a bit on an older kernel in a situation where > > > the LSN is reset and enough modification has occurred to update whatever > > > key metadata we determine as important with the reset LSNs. > > > > We can't prevent that - that horse has already bolted. > > Well, the feature bit can potentially do that. I'm not terribly fond of > it (overkill) and the goal was't to fix older kernels so much as to > prevent the problem from being reintroduced on newer kernels going > forward (provided newer kernels implemented this mount-time LSN > inheritance scheme). We can prevent the problem of old userspace on newer kernels by detecting a zeroed log - we don't need a feature bit for that. > In other words, the proposed solution depends on trust of the metadata > LSNs. One way we can trust those metadata LSNs is to prevent older > kernels/xfsprogs from messing with them. Well, it's old userspace we need to worry about here - kernels don't zero the log... > That said, I don't really agree with the assertion that upgraded > userspace alone sufficiently alleviates the problem. A filesystem that's > been around a while and has more recently been repaired is susceptible > to this problem for the foreseeable future, upgraded userspace or not, > until either all metadata with stale LSNs is updated or the problem is > identified and repaired explicitly. But there's nothing we can do in userspace to fix that. More on that below. > > > Another concern is that we're assuming that the key metadata will always > > > have the most recent LSN. I think the closest thing to a guarantee we > > > have of that is the superblock being updated on umount and every so > > > often by xfs_log_worker() to cover the log. After a bit of playing > > > around, I'm not so sure that is enough. > > > > Sure, I just threw it out as a way to get a more recent LSN. The > > only way to reliably get the highest LSN is to walk all the metadata > > in the filesystem. We can't do that at mount time, so perhaps it > > is best to just refuse to mount read-write and issue a warning to > > upgrade xfsprogs and re-run xfs_repair. > > > > Indeed, that sounds like a nicer approach to me. We're really only > considering the superblock at mount time though (note that repair resets > AG header LSNs), so we're not going to be guaranteed the mount fails for > all affected fs'. What do you think about also firing a (one-time, > probably) warning if we ever update a bit of metadata with a smaller > LSN? Larger LSN, you mean? ;) But, yes, that is what I was thinking for solving the "horse has already bolted" condition you described above. We can detect LSNs beyond the current log in the metadata we read from disk and issue a warning. e.g in each metadata verifiers we add a: if (xfs_verify_lsn(mp, hdr->lsn)) return false; then we can warn immediately that this is a problem. If we discover it during log recovery (i.e. lsn beyond the current head in the log in a block that passes all the other metadata self checks) then we can shut down or force the filesystem into read-only mode so that the user has to update xfsprogs and run repair to fix it because we can't safely run log recovery at this point. > That bit of metadata is now "fixed" once written out, but the point is > that the log item for this metadata was probably not effective and to > notify the user that the fs' LSNs are potentially out of whack and a > repair is in order. That's true - if we don't hit a bad lsn in recovery, we just issue a one-time warning from the verifiers and continue onwards. If the user is lucky, the problem will fix itself before it is ever a problem for recovery. > > So, to repair: have it record LSNs as it walks the metadata and > > at the start of phase 5 have it select a new cycle number higher > > than the highest LSN found in the filesystem. Stamp the log with > > that cycle number as well as all metadata that is being rebuilt > > in phase 5, and all the superblocks. > > > > Problem solved. > > > > Yeah, I was thinking of just using the current head of the log, as > described in my random note. Using the LSN from the metadata is probably > necessary in the cases where the log might be corrupted, however. And as a minor detail, I'd take the cycle number from the highest LSN and bump it a few cycles just to make sure that the new LSN is well beyond anything in the filesystem... > The solution of detection in the kernel and a fix in repair sounds > pretty good to me provided the detection is robust (e.g., the point > above wrt a warning). Then we have something in current kernels that can > effectively handle the problem regardless of how it might have been > (re)introduced and it's fairly simple as well. *nod* I think we have a plan :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 23 20:11:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E3D467F37 for ; Sun, 23 Aug 2015 20:11:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7E64DAC003 for ; Sun, 23 Aug 2015 18:11:28 -0700 (PDT) X-ASG-Debug-ID: 1440378685-04bdf0239930660001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ziYevdOZfaF62I5o for ; Sun, 23 Aug 2015 18:11:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BWCQACbtpVPEDvLHldgxtUZwKCV6cNDgEBAQEGg0OSHoV5AgIBAQJFXU0BAQEBAQEHAQEBAUE/hCQBAQQ6EQEKIxAIAw4FBQklDwURFAMHGhOILQ62JgGPQQEBAQEBBQEBAQEeGYYKhTSFCgeDGIEUBZU0hQaHaYFOhDCDHIVTgzOIM4Q2LDMBgksBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 10:41:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZTgIF-00079R-86; Mon, 24 Aug 2015 11:11:23 +1000 Date: Mon, 24 Aug 2015 11:11:23 +1000 From: Dave Chinner To: Eryu Guan Cc: Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, linux-fsdevel@vger.kernel.org, Jan Kara , Tejun Heo , kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824011123.GA714@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150813224415.GG4496@mtj.duckdns.org> <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440378685 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL On Sat, Aug 22, 2015 at 12:46:09PM +0800, Eryu Guan wrote: > On Sat, Aug 22, 2015 at 10:30:25AM +1000, Dave Chinner wrote: > > On Fri, Aug 21, 2015 at 06:20:53PM +0800, Eryu Guan wrote: > [snip] > > > > Eryu, can you try again, this time manually specifying the writeback > > tracepoints so you exclude the really noisy ones? You can also drop > > the xfs_file_buffered_write and xfs_file_fsync tracepoints as well, > > as we can see that the incoming side of the code is doing the right > > thing.... > > I excluded the writeback tracepoints you mentioned > > writeback_mark_inode_dirty > writeback_dirty_inode_start > writeback_dirty_inode > writeback_dirty_page > writeback_write_inode > > and left all other writeback tracepoints enabled, also dropped > xfs_file_buffered_write and xfs_file_fsync. > > This time I can reproduce generic/048 quickly and please download the > trace info from below > > http://128.199.137.77/writeback-v2/ ok: $ ls -li /mnt/scr total 102396 15688948 -rw------- 1 root root 0 Aug 22 14:31 978 15688950 -rw------- 1 root root 0 Aug 22 14:31 980 15688952 -rw------- 1 root root 10481664 Aug 22 14:31 982 15688957 -rw------- 1 root root 0 Aug 22 14:31 987 15688961 -rw------- 1 root root 0 Aug 22 14:31 991 15688963 -rw------- 1 root root 0 Aug 22 14:31 993 15688964 -rw------- 1 root root 0 Aug 22 14:31 994 15688966 -rw------- 1 root root 0 Aug 22 14:31 996 15688967 -rw------- 1 root root 0 Aug 22 14:31 997 15688968 -rw------- 1 root root 0 Aug 22 14:31 998 $ So, looking at what is on disk and what is in the log: Inode # Size block count flushiter dec hex inode log inode log inode log 15688948 0xef64f4 0 0 0xa00 0xa00 0 0 15688950 0xef64f6 0 0 0xa00 0xa00 0 0 15688952 0xef64f8 0x9ff000 0x9ff000 0x9ff 0xa00 1 0 15688957 0xef64fd 0 0 0xa00 0xa00 0 0 15688961 0xef6501 0 0 0xa00 0xa00 0 0 15688963 0xef6503 0 0 0xa00 0xa00 0 0 15688964 0xef6504 0 0 0xa00 0xa00 0 0 15688966 0xef6506 0 0 0xa00 0xa00 0 0 15688967 0xef6507 0 0 0xa00 0xa00 0 0 15688968 0xef6508 0 0 0xa00 0xa00 0 0 Now, inode #15688952 looks like there's some weirdness going on there with a non-zero flushiter and a block count that doesn't match between what is in the log and what is on disk. However, this is a result of the second mount that checks the file sizes and extent counts - it loads the inode into memory, checks it, and then when it is purged from the cache on unmount the blocks beyond EOF are punched away and the inode writen to disk. Hence there is a second transaction in the log for that inode after all the other inodes have been unlinked: INODE: #regs: 3 ino: 0xef64f8 flags: 0x5 dsize: 16 ..... size 0x9ff000 nblocks 0x9ff extsize 0x0 nextents 0x1 It is preceeded in the log by modifications to the AGF and frees space btree buffers. It's then followed by the superblock buffer and the unmount record. Hence this is not unexpected. What it does tell us, though, is that the log never recorded file size changes for all of the inode with zero size. We see the block count of 0xa00, which means the delayed allocation transaction during IO submission has hit the disk, but there are none of the IO completion transactions in the log. So let's go look at the event trace now now that we know the EOF size update transactions were not run before the filesystem shut down. Inode # writeback completion hex first last first last 0xef64f4 0-0x9ff000 yes no no 0xef64f6 0-0x9ff000 yes no no 0xef64f8 0-0x9ff000 yes no no 0xef64fd 0-0x9ff000 yes no no 0xef6501 0-0x9ff000 yes no no 0xef6503 no no no no 0xef6504 no no no no 0xef6506 no no no no 0xef6507 no no no no 0xef6508 no no no no Ok, so we still can't trust the event trace to be complete - we know from the log and the on-disk state that that allocation occurred for those last 5 inodes, so we can't read anything into the fact the traces for completions are missing. Eryu, can you change the way you run the event trace to be: $ sudo trace-cmd -o ./check rather than running the trace as a background operation elsewhere? Maybe that will give better results. Also, it would be informative to us if you can reproduce this with a v5 filesystem (i.e. mkfs.xfs -m crc=1) because it has much better on-disk information for sequence-of-event triage like this. If you can reproduce it with a v5 filesystem, can you post the trace and metadump? Other things to check (separately): - change godown to godown -f - add a "sleep 5" before running godown after sync - add a "sleep 5; sync" before running godown i.e. I'm wondering if sync is not waiting for everything, and so we aren't capturing the IO completions because the filesystem is already shut down by the time they are delivered... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 23 20:51:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2B2A77F37 for ; Sun, 23 Aug 2015 20:51:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D44E304032 for ; Sun, 23 Aug 2015 18:51:36 -0700 (PDT) X-ASG-Debug-ID: 1440381093-04cbb07cbc33c30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id QyYfkcXu7cBrCuRQ for ; Sun, 23 Aug 2015 18:51:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BFFACxd9pVPEDvLHldgxuBPYJXg3yjHgEBAQEGm1oCAgEBAoEjTQEBAQEBAQcBAQEBQT9BA4NgAQEEJxMcIxAIAxgJJQ8FJQMHGhOILcV2AQEBBwIBHxmGCoU0hQoHhCwFlTSMb447MotmgjQcFoFQLDOCTAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 11:21:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZTgv6-0007DG-DR; Mon, 24 Aug 2015 11:51:32 +1000 Date: Mon, 24 Aug 2015 11:51:32 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 1/4] xfsprogs: Free all data in libxfs_umount; call from xfs_copy as well Message-ID: <20150824015132.GT3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfsprogs: Free all data in libxfs_umount; call from xfs_copy as well References: <55D61740.9070507@sandeen.net> <55D6179B.1040701@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D6179B.1040701@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440381093 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21866 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On Thu, Aug 20, 2015 at 01:08:27PM -0500, Eric Sandeen wrote: > libxfs_umount was failing to free a handful of resources; fix that up. > Call it from xfs_copy as well, while we're at it; every other libxfs_mount > has a libxfs_umount counterpart, at least on a clean exit. xfs/077 6s ... - output mismatch (see /home/dave/src/xfstests-dev/results//xfs/077.out.bad) --- tests/xfs/077.out 2015-08-05 15:00:15.000000000 +1000 +++ /home/dave/src/xfstests-dev/results//xfs/077.out.bad 2015-08-24 11:35:42.000000000 +1000 @@ -18,4 +18,6 @@ writing all SBs new UUID = == xfs_copy with new UUID +cache_purge: shake on cache 0x64b2e0 left 1 nodes!? == xfs_copy with duplicate UUID +cache_purge: shake on cache 0x64b2e0 left 1 nodes!? ... It would seem that this exposes a buffer refcount issue in xfs_copy? Oh, yeah, the superblock. Patch modified to include this hunk: @@ -696,6 +696,7 @@ main(int argc, char **argv) sbp = libxfs_readbuf(mbuf.m_ddev_targp, XFS_SB_DADDR, 1 << (sb->sb_sectlog - BBSHIFT), 0, &xfs_sb_buf_ops); + libxfs_putbuf(sbp); mp = libxfs_mount(&mbuf, sb, xargs.ddev, xargs.logdev, xargs.rtdev, 0); if (mp == NULL) { Which makes the immediate problem go away. Eric, can you send another patch here to abort xfs_copy if the superblock is detected as corrupt by the verifier? Cheers, Dave. -- Dave Chinner david@fromorbit.com From easy_weight_loss-xfs=oss.sgi.com@allcarsguide.com Sun Aug 23 21:29:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=DIET_1,FROM_12LTRDOM, HTML_IMAGE_ONLY_24,HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5EBCC7F37 for ; Sun, 23 Aug 2015 21:29:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BCC53AC001 for ; Sun, 23 Aug 2015 19:29:26 -0700 (PDT) X-ASG-Debug-ID: 1440383358-04cbb07cbb344f0001-NocioJ Received: from mail.allcarsguide.com (hst.ist.lt [185.25.49.36]) by cuda.sgi.com with ESMTP id Hg3bItfL6SJySTK2 for ; Sun, 23 Aug 2015 19:29:19 -0700 (PDT) X-Barracuda-Envelope-From: easy_weight_loss-xfs=oss.sgi.com@allcarsguide.com X-Barracuda-Apparent-Source-IP: 185.25.49.36 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=allcarsguide.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=easy_weight_loss@allcarsguide.com; bh=rjtoxeCWm1cKArjfsU0wToZb4hc=; b=Mvy6SPpSTfr1KltGndTZPHL8Q4C04dC39+KC6492Ibd7/e+ovVDgO4zTMcfohzF2CZSH0OwYt0KR fI3S4eTVU4wJxkQe3WhcDFH9oH/0DSMMXYev1suGWwyRZTlKKhqBBCc4kx7HHcz70JjIz567WYIa ZjSFBSZdbTZtT6w+Q+4= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=allcarsguide.com; b=keb8wZhHcwCY2Q2C8X5+u1vKkrpRc7J7p5/P1NgffhDaTiHykXTwL22tPUPp2F3/GNa0y8Lum9fl CFLRa4R3/A95ZbK3Cvvs3uI+PXz8qubwlgFJdfuHFyxYhBRMefq29L2+VnPrGCQlMDz+IzibkR06 02khNRQWe3ix9t3fgC4=; Received: by mail.allcarsguide.com id hra0o60001gf for ; Sun, 23 Aug 2015 18:41:40 -0700 (envelope-from ) Date: Sun, 23 Aug 2015 18:41:40 -0700 From: "Easy Weight Loss" To: Subject: 2 Foods Proven To KILL Belly Fat (Latest Research) MIME-Version: 1.0 X-ASG-Orig-Subj: 2 Foods Proven To KILL Belly Fat (Latest Research) Content-Type: multipart/alternative; boundary="----=_Part_6139_520531792.1440380178188" Message-ID: <0.0.0.111.1D0DE0E05D40C88.B1C9E@mail.allcarsguide.com> X-Barracuda-Connect: hst.ist.lt[185.25.49.36] X-Barracuda-Start-Time: 1440383358 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.62 X-Barracuda-Spam-Status: No, SCORE=2.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DIET_1, DKIM_SIGNED, DKIM_VERIFIED, FR_3TAG_3TAG, HTML_IMAGE_ONLY_24, HTML_IMAGE_ONLY_24_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21867 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.34 DIET_1 BODY: Lose Weight Spam -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_24 BODY: HTML: images with 2000-2400 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 FR_3TAG_3TAG RAW: Looks like 3 small tags. 1.28 HTML_IMAGE_ONLY_24_2 HTML: images with 2000-2400 bytes of words ------=_Part_6139_520531792.1440380178188 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 2 Foods Proven To KILL Belly Fat (Latest Research) http://www.allcarsguide.com/since/4fej86m1bzbbZsnFjnn0ntv0Mjhc11 Update Preferences- http://www.allcarsguide.com/647M8I61bbeZsnFjnn0ntv0Mjh4cc/laugh ------=_Part_6139_520531792.1440380178188 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

2 Foods Proven To KILL Belly Fat (Latest Research)

The pic below is of a woman named Patricia Wron and what is so impressive is how she lost 37lbs in literally a matter of weeks!

And...

What' s even crazier... is that she was a 45 year old, out of shape diabetic with a serious thyroid problem and managed to make this completely vanish
by eliminating 2 vegetables from her diet!

Her transformation sounds unreal but check out this pic for proof...

The Fat Diminisher

Crazy transformation, right? Well...

If you want to see results like this, then you need to follow in Patricia' s footsteps and AVOID the 2 vegetables below...

=> AVOID These 2 Veggies And Lose 37 Pounds Like Patricia..

Here' s to you eating less veggies and getting faster fat loss results!

To your success!

DAS Services, 315 Place d' Youville, Montré al, QC H2Y 0A4. Copyright 2015. All rights reserved.

Update Preferences

 
 

------=_Part_6139_520531792.1440380178188-- From eguan@redhat.com Sun Aug 23 22:18:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A25D7F37 for ; Sun, 23 Aug 2015 22:18:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BC06304039 for ; Sun, 23 Aug 2015 20:18:21 -0700 (PDT) X-ASG-Debug-ID: 1440386300-04bdf0239732190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d6AeDc9WAA1ec7Zm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 23 Aug 2015 20:18:20 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 224C98E667; Mon, 24 Aug 2015 03:18:20 +0000 (UTC) Received: from localhost (vpn1-4-63.pek2.redhat.com [10.72.4.63]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7O3IGjt016963; Sun, 23 Aug 2015 23:18:18 -0400 Date: Mon, 24 Aug 2015 11:18:16 +0800 From: Eryu Guan To: Dave Chinner Cc: Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Tejun Heo , Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150814111408.GB8710@quack.suse.cz> <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824011123.GA714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440386300 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 24, 2015 at 11:11:23AM +1000, Dave Chinner wrote: > > Eryu, can you change the way you run the event trace to be: > > $ sudo trace-cmd -o ./check > > rather than running the trace as a background operation elsewhere? > Maybe that will give better results. The results are here http://128.199.137.77/writeback-v3/ > > Also, it would be informative to us if you can reproduce this with a > v5 filesystem (i.e. mkfs.xfs -m crc=1) because it has much better > on-disk information for sequence-of-event triage like this. If you > can reproduce it with a v5 filesystem, can you post the trace and > metadump? This seems to be harder to reproduce with tracepoints enabled, but I'll keep trying, and the tests below. Thanks, Eryu > > Other things to check (separately): > > - change godown to godown -f > - add a "sleep 5" before running godown after sync > - add a "sleep 5; sync" before running godown > > i.e. I'm wondering if sync is not waiting for everything, and so we > aren't capturing the IO completions because the filesystem is > already shut down by the time they are delivered... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From smilemukul2005@gmail.com Sun Aug 23 23:44:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 260EC7F37 for ; Sun, 23 Aug 2015 23:44:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D7A98F804B for ; Sun, 23 Aug 2015 21:44:58 -0700 (PDT) X-ASG-Debug-ID: 1440391492-04cb6c4a2832f80001-NocioJ Received: from mail-oi0-f49.google.com (mail-oi0-f49.google.com [209.85.218.49]) by cuda.sgi.com with ESMTP id i3kFEAs1RkKvaSsB (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Aug 2015 21:44:53 -0700 (PDT) X-Barracuda-Envelope-From: smilemukul2005@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.218.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.49] Received: by oiey141 with SMTP id y141so73153671oie.1 for ; Sun, 23 Aug 2015 21:44:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=Ix3zWBL3LINrB4E1KLD6xcVuWNPIiedtSwm8+Xqx+dU=; b=E3eEpfbwqd/czv7bq5z5SMUity/O0SxhnwbJEF3QBQ0PDIdHWx7qdXlj9BzB9sQ25X aE3hF+P2thmRY0giAWdS1vbZHOjgPRIpH8ITJp5/xTLg9sEFxRMbrSCxJP2PazGzsQ83 eef53N3kVnjUrnRo1iSxom66Z+iHfq6crscBdP+7PbXLDb85Iai+516s5SoufMnIdwlB s7e8OfGosoooDtcU/dU0pE2JWAsAFtFKxfRP/fPOqA6fSsACSSqVFRPMvbiw0nKOJATm ZotOHsIO7XXUpB0IblZkbiMYbP/iw74xp7I2C/kqTmrpT/3ayi+BkVWdRfzs0d1VDA4z 0+Ag== MIME-Version: 1.0 X-Received: by 10.202.169.138 with SMTP id s132mr18596635oie.71.1440391492636; Sun, 23 Aug 2015 21:44:52 -0700 (PDT) Received: by 10.202.71.150 with HTTP; Sun, 23 Aug 2015 21:44:52 -0700 (PDT) In-Reply-To: References: Date: Mon, 24 Aug 2015 10:14:52 +0530 Message-ID: Subject: Re: How to determine the reserved blocks in xfs filesystem ? From: Mukul Malhotra X-ASG-Orig-Subj: Re: How to determine the reserved blocks in xfs filesystem ? To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113cdbbe419e57051e074777 X-Barracuda-Connect: mail-oi0-f49.google.com[209.85.218.49] X-Barracuda-Start-Time: 1440391493 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a113cdbbe419e57051e074777 Content-Type: text/plain; charset=UTF-8 Hi, I have below queries on XFS log device as, 1. After creating a XFS filesystem with an external log device (journal), is there a way to mount the filesystem if I lose the external log device or a way to recover files? 2. Is there a way to convert an existing XFS filesystem which has internal log to external log and vice versa. Need help on above queries. Thank You Mukul Malhotra --001a113cdbbe419e57051e074777 Content-Type: text/html; charset=UTF-8
Hi,

I have below queries on XFS log device as,

1. After creating a XFS filesystem with an external log device (journal), is there a way to mount the filesystem if I lose the external log device or a way to recover files?

2. Is there a way to convert an existing XFS filesystem which has internal log to external log and vice versa.

Need help on above queries.


Thank You
Mukul Malhotra
--001a113cdbbe419e57051e074777-- From david@fromorbit.com Mon Aug 24 01:24:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E17517F37 for ; Mon, 24 Aug 2015 01:24:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C214C304032 for ; Sun, 23 Aug 2015 23:24:31 -0700 (PDT) X-ASG-Debug-ID: 1440397468-04cbb07cbc37a70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FHLrsWJMmGD4dzAJ for ; Sun, 23 Aug 2015 23:24:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D9CgBft9pVPEDvLHldgxtUZwKCV6cPDAEBAQEBAQaDQ5IehXkCAgEBAkVfTQEBAQEBAQcBAQEBQT+EJAEBBCcTEQEKIxAIAw4FBQklDwURFAMHGhOILQ62RAGPQQEBAQcCAR8ZhgqFNIUKB4QsBZU0hQaHaY5ti2aENiwzAYJLAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 15:54:27 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZTlBB-0007c9-UZ; Mon, 24 Aug 2015 16:24:25 +1000 Date: Mon, 24 Aug 2015 16:24:25 +1000 From: Dave Chinner To: Eryu Guan Cc: Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Tejun Heo , Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824062425.GU3902@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440397468 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL On Mon, Aug 24, 2015 at 11:18:16AM +0800, Eryu Guan wrote: > On Mon, Aug 24, 2015 at 11:11:23AM +1000, Dave Chinner wrote: > > > > Eryu, can you change the way you run the event trace to be: > > > > $ sudo trace-cmd -o ./check > > > > rather than running the trace as a background operation elsewhere? > > Maybe that will give better results. > > The results are here > > http://128.199.137.77/writeback-v3/ OK, the trace is still missing a few events, but it's much more complete, and contains the events that tell more of the story: $ ls -li /mnt/scr total 51196 15688955 -rw------- 1 root root 10481664 Aug 24 13:06 985 15688959 -rw------- 1 root root 0 Aug 24 13:06 989 15688961 -rw------- 1 root root 0 Aug 24 13:06 991 15688964 -rw------- 1 root root 0 Aug 24 13:06 994 15688966 -rw------- 1 root root 0 Aug 24 13:06 996 $ Inode # Size block count flushiter dec hex inode log inode log inode log 15688955 0xef64fb 0x9ff000 0x9ff000 0x9ff 0xa00 1 0 15688959 0xef64ff 0 0 0xa00 0xa00 0 0 15688961 0xef6501 0 0 0xa00 0xa00 0 0 15688964 0xef6504 0 0 0xa00 0xa00 0 0 15688966 0xef6506 0 0 0xa00 0xa00 0 0 Ok, that tallies with the previous symptoms. However, the trace tells us something different. the xfs_setfilesize events. here's the last 12 xfs_setfilesize events delivered in the trace (trimmed for brevity and focus): ino 0xef64fa isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ino 0xef64fa isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 409 ino 0xef64fb isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ino 0xef64fb isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 ino 0xef64ff isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ino 0xef64ff isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 ino 0xef6501 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ino 0xef6501 isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 ino 0xef6504 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ino 0xef6504 isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 ino 0xef6506 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 ino 0xef6506 isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 Yeah, the last 9 transactions corresponding to these events are not in the log. Which means, most likely, that they occurred after ->sync_fs forced the log out. THe next thing that happens is the fs is shut down, and that's preventing the dirty log from being written to disk. Eryu, this can be confirmed by add the xfs_log_force event to the trace. What I can't see in the traces is where sync is doing a blocking sync pass on the fileystem. The wbc control structure being passed to XFS is: wbc_writepage: bdi 253:0: towrt=45569 skip=0 mode=0 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff Which is not coming from sync_inodes_sb() as the sync mode is incorrect (i.e. not WB_SYNC_ALL). It looks to me that writeback is coming from a generic bdi flusher command rather than a directed superblock sync. i.e. through wakeup_flusher_threads() which sets: work->sync_mode = WB_SYNC_NONE; work->nr_pages = nr_pages; work->range_cyclic = range_cyclic; work->reason = reason; work->auto_free = 1; as the reason is "sync": sync-18849 writeback_queue: bdi 253:0: sb_dev 0:0 nr_pages=308986 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync sync-18849 writeback_queue: bdi 253:0: sb_dev 253:1 nr_pages=9223372036854775807 sync_mode=1 kupdate=0 range_cyclic=0 background=0 reason=sync .... kworker/u8:1-1563 writeback_exec: bdi 253:0: sb_dev 0:0 nr_pages=308986 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync kworker/u8:1-1563 writeback_start: bdi 253:0: sb_dev 0:0 nr_pages=308986 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync The next writeback_queue/writeback_exec tracepoint pair are: .... kworker/2:1-17163 xfs_setfilesize: dev 253:6 ino 0xef6506 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 kworker/2:1-17163 xfs_setfilesize: dev 253:6 ino 0xef6506 isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775798 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775797 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775796 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775795 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff umount-18852 writeback_queue: bdi 253:0: sb_dev 253:6 nr_pages=22059 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync kworker/u8:1-1563 writeback_exec: bdi 253:0: sb_dev 253:6 nr_pages=22059 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync .... which shows unmount being the next writeback event queued and executed after the IO completions have come in (that missed the log). What is missing is the specific queue/exec events for sync_sb_inodes() from the sync code for each filesystem. Anyway, Eryum long and short of it is that you don't need to worry about testing all the different combinations - we now know that the completion events are occurring, so let's focus on whether the sync code is not waiting for them correctly. Can you trace the following events: xfs_log_force xfs_setfilesize writeback_queue writeback_exec writeback_start writeback_queue_io writeback_written writeback_pages_written basically I'm trying to see if we've got all the BDI events as we'd expect then to be queued and run for sync, and when the ->sync_fs call occurs during the sync process before shutdown and unmount... Cheers, Dave. -- Dave Chinner david@fromorbit.com From simonxiaomg@gmail.com Mon Aug 24 01:43:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 45EEB7F37 for ; Mon, 24 Aug 2015 01:43:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C7BF0AC004 for ; Sun, 23 Aug 2015 23:43:09 -0700 (PDT) X-ASG-Debug-ID: 1440398587-04cbb07cbb37dd0001-NocioJ Received: from mail-io0-f182.google.com (mail-io0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id MebdvaJwOGrO2EoH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Aug 2015 23:43:07 -0700 (PDT) X-Barracuda-Envelope-From: simonxiaomg@gmail.com Received: by iodt126 with SMTP id t126so138458895iod.2 for ; Sun, 23 Aug 2015 23:43:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=onKPkaseVUdMJd6ikCKOMOO1Ms5A8/l5NJG2GuZuy5Q=; b=T+TnE7LYLbghQOapfWwrsNknEpy6feM15ASnQ+hdck630JUNt97u04dN8iFSFXaeJA 6wdY/NC/C0uqAaYjE7wUHBQvE1nLZatXwASSxaYlZTiQLhQP0R4YiChutlj3eM2+YQuq lrGZB0t7/X0QrDgl5x0sYeO001U7a4UEB9gofsc7V3u5NwfoYC60Vw1PG1+QQy5n9KW4 zXdeSyCLd996qN8WkmbupMA1E45wXiZAtIEEgYHInhlycAzvkC7rkmi8as8wetjAXOJK Oz4LopH3hHsVjC8sabTMm5QRILcZyI4x0B6HN2QEF6jcyTXozn6nEfPVunlcFfphzK93 KYKA== MIME-Version: 1.0 X-Received: by 10.107.152.139 with SMTP id a133mr10948197ioe.145.1440398587050; Sun, 23 Aug 2015 23:43:07 -0700 (PDT) Received: by 10.107.12.70 with HTTP; Sun, 23 Aug 2015 23:43:07 -0700 (PDT) In-Reply-To: <20150821112118.GB46372@bfoster.bfoster> References: <20150821112118.GB46372@bfoster.bfoster> Date: Mon, 24 Aug 2015 14:43:07 +0800 Message-ID: Subject: Re: xfs directory quota doesn't work From: Simon Xia X-ASG-Orig-Subj: Re: xfs directory quota doesn't work To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a1140a9c21dc137051e08eeca X-Barracuda-Connect: mail-io0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1440398587 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1140a9c21dc137051e08eeca Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable I do create two subdirectory for project and the error maybe caused by this step: xfs_quota -x -c 'project =E2=80=93c task1' /home/xiameng.xm/xfs_dir =E2=80=93c - no such project in /etc/projects Checking project task1 (path /home/xiameng.xm/xfs_dir/task1)... /home/xiameng.xm/xfs_dir/task1 - project identifier is not set (inode=3D0, tree=3D11) /home/xiameng.xm/xfs_dir/task1 - project inheritance flag is not set Processed 1 /etc/projects paths for project task1 I'm a little confused about the output message, cause everything is ok in config file 2015-08-21 19:21 GMT+08:00 Brian Foster : > On Fri, Aug 21, 2015 at 05:05:00PM +0800, Simon Xia wrote: > > hi, everyone, I encounter a problem when using xfs > > > > now I have two tasks and I wanna run them in different directory and > limit > > the directory=E2=80=99s size. I use xfs=E2=80=99s project quota to achi= eve this. > > > > I follow the steps from here: > > https://solidlinux.wordpress.com/2012/12/09/xfs-quota-managament/ > > > > here is detail of my two config files > > > > /etc/projects: > > > > 11:/home/xiameng.xm/xfs_dir/task1 > > 12:/home/xiameng.xm/xfs_dir/task2 > > > > /etc/projid: > > > > task1:11 > > task2:12 > > > > and here is my step: > > > > touch test_xfs > > dd if=3D/dev/zero of=3Dtest_xfs bs=3D1000000 count=3D1 > > mkfs.xfs test_xfs > > > > That looks small, I can't even mkfs a file that small. I ran through > this using 'bs=3D1M count=3D100.' > > > mkdir xfs_dir > > mount test_xfs ./xfs_dir -o pquota,loop > > > > xfs_quota -xc 'project =E2=80=93s task1' /home/xiameng.xm/xfs_dir > > xfs_quota -xc 'project =E2=80=93s task2' /home/xiameng.xm/xfs_dir > > > > I don't see where you've created the directories yet..? I get the > following: > > # xfs_quota -xc 'project -s task1' /mnt/ > xfs_quota: cannot find mount point for path `/mnt/task1': No such file or > directory > > ... until I create the task1/task2 directories. This is required because > the project quota command has to set the project id on the directory > inode. It won't work if the directory is created after this point, > regardless of whether the quota limit is specified. > > Once I create those directories and run the project command, everything > seems to work. I can write up to 2MB to task1 and 10MB to task2. > > Brian > > > xfs_quota -x -c 'limit -p bhard=3D2m task1' /home/xiameng.xm/xfs_dir > > xfs_quota -x -c 'limit -p bhard=3D10m task2' /home/xiameng.xm/xfs_dir > > > > here is the output of xfs_quota -x -c 'report /home/xiameng.xm/xfs_dir' > > > > Project quota on /home/xiameng.xm/xfs_dir (/dev/loop1) > > Blocks > > Project ID Used Soft Hard Warn/Grace > > ---------- -------------------------------------------------- > > task1 0 0 2048 00 [--------] > > task2 0 0 10240 00 [--------] > > > > the question is no mater how large I create a file in ./xfs_dir/task1 o= r > > ./xfs_dir/task2, it success! > > > > the quota limit doesn=E2=80=99t work! > > > > Any help will be appreciated :) > > > > > > ps: I also post my question here: > > > http://unix.stackexchange.com/questions/224606/xfs-directory-quota-doesnt= -work > > > > ---- > > > > Best Regards > > Simon Xia > > =E2=80=8B > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > --=20 Best Regards Simon Xia --001a1140a9c21dc137051e08eeca Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
I do create two subdirectory for project

and the error maybe caused by this step:
xfs_quota -x -c &= #39;project =E2=80=93c task1' /home/xiameng.xm/xfs_dir

=E2=80=93c - no such project in /etc/projects
Checking p= roject task1 (path /home/xiameng.xm/xfs_dir/task1)...
/home/xiame= ng.xm/xfs_dir/task1 - project identifier is not set (inode=3D0, tree=3D11)<= /div>
/home/xiameng.xm/xfs_dir/task1 - project inheritance flag is not = set
Processed 1 /etc/projects paths for project task1
=

I'm a little confused about the output message, cau= se everything is ok in config file

2015-08-21 19:21 GMT+08:00 Brian Foster <bfoster@r= edhat.com>:
On Fri, Aug 21, 2015 at 05:05:00PM +0800, Simon Xia wrote:
> hi, everyone, I encounter a problem when using xfs
>
> now I have two tasks and I wanna run them in different directory and l= imit
> the directory=E2=80=99s size. I use xfs=E2=80=99s project quota to ach= ieve this.
>
> I follow the steps from here:
> https://solidlinux.wordpress.c= om/2012/12/09/xfs-quota-managament/
>
> here is detail of my two config files
>
> /etc/projects:
>
> 11:/home/xiameng.xm/xfs_dir/task1
> 12:/home/xiameng.xm/xfs_dir/task2
>
> /etc/projid:
>
> task1:11
> task2:12
>
> and here is my step:
>
> touch test_xfs
> dd if=3D/dev/zero of=3Dtest_xfs bs=3D1000000 count=3D1
> mkfs.xfs test_xfs
>

That looks small, I can't even mkfs a file that small. I ran thr= ough
this using 'bs=3D1M count=3D100.'

> mkdir xfs_dir
> mount test_xfs ./xfs_dir -o pquota,loop
>
> xfs_quota -xc 'project =E2=80=93s task1' /home/xiameng.xm/xfs_= dir
> xfs_quota -xc 'project =E2=80=93s task2' /home/xiameng.xm/xfs_= dir
>

I don't see where you've created the directories yet..? I ge= t the
following:

# xfs_quota -xc 'project -s task1' /mnt/
xfs_quota: cannot find mount point for path `/mnt/task1': No such file = or directory

... until I create the task1/task2 directories. This is required because the project quota command has to set the project id on the directory
inode. It won't work if the directory is created after this point,
regardless of whether the quota limit is specified.

Once I create those directories and run the project command, everything
seems to work. I can write up to 2MB to task1 and 10MB to task2.

Brian

> xfs_quota -x -c 'limit -p bhard=3D2m task1' /home/xiameng.xm/x= fs_dir
> xfs_quota -x -c 'limit -p bhard=3D10m task2' /home/xiameng.xm/= xfs_dir
>
> here is the output of xfs_quota -x -c 'report /home/xiameng.xm/xfs= _dir'
>
> Project quota on /home/xiameng.xm/xfs_dir (/dev/loop1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Blocks
> Project ID=C2=A0 =C2=A0 =C2=A0 =C2=A0Used=C2=A0 =C2=A0 =C2=A0 =C2=A0So= ft=C2=A0 =C2=A0 =C2=A0 =C2=A0Hard=C2=A0 =C2=A0 Warn/Grace
> ---------- --------------------------------------------------
> task1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 0=C2=A0 =C2=A0 =C2=A0 =C2=A02048=C2=A0 =C2=A0 = =C2=A000 [--------]
> task2=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 0=C2=A0 =C2=A0 =C2=A0 10240=C2=A0 =C2=A0 =C2=A0= 00 [--------]
>
> the question is no mater how large I create a file in ./xfs_dir/task1 = or
> ./xfs_dir/task2, it success!
>
> the quota limit doesn=E2=80=99t work!
>
> Any help will be appreciated :)
>
>
> ps: I also post my question here:
> http://unix.stack= exchange.com/questions/224606/xfs-directory-quota-doesnt-work
>
> ----
>
> Best Regards
> Simon Xia
> =E2=80=8B

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




--
Best Regards

Simon= Xia
--001a1140a9c21dc137051e08eeca-- From eguan@redhat.com Mon Aug 24 03:34:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0326F7F37 for ; Mon, 24 Aug 2015 03:34:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 76663AC001 for ; Mon, 24 Aug 2015 01:34:42 -0700 (PDT) X-ASG-Debug-ID: 1440405280-04cbb07cbb3a260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vMGMxmV1cpxOkUNO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 01:34:41 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 793B58E370; Mon, 24 Aug 2015 08:34:40 +0000 (UTC) Received: from localhost (dhcp-12-142.nay.redhat.com [10.66.12.142]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7O8YcDh013271; Mon, 24 Aug 2015 04:34:39 -0400 Date: Mon, 24 Aug 2015 16:34:37 +0800 From: Eryu Guan To: Dave Chinner Cc: Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, linux-fsdevel@vger.kernel.org, Jan Kara , Tejun Heo , kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824083437.GP17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824062425.GU3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440405281 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 24, 2015 at 04:24:25PM +1000, Dave Chinner wrote: > On Mon, Aug 24, 2015 at 11:18:16AM +0800, Eryu Guan wrote: > > On Mon, Aug 24, 2015 at 11:11:23AM +1000, Dave Chinner wrote: > > > > > > Eryu, can you change the way you run the event trace to be: > > > > > > $ sudo trace-cmd -o ./check > > > > > > rather than running the trace as a background operation elsewhere? > > > Maybe that will give better results. [snip] > Anyway, Eryum long and short of it is that you don't need to worry > about testing all the different combinations - we now know that the > completion events are occurring, so let's focus on whether the sync > code is not waiting for them correctly. Can you trace the following > events: > > xfs_log_force > xfs_setfilesize > writeback_queue > writeback_exec > writeback_start > writeback_queue_io > writeback_written > writeback_pages_written > > basically I'm trying to see if we've got all the BDI events as we'd > expect then to be queued and run for sync, and when the ->sync_fs > call occurs during the sync process before shutdown and unmount... I collected two versions of trace info with crc enabled. http://128.199.137.77/writeback-crc/ This version traced the same events as previous runs. http://128.199.137.77/writeback-crc-v2/ And this version only traced the events you listed above. And the results of other tests to check(all done with v4 xfs, with no tracepoints enabled): > Other things to check (separately): > - change godown to godown -f Passed 100 loops. > - add a "sleep 5" before running godown after sync Failed, if you need the trace info please let me know. > - add a "sleep 5; sync" before running godown Passed 100 loops. Thanks, Eryu From david@fromorbit.com Mon Aug 24 03:56:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4CD57F37 for ; Mon, 24 Aug 2015 03:56:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F5B6AC003 for ; Mon, 24 Aug 2015 01:56:05 -0700 (PDT) X-ASG-Debug-ID: 1440406562-04cb6c4a2b369c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cxQcgRw803mbXhyu for ; Mon, 24 Aug 2015 01:56:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D+CgCz29pVPEDvLHldgxpUZwKCV6cSDAEBAQEBAQaDQ5IihXUCAgEBAkVkTQEBAQEBAQcBAQEBQT+EIwEBAQMBJxMRAQojBQsIAw4FBQklDwURFAMHGhOIJgcOtm0Bj0EBAQEBAQUBAQEBHhmGCoU0hQoHgxiBFAWHJoZuhAqDFoUGh2mBToQwiG+LZoQ2LDMBgksBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 18:25:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZTnXh-0007tq-QI; Mon, 24 Aug 2015 18:55:49 +1000 Date: Mon, 24 Aug 2015 18:55:49 +1000 From: Dave Chinner To: Eryu Guan Cc: Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, linux-fsdevel@vger.kernel.org, Jan Kara , Tejun Heo , kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824085549.GB714@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824083437.GP17933@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824083437.GP17933@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440406562 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21873 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL On Mon, Aug 24, 2015 at 04:34:37PM +0800, Eryu Guan wrote: > On Mon, Aug 24, 2015 at 04:24:25PM +1000, Dave Chinner wrote: > > On Mon, Aug 24, 2015 at 11:18:16AM +0800, Eryu Guan wrote: > > > On Mon, Aug 24, 2015 at 11:11:23AM +1000, Dave Chinner wrote: > > > > > > > > Eryu, can you change the way you run the event trace to be: > > > > > > > > $ sudo trace-cmd -o ./check > > > > > > > > rather than running the trace as a background operation elsewhere? > > > > Maybe that will give better results. > [snip] > > Anyway, Eryum long and short of it is that you don't need to worry > > about testing all the different combinations - we now know that the > > completion events are occurring, so let's focus on whether the sync > > code is not waiting for them correctly. Can you trace the following > > events: > > > > xfs_log_force > > xfs_setfilesize > > writeback_queue > > writeback_exec > > writeback_start > > writeback_queue_io > > writeback_written > > writeback_pages_written > > > > basically I'm trying to see if we've got all the BDI events as we'd > > expect then to be queued and run for sync, and when the ->sync_fs > > call occurs during the sync process before shutdown and unmount... > > I collected two versions of trace info with crc enabled. > > http://128.199.137.77/writeback-crc/ > > This version traced the same events as previous runs. > > http://128.199.137.77/writeback-crc-v2/ > > And this version only traced the events you listed above. OK, I'll look into these later. > And the results of other tests to check(all done with v4 xfs, with no > tracepoints enabled): > > > Other things to check (separately): > > - change godown to godown -f > > Passed 100 loops. Yup, I expected that from the last set of traces - the "-f" flag triggers a log force before shutdown, and that flushes out transactions that sync missed. > > - add a "sleep 5" before running godown after sync > > Failed, if you need the trace info please let me know. Expected, still nothing to flush transactions before shutdown. > > - add a "sleep 5; sync" before running godown > > Passed 100 loops. expected - sync flushed the transactions it missed on the first pass. Thanks for running these tests! Cheers, Dave. -- Dave Chinner david@fromorbit.com From jack@suse.cz Mon Aug 24 04:20:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B33A87F37 for ; Mon, 24 Aug 2015 04:20:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9228C304032 for ; Mon, 24 Aug 2015 02:20:07 -0700 (PDT) X-ASG-Debug-ID: 1440408003-04cbb07cbc3b390001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id SiXnEEj1urlZqP0G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 02:20:04 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4C1B9AC4E; Mon, 24 Aug 2015 09:20:03 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id ECEAA82823; Mon, 24 Aug 2015 11:19:59 +0200 (CEST) Date: Mon, 24 Aug 2015 11:19:59 +0200 From: Jan Kara To: Dave Chinner Cc: Eryu Guan , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Tejun Heo , Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824091959.GA2936@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824062425.GU3902@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440408004 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL On Mon 24-08-15 16:24:25, Dave Chinner wrote: > On Mon, Aug 24, 2015 at 11:18:16AM +0800, Eryu Guan wrote: > > On Mon, Aug 24, 2015 at 11:11:23AM +1000, Dave Chinner wrote: > > > > > > Eryu, can you change the way you run the event trace to be: > > > > > > $ sudo trace-cmd -o ./check > > > > > > rather than running the trace as a background operation elsewhere? > > > Maybe that will give better results. > > > > The results are here > > > > http://128.199.137.77/writeback-v3/ > What I can't see in the traces is where sync is doing a blocking > sync pass on the fileystem. The wbc control structure being passed > to XFS is: > > wbc_writepage: bdi 253:0: towrt=45569 skip=0 mode=0 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff > > Which is not coming from sync_inodes_sb() as the sync mode is > incorrect (i.e. not WB_SYNC_ALL). It looks to me that writeback is > coming from a generic bdi flusher command rather than a directed > superblock sync. i.e. through wakeup_flusher_threads() which sets: > > work->sync_mode = WB_SYNC_NONE; > work->nr_pages = nr_pages; > work->range_cyclic = range_cyclic; > work->reason = reason; > work->auto_free = 1; > > as the reason is "sync": > > sync-18849 writeback_queue: bdi 253:0: sb_dev 0:0 nr_pages=308986 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync > sync-18849 writeback_queue: bdi 253:0: sb_dev 253:1 nr_pages=9223372036854775807 sync_mode=1 kupdate=0 range_cyclic=0 background=0 reason=sync > .... > kworker/u8:1-1563 writeback_exec: bdi 253:0: sb_dev 0:0 nr_pages=308986 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync > kworker/u8:1-1563 writeback_start: bdi 253:0: sb_dev 0:0 nr_pages=308986 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync > > The next writeback_queue/writeback_exec tracepoint pair are: > > .... > kworker/2:1-17163 xfs_setfilesize: dev 253:6 ino 0xef6506 isize 0xa00000 disize 0x0 offset 0x0 count 10481664 > kworker/2:1-17163 xfs_setfilesize: dev 253:6 ino 0xef6506 isize 0xa00000 disize 0x9ff000 offset 0x9ff000 count 4096 > sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775798 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff > sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775797 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff > sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775796 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff > sync-18849 wbc_writepage: bdi 253:0: towrt=9223372036854775795 skip=0 mode=1 kupd=0 bgrd=0 reclm=0 cyclic=0 start=0x0 end=0x7fffffffffffffff > umount-18852 writeback_queue: bdi 253:0: sb_dev 253:6 nr_pages=22059 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync > kworker/u8:1-1563 writeback_exec: bdi 253:0: sb_dev 253:6 nr_pages=22059 sync_mode=0 kupdate=0 range_cyclic=0 background=0 reason=sync > .... > > which shows unmount being the next writeback event queued and > executed after the IO completions have come in (that missed the > log). What is missing is the specific queue/exec events for > sync_sb_inodes() from the sync code for each filesystem. Bah, I see the problem and indeed it was introduced by commit e79729123f639 "writeback: don't issue wb_writeback_work if clean". The problem is that we bail out of sync_inodes_sb() if there is no dirty IO. Which is wrong because we have to wait for any outstanding IO (i.e. call wait_sb_inodes()) regardless of dirty state! And that also explains why Tejun's patch fixes the problem because it backs out the change to the exit condition in sync_inodes_sb(). So Tejun's patch from this thread is indeed fixing the real problem but the comment in sync_inodes_sb() should be fixed to mention wait_sb_inodes() must be called in all cases... Tejun, will you fixup the comment please? Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Mon Aug 24 04:26:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 73DC57F37 for ; Mon, 24 Aug 2015 04:26:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3134D304032 for ; Mon, 24 Aug 2015 02:26:43 -0700 (PDT) X-ASG-Debug-ID: 1440408400-04bdf0239837820001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id kdlcn5uupMxCVzI6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 02:26:41 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 61F01ACBC; Mon, 24 Aug 2015 09:26:40 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 2622F82823; Mon, 24 Aug 2015 11:26:37 +0200 (CEST) Date: Mon, 24 Aug 2015 11:26:37 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix file type directory corruption for btree directories Message-ID: <20150824092637.GB2936@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix file type directory corruption for btree directories References: <1440179722-6029-1-git-send-email-jack@suse.com> <20150821231154.GR3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150821231154.GR3902@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440408401 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat 22-08-15 09:11:54, Dave Chinner wrote: > On Fri, Aug 21, 2015 at 07:55:22PM +0200, Jan Kara wrote: > > Users have occasionally reported that file type for some directory > > entries is wrong. This mostly happened after updating libraries some > > libraries. After some debugging the problem was traced down to > > xfs_dir2_node_replace(). The function uses args->filetype as a file type > > to store in the replaced directory entry however it also calls > > xfs_da3_node_lookup_int() which will store file type of the current > > directory entry in args->filetype. Thus we fail to change file type of a > > directory entry to a proper type. > > > > Fix the problem by storing new file type in a local variable before > > calling xfs_da3_node_lookup_int(). > > > > Reported-by: Giacomo Comes > > Signed-off-by: Jan Kara > > So this is being triggered by a rename() operation on a large > directory? node format is the optimised form form for large dirs, so > I suspect that's why only few people see this. Can you see if you > can write a reproducer for it baseed on a large single directory and > renaming two files of different types (e.g. BLKDEV over REG) to see > if the cause is that simple? Yes, I've tried and for a large enough directory renaming symlink over a regular file is all that is needed to corrupt the file type in the directory. Should I write a dedicated test for this or is there something that already excercises directory code? I know about fsstress runs but those would be hard to tweak to trigger this I guess. Honza > > --- > > fs/xfs/libxfs/xfs_dir2_node.c | 8 +++++++- > > 1 file changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c > > index 41b80d3d3877..1006710a7c92 100644 > > --- a/fs/xfs/libxfs/xfs_dir2_node.c > > +++ b/fs/xfs/libxfs/xfs_dir2_node.c > > @@ -2132,6 +2132,7 @@ xfs_dir2_node_replace( > > int error; /* error return value */ > > int i; /* btree level */ > > xfs_ino_t inum; /* new inode number */ > > + int ftype; /* new file type */ > > xfs_dir2_leaf_t *leaf; /* leaf structure */ > > xfs_dir2_leaf_entry_t *lep; /* leaf entry being changed */ > > int rval; /* internal return value */ > > @@ -2145,7 +2146,12 @@ xfs_dir2_node_replace( > > state = xfs_da_state_alloc(); > > state->args = args; > > state->mp = args->dp->i_mount; > > + /* > > + * We have to save new inode number and ftype since > > + * xfs_da3_node_lookup_int() is going to overwrite them > > + */ > > inum = args->inumber; > > + ftype = args->filetype; > > /* > > * Lookup the entry to change in the btree. > > */ > > @@ -2183,7 +2189,7 @@ xfs_dir2_node_replace( > > * Fill in the new inode number and log the entry. > > */ > > dep->inumber = cpu_to_be64(inum); > > - args->dp->d_ops->data_put_ftype(dep, args->filetype); > > + args->dp->d_ops->data_put_ftype(dep, ftype); > > xfs_dir2_data_log_entry(args, state->extrablk.bp, dep); > > rval = 0; > > } > > The change looks sane (i'll add whitespace around the comments when > i commit) and I'll also add the stable cc. I would like to have a > reproducer to test it, though ;) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- Jan Kara SUSE Labs, CR From bfoster@redhat.com Mon Aug 24 07:02:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 65D0A7F37 for ; Mon, 24 Aug 2015 07:02:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 39D998F804C for ; Mon, 24 Aug 2015 05:02:28 -0700 (PDT) X-ASG-Debug-ID: 1440417746-04bdf023983aa30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6CPCDSra2nR1kSYb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 05:02:27 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id B92EA8CF78; Mon, 24 Aug 2015 12:02:26 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7OC2Q3h004941; Mon, 24 Aug 2015 08:02:26 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7C546123E8A; Mon, 24 Aug 2015 08:02:25 -0400 (EDT) Date: Mon, 24 Aug 2015 08:02:25 -0400 From: Brian Foster To: Simon Xia Cc: xfs@oss.sgi.com Subject: Re: xfs directory quota doesn't work Message-ID: <20150824120225.GA50895@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs directory quota doesn't work References: <20150821112118.GB46372@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440417747 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 24, 2015 at 02:43:07PM +0800, Simon Xia wrote: > I do create two subdirectory for project > Please try not to top-post... > and the error maybe caused by this step: > xfs_quota -x -c 'project –c task1' /home/xiameng.xm/xfs_dir ^ That looks like an invalid character in the command here (and those below). I probably didn't notice it before and just fixed up my local commands... > > –c - no such project in /etc/projects ... but this suggests it's not being interpreted as a command flag. E.g., a command with the wrong character: # xfs_quota -x -c 'project –c task1' /mnt –c - no such project in /etc/projects or invalid project number Checking project task1 (path /mnt/task1)... /mnt/task1 - project identifier is not set (inode=0, tree=11) /mnt/task1 - project inheritance flag is not set Processed 1 (/etc/projects and cmdline) paths for project task1 with recursion depth infinite (-1). vs. with the correct: # xfs_quota -x -c 'project -c task1' /mnt Checking project task1 (path /mnt/task1)... /mnt/task1 - project identifier is not set (inode=0, tree=11) /mnt/task1 - project inheritance flag is not set Processed 1 (/etc/projects and cmdline) paths for project task1 with recursion depth infinite (-1). All in all, you should see something like the following from the '-s' command before this is expected to work: # xfs_quota -xc 'project -s task1' /mnt Setting up project task1 (path /mnt/task1)... Processed 1 (/etc/projects and cmdline) paths for project task1 with recursion depth infinite (-1). And for further verification, the project ID should be set on the associated directory: # xfs_io -c "lsproj" /mnt/task1 projid = 11 Brian > Checking project task1 (path /home/xiameng.xm/xfs_dir/task1)... > /home/xiameng.xm/xfs_dir/task1 - project identifier is not set (inode=0, > tree=11) > /home/xiameng.xm/xfs_dir/task1 - project inheritance flag is not set > Processed 1 /etc/projects paths for project task1 > > I'm a little confused about the output message, cause everything is ok in > config file > > 2015-08-21 19:21 GMT+08:00 Brian Foster : > > > On Fri, Aug 21, 2015 at 05:05:00PM +0800, Simon Xia wrote: > > > hi, everyone, I encounter a problem when using xfs > > > > > > now I have two tasks and I wanna run them in different directory and > > limit > > > the directory’s size. I use xfs’s project quota to achieve this. > > > > > > I follow the steps from here: > > > https://solidlinux.wordpress.com/2012/12/09/xfs-quota-managament/ > > > > > > here is detail of my two config files > > > > > > /etc/projects: > > > > > > 11:/home/xiameng.xm/xfs_dir/task1 > > > 12:/home/xiameng.xm/xfs_dir/task2 > > > > > > /etc/projid: > > > > > > task1:11 > > > task2:12 > > > > > > and here is my step: > > > > > > touch test_xfs > > > dd if=/dev/zero of=test_xfs bs=1000000 count=1 > > > mkfs.xfs test_xfs > > > > > > > That looks small, I can't even mkfs a file that small. I ran through > > this using 'bs=1M count=100.' > > > > > mkdir xfs_dir > > > mount test_xfs ./xfs_dir -o pquota,loop > > > > > > xfs_quota -xc 'project –s task1' /home/xiameng.xm/xfs_dir > > > xfs_quota -xc 'project –s task2' /home/xiameng.xm/xfs_dir > > > > > > > I don't see where you've created the directories yet..? I get the > > following: > > > > # xfs_quota -xc 'project -s task1' /mnt/ > > xfs_quota: cannot find mount point for path `/mnt/task1': No such file or > > directory > > > > ... until I create the task1/task2 directories. This is required because > > the project quota command has to set the project id on the directory > > inode. It won't work if the directory is created after this point, > > regardless of whether the quota limit is specified. > > > > Once I create those directories and run the project command, everything > > seems to work. I can write up to 2MB to task1 and 10MB to task2. > > > > Brian > > > > > xfs_quota -x -c 'limit -p bhard=2m task1' /home/xiameng.xm/xfs_dir > > > xfs_quota -x -c 'limit -p bhard=10m task2' /home/xiameng.xm/xfs_dir > > > > > > here is the output of xfs_quota -x -c 'report /home/xiameng.xm/xfs_dir' > > > > > > Project quota on /home/xiameng.xm/xfs_dir (/dev/loop1) > > > Blocks > > > Project ID Used Soft Hard Warn/Grace > > > ---------- -------------------------------------------------- > > > task1 0 0 2048 00 [--------] > > > task2 0 0 10240 00 [--------] > > > > > > the question is no mater how large I create a file in ./xfs_dir/task1 or > > > ./xfs_dir/task2, it success! > > > > > > the quota limit doesn’t work! > > > > > > Any help will be appreciated :) > > > > > > > > > ps: I also post my question here: > > > > > http://unix.stackexchange.com/questions/224606/xfs-directory-quota-doesnt-work > > > > > > ---- > > > > > > Best Regards > > > Simon Xia > > > ​ > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > -- > Best Regards > > Simon Xia > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Aug 24 07:19:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A84D57F37 for ; Mon, 24 Aug 2015 07:19:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B64F8F8035 for ; Mon, 24 Aug 2015 05:19:52 -0700 (PDT) X-ASG-Debug-ID: 1440418787-04bdf0239a3b0b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id dDrShubayfS1F1Gv for ; Mon, 24 Aug 2015 05:19:47 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CBCwDaCttVPEDvLHlcgxuBPYJXg3yjLQEBAQEBAQabWgICAQECgSxNAQEBAQEBBwEBAQFBP4QkAQEEJxMcIxAIAw4KCSUPBSUDBxoTiC3GVQEBAQEBBQEBAQEeGYYKhTSFCgeDGIEUBZU0jG+aU4Q2LDOCTAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2015 21:49:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZTqj3-0008LP-Ja; Mon, 24 Aug 2015 22:19:45 +1000 Date: Mon, 24 Aug 2015 22:19:45 +1000 From: Dave Chinner To: Jan Kara Cc: Jan Kara , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Fix file type directory corruption for btree directories Message-ID: <20150824121945.GC714@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix file type directory corruption for btree directories References: <1440179722-6029-1-git-send-email-jack@suse.com> <20150821231154.GR3902@dastard> <20150824092637.GB2936@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824092637.GB2936@quack.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440418787 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21877 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 24, 2015 at 11:26:37AM +0200, Jan Kara wrote: > On Sat 22-08-15 09:11:54, Dave Chinner wrote: > > On Fri, Aug 21, 2015 at 07:55:22PM +0200, Jan Kara wrote: > > > Users have occasionally reported that file type for some directory > > > entries is wrong. This mostly happened after updating libraries some > > > libraries. After some debugging the problem was traced down to > > > xfs_dir2_node_replace(). The function uses args->filetype as a file type > > > to store in the replaced directory entry however it also calls > > > xfs_da3_node_lookup_int() which will store file type of the current > > > directory entry in args->filetype. Thus we fail to change file type of a > > > directory entry to a proper type. > > > > > > Fix the problem by storing new file type in a local variable before > > > calling xfs_da3_node_lookup_int(). > > > > > > Reported-by: Giacomo Comes > > > Signed-off-by: Jan Kara > > > > So this is being triggered by a rename() operation on a large > > directory? node format is the optimised form form for large dirs, so > > I suspect that's why only few people see this. Can you see if you > > can write a reproducer for it baseed on a large single directory and > > renaming two files of different types (e.g. BLKDEV over REG) to see > > if the cause is that simple? > > Yes, I've tried and for a large enough directory renaming symlink over a > regular file is all that is needed to corrupt the file type in the > directory. Should I write a dedicated test for this or is there something > that already excercises directory code? I know about fsstress runs but > those would be hard to tweak to trigger this I guess. I don't think there's anything specific that tests ftype after rename. It might be worth writing a specific test for it that steps through different directory formats and checks that ftype swaps with rename corectly as we move through shortform, block, leaf and node formats (i.e. as the directory gets larger). Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Aug 24 07:34:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 153FA7F37 for ; Mon, 24 Aug 2015 07:34:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04EFB304039 for ; Mon, 24 Aug 2015 05:34:48 -0700 (PDT) X-ASG-Debug-ID: 1440419687-04cb6c4a293b280001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id h5LizIQZgWEtVghI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 05:34:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 41879550D5; Mon, 24 Aug 2015 12:34:47 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7OCYkEQ018749; Mon, 24 Aug 2015 08:34:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BB266123E8A; Mon, 24 Aug 2015 08:34:45 -0400 (EDT) Date: Mon, 24 Aug 2015 08:34:45 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: v5 filesystem corruption due to log recovery lsn ordering Message-ID: <20150824123445.GB50895@bfoster.bfoster> X-ASG-Orig-Subj: Re: v5 filesystem corruption due to log recovery lsn ordering References: <20150819183904.GB49174@bfoster.bfoster> <20150819224453.GL3902@dastard> <20150820162529.GB13033@bfoster.bfoster> <20150821003449.GU714@dastard> <20150821143923.GC46372@bfoster.bfoster> <20150824001035.GZ714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824001035.GZ714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440419687 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 24, 2015 at 10:10:35AM +1000, Dave Chinner wrote: > On Fri, Aug 21, 2015 at 10:39:23AM -0400, Brian Foster wrote: > > On Fri, Aug 21, 2015 at 10:34:49AM +1000, Dave Chinner wrote: > > > On Thu, Aug 20, 2015 at 12:25:29PM -0400, Brian Foster wrote: > > > > On Thu, Aug 20, 2015 at 08:44:53AM +1000, Dave Chinner wrote: > > > > That's an interesting idea, but I wonder if it truly fixes the problem > > > > or just makes it potentially more difficult to reproduce. One concern is > > > > that even with this in place, all it takes to reintroduce the problem is > > > > for a filesystem to run a bit on an older kernel in a situation where > > > > the LSN is reset and enough modification has occurred to update whatever > > > > key metadata we determine as important with the reset LSNs. > > > > > > We can't prevent that - that horse has already bolted. > > > > Well, the feature bit can potentially do that. I'm not terribly fond of > > it (overkill) and the goal was't to fix older kernels so much as to > > prevent the problem from being reintroduced on newer kernels going > > forward (provided newer kernels implemented this mount-time LSN > > inheritance scheme). > > We can prevent the problem of old userspace on newer kernels by > detecting a zeroed log - we don't need a feature bit for that. > > > In other words, the proposed solution depends on trust of the metadata > > LSNs. One way we can trust those metadata LSNs is to prevent older > > kernels/xfsprogs from messing with them. > > Well, it's old userspace we need to worry about here - kernels don't > zero the log... > The concern was just that older kernels could reset the LSNs of the key metadata inspected at mount time and thus defeat the mechanism on new kernels. This doesn't matter so much now that we'll have a more broad warning mechanism in place. > > That said, I don't really agree with the assertion that upgraded > > userspace alone sufficiently alleviates the problem. A filesystem that's > > been around a while and has more recently been repaired is susceptible > > to this problem for the foreseeable future, upgraded userspace or not, > > until either all metadata with stale LSNs is updated or the problem is > > identified and repaired explicitly. > > But there's nothing we can do in userspace to fix that. More on that > below. > Right... > > > > Another concern is that we're assuming that the key metadata will always > > > > have the most recent LSN. I think the closest thing to a guarantee we > > > > have of that is the superblock being updated on umount and every so > > > > often by xfs_log_worker() to cover the log. After a bit of playing > > > > around, I'm not so sure that is enough. > > > > > > Sure, I just threw it out as a way to get a more recent LSN. The > > > only way to reliably get the highest LSN is to walk all the metadata > > > in the filesystem. We can't do that at mount time, so perhaps it > > > is best to just refuse to mount read-write and issue a warning to > > > upgrade xfsprogs and re-run xfs_repair. > > > > > > > Indeed, that sounds like a nicer approach to me. We're really only > > considering the superblock at mount time though (note that repair resets > > AG header LSNs), so we're not going to be guaranteed the mount fails for > > all affected fs'. What do you think about also firing a (one-time, > > probably) warning if we ever update a bit of metadata with a smaller > > LSN? > > Larger LSN, you mean? ;) > Well, aren't incremental LSN updates the normal course of things? E.g., metadata is updated, the log pushes forward, the metadata is updated again with a larger LSN. Oh, I see. We're just looking at the logic differently. My thought above was to fire a warning on the action of updating a piece of metadata with a smaller current LSN. E.g., detect in the write verifier that the metadata LSN has gone backwards... > But, yes, that is what I was thinking for solving the "horse has > already bolted" condition you described above. We can detect LSNs > beyond the current log in the metadata we read from disk and issue a > warning. e.g in each metadata verifiers we add a: > > if (xfs_verify_lsn(mp, hdr->lsn)) > return false; > ... whereas you're suggesting to update read verifiers to detect that metadata LSN is valid according to the log, which means the warning fires if the metadata LSN is larger than the current LSN. So the validation logic sounds the same, but it sounds like a better idea to check in the read verifier. That provides far more reliable detection in that modifications aren't necessary to detect the problem. > then we can warn immediately that this is a problem. If we discover > it during log recovery (i.e. lsn beyond the current head in the log > in a block that passes all the other metadata self checks) then we > can shut down or force the filesystem into read-only mode so that > the user has to update xfsprogs and run repair to fix it because we > can't safely run log recovery at this point. > Good idea. > > That bit of metadata is now "fixed" once written out, but the point is > > that the log item for this metadata was probably not effective and to > > notify the user that the fs' LSNs are potentially out of whack and a > > repair is in order. > > That's true - if we don't hit a bad lsn in recovery, we just issue a > one-time warning from the verifiers and continue onwards. If the > user is lucky, the problem will fix itself before it is ever a > problem for recovery. > > > > So, to repair: have it record LSNs as it walks the metadata and > > > at the start of phase 5 have it select a new cycle number higher > > > than the highest LSN found in the filesystem. Stamp the log with > > > that cycle number as well as all metadata that is being rebuilt > > > in phase 5, and all the superblocks. > > > > > > Problem solved. > > > > > > > Yeah, I was thinking of just using the current head of the log, as > > described in my random note. Using the LSN from the metadata is probably > > necessary in the cases where the log might be corrupted, however. > > And as a minor detail, I'd take the cycle number from the highest > LSN and bump it a few cycles just to make sure that the new LSN is > well beyond anything in the filesystem... > Indeed, my current thought was to just bump the log up to the start of the next cycle. We can get more into that when I have some code... > > The solution of detection in the kernel and a fix in repair sounds > > pretty good to me provided the detection is robust (e.g., the point > > above wrt a warning). Then we have something in current kernels that can > > effectively handle the problem regardless of how it might have been > > (re)introduced and it's fairly simple as well. > > *nod* > > I think we have a plan :) > Thanks! Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 24 07:41:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F3DF97F37 for ; Mon, 24 Aug 2015 07:41:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD22B8F8040 for ; Mon, 24 Aug 2015 05:41:15 -0700 (PDT) X-ASG-Debug-ID: 1440420073-04cb6c4a293b490001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6670fRWISor7XKu7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 05:41:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 710FEABE for ; Mon, 24 Aug 2015 12:41:13 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7OCfDkF028664; Mon, 24 Aug 2015 08:41:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 368D9123E8A; Mon, 24 Aug 2015 08:41:12 -0400 (EDT) Date: Mon, 24 Aug 2015 08:41:12 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: collapse allocsize and biosize mount option handling Message-ID: <20150824124110.GC50895@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: collapse allocsize and biosize mount option handling References: <55D79504.6040305@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D79504.6040305@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440420073 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 21, 2015 at 04:15:48PM -0500, Eric Sandeen wrote: > The allocsize and biosize mount options are handled identically, > other than allocsize accepting suffixes. suffix_kstrtoint handles > bare numbers just fine too, so these can be collapsed. > > (In other news, though, maybe biosize needs to be deprecated? > XFS_IOC_SETBIOSIZE and XFS_IOC_GETBIOSIZE are deprecated, and > "biosize" was removed from Documentation/ back in 2005 ...) > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 1fb1656..4bd6c0d 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -261,16 +261,8 @@ xfs_parseargs( > mp->m_rtname = kstrndup(value, MAXNAMELEN, GFP_KERNEL); > if (!mp->m_rtname) > return -ENOMEM; > - } else if (!strcmp(this_char, MNTOPT_BIOSIZE)) { > - if (!value || !*value) { > - xfs_warn(mp, "%s option requires an argument", > - this_char); > - return -EINVAL; > - } > - if (kstrtoint(value, 10, &iosize)) > - return -EINVAL; > - iosizelog = ffs(iosize) - 1; > - } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) { > + } else if (!strcmp(this_char, MNTOPT_ALLOCSIZE) || > + !strcmp(this_char, MNTOPT_BIOSIZE)) { > if (!value || !*value) { > xfs_warn(mp, "%s option requires an argument", > this_char); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 24 07:41:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CA5967F58 for ; Mon, 24 Aug 2015 07:41:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B89D68F8035 for ; Mon, 24 Aug 2015 05:41:18 -0700 (PDT) X-ASG-Debug-ID: 1440420077-04cbb07cbd401d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EWdK0e61AS7XUJtI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 05:41:18 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 37AD48C1A2; Mon, 24 Aug 2015 12:41:17 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7OCfGFl012440; Mon, 24 Aug 2015 08:41:17 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E6735123E8A; Mon, 24 Aug 2015 08:41:15 -0400 (EDT) Date: Mon, 24 Aug 2015 08:41:15 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix non-debug build warnings Message-ID: <20150824124115.GD50895@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix non-debug build warnings References: <1440370721-23931-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440370721-23931-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440420077 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 24, 2015 at 08:58:41AM +1000, Dave Chinner wrote: > From: Dave Chinner > > There seem to be a couple of new set-but-unused build warnings > that gcc 4.9.3 is now warning about. These are not regressions, just > hte compiler being more picky. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_buf.c | 4 +--- > fs/xfs/xfs_buf_item.c | 20 +++++++++++++------- > fs/xfs/xfs_buf_item.h | 2 +- > 3 files changed, 15 insertions(+), 11 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index d7dbd81..c46166b 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -438,7 +438,6 @@ _xfs_buf_find( > xfs_buf_flags_t flags, > xfs_buf_t *new_bp) > { > - size_t numbytes; > struct xfs_perag *pag; > struct rb_node **rbp; > struct rb_node *parent; > @@ -450,10 +449,9 @@ _xfs_buf_find( > > for (i = 0; i < nmaps; i++) > numblks += map[i].bm_len; > - numbytes = BBTOB(numblks); > > /* Check for IOs smaller than the sector size / not sector aligned */ > - ASSERT(!(numbytes < btp->bt_meta_sectorsize)); > + ASSERT(!(BBTOB(numblks) < btp->bt_meta_sectorsize)); > ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_meta_sectormask)); > > /* > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 919057e..7e986da 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -746,13 +746,13 @@ xfs_buf_item_free_format( > * buffer (see xfs_buf_attach_iodone() below), then put the > * buf log item at the front. > */ > -void > +int > xfs_buf_item_init( > - xfs_buf_t *bp, > - xfs_mount_t *mp) > + struct xfs_buf *bp, > + struct xfs_mount *mp) > { > - xfs_log_item_t *lip = bp->b_fspriv; > - xfs_buf_log_item_t *bip; > + struct xfs_log_item *lip = bp->b_fspriv; > + struct xfs_buf_log_item *bip; > int chunks; > int map_size; > int error; > @@ -766,12 +766,11 @@ xfs_buf_item_init( > */ > ASSERT(bp->b_target->bt_mount == mp); > if (lip != NULL && lip->li_type == XFS_LI_BUF) > - return; > + return 0; > > bip = kmem_zone_zalloc(xfs_buf_item_zone, KM_SLEEP); > xfs_log_item_init(mp, &bip->bli_item, XFS_LI_BUF, &xfs_buf_item_ops); > bip->bli_buf = bp; > - xfs_buf_hold(bp); > > /* > * chunks is the number of XFS_BLF_CHUNK size pieces the buffer > @@ -784,6 +783,11 @@ xfs_buf_item_init( > */ > error = xfs_buf_item_get_format(bip, bp->b_map_count); > ASSERT(error == 0); > + if (error) { /* to stop gcc throwing set-but-unused warnings */ > + kmem_zone_free(xfs_buf_item_zone, bip); > + return error; > + } > + > > for (i = 0; i < bip->bli_format_count; i++) { > chunks = DIV_ROUND_UP(BBTOB(bp->b_maps[i].bm_len), > @@ -803,6 +807,8 @@ xfs_buf_item_init( > if (bp->b_fspriv) > bip->bli_item.li_bio_list = bp->b_fspriv; > bp->b_fspriv = bip; > + xfs_buf_hold(bp); > + return 0; > } > > > diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h > index 3f3455a..f7eba99 100644 > --- a/fs/xfs/xfs_buf_item.h > +++ b/fs/xfs/xfs_buf_item.h > @@ -61,7 +61,7 @@ typedef struct xfs_buf_log_item { > struct xfs_buf_log_format __bli_format; /* embedded in-log header */ > } xfs_buf_log_item_t; > > -void xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); > +int xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); > void xfs_buf_item_relse(struct xfs_buf *); > void xfs_buf_item_log(xfs_buf_log_item_t *, uint, uint); > uint xfs_buf_item_dirty(xfs_buf_log_item_t *); > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Mon Aug 24 07:54:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BE2557F37 for ; Mon, 24 Aug 2015 07:54:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA20A304039 for ; Mon, 24 Aug 2015 05:54:06 -0700 (PDT) X-ASG-Debug-ID: 1440420844-04cb6c4a283b8d0001-NocioJ Received: from mail-ig0-f173.google.com (mail-ig0-f173.google.com [209.85.213.173]) by cuda.sgi.com with ESMTP id A4qhlABcH3QSN5Ib (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 05:54:04 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igui7 with SMTP id i7so59999579igu.1 for ; Mon, 24 Aug 2015 05:54:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=/44GXW6lnkjOvkJKq80fEfjJDBl3PWFuTyLQ912Zkrw=; b=a7Q4GUFw+FNJEWFsVUT4Z4zhithpzC+VC2OCnFYhkWeXRdnP0HEkfBdafi78br3pfx rDROcPFcByfuTPI8ktzWAJ0i851lGsIEfxowpkLxhAWH8G6Z2dwHZzhBT0rzswUWJoy8 r3QDh+sWu1+PXpRV2rpDIoI7+kEAgl7Zu/GIdJj555wjoN7u8o5lcBnc/W1hW+pgfdNO JLNttTV7zAZHZI/Tuj0jP1KQgCG8BOVrVOJYgveBShUNsAMmmKQQctTbyhlVLJ2768Au 1/7RMal/2AeQAbeRspuRUZ+QFmA31Q3X78qnWUyZDy9KlhDglzmwUc48uuQJ6Mp029db CRtQ== X-Gm-Message-State: ALoCoQnwfiFUn8UYa2oB1T1hfCSmCLz6F6X9cVzYQGoM1QmRQmlz0EIa4OBXp2MGW66PYTidCNzQ X-Received: by 10.50.66.166 with SMTP id g6mr13522547igt.19.1440420844183; Mon, 24 Aug 2015 05:54:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.75 with HTTP; Mon, 24 Aug 2015 05:53:44 -0700 (PDT) In-Reply-To: <20150817193223.GE26222@infradead.org> References: <1439828606-7886-1-git-send-email-jtulak@redhat.com> <1439828606-7886-6-git-send-email-jtulak@redhat.com> <20150817193223.GE26222@infradead.org> From: Jan Tulak Date: Mon, 24 Aug 2015 14:53:44 +0200 Message-ID: Subject: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support Cc: xfs-oss , "Chinner, Dave" Content-Type: multipart/alternative; boundary=047d7bd6b082bebc95051e0e1c7b X-Barracuda-Connect: mail-ig0-f173.google.com[209.85.213.173] X-Barracuda-Start-Time: 1440420844 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21877 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bd6b082bebc95051e0e1c7b Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable As I got stuck with some C-related things in the changes for much longer than I anticipated, I'm making just this reply now - patches will came once I get it working. On Mon, Aug 17, 2015 at 9:32 PM, Christoph Hellwig wrote: > > Do you have any idea why MacOS defines a uuid_t, but wants unsigned > char arguments to uuid_compare? > =E2=80=8Buuid_t works too. :-)=E2=80=8B=E2=80=8B > > +static inline int nftw64(const char *path, int (*fn)(const char *, > const struct stat *ptr, int flag, struct FTW *), int depth, > > + int flags) > > +{ > > + return nftw(path, fn, depth, flags); > > +} > +#define MREMAP_FIXED 1 > > +#define MREMAP_MAYMOVE 2 > > +static inline void *mremap(void *old_address, size_t old_size, > > + size_t new_size, int flags, ... /* void > *new_address */) > > +{ > > + return NULL; > > +} > > + > > +/* FSR */ > > Please just build the mremap file in xfs_io conditional. > Well, if I make io/mmap.c =E2=80=8B(=E2=80=8B where mremap is used =E2=80=8B) c=E2=80=8B onditional, then I need to make multiple dummy calls =E2=80=8B =E2=80=8B or put ifdefs around every call from this file. So instead of a sing =E2=80=8BWell, if I make io/mmap.c, where mremap is used, conditional, then= I need to make multiple dummy calls or put ifdefs around every call from that file. So instead of a single dummy call and two defines, I ends with more changes...=E2=80=8B IOW, I don't see any file I could remove from xfs_io without bigger changes= . > > > +typedef int __fsblkcnt_t; > > +typedef int __fsfilcnt_t; > > +typedef long long int __fsblkcnt64_t; > > +typedef long long int __fsfilcnt64_t; > > + > > +struct statvfs64 > > +{ > > + unsigned long int f_bsize; > > + unsigned long int f_frsize; > > + __fsblkcnt64_t f_blocks; > > + __fsblkcnt64_t f_bfree; > > + __fsblkcnt64_t f_bavail; > > + __fsfilcnt64_t f_files; > > + __fsfilcnt64_t f_ffree; > > + __fsfilcnt64_t f_favail; > > + unsigned long int f_fsid; > > + int __f_unused; > > + unsigned long int f_flag; > > + unsigned long int f_namemax; > > + int __f_spare[6]; > > +}; > > Does MacOS support statvfs? or statfs? We should use the proper API > here instead of a dummy. Or maybe just not build fsr on OSX for now, > as that would solve the fsetxattr issue as well. > > =E2=80=8BNow, this is what stopped me. As far as I can tell, simple #define statvfs64 statfs do the job, as Mac has the struct and the call. But statfs on Mac is missin= g f_frsize and related members. I tried to make something with it, but I run out of ideas others than redefine the struct... =E2=80=8BI still don't like the idea of removing fsr from OSX build, but if= the amount of dummies is too big, it may end that way... :-(=E2=80=8B =E2=80=8BCheers, Jan=E2=80=8B --=20 Jan Tulak jtulak@redhat.com / jan@tulak.me --047d7bd6b082bebc95051e0e1c7b Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
As I got stuck with some C-related things in the changes f= or much longer than I
anticipated, I'm making just this reply now -= patches will came once I get it=C2=A0
working.

On Mon, Aug 17, 2015 at 9:32 P= M, Christoph Hellwig <hch@infradead.org> wrote:
Do you have any idea why MacOS defines a uuid_t, but wants unsigned
char arguments to uuid_compare?

=E2= =80=8Buuid_t works too. :-)=E2=80=8B=E2=80=8B

=C2=A0
> +static inline int nftw64(const char *path, int (*fn)(const char *, co= nst struct stat *ptr, int flag, struct FTW *), int depth,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int flags)
> +{
> +=C2=A0 =C2=A0 =C2=A0return nftw(path, fn, depth, flags);
> +}
=C2=A0
> +#define MREMAP_FIXED 1
> +#define MREMAP_MAYMOVE 2
> +static inline void *mremap(void *old_address, size_t old_size,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= size_t new_size, int flags, ... /* void *new_address */)
> +{
> +=C2=A0 =C2=A0 =C2=A0return NULL;
> +}
> +
> +/* FSR */

Please just build the mremap file in xfs_io conditional.

Well, if I make io/mmap.c
=E2=80=8B(=E2=80=8Bwhere=C2=A0mremap is used
=E2=80=8B) c=E2=80=8B
on= ditional, then I need to
make multiple dumm= y calls
=E2=80=8B =E2=80=8B
or put ifdefs around ever= y call from this file. So instead of a sing
=E2=80=8BWell, if I make io/mmap.c, where mremap is used, conditional, = then I need to
make multiple dummy calls or put ifdefs around every= call from that file.
So instead of a single dummy call and two def= ines, I ends with more
changes...=E2=80=8B

IOW= , I don't see any file I could remove from xfs_io without bigger change= s.

=C2=A0

> +typedef int __fsblkcnt_t;
> +typedef int __fsfilcnt_t;
> +typedef long long int __fsblkcnt64_t;
> +typedef long long int __fsfilcnt64_t;
> +
> +struct statvfs64
> +{
> +=C2=A0 =C2=A0 =C2=A0unsigned long int f_bsize;
> +=C2=A0 =C2=A0 =C2=A0unsigned long int f_frsize;
> +=C2=A0 =C2=A0 =C2=A0__fsblkcnt64_t f_blocks;
> +=C2=A0 =C2=A0 =C2=A0__fsblkcnt64_t f_bfree;
> +=C2=A0 =C2=A0 =C2=A0__fsblkcnt64_t f_bavail;
> +=C2=A0 =C2=A0 =C2=A0__fsfilcnt64_t f_files;
> +=C2=A0 =C2=A0 =C2=A0__fsfilcnt64_t f_ffree;
> +=C2=A0 =C2=A0 =C2=A0__fsfilcnt64_t f_favail;
> +=C2=A0 =C2=A0 =C2=A0unsigned long int f_fsid;
> +=C2=A0 =C2=A0 =C2=A0int __f_unused;
> +=C2=A0 =C2=A0 =C2=A0unsigned long int f_flag;
> +=C2=A0 =C2=A0 =C2=A0unsigned long int f_namemax;
> +=C2=A0 =C2=A0 =C2=A0int __f_spare[6];
> +};

Does MacOS support statvfs? or statfs?=C2=A0 We should use the prope= r API
here instead of a dummy.=C2=A0 Or maybe just not build fsr on OSX for now,<= br> as that would solve the fsetxattr issue as well.


=E2=80=8BNow, this is what stopped = me. As far as I can tell, simple

#define statvfs64 sta= tfs

do the job, as Mac has the struct and the call. Bu= t statfs on Mac is missing
f_frsize and related members. I tried to make something with it, but I r= un=C2=A0
out of ideas others t= han redefine the struct...
=C2=A0
=E2=80=8BI still d= on't like the idea of removing fsr from OSX build, but if the amount
of dummies is too big, it may end that way... :-(=E2=80=8B

=E2=80=8BCheers,
Jan= =E2=80=8B

--
<= /div>
--047d7bd6b082bebc95051e0e1c7b-- From sandeen@sandeen.net Mon Aug 24 08:31:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD4C67F37 for ; Mon, 24 Aug 2015 08:31:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF250304043 for ; Mon, 24 Aug 2015 06:31:04 -0700 (PDT) X-ASG-Debug-ID: 1440423062-04bdf0239a3d3d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id UqAmWXEcyCGZBWHo for ; Mon, 24 Aug 2015 06:31:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D64DF680741C; Mon, 24 Aug 2015 08:31:01 -0500 (CDT) Message-ID: <55DB1C95.1060002@sandeen.net> Date: Mon, 24 Aug 2015 08:31:01 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH V2] xfsprogs: Minor fixes for xfs.5 References: <55D799B9.8040002@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfsprogs: Minor fixes for xfs.5 In-Reply-To: <55D799B9.8040002@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440423062 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix whitespace around logdev/rtdev mount option, and add missing qnoenforce. Signed-off-by: Eric Sandeen --- diff --git a/man/man5/xfs.5 b/man/man5/xfs.5 index 3214455..fc1b776 100644 --- a/man/man5/xfs.5 +++ b/man/man5/xfs.5 @@ -229,7 +235,7 @@ stripe unit configured at mkfs time. The default value for version 1 logs is 32768, while the default value for version 2 logs is MAX(32768, log_sunit). .TP -.BR logdev=device and rtdev=device +.BR logdev=device " and " rtdev=device Use an external log (metadata journal) and/or real-time device. An XFS filesystem has up to three parts: a data section, a log section, and a real-time section. The real-time section is @@ -260,7 +266,7 @@ read-only snapshots. Forcibly turns off all quota accounting and enforcement within the filesystem. .TP -.B uquota/usrquota/uqnoenforce/quota +.B uquota/usrquota/quota/uqnoenforce/qnoenforce User disk quota accounting enabled, and limits (optionally) enforced. Refer to xfs_quota(8) for further details. .TP From htejun@gmail.com Mon Aug 24 09:51:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D43F77F37 for ; Mon, 24 Aug 2015 09:51:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 76435AC005 for ; Mon, 24 Aug 2015 07:51:55 -0700 (PDT) X-ASG-Debug-ID: 1440427913-04bdf023993ec00001-NocioJ Received: from mail-qk0-f170.google.com (mail-qk0-f170.google.com [209.85.220.170]) by cuda.sgi.com with ESMTP id TN8prRKLwjZh81xB (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 07:51:54 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.170] Received: by qkbm65 with SMTP id m65so69484121qkb.2 for ; Mon, 24 Aug 2015 07:51:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=eMW9Nh6Fbyb6KchTtQioJA9M0cSay6Y8Hn9iMvcSqSs=; b=Lg0rSwaKh3yeFjU0jh8INJwyKzhaehMks74tO1KW9Gvo3Rx+Q7yGe7kQHdGMMs8B8a wdEPrMbKPUtNJ19OW1ASJV5U5ZABsvG9+THycmn4+Ef/Pu5dCkjf7Z7tP29LharLuPMk fh5iwJ5zIOR5Cv+P7ZFUgq5/lYvy+DA91m9AU6CsFpvv8z1a5LvFkhP8fiZ/K6Mm9ykx Ydqc+/Vdtt/QRpy4ssxcNH2DKk8hal5eysO6pWPGGkuK09/JpzMVMPbISYYKY94osL5x kdnVlhD+f49mm+j3UiRdwHfXCVtcCFHTbIW1T1E6uqm1FbnWT56wHAuwLyhfTJCPMlaQ SfQQ== X-Received: by 10.170.77.197 with SMTP id t188mr30459236ykt.78.1440427913365; Mon, 24 Aug 2015 07:51:53 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::d:cc79]) by smtp.gmail.com with ESMTPSA id x11sm17626566ywd.44.2015.08.24.07.51.52 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 07:51:52 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 10:51:50 -0400 From: Tejun Heo To: Jan Kara Cc: Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824145150.GA10029@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824091959.GA2936@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-qk0-f170.google.com[209.85.220.170] X-Barracuda-Start-Time: 1440427914 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21879 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Jan. On Mon, Aug 24, 2015 at 11:19:59AM +0200, Jan Kara wrote: > > which shows unmount being the next writeback event queued and > > executed after the IO completions have come in (that missed the > > log). What is missing is the specific queue/exec events for > > sync_sb_inodes() from the sync code for each filesystem. > > Bah, I see the problem and indeed it was introduced by commit e79729123f639 > "writeback: don't issue wb_writeback_work if clean". The problem is that > we bail out of sync_inodes_sb() if there is no dirty IO. Which is wrong > because we have to wait for any outstanding IO (i.e. call wait_sb_inodes()) > regardless of dirty state! And that also explains why Tejun's patch fixes > the problem because it backs out the change to the exit condition in > sync_inodes_sb(). Dang, I'm an idiot sandwich. > So Tejun's patch from this thread is indeed fixing the real problem but the > comment in sync_inodes_sb() should be fixed to mention wait_sb_inodes() > must be called in all cases... Tejun, will you fixup the comment please? Will post an updated patch. Kudos to Eryu and Dave for chasing it down. Thanks a lot. -- tejun From eflorac@intellique.com Mon Aug 24 10:08:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 508AF7F37 for ; Mon, 24 Aug 2015 10:08:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 244F88F8035 for ; Mon, 24 Aug 2015 08:08:05 -0700 (PDT) X-ASG-Debug-ID: 1440428883-04bdf023983f260001-NocioJ Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id g6JQIJaP5oMaemXb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 08:08:04 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.5 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp5-g21.free.fr (Postfix) with ESMTP id 5FA09D4808A; Mon, 24 Aug 2015 17:08:02 +0200 (CEST) Date: Mon, 24 Aug 2015 17:08:08 +0200 From: Emmanuel Florac To: Mukul Malhotra Cc: xfs@oss.sgi.com Subject: Re: How to determine the reserved blocks in xfs filesystem ? Message-ID: <20150824170808.4129dcec@harpe.intellique.com> X-ASG-Orig-Subj: Re: How to determine the reserved blocks in xfs filesystem ? In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.12.0 (GTK+ 2.24.20; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1440428883 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, BSF_SC7_SA298e, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21879 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.20 BSF_SC7_SA298e Custom Rule SA298e 0.50 BSF_SC0_SA620b Custom Rule SA620b Le Mon, 24 Aug 2015 10:14:52 +0530 Mukul Malhotra =C3=A9crivait: > Hi, >=20 > I have below queries on XFS log device as, >=20 > 1. After creating a XFS filesystem with an external log device > (journal), is there a way to mount the filesystem if I lose the > external log device or a way to recover files? You can use some other device to hold the log. You could use a ramdisk, a loop device pointing to some file, etc. No problem as long as you unmounted the filesystem properly. > 2. Is there a way to convert an existing XFS filesystem which has > internal log to external log and vice versa. > Apparently no. xfs_growfs should be able to do it, but the man page states that this function is not implemented. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From htejun@gmail.com Mon Aug 24 12:11:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B44167F37 for ; Mon, 24 Aug 2015 12:11:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 458EEAC004 for ; Mon, 24 Aug 2015 10:11:49 -0700 (PDT) X-ASG-Debug-ID: 1440436307-04cb6c4a2941330001-NocioJ Received: from mail-qk0-f181.google.com (mail-qk0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id o2XKwoJaN0dDgECY (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 10:11:47 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by qkda128 with SMTP id a128so27402055qkd.3 for ; Mon, 24 Aug 2015 10:11:47 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=vDYTqx49tpzJTIiPzjqo7pFXDc3qIPmfdxBM2UAvcrY=; b=k6qJXeE7u5c1YOE6ZT1j84ip9IdvzAs4f7tKpVF9Qk+sUM3iRlFYJgbnP/hlnHBdKw gFk/adH7ON+y3x9zXMD5hhks99EShMHrXo3h3PvT+a7ryqbDSWX6YH5qxETuT18kcCCE OPX7tbYS7hKRdYImfRHA73B2JONxlErFZQWS1J95FNgsMnkbxcwob2eK95TKZUhIXlNs RSilKgdX1mxrv5MFm5yl5Ti6XlRDZluCD4qAIkr5SnR8ifbXY4QbW8wrsV1ICAfA5U12 ZDGDFY6qEJPQrw/dxp0sZPQoRG9anTVjaMLDmGO65ZWWeDiD4tskY59T/0nE3aER0x9E 4IMg== X-Received: by 10.13.241.68 with SMTP id a65mr30239357ywf.113.1440436306910; Mon, 24 Aug 2015 10:11:46 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id y66sm18009147ywe.11.2015.08.24.10.11.45 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 10:11:46 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 13:11:44 -0400 From: Tejun Heo To: Jan Kara Cc: Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824171144.GB27262@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824145150.GA10029@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-qk0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1440436307 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, On Mon, Aug 24, 2015 at 10:51:50AM -0400, Tejun Heo wrote: > > Bah, I see the problem and indeed it was introduced by commit e79729123f639 > > "writeback: don't issue wb_writeback_work if clean". The problem is that > > we bail out of sync_inodes_sb() if there is no dirty IO. Which is wrong > > because we have to wait for any outstanding IO (i.e. call wait_sb_inodes()) > > regardless of dirty state! And that also explains why Tejun's patch fixes > > the problem because it backs out the change to the exit condition in > > sync_inodes_sb(). > > Dang, I'm an idiot sandwich. A question tho, so this means that an inode may contain dirty or writeback pages w/o the inode being on one of the dirty lists. Looking at the generic filesystem and writeback code, this doesn't seem true in general. Is this something xfs specific? Thanks. -- tejun From htejun@gmail.com Mon Aug 24 13:10:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6C0A87F37 for ; Mon, 24 Aug 2015 13:10:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44BAB304032 for ; Mon, 24 Aug 2015 11:10:46 -0700 (PDT) X-ASG-Debug-ID: 1440439841-04bdf0239843550001-NocioJ Received: from mail-qk0-f178.google.com (mail-qk0-f178.google.com [209.85.220.178]) by cuda.sgi.com with ESMTP id rbqxGgubx153uGiU (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 11:10:41 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.178] Received: by qkbm65 with SMTP id m65so79689249qkb.2 for ; Mon, 24 Aug 2015 11:10:41 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=p/fgajdvmUaoB7Hl5Vebo/ZH3nbu7AkMmI4+OCiQVeY=; b=GWirfu2jmi48q6jOdZ6MPgvMYW8TaWgIVg823O2GRwnLDMmOlYVj2s1KcvYEwGlzMP vKxjKQy/tDzVzU7WvfPlzPG2awO15lCGgWklVunk1tFgUFFXZRhIj4WRnpgV8CZy3STt Sk50epOtPh3+HmSS7hspX6AeUBPHCSg6gMBxSli5gEC24ppSElS2d0xCIhPbkMgeFfSs 2954rfunV5RSK526XEqgyGaumFixYAIe/AvWNmUFG9YGAh0CMJr4o4V07XLV0eYuB/g1 UHrSRIeBu+h4i976s5olnaj5o6YfDhqG9QOiB3ejsYvzqx+2ogTcLahMgNhpTthn04HO kRaQ== X-Received: by 10.170.161.212 with SMTP id c203mr31657796ykd.7.1440439840940; Mon, 24 Aug 2015 11:10:40 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id f184sm18144565ywc.53.2015.08.24.11.10.39 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 11:10:40 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 14:10:38 -0400 From: Tejun Heo To: Dave Chinner Cc: Eryu Guan , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824181038.GA28944@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150817200254.GG21075@mtj.duckdns.org> <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> <20150820165537.GA2044@mtj.duckdns.org> <20150820230451.GT714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150820230451.GT714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-qk0-f178.google.com[209.85.220.178] X-Barracuda-Start-Time: 1440439841 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21883 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Dave. On Fri, Aug 21, 2015 at 09:04:51AM +1000, Dave Chinner wrote: > > Maybe I'm misunderstanding the code but all xfs_writepage() calls are > > from unbound workqueues - the writeback workers - while > > xfs_setfilesize() are from bound workqueues, so I wondered why that > > was and looked at the code and the setsize functions are run off of a > > separate work item which is queued from the end_bio callback and I > > can't tell who would be waiting for them. Dave, what am I missing? > > xfs_setfilesize runs transactions, so it can't be run from IO > completion context as it needs to block (i.e. on log space or inode > locks). It also can't block log IO completion, nor metadata Io > completion, as only log IO completion can free log space, and the > inode lock might be waiting on metadata buffer IO completion (e.g. > during delayed allocation). Hence we have multiple IO completion > workqueues to keep these things separated and deadlock free. i.e. > they all get punted to a workqueue where they are then processed in > a context that can block safely. I'm still a bit confused. What prevents the following from happening? 1. io completion of last dirty page of an inode and work item for xfs_setfilesize() is queued. 2. inode removed from dirty list. 3. __sync_filesystem() invokes sync_inodes_sb(). There are no dirty pages, so it finishes. 4. xfs_fs_sync_fs() is called which calls _xfs_log_force() but the work item from #1 hasn't run yet, so the size update isn't written out. 5. Crash. Is it that _xfs_log_force() waits for the setfilesize transaction created during writepage? Thanks. -- tejun From jack@suse.cz Mon Aug 24 14:08:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E28FD7F37 for ; Mon, 24 Aug 2015 14:08:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C60418F804B for ; Mon, 24 Aug 2015 12:08:55 -0700 (PDT) X-ASG-Debug-ID: 1440443332-04bdf02397448b0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id m9pzZmXWj0V3Nn0K (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 12:08:53 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2845CAB9F; Mon, 24 Aug 2015 19:08:51 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 9541882823; Mon, 24 Aug 2015 21:08:47 +0200 (CEST) Date: Mon, 24 Aug 2015 21:08:47 +0200 From: Jan Kara To: Tejun Heo Cc: Jan Kara , Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824190847.GA4234@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818215611.GD3902@dastard> <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> <20150824171144.GB27262@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824171144.GB27262@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440443332 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21885 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon 24-08-15 13:11:44, Tejun Heo wrote: > Hello, > > On Mon, Aug 24, 2015 at 10:51:50AM -0400, Tejun Heo wrote: > > > Bah, I see the problem and indeed it was introduced by commit e79729123f639 > > > "writeback: don't issue wb_writeback_work if clean". The problem is that > > > we bail out of sync_inodes_sb() if there is no dirty IO. Which is wrong > > > because we have to wait for any outstanding IO (i.e. call wait_sb_inodes()) > > > regardless of dirty state! And that also explains why Tejun's patch fixes > > > the problem because it backs out the change to the exit condition in > > > sync_inodes_sb(). > > > > Dang, I'm an idiot sandwich. > > A question tho, so this means that an inode may contain dirty or > writeback pages w/o the inode being on one of the dirty lists. > Looking at the generic filesystem and writeback code, this doesn't > seem true in general. Is this something xfs specific? Inode may contain writeback pages (but not dirty pages) without being on any of the dirty lists. That is correct. Josef Bacik had patches to create a list to track inodes with pages under writeback but they clashed with your patch series and they didn't get rebased yet AFAIR. Honza -- Jan Kara SUSE Labs, CR From htejun@gmail.com Mon Aug 24 14:32:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A55B7F37 for ; Mon, 24 Aug 2015 14:32:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6026D8F8040 for ; Mon, 24 Aug 2015 12:32:46 -0700 (PDT) X-ASG-Debug-ID: 1440444765-04cb6c4a2a44070001-NocioJ Received: from mail-qk0-f181.google.com (mail-qk0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id f8o7xGSKuqCVGw06 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 12:32:45 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by qkch123 with SMTP id h123so78116855qkc.0 for ; Mon, 24 Aug 2015 12:32:44 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=IJ8Gv/nk2YP7OjRWVaIuKE7EDxrBmHzAidAwMkshjXk=; b=SoEgHLGE9QtCLs0VFpfGHClBtHVqGQu4C2imWzMCZajDEKcX7SWYTG3f2jznMTtkJq YiXkPG6Hkpj7b8XbxvRg881bQ24+C41YDOK2XdVZe+V/XCMlhITUbOGsd79tigcE3IvV WBc0QbPSQg8DtFLpASvac6kXRrnGTtsfZ/IBTE6Wdiixgsfy0UmjEQ5LAHmbN2Ml9EOx M/RB/cb5thDcZe/acN3P++03rpnBw7lgRNh8/uzNo5sU9S6vFyTShjzfoHy8vz3WYUFX W6LJ9DT6I5xie0seo0BBirQIN1xZ0CvBo0lNlLbhWxpmzyw2H0sjtjBWnXSD8sl5wmRL eedw== X-Received: by 10.129.55.145 with SMTP id e139mr32990948ywa.2.1440444764711; Mon, 24 Aug 2015 12:32:44 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id c67sm18378978ywb.31.2015.08.24.12.32.43 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 12:32:44 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 15:32:42 -0400 From: Tejun Heo To: Jan Kara Cc: Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824193242.GE28944@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150821102053.GL17933@dhcp-13-216.nay.redhat.com> <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> <20150824171144.GB27262@mtj.duckdns.org> <20150824190847.GA4234@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824190847.GA4234@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-qk0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1440444765 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Jan. On Mon, Aug 24, 2015 at 09:08:47PM +0200, Jan Kara wrote: > Inode may contain writeback pages (but not dirty pages) without being on > any of the dirty lists. That is correct. Josef Bacik had patches to create Hmmm... Can you please expand on how / why that happens? It's kinda weird to require writeback to walk all inodes regardless of their dirty states. > a list to track inodes with pages under writeback but they clashed with > your patch series and they didn't get rebased yet AFAIR. Wouldn't it make more sense to simply put them on one of the existing b_* lists? Thanks. -- tejun From jack@suse.cz Mon Aug 24 16:09:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D39D77F37 for ; Mon, 24 Aug 2015 16:09:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B485E8F8033 for ; Mon, 24 Aug 2015 14:09:34 -0700 (PDT) X-ASG-Debug-ID: 1440450572-04bdf0239946c20001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id bD4GXBcBG7uVXWqe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 14:09:33 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 70B28AAC8; Mon, 24 Aug 2015 21:09:31 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 0F6C682823; Mon, 24 Aug 2015 23:09:27 +0200 (CEST) Date: Mon, 24 Aug 2015 23:09:27 +0200 From: Jan Kara To: Tejun Heo Cc: Jan Kara , Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824210927.GA8823@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150822003025.GS3902@dastard> <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> <20150824171144.GB27262@mtj.duckdns.org> <20150824190847.GA4234@quack.suse.cz> <20150824193242.GE28944@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824193242.GE28944@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440450572 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21889 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon 24-08-15 15:32:42, Tejun Heo wrote: > Hello, Jan. > > On Mon, Aug 24, 2015 at 09:08:47PM +0200, Jan Kara wrote: > > Inode may contain writeback pages (but not dirty pages) without being on > > any of the dirty lists. That is correct. Josef Bacik had patches to create > > Hmmm... Can you please expand on how / why that happens? It's kinda > weird to require writeback to walk all inodes regardless of their > dirty states. It is inefficient, yes. But note that 'writeback' and 'dirty' states are completely independent. Page can be in any of the !dirty & !writeback, dirty & !writeback, !dirty & writeback, dirty & writeback states. So mixing tracking of writeback and dirty state of an inode just makes the code even messier. > > a list to track inodes with pages under writeback but they clashed with > > your patch series and they didn't get rebased yet AFAIR. > > Wouldn't it make more sense to simply put them on one of the existing > b_* lists? Logically it just doesn't make sense because as I wrote above dirty and writeback states are completely independent. Also you'd have to detect & skip inodes that don't really have any dirty pages to write and all the detection of "is there any data to write" would get more complicated. A separate list for inodes under writeback as Josef did is IMO the cleanest solution. Honza -- Jan Kara SUSE Labs, CR From htejun@gmail.com Mon Aug 24 16:45:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 220407F37 for ; Mon, 24 Aug 2015 16:45:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7646304032 for ; Mon, 24 Aug 2015 14:45:39 -0700 (PDT) X-ASG-Debug-ID: 1440452738-04bdf0239747740001-NocioJ Received: from mail-yk0-f169.google.com (mail-yk0-f169.google.com [209.85.160.169]) by cuda.sgi.com with ESMTP id RclsvnP5PTQI1qNr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 14:45:38 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.169] Received: by ykfw73 with SMTP id w73so136618146ykf.3 for ; Mon, 24 Aug 2015 14:45:37 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=+mjxz03f7aB9vcLxn65ko5U3lh825t2018J2lrgCB+M=; b=Fkd1UNwQWJGk+idiGu9tWmBvYUIMB4eBF/Y/a2AWiJ5NnN8wy1MKi4T/fwtaXpJNos MLB3ygiaGtP19oPqMgLIw0rBshUx0R8+wUV7aM/SKwb1WDfiIgf02X85b5jXHkzGfAuW Ts01By8NKm4lnvS+dKJGSF/PrzX/yxinUcSigIXmbOdcD9idmV1gE8XlLUkXUvKpr2xx P53CYhpB4g7MpX6H9sC6qrrfmMNsFqpZSoHgDmZxVCKa0soRud3iMfVKHhzG+J+o8b9R ZBFbB13JhRHjFhFveolvGjRmK6wuORxMtkVNX+PjQPafVk7oDppJa6Kh8VSiWiStsJIB w8JQ== X-Received: by 10.170.128.131 with SMTP id u125mr33239089ykb.5.1440452737672; Mon, 24 Aug 2015 14:45:37 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id i201sm18768850ywc.43.2015.08.24.14.45.36 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 14:45:37 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 17:45:35 -0400 From: Tejun Heo To: Jan Kara Cc: Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824214535.GM28944@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150822044609.GM17933@dhcp-13-216.nay.redhat.com> <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> <20150824171144.GB27262@mtj.duckdns.org> <20150824190847.GA4234@quack.suse.cz> <20150824193242.GE28944@mtj.duckdns.org> <20150824210927.GA8823@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824210927.GA8823@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f169.google.com[209.85.160.169] X-Barracuda-Start-Time: 1440452738 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21890 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, On Mon, Aug 24, 2015 at 11:09:27PM +0200, Jan Kara wrote: > It is inefficient, yes. But note that 'writeback' and 'dirty' states are > completely independent. Page can be in any of the !dirty & !writeback, That isn't true for pages being dirtied through set_page_dirty(). It's guaranteed that a dirty inode remains on one of the b_* lists till there's no dirty page and writeback is complete. > dirty & !writeback, !dirty & writeback, dirty & writeback states. So mixing > tracking of writeback and dirty state of an inode just makes the code even > messier. I'm curious where and why they would deviate. Can you give me some examples? AFAICS, anything which uses the usual set_page_dirty() path shouldn't do that. > > > a list to track inodes with pages under writeback but they clashed with > > > your patch series and they didn't get rebased yet AFAIR. > > > > Wouldn't it make more sense to simply put them on one of the existing > > b_* lists? > > Logically it just doesn't make sense because as I wrote above dirty and > writeback states are completely independent. Also you'd have to detect & > skip inodes that don't really have any dirty pages to write and all the > detection of "is there any data to write" would get more complicated. A > separate list for inodes under writeback as Josef did is IMO the cleanest > solution. Given that the usual code path tracks dirty and writeback together, I don't think it's nonsensical; however, I'm more curious how common writeback w/o dirtying case is. Thanks. -- tejun From david@fromorbit.com Mon Aug 24 17:27:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 462DA7F37 for ; Mon, 24 Aug 2015 17:27:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15F94304032 for ; Mon, 24 Aug 2015 15:27:25 -0700 (PDT) X-ASG-Debug-ID: 1440455242-04bdf0239a48320001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 1bB7QL6WoyrOYNKc for ; Mon, 24 Aug 2015 15:27:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C8CABMmdtVPEDvLHldgxuBPYZTozEBAQEBAQEGm1oEAgKBLk0BAQEBAQEHAQEBAUE/hCMBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIJgfHOwEBAQEGAgEfGYYKhTSFCgeDGIEUBZIJgyuMb4FOiECEX4MziDOENiwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Aug 2015 07:57:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZU0D3-0001Bg-07; Tue, 25 Aug 2015 08:27:21 +1000 Date: Tue, 25 Aug 2015 08:27:20 +1000 From: Dave Chinner To: Tejun Heo Cc: Eryu Guan , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824222720.GD714@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818091603.GA12317@quack.suse.cz> <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> <20150820165537.GA2044@mtj.duckdns.org> <20150820230451.GT714@dastard> <20150824181038.GA28944@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824181038.GA28944@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440455242 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21892 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 24, 2015 at 02:10:38PM -0400, Tejun Heo wrote: > Hello, Dave. > > On Fri, Aug 21, 2015 at 09:04:51AM +1000, Dave Chinner wrote: > > > Maybe I'm misunderstanding the code but all xfs_writepage() calls are > > > from unbound workqueues - the writeback workers - while > > > xfs_setfilesize() are from bound workqueues, so I wondered why that > > > was and looked at the code and the setsize functions are run off of a > > > separate work item which is queued from the end_bio callback and I > > > can't tell who would be waiting for them. Dave, what am I missing? > > > > xfs_setfilesize runs transactions, so it can't be run from IO > > completion context as it needs to block (i.e. on log space or inode > > locks). It also can't block log IO completion, nor metadata Io > > completion, as only log IO completion can free log space, and the > > inode lock might be waiting on metadata buffer IO completion (e.g. > > during delayed allocation). Hence we have multiple IO completion > > workqueues to keep these things separated and deadlock free. i.e. > > they all get punted to a workqueue where they are then processed in > > a context that can block safely. > > I'm still a bit confused. What prevents the following from happening? > > 1. io completion of last dirty page of an inode and work item for > xfs_setfilesize() is queued. > > 2. inode removed from dirty list. The inode has already been removed from the dirty list - that happens at inode writeback submission time, not IO completion. > 3. __sync_filesystem() invokes sync_inodes_sb(). There are no dirty > pages, so it finishes. There are no dirty pages, but the pages aren't clean, either. i.e they are still under writeback. Hence we need to invoke wait_inodes_sb() to wait for writeback on all pages to complete before returning. > 4. xfs_fs_sync_fs() is called which calls _xfs_log_force() but the > work item from #1 hasn't run yet, so the size update isn't written > out. The bug here is that wait_inodes_sb() has not been run, therefore ->syncfs is being run before IO completions have been processed and pages marked clean. > 5. Crash. > > Is it that _xfs_log_force() waits for the setfilesize transaction > created during writepage? No, it's wait_inodes_sb() that does the waiting for data IO completion for sync. Cheers, Dave. -- Dave Chinner david@fromorbit.com From htejun@gmail.com Mon Aug 24 17:54:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F19A7F37 for ; Mon, 24 Aug 2015 17:54:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 681448F804B for ; Mon, 24 Aug 2015 15:54:00 -0700 (PDT) X-ASG-Debug-ID: 1440456838-04cbb07cbc4de00001-NocioJ Received: from mail-yk0-f181.google.com (mail-yk0-f181.google.com [209.85.160.181]) by cuda.sgi.com with ESMTP id 4qoVKOcIQ67VrRlV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 15:53:59 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] Received: by ykdt205 with SMTP id t205so138692590ykd.1 for ; Mon, 24 Aug 2015 15:53:58 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=AYMhRc9N58yuF5lJ6Rw8ZPqRW0BL/25EI4B8UBiic4k=; b=is+gA2nA5IigGMA3w7UM241OXyM9ClXrSvadiAgS0NQP4j4jGfrxR2ZXinUCg6rlhK rniII3t1m+lg9+G/jHWSXH0gpK3grGD4NukdWQOdKZINSaettsjORWen819zZtZuJT2a xs+VKLTlenmwbYx23yP6x16XIc4Qb/oQhN6f9fP8PN26DZVlsT5+p/SkW5dDMTu/84It mmSiReyky27osgSFvK0gv1sqUml2k81/OtYm1/+Df3Sg0eZ7FTlCK7hZdo1yVsisyhb0 onahwdAeNgvVnQTURKYTDFGOI55nC/Y8KJd9iKD6ZoWhweQJed8OJh1xzeqoLwqqZkpv ym/w== X-Received: by 10.129.49.200 with SMTP id x191mr33281072ywx.56.1440456838633; Mon, 24 Aug 2015 15:53:58 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id q130sm3813192ywb.36.2015.08.24.15.53.57 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 15:53:58 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 18:53:56 -0400 From: Tejun Heo To: Dave Chinner Cc: Eryu Guan , Jens Axboe , Jan Kara , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824225356.GP28944@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150818174718.GA15739@mtj.duckdns.org> <20150818195439.GB15739@mtj.duckdns.org> <20150818215611.GD3902@dastard> <20150820061224.GG17933@dhcp-13-216.nay.redhat.com> <20150820143626.GI17933@dhcp-13-216.nay.redhat.com> <20150820143735.GJ17933@dhcp-13-216.nay.redhat.com> <20150820165537.GA2044@mtj.duckdns.org> <20150820230451.GT714@dastard> <20150824181038.GA28944@mtj.duckdns.org> <20150824222720.GD714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824222720.GD714@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f181.google.com[209.85.160.181] X-Barracuda-Start-Time: 1440456839 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Dave. On Tue, Aug 25, 2015 at 08:27:20AM +1000, Dave Chinner wrote: > > I'm still a bit confused. What prevents the following from happening? > > > > 1. io completion of last dirty page of an inode and work item for > > xfs_setfilesize() is queued. > > > > 2. inode removed from dirty list. > > The inode has already been removed from the dirty list - that > happens at inode writeback submission time, not IO completion. Ah, yeah, right, somehow was thinking requeue_io() was being called from completion path. That's where I was confused. Thanks. -- tejun From htejun@gmail.com Mon Aug 24 17:55:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD2D97F37 for ; Mon, 24 Aug 2015 17:55:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AF2978F8049 for ; Mon, 24 Aug 2015 15:55:02 -0700 (PDT) X-ASG-Debug-ID: 1440456900-04bdf0239848a50001-NocioJ Received: from mail-yk0-f175.google.com (mail-yk0-f175.google.com [209.85.160.175]) by cuda.sgi.com with ESMTP id oC9xOLXb2JGoLVQH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Aug 2015 15:55:01 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.175] Received: by ykdt205 with SMTP id t205so138713867ykd.1 for ; Mon, 24 Aug 2015 15:55:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=gAaItNN/kWCNSEspSsHpC8m1WzY0oTGwgRsIvpuU8e8=; b=wlbzw6IVy8qt3H9zyRSqXTTlEBZDyZObCCr3p4u+5h9hwG87/rD5QeCTzOJyWakEwT vuEI/yu/RMT79UjD1seKgnrJZj8p6r29Qf6Ur8KEmpm5Yfg+XMSwiEfAaSP4+nqY/Cbg H8X2z9BPYww/xI+La14VawOfIcL8Lpc3qnq0QN5hG/S7PAqYTbKZWcZcw64c5SRkQCay f7Khm+z0pknnZ2s7+NuTNBdpGuWcJMkaZNwAPMWoqKNYHPvp6JJSY6wEeXMPBRPeE4re oZgM7vxg4XT/aZCXSOxlK7fPfGTVzRbkhpOhGNBo1GT5OitbJcf8G0dYzyBEFA+MI7GM DmcA== X-Received: by 10.129.58.16 with SMTP id h16mr34214791ywa.8.1440456900655; Mon, 24 Aug 2015 15:55:00 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id l84sm18981351ywb.5.2015.08.24.15.54.59 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Aug 2015 15:55:00 -0700 (PDT) Sender: Tejun Heo Date: Mon, 24 Aug 2015 18:54:58 -0400 From: Tejun Heo To: Jan Kara Cc: Dave Chinner , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824225458.GQ28944@mtj.duckdns.org> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> <20150824171144.GB27262@mtj.duckdns.org> <20150824190847.GA4234@quack.suse.cz> <20150824193242.GE28944@mtj.duckdns.org> <20150824210927.GA8823@quack.suse.cz> <20150824214535.GM28944@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824214535.GM28944@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f175.google.com[209.85.160.175] X-Barracuda-Start-Time: 1440456901 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, On Mon, Aug 24, 2015 at 05:45:35PM -0400, Tejun Heo wrote: > That isn't true for pages being dirtied through set_page_dirty(). > It's guaranteed that a dirty inode remains on one of the b_* lists > till there's no dirty page and writeback is complete. I got confused here. inodes get removed from b_* once all IOs are issued. Thanks. -- tejun From david@fromorbit.com Mon Aug 24 17:57:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0D48E7F37 for ; Mon, 24 Aug 2015 17:57:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF34B304039 for ; Mon, 24 Aug 2015 15:57:47 -0700 (PDT) X-ASG-Debug-ID: 1440457065-04cbb07cbd4def0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id WIrTEEGBwSSu9Bv6 for ; Mon, 24 Aug 2015 15:57:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C8CABmoNtVPEDvLHldgxuBPYZTozIBAQEBAQEGm1oEAgKBLU0BAQEBAQEHAQEBAUE/hCMBAQEDATocIxAIAw4KCSUPBSUDBxoTG4gLB8c9AQEBAQYCAR8ZhgqFNIUKB4MYgRQFkh6DFoxvgU6NH4d8g2qCNByBZiwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Aug 2015 08:27:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZU0gR-0001ED-HH; Tue, 25 Aug 2015 08:57:43 +1000 Date: Tue, 25 Aug 2015 08:57:43 +1000 From: Dave Chinner To: Tejun Heo Cc: Jan Kara , Eryu Guan , Jens Axboe , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, axboe@fb.com, Jan Kara , linux-fsdevel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Message-ID: <20150824225743.GE714@dastard> X-ASG-Orig-Subj: Re: [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes References: <20150824011123.GA714@dastard> <20150824031816.GO17933@dhcp-13-216.nay.redhat.com> <20150824062425.GU3902@dastard> <20150824091959.GA2936@quack.suse.cz> <20150824145150.GA10029@mtj.duckdns.org> <20150824171144.GB27262@mtj.duckdns.org> <20150824190847.GA4234@quack.suse.cz> <20150824193242.GE28944@mtj.duckdns.org> <20150824210927.GA8823@quack.suse.cz> <20150824214535.GM28944@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150824214535.GM28944@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1440457065 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 24, 2015 at 05:45:35PM -0400, Tejun Heo wrote: > Hello, > > On Mon, Aug 24, 2015 at 11:09:27PM +0200, Jan Kara wrote: > > It is inefficient, yes. But note that 'writeback' and 'dirty' states are > > completely independent. Page can be in any of the !dirty & !writeback, > > That isn't true for pages being dirtied through set_page_dirty(). > It's guaranteed that a dirty inode remains on one of the b_* lists > till there's no dirty page and writeback is complete. IO submission calls clear_page_dirty_for_io(), so by the time that all the pages have been submitted for IO, there are no dirty pages. IO submission also calls set_page_writeback() once the filesystem has decided to do IO on the page, and then IO completion calls end_page_writeback() to clear that state. IOWs, the page transitions from (dirty && !writeback) before submission to (!dirty && writeback) after submission, and to (!dirty && !writeback) once IO completion occurs. And you'll note that filemap_fdatawait() blocks on pages with the PAGECACHE_TAG_WRITEBACK tag set in the mapping tree, not dirty pages. Hence sync has to wait for all pages to transition out of writeback before we can consider the inode to be clean. > > dirty & !writeback, !dirty & writeback, dirty & writeback states. So mixing > > tracking of writeback and dirty state of an inode just makes the code even > > messier. > > I'm curious where and why they would deviate. Can you give me some > examples? AFAICS, anything which uses the usual set_page_dirty() path > shouldn't do that. mmaped files. page_mkwrite dirties page (dirty && !writeback) writepage clear_page_dirty_for_io (!dirty && !writeback) writepage starts writeback (!dirty && writeback) page_mkwrite dirties page (dirty && writeback) io completes (dirty && !writeback) This is done so we don't lose dirty state from page faults whilst the page is under IO and hence have sync miss the page next time through.... Of course, this behaviour is different if you have a filesystem or block device that requires stable pages (e.g. btrfs for data CRC validity). In this case, the page fault will block until the writeback state goes away... > > > > a list to track inodes with pages under writeback but they clashed with > > > > your patch series and they didn't get rebased yet AFAIR. > > > > > > Wouldn't it make more sense to simply put them on one of the existing > > > b_* lists? > > > > Logically it just doesn't make sense because as I wrote above dirty and > > writeback states are completely independent. Also you'd have to detect & > > skip inodes that don't really have any dirty pages to write and all the > > detection of "is there any data to write" would get more complicated. A > > separate list for inodes under writeback as Josef did is IMO the cleanest > > solution. > > Given that the usual code path tracks dirty and writeback together, I > don't think it's nonsensical; however, I'm more curious how common > writeback w/o dirtying case is. I suspect you've misunderstood the progression here. You can't get writeback without first going through dirty. But the transition to writeback clears the dirty page state so that we can capture page state changes while writeback is in progress. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 24 22:37:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B165F7F37 for ; Mon, 24 Aug 2015 22:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4631CAC002 for ; Mon, 24 Aug 2015 20:37:24 -0700 (PDT) X-ASG-Debug-ID: 1440473841-04bdf0239a4d330001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id F59yTpvHBhPoBPKa for ; Mon, 24 Aug 2015 20:37:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BpDwAy4ttV/0DvLHlcgxsjMWmCV6cvDAEBAQEBAQaVWQKFfQSBMk0BAQEBAQGBC0EFhDo7JDQFJQM0iC2iOKUoGYYKilyCFwxBHYEUBYcpinaDFYUGh2mOKYwpJoFWgjosM4JMAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 13:07:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZU52q-0001hV-5d for xfs@oss.sgi.com; Tue, 25 Aug 2015 13:37:08 +1000 Date: Tue, 25 Aug 2015 13:37:08 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 70b33a7 Message-ID: <20150825033708.GF714@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 70b33a7 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="cQXOx3fnlpmgJsTP" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440473842 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --cQXOx3fnlpmgJsTP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: 70b33a7 Merge branch 'xfs-misc-fixes-for-4.3-3' into for-next New Commits: Dave Chinner (3): [b6a9947] xfs: lockdep annotations throw warnings on non-debug builds [f79af0b] xfs: fix non-debug build warnings [70b33a7] Merge branch 'xfs-misc-fixes-for-4.3-3' into for-next Eric Sandeen (1): [2ccf4a9] xfs: collapse allocsize and biosize mount option handling Jan Kara (2): [c184f85] xfs: Fix uninitialized return value in xfs_alloc_fix_freeli= st() [0375423] xfs: Fix file type directory corruption for btree directori= es Code Diffstat: fs/xfs/libxfs/xfs_alloc.c | 2 +- fs/xfs/libxfs/xfs_dir2_node.c | 10 +++++++++- fs/xfs/xfs_buf.c | 4 +--- fs/xfs/xfs_buf_item.c | 20 +++++++++++++------- fs/xfs/xfs_buf_item.h | 2 +- fs/xfs/xfs_inode.c | 8 +++++++- fs/xfs/xfs_super.c | 12 ++---------- 7 files changed, 34 insertions(+), 24 deletions(-) --=20 Dave Chinner david@fromorbit.com --cQXOx3fnlpmgJsTP Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJV2+LjAAoJEK3oKUf0dfodSosQAKvojDW6mqBsUZlXkTGHgBmc T7Br0gwkCwMFdz8eBAJLQX8bJLVFzg5VnyfyOZ6ozHTTOgZL+S3AmsDtxMmF5hQ4 DOGN+D6Sb9FDWier1BN/RXwbfF99/iL/9ug38tjK66hHbM4/zz422RYreHeWriQv E2EasnN/IIRetUgAjJqR9iADoGI8C2DPrzJe5DeAmnpNdZT2hoiPWAw7rNueN9ZR 5XigIS6lMycwBggpgLASKf6JpkHw73LrL2etR5ZqsxHAY/FmvyCu4lsR+lSu45fT 61fsSW4KFQB+29Bmm6rfyn8HZBwrnLfKC0LDq8XlJP49DfiQSqHf2CFKcad01b2q yTBkQB1qKH0xw2SPWMph3bqUA+aodA4WZfRpGD77WlnncsW0W96PmIwScdQf5ABc FwUppHEF+R/udijR8K1aD9xTP+l6Dis7/NMQQs0RcIMwmtYijcUwSC4m1sPGLlx1 wI6OeiH6hHtbFjTyqITUCbeQFrLqMMSk8PhWVzsGiEAK8ozRVMKmOELd3r1ZP40i y3qQZjFEqm95bUxg/Zt3NNiTQErNK02nG6xnmzSiRQFPJU3+iScWwBWm6mQEwYLG UIVl0I23rbLFfHTkEXFSBRbAvqbLatk7jjFJcw8IaOYck/kJHSXACeAkZ9COZP+v QmLMJYiyjJqocaOAXaLv =xqCu -----END PGP SIGNATURE----- --cQXOx3fnlpmgJsTP-- From david@fromorbit.com Mon Aug 24 22:58:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 93E3B7F37 for ; Mon, 24 Aug 2015 22:58:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 17C49AC004 for ; Mon, 24 Aug 2015 20:58:00 -0700 (PDT) X-ASG-Debug-ID: 1440475074-04bdf023974d850001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id IFcCQyszPLDStwfT for ; Mon, 24 Aug 2015 20:57:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BlCQAp59tV/0DvLHldgxsjMWmCV6cvDAEBAQEBAQaKXYp8AoV9BIEyTQEBAQEBAYELhQA7JDQFJQM0iC2iOaUqGYYKjHMMQYExBYcpjguFBodpgU1GhwaFEIwpJoFKCwEBAYI4LDOBByWBIAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 13:27:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZU5Mc-0001kJ-T3 for xfs@oss.sgi.com; Tue, 25 Aug 2015 13:57:34 +1000 Date: Tue, 25 Aug 2015 13:57:34 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: v4.2.0-rc3 released Message-ID: <20150825035734.GG714@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: v4.2.0-rc3 released MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Lb0e7rgc7IsuDeGj" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440475074 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Lb0e7rgc7IsuDeGj Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repositories at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git git://oss.sgi.com/xfs/cmds/xfsprogs have just been updated to v4.2.0-rc3. The changes since 4.2.0-rc2 are mainly fixes for problems found by Eric, Jan, Eryu and Darrick in the past week. I've also pulled the libxfs bug fixes from the current kernel tree to cover all the changes made to fix corruption issues that have been found recently. There was also a revert of an OS X build change - I incorrectly committed an early version, and the finalised version is not yet ready. I think the tree is now pretty close being ready for a 4.2.0 release. If no major problems arise in the next week then I think we are good to go, which means we are looking at 4.2.0 releasing at roughly the same time as the 4.2 kernel (Yay!). The new head of the master branch is commit: 2852f7d xfsprogs: Release v4.2.0-rc3 New Commits: Darrick J. Wong (3): [06e61d6] libxfs: readahead of dir3 data blocks should use the read v= erifier [603ab21] xfs_db: don't crash on a corrupt inode [66fc04e] xfs_repair: fix broken EFSBADCRC/EFSCORRUPTED usage with bu= ffer errors Dave Chinner (5): [db9cba4] xfs: xfs_bunmapi() does not need XFS_BMAPI_METADATA flag [92a57a6] xfs: remote attributes need to be considered data [d9241d7] xfs: remote attribute headers contain an invalid LSN [8b25826] xfsprogs: revert OS X dummy function changes [2852f7d] xfsprogs: Release v4.2.0-rc3 Eric Sandeen (7): [4334e2e] libxfs: fix memory leasks in libxfs_umount() [0a223eb] xfs_repair: free msgbuf on exit [4491caa] xfs_repair: call IRELE(ip) after libxfs_trans_iget calls [bd75814] xfs_repair: unconditionally free blockmaps when threads com= plete [2dd1360] libxfs: remove self-assignment in libxfs/util.c [efb3582] xfs: don't cast string literals [66a5607] man pages: Minor fixes for xfs.5 Eryu Guan (1): [621b5ff] repair: fix wrong logic when validating node magic number Jan Kara (2): [71a9bb1] libxfs: Fix file type directory corruption for btree direct= ories [fcdd428] xfs: Fix uninitialized return value in xfs_alloc_fix_freeli= st() Joe Perches (1): [2c2ec8f] xfs: Use consistent logging message prefixes Code Diffstat: VERSION | 2 +- configure.ac | 2 +- copy/xfs_copy.c | 3 + db/attr.c | 4 +- db/dir2.c | 4 +- db/inode.c | 2 + db/io.c | 4 +- db/io.h | 2 +- doc/CHANGES | 10 ++++ fsr/xfs_fsr.c | 8 --- include/darwin.h | 153 +++++--------------------------------------= ---- libxfs/init.c | 9 +++ libxfs/libxfs_priv.h | 3 +- libxfs/util.c | 9 --- libxfs/xfs_alloc.c | 2 +- libxfs/xfs_attr_remote.c | 49 +++++++++++---- libxfs/xfs_da_btree.c | 4 +- libxfs/xfs_dir2.c | 33 +++++----- libxfs/xfs_dir2_data.c | 3 +- libxfs/xfs_dir2_node.c | 11 +++- libxfs/xfs_format.h | 4 +- libxfs/xfs_sb.c | 14 +++-- man/man5/xfs.5 | 4 +- repair/attr_repair.c | 2 +- repair/bmap.c | 17 +++++- repair/bmap.h | 1 + repair/dir2.c | 2 +- repair/phase3.c | 2 + repair/phase4.c | 1 + repair/phase6.c | 6 ++ repair/scan.c | 12 ++-- repair/xfs_repair.c | 2 + 32 files changed, 164 insertions(+), 220 deletions(-) --=20 Dave Chinner david@fromorbit.com --Lb0e7rgc7IsuDeGj Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJV2+euAAoJEK3oKUf0dfodsfgP/iCsFjCCW2PFUuxLoMMutq5s VHOG95GWFEHYhKTcYbxRO11eEDUSRN2y5YhM2p4iH5tqQoy6otakenMKs413vxSb amhkwTZ4LZbdnUt2AjnS5TjYDMtB3N/OENol3K9NrJqipaa0Hjy1gU5yMWMwD5o/ NuDtgo2q+qcBW+80tTqi7xtGIaxR990ZL0ItO0e0/Bstbt2nV8sYCsGfWSdnoUJv pdRj7sY6B46kG/qydfS6JqRrbg8PCSYslzDH0VQbmn0V1C+2cg3XSrZzPaMEjdIN B5iPIL0z2uykAaHnYuLWzl3EFVbPJUr1bDqSrH2QZsyX4qwdFGa2u0RCXYhxyN0p 0v8lIQIgjQQ0ztqpr8uQUDs8vlBvJh2JJ8nK3CNO+JUh2MEN/UtVyV4O1y+YmZID JV1BkhcbJSTbuW2/lP3ysjHS+9tsvjIGZb0SRvTsQvh+xK8/G4ecARCseGjIIZYU MCUw2WY7uT/pNPeLeVkHKIMRivxboKAE4jJGeU4R4FphgGBcxpNzSCc7mT5q4iMi MNsmtoyK2gol6dBVZrOhlLYfDJxxuMNNUzPAHtos2xPleTGWs00cbDaaNNuF2iNU PGAwYsJ63PATGb+BOXVG8zZtX2sp0gaw73eYf9crvJRmrYaLUSNbf/Iud9ujMQzc XNnLaqEgvi8ph3eyyhsU =E6XY -----END PGP SIGNATURE----- --Lb0e7rgc7IsuDeGj-- From darrick.wong@oracle.com Mon Aug 24 23:06:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E10357F37 for ; Mon, 24 Aug 2015 23:06:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E2BFAC007 for ; Mon, 24 Aug 2015 21:06:23 -0700 (PDT) X-ASG-Debug-ID: 1440475578-04cbb07cbc53f40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id XMVTIaq0vynXQNVx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 21:06:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7P46C7X016398 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Aug 2015 04:06:13 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7P46BAf012764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 25 Aug 2015 04:06:12 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7P46Ao3003021; Tue, 25 Aug 2015 04:06:10 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 24 Aug 2015 21:06:10 -0700 Date: Mon, 24 Aug 2015 21:06:09 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: libxfs: verifier should set buffer error when da block has a bad magic number Message-ID: <20150825040609.GT10043@birch.djwong.org> X-ASG-Orig-Subj: libxfs: verifier should set buffer error when da block has a bad magic number MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440475578 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If xfs_da3_node_read_verify() doesn't recognize the magic number of a buffer it's just read, set the buffer error to -EFSCORRUPTED so that the error can be sent up to userspace. Without this patch we'll ASSERT on the bad magic eventually while trying to traverse or change the block, but we really ought to fail fast in the verifier. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_da_btree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index 2385f8c..ec4a5a1 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -238,6 +238,7 @@ xfs_da3_node_read_verify( /* corrupt block */ xfs_verifier_error(bp); + xfs_buf_ioerror(bp, -EFSCORRUPTED); } const struct xfs_buf_ops xfs_da3_node_buf_ops = { From david@fromorbit.com Mon Aug 24 23:23:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E11607F37 for ; Mon, 24 Aug 2015 23:23:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B9A0AC004 for ; Mon, 24 Aug 2015 21:23:17 -0700 (PDT) X-ASG-Debug-ID: 1440476595-04bdf0239a4df80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 3XNeUOBKXYkb83vj for ; Mon, 24 Aug 2015 21:23:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CNDwDU7NtV/0DvLHldgxuBPYJXpzsBAQEBAQEGm1gCAgEBAoEuTQEBAQEBAYELQQWDXgEBBDocIxAIAxgJJQ8FJQMhE4gtxzoBAQgCAR8ZhgqFNIUKB4QsBZU0jG+BTYdMkTkmgkCBUCwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 13:53:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZU5lG-0001n7-8m; Tue, 25 Aug 2015 14:23:02 +1000 Date: Tue, 25 Aug 2015 14:23:02 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: libxfs: verifier should set buffer error when da block has a bad magic number Message-ID: <20150825042302.GH714@dastard> X-ASG-Orig-Subj: Re: libxfs: verifier should set buffer error when da block has a bad magic number References: <20150825040609.GT10043@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150825040609.GT10043@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440476595 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 24, 2015 at 09:06:09PM -0700, Darrick J. Wong wrote: > If xfs_da3_node_read_verify() doesn't recognize the magic number of a > buffer it's just read, set the buffer error to -EFSCORRUPTED so that > the error can be sent up to userspace. Without this patch we'll > ASSERT on the bad magic eventually while trying to traverse or change > the block, but we really ought to fail fast in the verifier. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_da_btree.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c > index 2385f8c..ec4a5a1 100644 > --- a/fs/xfs/libxfs/xfs_da_btree.c > +++ b/fs/xfs/libxfs/xfs_da_btree.c > @@ -238,6 +238,7 @@ xfs_da3_node_read_verify( > > /* corrupt block */ > xfs_verifier_error(bp); > + xfs_buf_ioerror(bp, -EFSCORRUPTED); > } That should be in the default block of the switch statement, otherwise it will overwrite the error from the node format crc/ verifier failures.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Aug 24 23:31:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FAF27F37 for ; Mon, 24 Aug 2015 23:31:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32539304039 for ; Mon, 24 Aug 2015 21:31:40 -0700 (PDT) X-ASG-Debug-ID: 1440477093-04bdf023984e120001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 2qgf4f0InJQtdV2P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 21:31:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7P4VRlO007603 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Aug 2015 04:31:28 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7P4VRq3031501 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 25 Aug 2015 04:31:27 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7P4VQ5q013077; Tue, 25 Aug 2015 04:31:26 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 24 Aug 2015 21:31:26 -0700 Date: Mon, 24 Aug 2015 21:31:24 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: libxfs: verifier should set buffer error when da block has a bad magic number Message-ID: <20150825043124.GU10043@birch.djwong.org> X-ASG-Orig-Subj: Re: libxfs: verifier should set buffer error when da block has a bad magic number References: <20150825040609.GT10043@birch.djwong.org> <20150825042302.GH714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150825042302.GH714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440477093 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 25, 2015 at 02:23:02PM +1000, Dave Chinner wrote: > On Mon, Aug 24, 2015 at 09:06:09PM -0700, Darrick J. Wong wrote: > > If xfs_da3_node_read_verify() doesn't recognize the magic number of a > > buffer it's just read, set the buffer error to -EFSCORRUPTED so that > > the error can be sent up to userspace. Without this patch we'll > > ASSERT on the bad magic eventually while trying to traverse or change > > the block, but we really ought to fail fast in the verifier. > > > > Signed-off-by: Darrick J. Wong > > --- > > fs/xfs/libxfs/xfs_da_btree.c | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c > > index 2385f8c..ec4a5a1 100644 > > --- a/fs/xfs/libxfs/xfs_da_btree.c > > +++ b/fs/xfs/libxfs/xfs_da_btree.c > > @@ -238,6 +238,7 @@ xfs_da3_node_read_verify( > > > > /* corrupt block */ > > xfs_verifier_error(bp); > > + xfs_buf_ioerror(bp, -EFSCORRUPTED); > > } > > That should be in the default block of the switch statement, > otherwise it will overwrite the error from the node format crc/ > verifier failures.... Aha, I missed that. Thank you. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Aug 24 23:46:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1CDB27F37 for ; Mon, 24 Aug 2015 23:46:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A93B9AC005 for ; Mon, 24 Aug 2015 21:46:37 -0700 (PDT) X-ASG-Debug-ID: 1440477996-04bdf023984e4b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id DWV4keJEgWgHzTN1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Aug 2015 21:46:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7P4kZLY021610 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Aug 2015 04:46:35 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7P4kZur013896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 25 Aug 2015 04:46:35 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7P4kYbt030874; Tue, 25 Aug 2015 04:46:34 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 24 Aug 2015 21:46:34 -0700 Date: Mon, 24 Aug 2015 21:46:33 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: [PATCH v2] libxfs: verifier should set buffer error when da block has a bad magic number Message-ID: <20150825044633.GV10043@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2] libxfs: verifier should set buffer error when da block has a bad magic number MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440477996 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If xfs_da3_node_read_verify() doesn't recognize the magic number of a buffer it's just read, set the buffer error to -EFSCORRUPTED so that the error can be sent up to userspace. Without this patch we'll notice the bad magic eventually while trying to traverse or change the block, but we really ought to fail early in the verifier. v2: Mark the buffer corrupt in the default case to avoid blowing away a CRC error code in the node block case. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_da_btree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index 2385f8c..8951e34 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -233,6 +233,7 @@ xfs_da3_node_read_verify( bp->b_ops->verify_read(bp); return; default: + xfs_buf_ioerror(bp, -EFSCORRUPTED); break; } From dave@fromorbit.com Tue Aug 25 00:06:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E1FEE7F37 for ; Tue, 25 Aug 2015 00:06:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C21A38F804B for ; Mon, 24 Aug 2015 22:06:16 -0700 (PDT) X-ASG-Debug-ID: 1440479169-04bdf023974e960001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id YGvC1rC7aA1ZU48N for ; Mon, 24 Aug 2015 22:06:09 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BzJwBs9ttV/0DvLHldgxtUaal6AgEJDAEBAQEBAQaBCJRbhytNAQEBAQEBgQtBBYQ6Hh2BAgOIYQ6iLqUuhiOIIYI7hBUFlTSFBpZVi2YmgUoBAQEHAQEBATYcgWYsMwGCSwEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 14:36:08 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZU6Ql-0001qs-HC for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZU6Ql-0000lG-GA for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/4 v2] xfs: get rid of xfs_cluster_write() Date: Tue, 25 Aug 2015 15:05:49 +1000 X-ASG-Orig-Subj: [PATCH 0/4 v2] xfs: get rid of xfs_cluster_write() Message-Id: <1440479153-1584-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440479169 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is the second version of the patchset that removes xfs_cluster_write() in preference to using state in generic_writepages to enable clustering of pages. The full description from the v1 patchset is here: http://oss.sgi.com/archives/xfs/2015-08/msg00224.html The end result is effectively unchanged from version 1, just the breakdown of the patches is different to the original posting, as requested by Christoph. -Dave. Version 2: - promote removal of non-blocking behaviour to be an initial cleanup patch - collapse staged introduction of struct xfs_writepage_context into a single patch. From dave@fromorbit.com Tue Aug 25 00:06:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AA5FB7F37 for ; Tue, 25 Aug 2015 00:06:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 70251304059 for ; Mon, 24 Aug 2015 22:06:44 -0700 (PDT) X-ASG-Debug-ID: 1440479170-04bdf023994e970001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qk2NKdexTStWDapu for ; Mon, 24 Aug 2015 22:06:11 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AoCQBs9ttV/0DvLHldgxuBPaoSAQEBAQEBBp0OTQEBAQEBAYELhCQBBScvMwgYMTkDGxmILcdqhiOJZYUMBYcpjgubW4tmJoFKAQs1AxyBZiwzgQWBRwEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 14:36:08 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZU6Ql-0001qv-Ib for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZU6Ql-0000lT-Hp for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: xfs_cluster_write is redundant Date: Tue, 25 Aug 2015 15:05:52 +1000 X-ASG-Orig-Subj: [PATCH 3/4] xfs: xfs_cluster_write is redundant Message-Id: <1440479153-1584-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1440479153-1584-1-git-send-email-david@fromorbit.com> References: <1440479153-1584-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440479170 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_cluster_write() is not necessary now that xfs_vm_writepages() aggregates writepage calls across a single mapping. This means we no longer need to do page lookups in xfs_cluster_write, so writeback only needs to look up th epage cache once per page being written. This also removes a large amount of mostly duplicate code between xfs_do_writepage() and xfs_convert_page(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 215 ++---------------------------------------------------- 1 file changed, 6 insertions(+), 209 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 93bf13c..1fb1ec9 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -644,179 +644,6 @@ xfs_check_page_type( return false; } -/* - * Allocate & map buffers for page given the extent map. Write it out. - * except for the original page of a writepage, this is called on - * delalloc/unwritten pages only, for the original page it is possible - * that the page has no mapping at all. - */ -STATIC int -xfs_convert_page( - struct inode *inode, - struct page *page, - loff_t tindex, - struct xfs_writepage_ctx *wpc, - struct writeback_control *wbc) -{ - struct buffer_head *bh, *head; - xfs_off_t end_offset; - unsigned long p_offset; - int len, page_dirty; - int count = 0, done = 0, uptodate = 1; - xfs_off_t offset = page_offset(page); - - if (page->index != tindex) - goto fail; - if (!trylock_page(page)) - goto fail; - if (PageWriteback(page)) - goto fail_unlock_page; - if (page->mapping != inode->i_mapping) - goto fail_unlock_page; - if (!xfs_check_page_type(page, wpc->ioend->io_type, false)) - goto fail_unlock_page; - - /* - * page_dirty is initially a count of buffers on the page before - * EOF and is decremented as we move each into a cleanable state. - * - * Derivation: - * - * End offset is the highest offset that this page should represent. - * If we are on the last page, (end_offset & (PAGE_CACHE_SIZE - 1)) - * will evaluate non-zero and be less than PAGE_CACHE_SIZE and - * hence give us the correct page_dirty count. On any other page, - * it will be zero and in that case we need page_dirty to be the - * count of buffers on the page. - */ - end_offset = min_t(unsigned long long, - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, - i_size_read(inode)); - - /* - * If the current map does not span the entire page we are about to try - * to write, then give up. The only way we can write a page that spans - * multiple mappings in a single writeback iteration is via the - * xfs_vm_writepage() function. Data integrity writeback requires the - * entire page to be written in a single attempt, otherwise the part of - * the page we don't write here doesn't get written as part of the data - * integrity sync. - * - * For normal writeback, we also don't attempt to write partial pages - * here as it simply means that write_cache_pages() will see it under - * writeback and ignore the page until some point in the future, at - * which time this will be the only page in the file that needs - * writeback. Hence for more optimal IO patterns, we should always - * avoid partial page writeback due to multiple mappings on a page here. - */ - if (!xfs_imap_valid(inode, &wpc->imap, end_offset)) - goto fail_unlock_page; - - len = 1 << inode->i_blkbits; - p_offset = min_t(unsigned long, end_offset & (PAGE_CACHE_SIZE - 1), - PAGE_CACHE_SIZE); - p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; - page_dirty = p_offset / len; - - /* - * The moment we find a buffer that doesn't match our current type - * specification or can't be written, abort the loop and start - * writeback. As per the above xfs_imap_valid() check, only - * xfs_vm_writepage() can handle partial page writeback fully - we are - * limited here to the buffers that are contiguous with the current - * ioend, and hence a buffer we can't write breaks that contiguity and - * we have to defer the rest of the IO to xfs_vm_writepage(). - */ - bh = head = page_buffers(page); - do { - if (offset >= end_offset) - break; - if (!buffer_uptodate(bh)) - uptodate = 0; - if (!(PageUptodate(page) || buffer_uptodate(bh))) { - done = 1; - break; - } - - if (buffer_unwritten(bh) || buffer_delay(bh) || - buffer_mapped(bh)) { - if (buffer_unwritten(bh)) - wpc->io_type = XFS_IO_UNWRITTEN; - else if (buffer_delay(bh)) - wpc->io_type = XFS_IO_DELALLOC; - else - wpc->io_type = XFS_IO_OVERWRITE; - - /* - * imap should always be valid because of the above - * partial page end_offset check on the imap. - */ - ASSERT(xfs_imap_valid(inode, &wpc->imap, offset)); - - lock_buffer(bh); - if (wpc->io_type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, wpc); - - page_dirty--; - count++; - } else { - done = 1; - break; - } - } while (offset += len, (bh = bh->b_this_page) != head); - - if (uptodate && bh == head) - SetPageUptodate(page); - - if (count) { - if (--wbc->nr_to_write <= 0 && - wbc->sync_mode == WB_SYNC_NONE) - done = 1; - } - xfs_start_page_writeback(page, !page_dirty, count); - - return done; - fail_unlock_page: - unlock_page(page); - fail: - return 1; -} - -/* - * Convert & write out a cluster of pages in the same extent as defined - * by mp and following the start page. - */ -STATIC void -xfs_cluster_write( - struct inode *inode, - pgoff_t tindex, - struct xfs_writepage_ctx *wpc, - struct writeback_control *wbc, - pgoff_t tlast) -{ - struct pagevec pvec; - int done = 0, i; - - pagevec_init(&pvec, 0); - while (!done && tindex <= tlast) { - unsigned len = min_t(pgoff_t, PAGEVEC_SIZE, tlast - tindex + 1); - - if (!pagevec_lookup(&pvec, inode->i_mapping, tindex, len)) - break; - - for (i = 0; i < pagevec_count(&pvec); i++) { - done = xfs_convert_page(inode, pvec.pages[i], tindex++, - wpc, wbc); - if (done) - break; - } - - pagevec_release(&pvec); - cond_resched(); - } -} - STATIC void xfs_vm_invalidatepage( struct page *page, @@ -933,7 +760,7 @@ xfs_do_writepage( struct buffer_head *bh, *head; loff_t offset; __uint64_t end_offset; - pgoff_t end_index, last_index; + pgoff_t end_index; ssize_t len; int err, uptodate = 1; int count = 0; @@ -963,12 +790,9 @@ xfs_do_writepage( if (WARN_ON_ONCE(current->flags & PF_FSTRANS)) goto redirty; - /* Is this page beyond the end of the file? */ - offset = i_size_read(inode); - end_index = offset >> PAGE_CACHE_SHIFT; - last_index = (offset - 1) >> PAGE_CACHE_SHIFT; - /* + * Is this page beyond the end of the file? + * * The page index is less than the end_index, adjust the end_offset * to the highest offset that this page should represent. * ----------------------------------------------------- @@ -979,6 +803,8 @@ xfs_do_writepage( * | desired writeback range | see else | * ---------------------------------^------------------| */ + offset = i_size_read(inode); + end_index = offset >> PAGE_CACHE_SHIFT; if (page->index < end_index) end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; else { @@ -1108,36 +934,7 @@ xfs_do_writepage( SetPageUptodate(page); xfs_start_page_writeback(page, 1, count); - - /* if there is no IO to be submitted for this page, we are done */ - if (!count) - return 0; - - ASSERT(wpc->iohead); - - /* - * Any errors from this point onwards need tobe reported through the IO - * completion path as we have marked the initial page as under writeback - * and unlocked it. - */ - if (wpc->imap_valid) { - xfs_off_t end_index; - - end_index = wpc->imap.br_startoff + wpc->imap.br_blockcount; - - /* to bytes */ - end_index <<= inode->i_blkbits; - - /* to pages */ - end_index = (end_index - 1) >> PAGE_CACHE_SHIFT; - - /* check against file size */ - if (end_index > last_index) - end_index = last_index; - - xfs_cluster_write(inode, page->index + 1, wpc, wbc, end_index); - } - + ASSERT(wpc->iohead || !count); return 0; error: -- 2.5.0 From dave@fromorbit.com Tue Aug 25 00:06:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 043E07F3F for ; Tue, 25 Aug 2015 00:06:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BAF1B304039 for ; Mon, 24 Aug 2015 22:06:41 -0700 (PDT) X-ASG-Debug-ID: 1440479169-04bdf023974e960002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qInJ2mSojwzURoC8 for ; Mon, 24 Aug 2015 22:06:10 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AmCQBs9ttV/0DvLHldgxuBPaoSAQEBAQEBBptegTBNAQEBAQEBgQuEJAEFJy8zCBgxOQMbGR6ID8dqhiOKMymEFQWHKY4Lm1uLZiaBSgELgjosM4JMAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 14:36:08 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZU6Ql-0001qt-Hf for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZU6Ql-0000lJ-Gx for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: remove nonblocking mode from xfs_vm_writepage Date: Tue, 25 Aug 2015 15:05:50 +1000 X-ASG-Orig-Subj: [PATCH 1/4] xfs: remove nonblocking mode from xfs_vm_writepage Message-Id: <1440479153-1584-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1440479153-1584-1-git-send-email-david@fromorbit.com> References: <1440479153-1584-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440479170 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Remove the nonblocking optimisation done for mapping lookups during writeback. It's not clear that leaving a hole in the writeback range just because we couldn't get a lock is really a win, as it makes us do another small random IO later on rather than a large sequential IO now. As this gets in the way of sane error handling later on, just remove for the moment and we can re-introduce an equivalent optimisation in future if we see problems due to extent map lock contention. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 3859f5e..89fad6b 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -276,8 +276,7 @@ xfs_map_blocks( struct inode *inode, loff_t offset, struct xfs_bmbt_irec *imap, - int type, - int nonblocking) + int type) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; @@ -293,12 +292,7 @@ xfs_map_blocks( if (type == XFS_IO_UNWRITTEN) bmapi_flags |= XFS_BMAPI_IGSTATE; - if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) { - if (nonblocking) - return -EAGAIN; - xfs_ilock(ip, XFS_ILOCK_SHARED); - } - + xfs_ilock(ip, XFS_ILOCK_SHARED); ASSERT(ip->i_d.di_format != XFS_DINODE_FMT_BTREE || (ip->i_df.if_flags & XFS_IFEXTENTS)); ASSERT(offset <= mp->m_super->s_maxbytes); @@ -949,7 +943,6 @@ xfs_vm_writepage( ssize_t len; int err, imap_valid = 0, uptodate = 1; int count = 0; - int nonblocking = 0; trace_xfs_writepage(inode, page, 0, 0); @@ -1049,9 +1042,6 @@ xfs_vm_writepage( offset = page_offset(page); type = XFS_IO_OVERWRITE; - if (wbc->sync_mode == WB_SYNC_NONE) - nonblocking = 1; - do { int new_ioend = 0; @@ -1111,8 +1101,7 @@ xfs_vm_writepage( * time. */ new_ioend = 1; - err = xfs_map_blocks(inode, offset, &imap, type, - nonblocking); + err = xfs_map_blocks(inode, offset, &imap, type); if (err) goto error; imap_valid = xfs_imap_valid(inode, &imap, offset); @@ -1182,9 +1171,6 @@ error: if (iohead) xfs_cancel_ioend(iohead); - if (err == -EAGAIN) - goto redirty; - xfs_aops_discard_page(page); ClearPageUptodate(page); unlock_page(page); -- 2.5.0 From dave@fromorbit.com Tue Aug 25 00:06:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DED807F56 for ; Tue, 25 Aug 2015 00:06:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA05A30404E for ; Mon, 24 Aug 2015 22:06:53 -0700 (PDT) X-ASG-Debug-ID: 1440479169-04bdf023974e960003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id C3n4BCHmugMSRQc6 for ; Mon, 24 Aug 2015 22:06:49 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AoCQBs9ttV/0DvLHlVCIMbgT2qEgEBAQEBAQadDk0BAQEBAQGBC4QkAQUnLzMIGDE5AxsZiC3HaoYjiWeFCgWHKY4Lm1uLZiaBSgELgjosM4JMAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 14:36:08 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZU6Ql-0001qw-JG for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZU6Ql-0000lY-II for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: factor mapping out of xfs_do_writepage Date: Tue, 25 Aug 2015 15:05:53 +1000 X-ASG-Orig-Subj: [PATCH 4/4] xfs: factor mapping out of xfs_do_writepage Message-Id: <1440479153-1584-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1440479153-1584-1-git-send-email-david@fromorbit.com> References: <1440479153-1584-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440479200 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Separate out the bufferhead based mapping from the writepage code so that we have a clear separation of the page operations and the bufferhead state. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 221 +++++++++++++++++++++++++++++------------------------- 1 file changed, 119 insertions(+), 102 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 1fb1ec9..08a0205 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -741,6 +741,116 @@ xfs_writepage_submit( return status; } +static int +xfs_writepage_map( + struct xfs_writepage_ctx *wpc, + struct inode *inode, + struct page *page, + loff_t offset, + __uint64_t end_offset) +{ + struct buffer_head *bh, *head; + ssize_t len = 1 << inode->i_blkbits; + int error = 0; + int uptodate = 1; + int count = 0; + + bh = head = page_buffers(page); + offset = page_offset(page); + + do { + if (offset >= end_offset) + break; + if (!buffer_uptodate(bh)) + uptodate = 0; + + /* + * set_page_dirty dirties all buffers in a page, independent + * of their state. The dirty state however is entirely + * meaningless for holes (!mapped && uptodate), so skip + * buffers covering holes here. + */ + if (!buffer_mapped(bh) && buffer_uptodate(bh)) { + wpc->imap_valid = false; + continue; + } + + if (buffer_unwritten(bh)) { + if (wpc->io_type != XFS_IO_UNWRITTEN) { + wpc->io_type = XFS_IO_UNWRITTEN; + wpc->imap_valid = false; + } + } else if (buffer_delay(bh)) { + if (wpc->io_type != XFS_IO_DELALLOC) { + wpc->io_type = XFS_IO_DELALLOC; + wpc->imap_valid = false; + } + } else if (buffer_uptodate(bh)) { + if (wpc->io_type != XFS_IO_OVERWRITE) { + wpc->io_type = XFS_IO_OVERWRITE; + wpc->imap_valid = false; + } + } else { + if (PageUptodate(page)) + ASSERT(buffer_mapped(bh)); + /* + * This buffer is not uptodate and will not be + * written to disk. Ensure that we will put any + * subsequent writeable buffers into a new + * ioend. + */ + wpc->imap_valid = false; + continue; + } + + if (wpc->imap_valid) + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); + if (!wpc->imap_valid) { + error = xfs_map_blocks(inode, offset, &wpc->imap, + wpc->io_type); + if (error) + goto out_error; + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); + } + if (wpc->imap_valid) { + lock_buffer(bh); + if (wpc->io_type != XFS_IO_OVERWRITE) + xfs_map_at_offset(inode, bh, &wpc->imap, offset); + xfs_add_to_ioend(inode, bh, offset, wpc); + count++; + } + + if (!wpc->iohead) + wpc->iohead = wpc->ioend; + + } while (offset += len, ((bh = bh->b_this_page) != head)); + + if (uptodate && bh == head) + SetPageUptodate(page); + + xfs_start_page_writeback(page, 1, count); + ASSERT(wpc->iohead || !count); + return 0; + +out_error: + /* + * We can only discard the page we had the IO error on if we haven't + * included it in the ioend above. If it has already been added to the + * ioend, then we can't touch it here and need to rely on IO submission + * to unlock it. + */ + if (count) + xfs_start_page_writeback(page, 0, count); + else { + xfs_aops_discard_page(page); + ClearPageUptodate(page); + unlock_page(page); + } + return error; +} + /* * Write out a dirty page. * @@ -757,13 +867,10 @@ xfs_do_writepage( { struct xfs_writepage_ctx *wpc = data; struct inode *inode = page->mapping->host; - struct buffer_head *bh, *head; loff_t offset; __uint64_t end_offset; pgoff_t end_index; - ssize_t len; - int err, uptodate = 1; - int count = 0; + int error = 0; trace_xfs_writepage(inode, page, 0, 0); @@ -856,113 +963,23 @@ xfs_do_writepage( end_offset = offset; } - len = 1 << inode->i_blkbits; - - bh = head = page_buffers(page); - offset = page_offset(page); - - do { - if (offset >= end_offset) - break; - if (!buffer_uptodate(bh)) - uptodate = 0; - - /* - * set_page_dirty dirties all buffers in a page, independent - * of their state. The dirty state however is entirely - * meaningless for holes (!mapped && uptodate), so skip - * buffers covering holes here. - */ - if (!buffer_mapped(bh) && buffer_uptodate(bh)) { - wpc->imap_valid = false; - continue; - } - - if (buffer_unwritten(bh)) { - if (wpc->io_type != XFS_IO_UNWRITTEN) { - wpc->io_type = XFS_IO_UNWRITTEN; - wpc->imap_valid = false; - } - } else if (buffer_delay(bh)) { - if (wpc->io_type != XFS_IO_DELALLOC) { - wpc->io_type = XFS_IO_DELALLOC; - wpc->imap_valid = false; - } - } else if (buffer_uptodate(bh)) { - if (wpc->io_type != XFS_IO_OVERWRITE) { - wpc->io_type = XFS_IO_OVERWRITE; - wpc->imap_valid = false; - } - } else { - if (PageUptodate(page)) - ASSERT(buffer_mapped(bh)); - /* - * This buffer is not uptodate and will not be - * written to disk. Ensure that we will put any - * subsequent writeable buffers into a new - * ioend. - */ - wpc->imap_valid = false; - continue; - } - - if (wpc->imap_valid) - wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, - offset); - if (!wpc->imap_valid) { - err = xfs_map_blocks(inode, offset, &wpc->imap, - wpc->io_type); - if (err) - goto error; - wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, - offset); - } - if (wpc->imap_valid) { - lock_buffer(bh); - if (wpc->io_type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, &wpc->imap, offset); - xfs_add_to_ioend(inode, bh, offset, wpc); - count++; - } - - if (!wpc->iohead) - wpc->iohead = wpc->ioend; - - } while (offset += len, ((bh = bh->b_this_page) != head)); - - if (uptodate && bh == head) - SetPageUptodate(page); - - xfs_start_page_writeback(page, 1, count); - ASSERT(wpc->iohead || !count); + error = xfs_writepage_map(wpc, inode, page, offset, end_offset); + if (error) + goto out_error; return 0; -error: +out_error: /* * We have to fail the iohead here because we buffers locked in the * ioend chain. If we don't do this, we'll deadlock invalidating the * page as that tries to lock the buffers on the page. Also, because we * have set pages under writeback, we have to run IO completion to mark * the error state of the IO appropriately, so we can't cancel the ioend - * directly here. That means we have to mark this page as under - * writeback if we included any buffers from it in the ioend chain. + * directly here. */ - if (count) - xfs_start_page_writeback(page, 0, count); - xfs_writepage_submit(wpc, wbc, err); - - /* - * We can only discard the page we had the IO error on if we haven't - * included it in the ioend above. If it has already been errored out, - * the it is unlocked and we can't touch it here. - */ - if (!count) { - xfs_aops_discard_page(page); - ClearPageUptodate(page); - unlock_page(page); - } - mapping_set_error(page->mapping, err); - return err; + xfs_writepage_submit(wpc, wbc, error); + mapping_set_error(page->mapping, error); + return error; redirty: redirty_page_for_writepage(wbc, page); -- 2.5.0 From dave@fromorbit.com Tue Aug 25 00:06:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B3DC17F37 for ; Tue, 25 Aug 2015 00:06:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 745328F804B for ; Mon, 24 Aug 2015 22:06:54 -0700 (PDT) X-ASG-Debug-ID: 1440479170-04bdf023994e970002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id T7NVgiXOhFHHlsCN for ; Mon, 24 Aug 2015 22:06:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AnCQBs9ttV/0DvLHlVCIMbgT2qEgEBAQEBAQabXoEwTQEBAQEBAYELhCQBBScgDzMIGBgZOQMbGYgttzuQL4YjiWdMHIQiBYcpjgunQSaBSgELATQDHIFmLDOCTAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 14:36:08 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZU6Ql-0001qu-I7 for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZU6Ql-0000lO-HN for xfs@oss.sgi.com; Tue, 25 Aug 2015 15:05:55 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: Introduce writeback context for writepages Date: Tue, 25 Aug 2015 15:05:51 +1000 X-ASG-Orig-Subj: [PATCH 2/4] xfs: Introduce writeback context for writepages Message-Id: <1440479153-1584-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1440479153-1584-1-git-send-email-david@fromorbit.com> References: <1440479153-1584-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440479203 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_vm_writepages() calls generic_writepages to writeback a range of a file, but then xfs_vm_writepage() clusters pages itself as it does not have any context it can pass between->writepage calls from __write_cache_pages(). Introduce a writeback context for xfs_vm_writepages() and call __write_cache_pages directly with our own writepage callback so that we can pass that context to each writepage invocation. This encapsulates the current mapping, whether it is valid or not, the current ioend and it's IO type and the ioend chain being built. This requires us to move the ioend submission up to the level where the writepage context is declared. This does mean we do not submit IO until we packaged the entire writeback range, but with the block plugging in the writepages call this is the way IO is submitted, anyway. It also means that we need to handle discontiguous page ranges. If the pages sent down by write_cache_pages to the writepage callback are discontiguous, we need to detect this and put each discontiguous page range into individual ioends. This is needed to ensure that the ioend accurately represents the range of the file that it covers so that file size updates during IO completion set the size correctly. Failure to take into account the discontiguous ranges results in files being too small when writeback patterns are non-sequential. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 277 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 146 insertions(+), 131 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 89fad6b..93bf13c 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -36,6 +36,18 @@ #include #include +/* + * structure owned by writepages passed to individual writepage calls + */ +struct xfs_writepage_ctx { + struct xfs_bmbt_irec imap; + bool imap_valid; + unsigned int io_type; + struct xfs_ioend *iohead; + struct xfs_ioend *ioend; + sector_t last_block; +}; + void xfs_count_page_state( struct page *page, @@ -328,7 +340,7 @@ xfs_map_blocks( return 0; } -STATIC int +STATIC bool xfs_imap_valid( struct inode *inode, struct xfs_bmbt_irec *imap, @@ -516,38 +528,6 @@ xfs_submit_ioend( } /* - * Cancel submission of all buffer_heads so far in this endio. - * Toss the endio too. Only ever called for the initial page - * in a writepage request, so only ever one page. - */ -STATIC void -xfs_cancel_ioend( - xfs_ioend_t *ioend) -{ - xfs_ioend_t *next; - struct buffer_head *bh, *next_bh; - - do { - next = ioend->io_list; - bh = ioend->io_buffer_head; - do { - next_bh = bh->b_private; - clear_buffer_async_write(bh); - /* - * The unwritten flag is cleared when added to the - * ioend. We're not submitting for I/O so mark the - * buffer unwritten again for next time around. - */ - if (ioend->io_type == XFS_IO_UNWRITTEN) - set_buffer_unwritten(bh); - unlock_buffer(bh); - } while ((bh = next_bh) != NULL); - - mempool_free(ioend, xfs_ioend_pool); - } while ((ioend = next) != NULL); -} - -/* * Test to see if we've been building up a completion structure for * earlier buffers -- if so, we try to append to this ioend if we * can, otherwise we finish off any current ioend and start another. @@ -558,29 +538,27 @@ xfs_add_to_ioend( struct inode *inode, struct buffer_head *bh, xfs_off_t offset, - unsigned int type, - xfs_ioend_t **result, - int need_ioend) + struct xfs_writepage_ctx *wpc) { - xfs_ioend_t *ioend = *result; - - if (!ioend || need_ioend || type != ioend->io_type) { - xfs_ioend_t *previous = *result; - - ioend = xfs_alloc_ioend(inode, type); - ioend->io_offset = offset; - ioend->io_buffer_head = bh; - ioend->io_buffer_tail = bh; - if (previous) - previous->io_list = ioend; - *result = ioend; + if (!wpc->ioend || wpc->io_type != wpc->ioend->io_type || + bh->b_blocknr != wpc->last_block + 1) { + struct xfs_ioend *new; + + new = xfs_alloc_ioend(inode, wpc->io_type); + new->io_offset = offset; + new->io_buffer_head = bh; + new->io_buffer_tail = bh; + if (wpc->ioend) + wpc->ioend->io_list = new; + wpc->ioend = new; } else { - ioend->io_buffer_tail->b_private = bh; - ioend->io_buffer_tail = bh; + wpc->ioend->io_buffer_tail->b_private = bh; + wpc->ioend->io_buffer_tail = bh; } bh->b_private = NULL; - ioend->io_size += bh->b_size; + wpc->ioend->io_size += bh->b_size; + wpc->last_block = bh->b_blocknr; } STATIC void @@ -677,17 +655,15 @@ xfs_convert_page( struct inode *inode, struct page *page, loff_t tindex, - struct xfs_bmbt_irec *imap, - xfs_ioend_t **ioendp, + struct xfs_writepage_ctx *wpc, struct writeback_control *wbc) { struct buffer_head *bh, *head; xfs_off_t end_offset; unsigned long p_offset; - unsigned int type; int len, page_dirty; int count = 0, done = 0, uptodate = 1; - xfs_off_t offset = page_offset(page); + xfs_off_t offset = page_offset(page); if (page->index != tindex) goto fail; @@ -697,7 +673,7 @@ xfs_convert_page( goto fail_unlock_page; if (page->mapping != inode->i_mapping) goto fail_unlock_page; - if (!xfs_check_page_type(page, (*ioendp)->io_type, false)) + if (!xfs_check_page_type(page, wpc->ioend->io_type, false)) goto fail_unlock_page; /* @@ -733,7 +709,7 @@ xfs_convert_page( * writeback. Hence for more optimal IO patterns, we should always * avoid partial page writeback due to multiple mappings on a page here. */ - if (!xfs_imap_valid(inode, imap, end_offset)) + if (!xfs_imap_valid(inode, &wpc->imap, end_offset)) goto fail_unlock_page; len = 1 << inode->i_blkbits; @@ -765,23 +741,22 @@ xfs_convert_page( if (buffer_unwritten(bh) || buffer_delay(bh) || buffer_mapped(bh)) { if (buffer_unwritten(bh)) - type = XFS_IO_UNWRITTEN; + wpc->io_type = XFS_IO_UNWRITTEN; else if (buffer_delay(bh)) - type = XFS_IO_DELALLOC; + wpc->io_type = XFS_IO_DELALLOC; else - type = XFS_IO_OVERWRITE; + wpc->io_type = XFS_IO_OVERWRITE; /* * imap should always be valid because of the above * partial page end_offset check on the imap. */ - ASSERT(xfs_imap_valid(inode, imap, offset)); + ASSERT(xfs_imap_valid(inode, &wpc->imap, offset)); lock_buffer(bh); - if (type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, imap, offset); - xfs_add_to_ioend(inode, bh, offset, type, - ioendp, done); + if (wpc->io_type != XFS_IO_OVERWRITE) + xfs_map_at_offset(inode, bh, &wpc->imap, offset); + xfs_add_to_ioend(inode, bh, offset, wpc); page_dirty--; count++; @@ -816,8 +791,7 @@ STATIC void xfs_cluster_write( struct inode *inode, pgoff_t tindex, - struct xfs_bmbt_irec *imap, - xfs_ioend_t **ioendp, + struct xfs_writepage_ctx *wpc, struct writeback_control *wbc, pgoff_t tlast) { @@ -833,7 +807,7 @@ xfs_cluster_write( for (i = 0; i < pagevec_count(&pvec); i++) { done = xfs_convert_page(inode, pvec.pages[i], tindex++, - imap, ioendp, wbc); + wpc, wbc); if (done) break; } @@ -919,6 +893,27 @@ out_invalidate: return; } +static int +xfs_writepage_submit( + struct xfs_writepage_ctx *wpc, + struct writeback_control *wbc, + int status) +{ + struct blk_plug plug; + + /* Reserve log space if we might write beyond the on-disk inode size. */ + if (!status && wpc->ioend && wpc->ioend->io_type != XFS_IO_UNWRITTEN && + xfs_ioend_is_append(wpc->ioend)) + status = xfs_setfilesize_trans_alloc(wpc->ioend); + + if (wpc->iohead) { + blk_start_plug(&plug); + xfs_submit_ioend(wbc, wpc->iohead, status); + blk_finish_plug(&plug); + } + return status; +} + /* * Write out a dirty page. * @@ -928,20 +923,19 @@ out_invalidate: * For any other dirty buffer heads on the page we should flush them. */ STATIC int -xfs_vm_writepage( +xfs_do_writepage( struct page *page, - struct writeback_control *wbc) + struct writeback_control *wbc, + void *data) { + struct xfs_writepage_ctx *wpc = data; struct inode *inode = page->mapping->host; struct buffer_head *bh, *head; - struct xfs_bmbt_irec imap; - xfs_ioend_t *ioend = NULL, *iohead = NULL; loff_t offset; - unsigned int type; __uint64_t end_offset; pgoff_t end_index, last_index; ssize_t len; - int err, imap_valid = 0, uptodate = 1; + int err, uptodate = 1; int count = 0; trace_xfs_writepage(inode, page, 0, 0); @@ -1040,11 +1034,8 @@ xfs_vm_writepage( bh = head = page_buffers(page); offset = page_offset(page); - type = XFS_IO_OVERWRITE; do { - int new_ioend = 0; - if (offset >= end_offset) break; if (!buffer_uptodate(bh)) @@ -1057,24 +1048,24 @@ xfs_vm_writepage( * buffers covering holes here. */ if (!buffer_mapped(bh) && buffer_uptodate(bh)) { - imap_valid = 0; + wpc->imap_valid = false; continue; } if (buffer_unwritten(bh)) { - if (type != XFS_IO_UNWRITTEN) { - type = XFS_IO_UNWRITTEN; - imap_valid = 0; + if (wpc->io_type != XFS_IO_UNWRITTEN) { + wpc->io_type = XFS_IO_UNWRITTEN; + wpc->imap_valid = false; } } else if (buffer_delay(bh)) { - if (type != XFS_IO_DELALLOC) { - type = XFS_IO_DELALLOC; - imap_valid = 0; + if (wpc->io_type != XFS_IO_DELALLOC) { + wpc->io_type = XFS_IO_DELALLOC; + wpc->imap_valid = false; } } else if (buffer_uptodate(bh)) { - if (type != XFS_IO_OVERWRITE) { - type = XFS_IO_OVERWRITE; - imap_valid = 0; + if (wpc->io_type != XFS_IO_OVERWRITE) { + wpc->io_type = XFS_IO_OVERWRITE; + wpc->imap_valid = false; } } else { if (PageUptodate(page)) @@ -1085,38 +1076,31 @@ xfs_vm_writepage( * subsequent writeable buffers into a new * ioend. */ - imap_valid = 0; + wpc->imap_valid = false; continue; } - if (imap_valid) - imap_valid = xfs_imap_valid(inode, &imap, offset); - if (!imap_valid) { - /* - * If we didn't have a valid mapping then we need to - * put the new mapping into a separate ioend structure. - * This ensures non-contiguous extents always have - * separate ioends, which is particularly important - * for unwritten extent conversion at I/O completion - * time. - */ - new_ioend = 1; - err = xfs_map_blocks(inode, offset, &imap, type); + if (wpc->imap_valid) + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); + if (!wpc->imap_valid) { + err = xfs_map_blocks(inode, offset, &wpc->imap, + wpc->io_type); if (err) goto error; - imap_valid = xfs_imap_valid(inode, &imap, offset); + wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, + offset); } - if (imap_valid) { + if (wpc->imap_valid) { lock_buffer(bh); - if (type != XFS_IO_OVERWRITE) - xfs_map_at_offset(inode, bh, &imap, offset); - xfs_add_to_ioend(inode, bh, offset, type, &ioend, - new_ioend); + if (wpc->io_type != XFS_IO_OVERWRITE) + xfs_map_at_offset(inode, bh, &wpc->imap, offset); + xfs_add_to_ioend(inode, bh, offset, wpc); count++; } - if (!iohead) - iohead = ioend; + if (!wpc->iohead) + wpc->iohead = wpc->ioend; } while (offset += len, ((bh = bh->b_this_page) != head)); @@ -1126,20 +1110,20 @@ xfs_vm_writepage( xfs_start_page_writeback(page, 1, count); /* if there is no IO to be submitted for this page, we are done */ - if (!ioend) + if (!count) return 0; - ASSERT(iohead); + ASSERT(wpc->iohead); /* * Any errors from this point onwards need tobe reported through the IO * completion path as we have marked the initial page as under writeback * and unlocked it. */ - if (imap_valid) { + if (wpc->imap_valid) { xfs_off_t end_index; - end_index = imap.br_startoff + imap.br_blockcount; + end_index = wpc->imap.br_startoff + wpc->imap.br_blockcount; /* to bytes */ end_index <<= inode->i_blkbits; @@ -1151,29 +1135,36 @@ xfs_vm_writepage( if (end_index > last_index) end_index = last_index; - xfs_cluster_write(inode, page->index + 1, &imap, &ioend, - wbc, end_index); + xfs_cluster_write(inode, page->index + 1, wpc, wbc, end_index); } - - /* - * Reserve log space if we might write beyond the on-disk inode size. - */ - err = 0; - if (ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) - err = xfs_setfilesize_trans_alloc(ioend); - - xfs_submit_ioend(wbc, iohead, err); - return 0; error: - if (iohead) - xfs_cancel_ioend(iohead); + /* + * We have to fail the iohead here because we buffers locked in the + * ioend chain. If we don't do this, we'll deadlock invalidating the + * page as that tries to lock the buffers on the page. Also, because we + * have set pages under writeback, we have to run IO completion to mark + * the error state of the IO appropriately, so we can't cancel the ioend + * directly here. That means we have to mark this page as under + * writeback if we included any buffers from it in the ioend chain. + */ + if (count) + xfs_start_page_writeback(page, 0, count); + xfs_writepage_submit(wpc, wbc, err); - xfs_aops_discard_page(page); - ClearPageUptodate(page); - unlock_page(page); + /* + * We can only discard the page we had the IO error on if we haven't + * included it in the ioend above. If it has already been errored out, + * the it is unlocked and we can't touch it here. + */ + if (!count) { + xfs_aops_discard_page(page); + ClearPageUptodate(page); + unlock_page(page); + } + mapping_set_error(page->mapping, err); return err; redirty: @@ -1183,12 +1174,36 @@ redirty: } STATIC int +xfs_vm_writepage( + struct page *page, + struct writeback_control *wbc) +{ + struct xfs_writepage_ctx wpc = { + .io_type = XFS_IO_OVERWRITE, + }; + int ret; + + ret = xfs_do_writepage(page, wbc, &wpc); + if (ret) + return ret; + return xfs_writepage_submit(&wpc, wbc, ret); +} + +STATIC int xfs_vm_writepages( struct address_space *mapping, struct writeback_control *wbc) { + struct xfs_writepage_ctx wpc = { + .io_type = XFS_IO_OVERWRITE, + }; + int ret; + xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); - return generic_writepages(mapping, wbc); + ret = write_cache_pages(mapping, wbc, xfs_do_writepage, &wpc); + if (ret) + return ret; + return xfs_writepage_submit(&wpc, wbc, ret); } /* -- 2.5.0 From weber@zbfmail.de Tue Aug 25 03:25:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 90DD97F37 for ; Tue, 25 Aug 2015 03:25:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A41FAC005 for ; Tue, 25 Aug 2015 01:25:27 -0700 (PDT) X-ASG-Debug-ID: 1440491120-04cbb07cbc59090001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id Zlb3D7D4NxAxlrQb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 01:25:21 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id 494A26EE0EA for ; Tue, 25 Aug 2015 10:25:16 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de 494A26EE0EA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440491120; bh=u91vcoilZ0mvhC6f9XNmzfPmpZmfKJ0vnFkLSkK5lV4=; h=Date:From:To:Subject:Reply-To; b=VympkEszDrpFsg9vOB7RGA8qCHjnQ4Cwws/ULeaeQ30kO34NrcSa8SXZO1TQ/naTA ErwUSqyNMNTLe/0x0Dr54g10AMEg+/yf3Kjw6dc+JVpQzdCXUvHmDlfwHo4ROLt6ln SF9qgmogHumTSLkbi+yT1nLkz25LXo6EQaqrwSYg= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Tue, 25 Aug 2015 10:25:16 +0200 From: Marko Weber|8000 To: Xfs Subject: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-wuwien-Metrics: mailserver 1290; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440491121 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21904 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello List, Hello Dave... i try to mount on my backup server an Lvm Partition and get errors in stdout and log: stdout: mount: wrong fs type, bad option, bad superblock on /dev/mapper/VolGroup01-storage01, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so. /var/log/messages: Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled! Aug 25 10:20:31 backupserver kernel: Use of these features in this kernel is at your own risk! Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Superblock has unknown read-only compatible features (0x1) enabled. Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Attempted to mount read-only compatible filesystem read-write. Aug 25 10:20:31 backupserver kernel: Filesystem can only be safely mounted read only. Aug 25 10:20:31 backupserver kernel: XFS (dm-2): SB validate failed with error 22. How do i solve this? I dont remember to have activated any experimental features in kernel. thanks, marko -- zbfmail - Mittendrin statt nur Datei! From zhengbin.08747@h3c.com Tue Aug 25 04:07:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 952D87F37 for ; Tue, 25 Aug 2015 04:07:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 104BCAC005 for ; Tue, 25 Aug 2015 02:07:46 -0700 (PDT) X-ASG-Debug-ID: 1440493662-04cb6c4a2952170001-NocioJ Received: from h3cmg01-ex.h3c.com (smtp.h3c.com [60.191.123.56]) by cuda.sgi.com with ESMTP id jcu7SNsobTjZtAYs for ; Tue, 25 Aug 2015 02:07:43 -0700 (PDT) X-Barracuda-Envelope-From: zhengbin.08747@h3c.com X-Barracuda-Apparent-Source-IP: 60.191.123.56 Received: from H3CHUB03-EX.srv.huawei-3com.com (unknown [10.63.20.169]) by h3cmg01-ex.h3c.com with smtp id 5cfb_0180_5f9230f5_87c9_449d_a38e_c2e786dabf9a; Tue, 25 Aug 2015 17:07:41 +0800 Received: from H3CMLB12-EX.srv.huawei-3com.com ([fe80::f091:bd11:f0a9:5cbe]) by H3CHUB03-EX.srv.huawei-3com.com ([fe80::ec6c:67e6:67f8:ce53%15]) with mapi id 14.01.0355.002; Tue, 25 Aug 2015 17:07:33 +0800 From: "zhengbin.08747@h3c.com" To: "xfs@oss.sgi.com" Subject: hello, my xfs has a probelm. does anybody know this?thank you Thread-Topic: hello, my xfs has a probelm. does anybody know this?thank you X-ASG-Orig-Subj: hello, my xfs has a probelm. does anybody know this?thank you Thread-Index: AdDfFGcn6JrvLpfIS/27/p8VDAI2qw== Date: Tue, 25 Aug 2015 09:08:06 +0000 Message-ID: <7B5C2F2226F8AF419D625C6097AD814C5E26FE9C@H3CMLB12-EX.srv.huawei-3com.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.96.70.193] Content-Type: multipart/alternative; boundary="_000_7B5C2F2226F8AF419D625C6097AD814C5E26FE9CH3CMLB12EXsrvhu_" MIME-Version: 1.0 X-Barracuda-Connect: smtp.h3c.com[60.191.123.56] X-Barracuda-Start-Time: 1440493662 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.69 X-Barracuda-Spam-Status: No, SCORE=1.69 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HELO_DYNAMIC_DHCP, HELO_DYNAMIC_DHCP_2, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21904 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HELO_DYNAMIC_DHCP Relay HELO'd using suspicious hostname (DHCP) 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message 1.66 HELO_DYNAMIC_DHCP_2 HELO_DYNAMIC_DHCP_2 --_000_7B5C2F2226F8AF419D625C6097AD814C5E26FE9CH3CMLB12EXsrvhu_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable My OS is redhat7.1, the version of Linux kernel is "Linux version 3.10.0-22= 9.el7.x86_64" Sometime xfs give a message like this Aug 11 15:51:05 localhost kernel: XFS (dm-4): metadata I/O error: block 0x7= d9a010 ("xfs_trans_read_buf_map") error 117 numblks 16 Aug 11 15:51:05 localhost kernel: XFS (dm-4): xfs_imap_to_bp: xfs_trans_rea= d_buf() returned error 117. Aug 11 15:31:08 localhost kernel: XFS (dm-4): Metadata corruption detected = at xfs_inode_buf_verify+0x75/0xd0 [xfs], block 0x7d9a010 Aug 11 15:31:08 localhost kernel: XFS (dm-4): Unmount and run xfs_repair Aug 11 15:31:08 localhost kernel: XFS (dm-4): First 64 bytes of corrupted m= etadata buffer: Aug 11 15:31:08 localhost kernel: ffff88089144a000: 00 00 00 00 00 00 00 00= 00 00 00 00 00 00 00 00 ................ Aug 11 15:31:08 localhost kernel: ffff88089144a010: 00 00 00 00 00 00 00 00= 00 00 00 00 00 00 00 00 ................ Aug 11 15:31:08 localhost kernel: ffff88089144a020: 00 00 00 00 00 00 00 00= 00 00 00 00 00 00 00 00 ................ Aug 11 15:31:08 localhost kernel: ffff88089144a030: 00 00 00 00 00 00 00 00= 00 00 00 00 00 00 00 00 ................ So is this a bug of xfs? or is the device's error(the device actually did n= ot save the data, but give xfs success message)? ---------------------------------------------------------------------------= ---------------------------------------------------------- ???????????????????????????????????????? ???????????????????????????????????????? ???????????????????????????????????????? ??? This e-mail and its attachments contain confidential information from H3C, = which is intended only for the person or entity whose address is listed above. Any u= se of the information contained herein in any way (including, but not limited to, tot= al or partial disclosure, reproduction, or dissemination) by persons other than the inten= ded recipient(s) is prohibited. If you receive this e-mail in error, please not= ify the sender by phone or email immediately and delete it! --_000_7B5C2F2226F8AF419D625C6097AD814C5E26FE9CH3CMLB12EXsrvhu_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

My OS is redhat7.1, the version= of Linux kernel is Lin= ux version 3.10.0-229.el7.x86_64

 

 

Sometime xfs give a message like this

 

Aug 11 15:51:05 localhost kerne= l: XFS (dm-4): metadata I/O error: block 0x7d9a010 ("xfs_trans_read_bu= f_map") error 117 numblks 16

Aug 11 15:51:05 localhost kerne= l: XFS (dm-4): xfs_imap_to_bp: xfs_trans_read_buf() returned error 117.&nbs= p;

 

Aug 11 15:31:08 localhost kerne= l: XFS (dm-4): Metadata corruption detected at xfs_inode_buf_verify+0x7= 5/0xd0 [xfs], block 0x7d9a010

Aug 11 15:31:08 localhost kerne= l: XFS (dm-4): Unmount and run xfs_repair

Aug 11 15:31:08 localhost kerne= l: XFS (dm-4): First 64 bytes of corrupted metadata buffer:

Aug 11 15:31:08 localhost kerne= l: ffff88089144a000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  = ................

Aug 11 15:31:08 localhost kerne= l: ffff88089144a010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  = ................

Aug 11 15:31:08 localhost kerne= l: ffff88089144a020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  = ................

Aug 11 15:31:08 localhost kerne= l: ffff88089144a030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  = ................

 

 

So is this a bug = of xfs? or is the device’s error(the device actually did not save the= data, but give xfs success message)?

 

 

 

---------------------------------------= ---------------------------------------------------------------------------= -------------------
本邮件及其附件含= 377;杭州华三通信技术有= ;限公司的保密信息,&#= 20165;限于发送给上面地ß= 36;中列出
的个人或群组。禁= 490;任何其他人以任何形= ;式使用(包括但不限&#= 20110;全部或部分地泄露z= 89;复制、
或散发)本邮件中= 340;信息。如果您错收了= ;本邮件,请您立即电&#= 35805;或邮件通知发件人ñ= 82;删除本
邮件!
This e-mail and its att= achments contain confidential information from H3C, which is
intended only for the person or entity whose address is listed above. Any u= se of the
information contained herein in any way (including, but not limited to, tot= al or partial
disclosure, reproduction, or dissemination) by persons other than the inten= ded
recipient(s) is prohibited. If you receive this e-mail in error, please not= ify the sender
by phone or email immediately and delete it!
--_000_7B5C2F2226F8AF419D625C6097AD814C5E26FE9CH3CMLB12EXsrvhu_-- From jack@suse.cz Tue Aug 25 04:42:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 115B57F37 for ; Tue, 25 Aug 2015 04:42:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC6478F8040 for ; Tue, 25 Aug 2015 02:42:22 -0700 (PDT) X-ASG-Debug-ID: 1440495738-04bdf0239853de0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id aNztMkoslUnu0dTC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 02:42:19 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2781FAB9D; Tue, 25 Aug 2015 09:42:18 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id B1FFD82823; Tue, 25 Aug 2015 11:42:14 +0200 (CEST) From: Jan Kara To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Jan Kara Subject: [PATCH] fstests: Add test of rename Date: Tue, 25 Aug 2015 11:42:10 +0200 X-ASG-Orig-Subj: [PATCH] fstests: Add test of rename Message-Id: <1440495730-14093-1-git-send-email-jack@suse.com> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440495739 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21905 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Test renaming of various entry types in directories of various sizes. Check that filesystem didn't get corrupted. Signed-off-by: Jan Kara --- tests/generic/326 | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 2 files changed, 94 insertions(+) create mode 100755 tests/generic/326 This is a regression test for ftype handling bug I've fixed last week in XFS. I've made the test to iterate relatively densely over a wide range of directory sizes so that it can be used to test handling of different directory formats also for other filesystems (e.g. ext4 has inline & normal directories, UDF as well). I have verified that for XFS we test directory operations for all directory types. diff --git a/tests/generic/326 b/tests/generic/326 new file mode 100755 index 000000000000..a8d9e9b5a34f --- /dev/null +++ b/tests/generic/326 @@ -0,0 +1,93 @@ +#! /bin/bash +# FS QA Test No. 326 +# +# Test rename for various sizes of directories. This is motivated by a bug +# in XFS where directory entry file type was not updated properly on rename. +# +#----------------------------------------------------------------------- +# Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved. +# Author: Jan Kara +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +status=1 # failure is the default! + +filldir() +{ + for (( i = 0; i < $1; i++ )); do + touch "fname$i" + done +} + +# Test renaming of file, symlink over file, symlink, non-existent +# name +renamedir() +{ + touch fs1 + touch fs2 + touch fs3 + touch fd1 + touch fd2 + ln -s foo ss1 + ln -s foo ss2 + ln -s foo ss3 + ln -s foo sd1 + ln -s foo sd2 + + mv -T fs1 fd1 + mv -T fs2 sd1 + mv -T fs3 ed1 + + mv -T ss1 fd2 + mv -T ss2 sd2 + mv -T ss3 ed2 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/log + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +_scratch_mkfs >> $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +# Test different directory sizes to test various directory formats +for f in 1 2 3 4 5 8 12 18 27 40 60 90 135 202 303 454 681 1020 1530 2295; do + mkdir $SCRATCH_MNT/dir$f + pushd $SCRATCH_MNT/dir$f >/dev/null + filldir $f + renamedir + popd >/dev/null +done + +if _check_scratch_fs; then + _echofull "Scratch fs is fine after renames" + status=0 +fi + +exit diff --git a/tests/generic/group b/tests/generic/group index a33536ec2a0a..612cb8efe879 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -204,3 +204,4 @@ 323 auto aio stress 324 auto fsr quick 325 auto quick data log +326 auto metadata dir -- 2.1.4 From david@fromorbit.com Tue Aug 25 06:54:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB1B27F37 for ; Tue, 25 Aug 2015 06:54:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6580FAC004 for ; Tue, 25 Aug 2015 04:54:31 -0700 (PDT) X-ASG-Debug-ID: 1440503665-04bdf0239856cb0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id sHqBCSgu6YDskiJ3 for ; Tue, 25 Aug 2015 04:54:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D2DgDyVtxV/0DvLHldgxuBPYJXpz0BAQEBAQEGm1gEAgKBNk0BAQEBAQGBC0EFg14BAQQ6HCMQCAMYCSUPBSUDNIgtx1gBCyAZhgqFNIQeIUsHF4QVBYcmhm+HH4xvgU2HTI1Pg2omhBAsM4EHJYEgAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2015 21:24:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUCns-0002fM-8k; Tue, 25 Aug 2015 21:54:12 +1000 Date: Tue, 25 Aug 2015 21:54:12 +1000 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Message-ID: <20150825115412.GI714@dastard> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440503665 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 25, 2015 at 10:25:16AM +0200, Marko Weber|8000 wrote: > > Hello List, Hello Dave... > > > i try to mount on my backup server an Lvm Partition and get errors > in stdout and log: > > /var/log/messages: > > Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Version 5 > superblock detected. This kernel has EXPERIMENTAL support enabled! > Aug 25 10:20:31 backupserver kernel: Use of these features in this > kernel is at your own risk! > Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Superblock has > unknown read-only compatible features (0x1) enabled. > Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Attempted to mount > read-only compatible filesystem read-write. > Aug 25 10:20:31 backupserver kernel: Filesystem can only be safely > mounted read only. > Aug 25 10:20:31 backupserver kernel: XFS (dm-2): SB validate failed > with error 22. You need to run the same version kernel on both servers. The primary has a more recent kernel and feature set than your older backup server is running. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Aug 25 09:54:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C0CE7F47 for ; Tue, 25 Aug 2015 09:54:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B59D30404E for ; Tue, 25 Aug 2015 07:54:08 -0700 (PDT) X-ASG-Debug-ID: 1440514441-04bdf023975bea0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MJkT7E2DgRcCFEW8 for ; Tue, 25 Aug 2015 07:54:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id ED66F63C77A5; Tue, 25 Aug 2015 09:54:00 -0500 (CDT) Message-ID: <55DC8188.5060004@sandeen.net> Date: Tue, 25 Aug 2015 09:54:00 -0500 From: Eric Sandeen MIME-Version: 1.0 To: "zhengbin.08747@h3c.com" , "xfs@oss.sgi.com" Subject: Re: hello, my xfs has a probelm. does anybody know this?thank you References: <7B5C2F2226F8AF419D625C6097AD814C5E26FE9C@H3CMLB12-EX.srv.huawei-3com.com> X-ASG-Orig-Subj: Re: hello, my xfs has a probelm. does anybody know this?thank you In-Reply-To: <7B5C2F2226F8AF419D625C6097AD814C5E26FE9C@H3CMLB12-EX.srv.huawei-3com.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440514441 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21910 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/25/15 4:08 AM, zhengbin.08747@h3c.com wrote: > My OS is redhat7.1, the version of Linux kernel is “Linux version 3.10.0-229.el7.x86_64” > > Sometime xfs give a message like this > > Aug 11 15:51:05 localhost kernel: XFS (dm-4): metadata I/O error: block 0x7d9a010 ("xfs_trans_read_buf_map") error 117 numblks 16 > Aug 11 15:51:05 localhost kernel: XFS (dm-4): xfs_imap_to_bp: xfs_trans_read_buf() returned error 117. > Aug 11 15:31:08 localhost kernel: XFS (dm-4): Metadata corruption detected at xfs_inode_buf_verify+0x75/0xd0 [xfs], block 0x7d9a010 > Aug 11 15:31:08 localhost kernel: XFS (dm-4): Unmount and run xfs_repair Did you try running xfs_repair (or possibly better for the first run, do xfs_repair -n, to do a check-only run?) > Aug 11 15:31:08 localhost kernel: XFS (dm-4): First 64 bytes of corrupted metadata buffer: > Aug 11 15:31:08 localhost kernel: ffff88089144a000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > Aug 11 15:31:08 localhost kernel: ffff88089144a010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > Aug 11 15:31:08 localhost kernel: ffff88089144a020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ > Aug 11 15:31:08 localhost kernel: ffff88089144a030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ So it seems to have read a completely zeroed-out block. Isn't there a stack trace after this part of the message? Hm I guess not; if you can hit it again, try # sysctl -w fs.xfs.error_level=11 to turn up the error reporting level. Any chance that this is a thinly provisioned device? Or what type of dm device is it? > So is this a bug of xfs? or is the device’s error(the device actually did not save the data, but give xfs success message)? Hard to say at this point. -Eric From sandeen@redhat.com Tue Aug 25 11:39:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E4DA77F47 for ; Tue, 25 Aug 2015 11:39:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 910B3AC007 for ; Tue, 25 Aug 2015 09:39:31 -0700 (PDT) X-ASG-Debug-ID: 1440520770-04bdf0239a5f9d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WEpIwuAocEIMllqI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 09:39:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id B4CE58E3E8 for ; Tue, 25 Aug 2015 16:39:30 +0000 (UTC) Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7PGdT5H030964 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 12:39:30 -0400 Message-ID: <55DC9A41.8060006@redhat.com> Date: Tue, 25 Aug 2015 11:39:29 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfsprogs: properly terminate string in quota's restore_file() Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfsprogs: properly terminate string in quota's restore_file() Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440520770 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This code copies up to the entire size of devbuffer, and then tries to use "strlen" to null terminate it. But strlen works by *finding* the null, so it's at best a no-op, and at worst not properly terminating the string. Fix this by placing the null at the last byte of the buffer. Addresses-Coverity-Id: 1297519 Signed-off-by: Eric Sandeen --- diff --git a/quota/edit.c b/quota/edit.c index d226e89..a53a7e6 100644 --- a/quota/edit.c +++ b/quota/edit.c @@ -385,7 +385,7 @@ restore_file( while (fgets(buffer, sizeof(buffer), fp) != NULL) { if (strncmp("fs = ", buffer, 5) == 0) { dev = strncpy(devbuffer, buffer+5, sizeof(devbuffer)); - dev[strlen(dev) - 1] = '\0'; + dev[sizeof(devbuffer) - 1] = '\0'; continue; } rtbsoft = rtbhard = 0; From weber@zbfmail.de Tue Aug 25 11:51:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A07227F47 for ; Tue, 25 Aug 2015 11:51:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4C417AC009 for ; Tue, 25 Aug 2015 09:51:10 -0700 (PDT) X-ASG-Debug-ID: 1440521466-04bdf023985fe70001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id UvDIE2LzdBu4N0qc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 09:51:07 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id E3C4A1129A3 for ; Tue, 25 Aug 2015 18:51:05 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de E3C4A1129A3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440521466; bh=GBGXRvvNpZwe/XOVN5GroAz25vbumuseu2/Zfsbn+xo=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=U4/ZO550V5b33qTekkVgH+X9zq7S274ETGUihag50BDcZl4T9/35XtHGzglWgv7lx FUhVRIQmfQ0mhtPxcsJgfqmLdF9xlD12DcmF31/KJdk/+XBhGA5DJfAFenXdmccu2Q qLlLzeC7253z6I7K/8CBgv58xQdiNzsGIUFkLkJo= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Tue, 25 Aug 2015 18:51:05 +0200 From: Marko Weber|8000 To: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <20150825115412.GI714@dastard> References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> Message-ID: <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-EATSERVER-Metrics: mailserver 1166; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440521467 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21914 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature dave, Am 2015-08-25 13:54, schrieb Dave Chinner: > On Tue, Aug 25, 2015 at 10:25:16AM +0200, Marko Weber|8000 wrote: >> >> Hello List, Hello Dave... >> >> >> i try to mount on my backup server an Lvm Partition and get errors >> in stdout and log: >> >> /var/log/messages: >> >> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Version 5 >> superblock detected. This kernel has EXPERIMENTAL support enabled! >> Aug 25 10:20:31 backupserver kernel: Use of these features in this >> kernel is at your own risk! >> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Superblock has >> unknown read-only compatible features (0x1) enabled. >> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Attempted to mount >> read-only compatible filesystem read-write. >> Aug 25 10:20:31 backupserver kernel: Filesystem can only be safely >> mounted read only. >> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): SB validate failed >> with error 22. > > You need to run the same version kernel on both servers. The primary > has a more recent kernel and feature set than your older backup > server is running. > > Cheers, > > Dave. you was right. There was new kernel built. /usr/src/linux pointed to new kernel source. But machine was not rebooted. So kernel version before kernel built was loaded. I rebooted machine. i renoved logical volume i created logical volume i tried to mount it and get: Aug 25 18:43:15 backupserver kernel: md4: unknown partition table Aug 25 18:43:15 backupserver syslog-ng[1417]: Internal error, alarm_set() called while an alarm is still active; Aug 25 18:43:56 backupserver kernel: md4: unknown partition table Aug 25 18:44:01 backupserver kernel: XFS (dm-2): Invalid superblock magic number pvdisplay shows: # pvdisplay --- Physical volume --- PV Name /dev/md4 VG Name VolGroup01 PV Size 2.69 TiB / not usable 1.25 MiB so what is XFS missing? From sandeen@sandeen.net Tue Aug 25 11:56:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9C9317F47 for ; Tue, 25 Aug 2015 11:56:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 39C15AC008 for ; Tue, 25 Aug 2015 09:56:07 -0700 (PDT) X-ASG-Debug-ID: 1440521757-04bdf0239860030001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id v6nrhinPvBv6kg8j for ; Tue, 25 Aug 2015 09:55:58 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 638ED63C77A5 for ; Tue, 25 Aug 2015 11:55:57 -0500 (CDT) Message-ID: <55DC9E1C.8090009@sandeen.net> Date: Tue, 25 Aug 2015 11:55:56 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: Re: [PATCH] xfs_repair: set args.geo in dir2_kill_block References: <55B14B40.5030209@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: set args.geo in dir2_kill_block In-Reply-To: <55B14B40.5030209@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440521757 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21914 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave, ping on this? Thanks, -Eric On 7/23/15 3:14 PM, Eric Sandeen wrote: > This path in xfs_repair: > > dir2_kill_block > libxfs_da_shrink_inode > xfs_dir2_shrink_inode > xfs_dir2_db_to_da > > segfaults, because dir2_kill_block() does not initialize > args.geo, and a null geometry winds up in xfs_dir2_db_to_da(), > which dereferences it. > > Fix that. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/repair/phase6.c b/repair/phase6.c > index de445c6..0c952ed 100644 > --- a/repair/phase6.c > +++ b/repair/phase6.c > @@ -1438,6 +1438,7 @@ dir2_kill_block( > args.firstblock = &firstblock; > args.flist = &flist; > args.whichfork = XFS_DATA_FORK; > + args.geo = mp->m_dir_geo; > if (da_bno >= mp->m_dir_geo->leafblk && da_bno < mp->m_dir_geo->freeblk) > error = -libxfs_da_shrink_inode(&args, da_bno, bp); > else > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From htejun@gmail.com Tue Aug 25 13:12:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 05A6B7F47 for ; Tue, 25 Aug 2015 13:12:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E843730404E for ; Tue, 25 Aug 2015 11:11:57 -0700 (PDT) X-ASG-Debug-ID: 1440526315-04cb6c4a2b5e3d0001-NocioJ Received: from mail-yk0-f178.google.com (mail-yk0-f178.google.com [209.85.160.178]) by cuda.sgi.com with ESMTP id 0arlPr9I7NODKek8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Aug 2015 11:11:55 -0700 (PDT) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.178] Received: by ykfw73 with SMTP id w73so164390065ykf.3 for ; Tue, 25 Aug 2015 11:11:55 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=efqsTIFBLamhL93IRaz6TiaLzHv+OlNm9vGvb/RGqMI=; b=N+tL1MUejrb5JsJMJcYVYmRkfkA21iag1i/3q6D4UyRYV652x8+r/to7rak0oE/eUp bc5Ju8PWbCUXJ4Yzkf2M44v6GDq20B3oS2dR4QTVgnXA3EQpHOYfEBQUCdiCq6rZUV+B d7jjIUXTvFSZfNvU8YJEha8Ikd3lkjpaayt293XKl2M3fC1mwbAKVMa3lLL81dSo1v4+ 5h6IdhkuRA9f2SJkA99k0VY3kZHXwluHQm7XpZ79NjRM9aJzNc7OBm8G9qy2iBfqSSPf FCQTfdvm6Zc3Dla16EEgq3i8C8aUtX+ENhMmJicoXcUikcNfYn0HxMb7WPzox+0xAKW/ GKfA== X-Received: by 10.13.219.129 with SMTP id d123mr39918395ywe.54.1440526315239; Tue, 25 Aug 2015 11:11:55 -0700 (PDT) Received: from mtj.duckdns.org ([2620:10d:c0a1:f80::e:1a35]) by smtp.gmail.com with ESMTPSA id f123sm32892ywb.15.2015.08.25.11.11.53 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Aug 2015 11:11:54 -0700 (PDT) Sender: Tejun Heo Date: Tue, 25 Aug 2015 14:11:52 -0400 From: Tejun Heo To: Jens Axboe , Jan Kara Cc: Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() Message-ID: <20150825181152.GA26785@mtj.duckdns.org> X-ASG-Orig-Subj: [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150813224415.GG4496@mtj.duckdns.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-yk0-f178.google.com[209.85.160.178] X-Barracuda-Start-Time: 1440526315 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21916 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature e79729123f63 ("writeback: don't issue wb_writeback_work if clean") updated writeback path to avoid kicking writeback work items if there are no inodes to be written out; unfortunately, the avoidance logic was too aggressive and broke sync_inodes_sb(). * sync_inodes_sb() must write out I_DIRTY_TIME inodes but I_DIRTY_TIME inodes dont't contribute to bdi/wb_has_dirty_io() tests and were being skipped over. * inodes are taken off wb->b_dirty/io/more_io lists after writeback starts on them. sync_inodes_sb() skipping wait_sb_inodes() when bdi_has_dirty_io() breaks it by making it return while writebacks are in-flight. This patch fixes the breakages by * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs(). The callers are already testing the condition. * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that it always calls into bdi_split_work_to_wbs() and wait_sb_inodes(). * Making bdi_split_work_to_wbs() consider the b_dirty_time list for WB_SYNC_ALL writebacks. Kudos to Eryu, Dave and Jan for tracking down the issue. Signed-off-by: Tejun Heo Fixes: e79729123f63 ("writeback: don't issue wb_writeback_work if clean") Link: http://lkml.kernel.org/g/20150812101204.GE17933@dhcp-13-216.nay.redhat.com Reported-and-bisected-by: Eryu Guan Cc: Dave Chinner Cc: Jan Kara Cc: Ted Ts'o --- fs/fs-writeback.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -844,14 +844,15 @@ static void bdi_split_work_to_wbs(struct struct wb_iter iter; might_sleep(); - - if (!bdi_has_dirty_io(bdi)) - return; restart: rcu_read_lock(); bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { - if (!wb_has_dirty_io(wb) || - (skip_if_busy && writeback_in_progress(wb))) + /* SYNC_ALL writes out I_DIRTY_TIME too */ + if (!wb_has_dirty_io(wb) && + (base_work->sync_mode == WB_SYNC_NONE || + list_empty(&wb->b_dirty_time))) + continue; + if (skip_if_busy && writeback_in_progress(wb)) continue; base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); @@ -899,8 +900,7 @@ static void bdi_split_work_to_wbs(struct { might_sleep(); - if (bdi_has_dirty_io(bdi) && - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { base_work->auto_free = 0; base_work->single_wait = 0; base_work->single_done = 0; @@ -2275,8 +2275,12 @@ void sync_inodes_sb(struct super_block * }; struct backing_dev_info *bdi = sb->s_bdi; - /* Nothing to do? */ - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) + /* + * Can't skip on !bdi_has_dirty() because we should wait for !dirty + * inodes under writeback and I_DIRTY_TIME inodes ignored by + * bdi_has_dirty() need to be written out too. + */ + if (bdi == &noop_backing_dev_info) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); From sandeen@sandeen.net Tue Aug 25 13:18:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 77D3D7F54 for ; Tue, 25 Aug 2015 13:18:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 152C2AC005 for ; Tue, 25 Aug 2015 11:18:02 -0700 (PDT) X-ASG-Debug-ID: 1440526681-04bdf0239862000001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mWrOmUOLnlHI6ea6 for ; Tue, 25 Aug 2015 11:18:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 21A6A63C3C9A; Tue, 25 Aug 2015 13:18:01 -0500 (CDT) Message-ID: <55DCB158.20505@sandeen.net> Date: Tue, 25 Aug 2015 13:18:00 -0500 From: Eric Sandeen MIME-Version: 1.0 To: weber@zbfmail.de, Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? In-Reply-To: <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440526681 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21916 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/25/15 11:51 AM, Marko Weber|8000 wrote: > > dave, > > Am 2015-08-25 13:54, schrieb Dave Chinner: >> On Tue, Aug 25, 2015 at 10:25:16AM +0200, Marko Weber|8000 wrote: >>> >>> Hello List, Hello Dave... >>> >>> >>> i try to mount on my backup server an Lvm Partition and get errors >>> in stdout and log: >>> >>> /var/log/messages: >>> >>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Version 5 >>> superblock detected. This kernel has EXPERIMENTAL support enabled! >>> Aug 25 10:20:31 backupserver kernel: Use of these features in this >>> kernel is at your own risk! >>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Superblock has >>> unknown read-only compatible features (0x1) enabled. >>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Attempted to mount >>> read-only compatible filesystem read-write. >>> Aug 25 10:20:31 backupserver kernel: Filesystem can only be safely >>> mounted read only. >>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): SB validate failed >>> with error 22. >> >> You need to run the same version kernel on both servers. The primary >> has a more recent kernel and feature set than your older backup >> server is running. >> >> Cheers, >> >> Dave. > > you was right. > There was new kernel built. /usr/src/linux pointed to new kernel source. > But machine was not rebooted. So kernel version before kernel built was loaded. > I rebooted machine. > i renoved logical volume > i created logical volume Hope it landed back in the same place! > i tried to mount it and get: > > Aug 25 18:43:15 backupserver kernel: md4: unknown partition table > Aug 25 18:43:15 backupserver syslog-ng[1417]: Internal error, alarm_set() called while an alarm is still active; > Aug 25 18:43:56 backupserver kernel: md4: unknown partition table > Aug 25 18:44:01 backupserver kernel: XFS (dm-2): Invalid superblock magic number > > pvdisplay shows: > > # pvdisplay > --- Physical volume --- > PV Name /dev/md4 > VG Name VolGroup01 > PV Size 2.69 TiB / not usable 1.25 MiB > > > so what is XFS missing? what does blkid /dev/md4 say? It looks like you might have a storage problem, now, and xfs can't even find a proper magic number on that device. -Eric From sandeen@sandeen.net Tue Aug 25 13:34:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 32A227F51 for ; Tue, 25 Aug 2015 13:34:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 10967304043 for ; Tue, 25 Aug 2015 11:34:24 -0700 (PDT) X-ASG-Debug-ID: 1440527662-04cbb07cbb68e10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jnOufH1M2lUphHz8 for ; Tue, 25 Aug 2015 11:34:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6CA5863C3C99 for ; Tue, 25 Aug 2015 13:34:22 -0500 (CDT) Message-ID: <55DCB52D.3030809@sandeen.net> Date: Tue, 25 Aug 2015 13:34:21 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs_repair: set args.geo in longform_dir2_entry_check_data Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs_repair: set args.geo in longform_dir2_entry_check_data Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440527662 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21918 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Here's another one where we miss setting da_args->geo: longform_dir2_entry_check_data struct xfs_da_args da = { .dp = ip, // .geo is unset }; ... libxfs_dir2_data_make_free(&da ...) xfs_dir2_data_make_free endptr = (char *)hdr + args->geo->blksize; BOOM Addresses-Coverity-Id: 1298008 Signed-off-by: Eric Sandeen --- Have to wonder if there are more of these :( diff --git a/repair/phase6.c b/repair/phase6.c index 04638c2..951587e 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1506,6 +1506,7 @@ longform_dir2_entry_check_data( int wantmagic; struct xfs_da_args da = { .dp = ip, + .geo = mp->m_dir_geo, }; From weber@zbfmail.de Tue Aug 25 14:26:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F0FA929DF6 for ; Tue, 25 Aug 2015 14:26:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E00B1304043 for ; Tue, 25 Aug 2015 12:26:46 -0700 (PDT) X-ASG-Debug-ID: 1440530803-04cb6c4a2a5fce0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id PMa6NpkeneFzrJco (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 12:26:43 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id D659F6EE0E9 for ; Tue, 25 Aug 2015 21:26:42 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de D659F6EE0E9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440530803; bh=bGVavJGs1YLXr1jT95OutFtJbD5TdNbSzzErN7kReFE=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=LZrkW67SWcdSm1ehmokiXf2RSWtmFWscRIc5ZwRUEOk5USUgRvAwWr9cWFRvt0NIb upoJMrGSi8y6kyUjMUR02xawF7r9jmrmOO4MRH9NsF7FVGRCxHGzdhTlSAWFwyBfFV I8dag8kTwEmOx9ki6WRuKGL229TVv4ELalefp5G0= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Tue, 25 Aug 2015 21:26:42 +0200 From: Marko Weber|8000 To: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <55DCB158.20505@sandeen.net> References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-EATSERVER-Metrics: mailserver 1166; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440530803 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21919 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature hi eric, > Am 2015-08-25 20:18, schrieb Eric Sandeen: > On 8/25/15 11:51 AM, Marko Weber|8000 wrote: >> >> dave, >> >> Am 2015-08-25 13:54, schrieb Dave Chinner: >>> On Tue, Aug 25, 2015 at 10:25:16AM +0200, Marko Weber|8000 wrote: >>>> >>>> Hello List, Hello Dave... >>>> >>>> >>>> i try to mount on my backup server an Lvm Partition and get errors >>>> in stdout and log: >>>> >>>> /var/log/messages: >>>> >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Version 5 >>>> superblock detected. This kernel has EXPERIMENTAL support enabled! >>>> Aug 25 10:20:31 backupserver kernel: Use of these features in this >>>> kernel is at your own risk! >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Superblock has >>>> unknown read-only compatible features (0x1) enabled. >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Attempted to mount >>>> read-only compatible filesystem read-write. >>>> Aug 25 10:20:31 backupserver kernel: Filesystem can only be safely >>>> mounted read only. >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): SB validate failed >>>> with error 22. >>> >>> You need to run the same version kernel on both servers. The primary >>> has a more recent kernel and feature set than your older backup >>> server is running. >>> >>> Cheers, >>> >>> Dave. >> >> you was right. >> There was new kernel built. /usr/src/linux pointed to new kernel >> source. >> But machine was not rebooted. So kernel version before kernel built >> was loaded. >> I rebooted machine. >> i renoved logical volume >> i created logical volume > > Hope it landed back in the same place! > >> i tried to mount it and get: >> >> Aug 25 18:43:15 backupserver kernel: md4: unknown partition table >> Aug 25 18:43:15 backupserver syslog-ng[1417]: Internal error, >> alarm_set() called while an alarm is still active; >> Aug 25 18:43:56 backupserver kernel: md4: unknown partition table >> Aug 25 18:44:01 backupserver kernel: XFS (dm-2): Invalid superblock >> magic number >> >> pvdisplay shows: >> >> # pvdisplay >> --- Physical volume --- >> PV Name /dev/md4 >> VG Name VolGroup01 >> PV Size 2.69 TiB / not usable 1.25 MiB >> >> >> so what is XFS missing? > > what does blkid /dev/md4 say? > > It looks like you might have a storage problem, now, and xfs can't > even find a proper magic number on that device. smartcl says all is ok. AND the othetr two lvm partitions get mounted well.... blkid output: ~ # blkid /dev/md4 /dev/md4: UUID="7LYlkp-33ro-qyal-yGkZ-pMwC-Ei1L-Viy4UJ" TYPE="LVM2_member" marko > > -Eric > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue Aug 25 15:04:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2434B7F47 for ; Tue, 25 Aug 2015 15:04:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3565AC005 for ; Tue, 25 Aug 2015 13:04:43 -0700 (PDT) X-ASG-Debug-ID: 1440533078-04cb6c4a2860950001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HrNg66cVXpE9dVPq for ; Tue, 25 Aug 2015 13:04:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6358663C77A5; Tue, 25 Aug 2015 15:04:38 -0500 (CDT) Message-ID: <55DCCA55.4010901@sandeen.net> Date: Tue, 25 Aug 2015 15:04:37 -0500 From: Eric Sandeen MIME-Version: 1.0 To: weber@zbfmail.de, Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440533078 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21920 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/25/15 2:26 PM, Marko Weber|8000 wrote: >>> pvdisplay shows: >>> >>> # pvdisplay >>> --- Physical volume --- >>> PV Name /dev/md4 >>> VG Name VolGroup01 >>> PV Size 2.69 TiB / not usable 1.25 MiB >>> >>> >>> so what is XFS missing? >> >> what does blkid /dev/md4 say? >> >> It looks like you might have a storage problem, now, and xfs can't >> even find a proper magic number on that device. > > smartcl says all is ok. > AND the othetr two lvm partitions get mounted well.... > > blkid output: > > ~ # blkid /dev/md4 > /dev/md4: UUID="7LYlkp-33ro-qyal-yGkZ-pMwC-Ei1L-Viy4UJ" TYPE="LVM2_member" Sorry, I shouldn't have asked for /dev/md4; that's your physical volume, not a logical volume. I meant to ask for blkid of whatever dm-2 is. Anyway, from: > Aug 25 18:44:01 backupserver kernel: XFS (dm-2): Invalid superblock magic number it seems that the dm-2 device doesn't actually contain an xfs filesystem, so this looks like a storage config problem, not an xfs problem. -Eric -Eric From shrinand@maginatics.com Tue Aug 25 15:32:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 04D007F54 for ; Tue, 25 Aug 2015 15:32:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 830AEAC007 for ; Tue, 25 Aug 2015 13:32:49 -0700 (PDT) X-ASG-Debug-ID: 1440534765-04cbb07cbd6b830001-NocioJ Received: from mail-lb0-f171.google.com (mail-lb0-f171.google.com [209.85.217.171]) by cuda.sgi.com with ESMTP id HUeOzXtPyIScxs1R (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Aug 2015 13:32:46 -0700 (PDT) X-Barracuda-Envelope-From: shrinand@maginatics.com X-Barracuda-Apparent-Source-IP: 209.85.217.171 Received: by lbbpu9 with SMTP id pu9so107588572lbb.3 for ; Tue, 25 Aug 2015 13:32:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=apAfDNa8Ncy3tXby5xG3IEXzGeVqwRrryD9qpyUe2Vo=; b=fE2efF6p48iVUJwX8s6xiPBgf8jU9EymtxKgeN2wRHPrv83vmiKeu9IG9OweAugZIw fs97pmad5lKrtch1fBBhD9B+ltnuquG76WeKi3cPmUzGI7OHllYqS16r8gxREuCxu3ci tBcg1ZMUfkx4yOe33V9d06xnCt8kJ/au3MjisIg1ZdJEd2zHO2MhF36hD2e8bSy7SHe1 YqTR1NJqh79r8NRhRg25qTEbiKNt8SqskxwZShjX0JZ3jxSeyrrIyKxmG0i+I6vl6WO4 PwB83Z7cE4/xevB1Mq2E4CSo7k+oKhbQBkQD8XJsLLhLBKnez9C9Krob2vXmXs/Q//qd HPBg== X-Gm-Message-State: ALoCoQnFDRCH+te3je7dSFHsq7CJRNx8iuil4Z14mg5Q1SygQ8UJhJk8iupXjxT54i7sn1KHz1/M MIME-Version: 1.0 X-Received: by 10.112.73.33 with SMTP id i1mr28024718lbv.31.1440534764736; Tue, 25 Aug 2015 13:32:44 -0700 (PDT) Received: by 10.25.31.7 with HTTP; Tue, 25 Aug 2015 13:32:44 -0700 (PDT) Date: Tue, 25 Aug 2015 13:32:44 -0700 Message-ID: Subject: Performance impact of mkfs.xfs vs mkfs.xfs -f From: Shrinand Javadekar X-ASG-Orig-Subj: Performance impact of mkfs.xfs vs mkfs.xfs -f To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f171.google.com[209.85.217.171] X-Barracuda-Start-Time: 1440534765 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I have 23 disks formatted with XFS on a single server. The workload is Openstack Swift. See this email from a few months ago about the details: http://oss.sgi.com/archives/xfs/2015-06/msg00108.html I am observing some strange behavior and would like to get some feedback about why this is happening. I formatted the disks with xfs (mkfs.xfs) and deployed Openstack Swift on it. Writing 100GB of data into Swift in batches of 20GB each gave us the following throughput: 20 GB: 93MB/s 40 GB: 65MB/s 60 GB: 52MB/s 80 GB: 50MB/s 100 GB: 48MB/s I then re-formatted the disks with mkfs.xfs -f and ran the experiment again. This time I got the following throughput: 20 GB: 118MB/s 40 GB: 95MB/s 60 GB: 74MB/s 80 GB: 68MB/s 100 GB: 63MB/s I've seen similar results twice. Any ideas why this might be happening? Thanks in advance. -Shri From axboe@kernel.dk Tue Aug 25 15:37:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 21BA07F54 for ; Tue, 25 Aug 2015 15:37:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 90B12AC005 for ; Tue, 25 Aug 2015 13:37:20 -0700 (PDT) X-ASG-Debug-ID: 1440535038-04cbb07cbd6b970001-NocioJ Received: from mail-ig0-f170.google.com (mail-ig0-f170.google.com [209.85.213.170]) by cuda.sgi.com with ESMTP id YDctsiePTW5lF4ry (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Aug 2015 13:37:18 -0700 (PDT) X-Barracuda-Envelope-From: axboe@kernel.dk Received: by igcse8 with SMTP id se8so23399248igc.1 for ; Tue, 25 Aug 2015 13:37:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-type :content-transfer-encoding; bh=KXAPNMLnRt0FpybB9WUSq0sSs0tGjSAYWRGLwqoeb4s=; b=RoedZz1G2vIs7qNgdjEBmzb0ppNcLdP8PV8Kgogm0AWhcZj2QWs6MPtapUZ0g2+HFy OTunPyKLNZhLzs1++oAE7uqsIViuKJeVIiMG5Tm2aRHUlG6x1dq2GuTsX1wYbUiryflx dlALBXmM0Hx97ueG02G2KwhXVgTf7CzJgsdw59voxq18IO6vBXyA4xfygcx4Q0PyclgG WPLJhHVzEKUB+nwlA+Yxf/e/H3V7ERAS3r9WXXAiyeF0S7jMbYDHoBxo/oqyGc7lIvMO Pj7jCWKmn50QgaIdG6YHr2R4utZdpblBo25ynPrIdRwzHl5FBNQF7XG9t32NOcgYr0cK fh1w== X-Gm-Message-State: ALoCoQk04Y5imJ/Xm6Va4LTe/OcmyFTSlHX+5WDxtThkkLQr51inciZQYoSc5c32pIvmYuPPDvWp X-Received: by 10.50.138.71 with SMTP id qo7mr6011713igb.12.1440535038475; Tue, 25 Aug 2015 13:37:18 -0700 (PDT) Received: from [192.168.1.120] ([216.160.245.98]) by smtp.gmail.com with ESMTPSA id h124sm7920341ioh.29.2015.08.25.13.37.17 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Aug 2015 13:37:17 -0700 (PDT) Subject: Re: [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() To: Tejun Heo , Jan Kara X-ASG-Orig-Subj: Re: [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150825181152.GA26785@mtj.duckdns.org> Cc: Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com From: Jens Axboe Message-ID: <55DCD1FD.6070809@kernel.dk> Date: Tue, 25 Aug 2015 14:37:17 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <20150825181152.GA26785@mtj.duckdns.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ig0-f170.google.com[209.85.213.170] X-Barracuda-Start-Time: 1440535038 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21921 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 08/25/2015 12:11 PM, Tejun Heo wrote: > e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > updated writeback path to avoid kicking writeback work items if there > are no inodes to be written out; unfortunately, the avoidance logic > was too aggressive and broke sync_inodes_sb(). > > * sync_inodes_sb() must write out I_DIRTY_TIME inodes but I_DIRTY_TIME > inodes dont't contribute to bdi/wb_has_dirty_io() tests and were > being skipped over. > > * inodes are taken off wb->b_dirty/io/more_io lists after writeback > starts on them. sync_inodes_sb() skipping wait_sb_inodes() when > bdi_has_dirty_io() breaks it by making it return while writebacks > are in-flight. > > This patch fixes the breakages by > > * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs(). > The callers are already testing the condition. > > * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that > it always calls into bdi_split_work_to_wbs() and wait_sb_inodes(). > > * Making bdi_split_work_to_wbs() consider the b_dirty_time list for > WB_SYNC_ALL writebacks. > > Kudos to Eryu, Dave and Jan for tracking down the issue. > > Signed-off-by: Tejun Heo > Fixes: e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > Link: http://lkml.kernel.org/g/20150812101204.GE17933@dhcp-13-216.nay.redhat.com > Reported-and-bisected-by: Eryu Guan > Cc: Dave Chinner > Cc: Jan Kara > Cc: Ted Ts'o Added for 4.2. -- Jens Axboe From shrinand@maginatics.com Tue Aug 25 16:24:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 535FB7F47 for ; Tue, 25 Aug 2015 16:24:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3C55AC007 for ; Tue, 25 Aug 2015 14:24:41 -0700 (PDT) X-ASG-Debug-ID: 1440537873-04bdf0239865b10001-NocioJ Received: from mail-la0-f42.google.com (mail-la0-f42.google.com [209.85.215.42]) by cuda.sgi.com with ESMTP id SRvGkZt2YKoopvlU (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Aug 2015 14:24:34 -0700 (PDT) X-Barracuda-Envelope-From: shrinand@maginatics.com X-Barracuda-Apparent-Source-IP: 209.85.215.42 Received: by lalv9 with SMTP id v9so106999701lal.0 for ; Tue, 25 Aug 2015 14:24:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=jh3a12TUKLvJMk+vfu6/2f0MwE3OUS2P+oM9T+Bo1vA=; b=DctZX6zm4dzPBG4RGbeAqIEHftxfXDgwz/yBLA34LKJx8O/kNSkruXEoL4RwmP46fL y04zh5ogm2XDu8G1Vinehx06cxrUGVcQWdWaknjET4xSkz6FBox9mx/tU2d+AG6zdybF vHdEdt+ZPVbeZ9XG3wb8Saeu/3BPYANk8mfaSGz7/KoXCVFTbXGERCtVHNiUFFcoZeCs HOYgWN9uUdyMyC2Buexm4MYH1jjMxMuRlkxasHfx6uaI+HRQrOJKWiklXhAVg1mkS2Ap CEDlCVO78P7gNesZyqdRGHWOlGddalZ5UIzwkaMpiF5VcTWh5AGnjR73G9GdnuBbXWho Wgiw== X-Gm-Message-State: ALoCoQnT/p51Tiwa/ygQfqMnzorol81MztRVxgBX+5bnmk+UOSlmkq0prZRfmzPX52kq0N3PR7uP MIME-Version: 1.0 X-Received: by 10.152.36.67 with SMTP id o3mr26991768laj.11.1440537873028; Tue, 25 Aug 2015 14:24:33 -0700 (PDT) Received: by 10.25.31.7 with HTTP; Tue, 25 Aug 2015 14:24:32 -0700 (PDT) In-Reply-To: References: Date: Tue, 25 Aug 2015 14:24:32 -0700 Message-ID: Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f From: Shrinand Javadekar X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-la0-f42.google.com[209.85.215.42] X-Barracuda-Start-Time: 1440537874 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21922 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Does previously existing data on disk affect fragmentation? On Tue, Aug 25, 2015 at 1:32 PM, Shrinand Javadekar wrote: > Hi, > > I have 23 disks formatted with XFS on a single server. The workload is > Openstack Swift. See this email from a few months ago about the > details: > > http://oss.sgi.com/archives/xfs/2015-06/msg00108.html > > I am observing some strange behavior and would like to get some > feedback about why this is happening. > > I formatted the disks with xfs (mkfs.xfs) and deployed Openstack Swift > on it. Writing 100GB of data into Swift in batches of 20GB each gave > us the following throughput: > > 20 GB: 93MB/s > 40 GB: 65MB/s > 60 GB: 52MB/s > 80 GB: 50MB/s > 100 GB: 48MB/s > > I then re-formatted the disks with mkfs.xfs -f and ran the experiment > again. This time I got the following throughput: > > 20 GB: 118MB/s > 40 GB: 95MB/s > 60 GB: 74MB/s > 80 GB: 68MB/s > 100 GB: 63MB/s > > I've seen similar results twice. > > Any ideas why this might be happening? > > Thanks in advance. > -Shri From sandeen@sandeen.net Tue Aug 25 16:44:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CA58C7F47 for ; Tue, 25 Aug 2015 16:44:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA5A830404E for ; Tue, 25 Aug 2015 14:44:50 -0700 (PDT) X-ASG-Debug-ID: 1440539087-04bdf0239766090001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id xsgCWpwKxW21fkfP for ; Tue, 25 Aug 2015 14:44:48 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B12F663C77A5; Tue, 25 Aug 2015 16:44:47 -0500 (CDT) Message-ID: <55DCE1CF.5030708@sandeen.net> Date: Tue, 25 Aug 2015 16:44:47 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Shrinand Javadekar , xfs@oss.sgi.com Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f References: X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440539087 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21922 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/25/15 3:32 PM, Shrinand Javadekar wrote: > Hi, > > I have 23 disks formatted with XFS on a single server. The workload is > Openstack Swift. See this email from a few months ago about the > details: > > http://oss.sgi.com/archives/xfs/2015-06/msg00108.html > > I am observing some strange behavior and would like to get some > feedback about why this is happening. > > I formatted the disks with xfs (mkfs.xfs) and deployed Openstack Swift > on it. Writing 100GB of data into Swift in batches of 20GB each gave > us the following throughput: > > 20 GB: 93MB/s > 40 GB: 65MB/s > 60 GB: 52MB/s > 80 GB: 50MB/s > 100 GB: 48MB/s > > I then re-formatted the disks with mkfs.xfs -f and ran the experiment > again. This time I got the following throughput: > > 20 GB: 118MB/s > 40 GB: 95MB/s > 60 GB: 74MB/s > 80 GB: 68MB/s > 100 GB: 63MB/s > > I've seen similar results twice. How did you do the above twice, out of curiosity? If it's the same set of disks, the 3rd mkfs would require "-f" to overwrite the old format. > Any ideas why this might be happening? With the paucity of information you've provided, nope! What version of xfsprogs are you using? What was the output of mkfs.xfs each time; did the geometry differ? -f sets force_overwrite, which only does 3 things: 1) overwrite existing filesystem signatures 3) zeros out old xfs structures on disk 2) allow mkfs to proceed on a misaligned device I don't see why any of those behaviors would change runtime behavior. Maybe you have other variables in your performance testing, and two tests isn't enough to sort out noise? -Eric > Thanks in advance. > -Shri > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Tue Aug 25 17:52:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2632C7F47 for ; Tue, 25 Aug 2015 17:52:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E8A7F8F8049 for ; Tue, 25 Aug 2015 15:52:22 -0700 (PDT) X-ASG-Debug-ID: 1440543137-04bdf0239867630001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id JXm4X7Uu2UGCmWWW for ; Tue, 25 Aug 2015 15:52:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CbCwAo8dxV/0DvLHldgxuBPaocAQEBAQEBBopQkRACAgEBAoE4TQEBAQEBAYELQQWDXgEBBCcTHCMQCAMYCSUPBSUDIROILcg/AQEIAiAZhgqFNIUKB4QsAQSVN4xvjm6LaSaEECwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 08:22:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUN4T-000433-QZ; Wed, 26 Aug 2015 08:52:01 +1000 Date: Wed, 26 Aug 2015 08:52:01 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_repair: set args.geo in longform_dir2_entry_check_data Message-ID: <20150825225201.GJ714@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: set args.geo in longform_dir2_entry_check_data References: <55DCB52D.3030809@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DCB52D.3030809@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440543137 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 25, 2015 at 01:34:21PM -0500, Eric Sandeen wrote: > Here's another one where we miss setting da_args->geo: > > longform_dir2_entry_check_data > struct xfs_da_args da = { > .dp = ip, > // .geo is unset > }; > ... > libxfs_dir2_data_make_free(&da ...) > xfs_dir2_data_make_free > endptr = (char *)hdr + args->geo->blksize; > BOOM > > Addresses-Coverity-Id: 1298008 > Signed-off-by: Eric Sandeen > --- > > Have to wonder if there are more of these :( A quick git grep shows 3 uses of the struct xfs_da_args outside libxfs. longform_dir2_entry_check() is already fixed, this fixes longform_dir2_entry_check_data(), and dir2_kill_block() still needs fixing. AFAICT all the libxfs/ usage is good. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Aug 25 17:53:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B049D7F47 for ; Tue, 25 Aug 2015 17:53:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F3058F8037 for ; Tue, 25 Aug 2015 15:53:39 -0700 (PDT) X-ASG-Debug-ID: 1440543214-04cb6c4a2963860001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Tw0XPkzNa8NOO0yP for ; Tue, 25 Aug 2015 15:53:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B333A63C77A5 for ; Tue, 25 Aug 2015 17:53:34 -0500 (CDT) Message-ID: <55DCF1EE.6070200@sandeen.net> Date: Tue, 25 Aug 2015 17:53:34 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: Re: [PATCH] xfs_repair: set args.geo in longform_dir2_entry_check_data References: <55DCB52D.3030809@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: set args.geo in longform_dir2_entry_check_data In-Reply-To: <55DCB52D.3030809@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440543214 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/25/15 1:34 PM, Eric Sandeen wrote: > Here's another one where we miss setting da_args->geo: > > longform_dir2_entry_check_data > struct xfs_da_args da = { > .dp = ip, > // .geo is unset > }; > ... > libxfs_dir2_data_make_free(&da ...) > xfs_dir2_data_make_free > endptr = (char *)hdr + args->geo->blksize; > BOOM > > Addresses-Coverity-Id: 1298008 > Signed-off-by: Eric Sandeen > --- > > Have to wonder if there are more of these :( Spot-checking in userspace wasn't hard; doesn't look like there are any more. kernelspace looks ok too. -Eric From weber@zbfmail.de Tue Aug 25 17:53:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E99D729DFC for ; Tue, 25 Aug 2015 17:53:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B844C8F804B for ; Tue, 25 Aug 2015 15:53:56 -0700 (PDT) X-ASG-Debug-ID: 1440543232-04bdf02398676a0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id gZVu2U4PqBmtTh8h (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 15:53:53 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id BE2EE1129A3 for ; Wed, 26 Aug 2015 00:53:51 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de BE2EE1129A3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440543231; bh=CA2x36muE20xf9+5cTx5VCHRLyFYW4CCeG1D7xTHGzs=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=UtNcomiv6OnjLBfr7GsU2RB4EAIVuS4+wmc/3Jjtyz/upd4/jDyNt125Gb0UTrbkP eXjJwZviTwWx5IzBAV30j4WTjAdPEvRXer5UiNtB1Ez2N53uDG90R87TdL0XI7yfWI 9jr223ijch9XlQ1bw94t6PliHAuV5GnMMKqam8+c= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 26 Aug 2015 00:53:51 +0200 From: Marko Weber|8000 To: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <55DCB158.20505@sandeen.net> References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-debian-Metrics: mailserver 1169; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440543232 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature hi eric, Am 2015-08-25 20:18, schrieb Eric Sandeen: > On 8/25/15 11:51 AM, Marko Weber|8000 wrote: >> >> dave, >> >> Am 2015-08-25 13:54, schrieb Dave Chinner: >>> On Tue, Aug 25, 2015 at 10:25:16AM +0200, Marko Weber|8000 wrote: >>>> >>>> Hello List, Hello Dave... >>>> >>>> >>>> i try to mount on my backup server an Lvm Partition and get errors >>>> in stdout and log: >>>> >>>> /var/log/messages: >>>> >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Version 5 >>>> superblock detected. This kernel has EXPERIMENTAL support enabled! >>>> Aug 25 10:20:31 backupserver kernel: Use of these features in this >>>> kernel is at your own risk! >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Superblock has >>>> unknown read-only compatible features (0x1) enabled. >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): Attempted to mount >>>> read-only compatible filesystem read-write. >>>> Aug 25 10:20:31 backupserver kernel: Filesystem can only be safely >>>> mounted read only. >>>> Aug 25 10:20:31 backupserver kernel: XFS (dm-2): SB validate failed >>>> with error 22. >>> >>> You need to run the same version kernel on both servers. The primary >>> has a more recent kernel and feature set than your older backup >>> server is running. >>> >>> Cheers, >>> >>> Dave. >> >> you was right. >> There was new kernel built. /usr/src/linux pointed to new kernel >> source. >> But machine was not rebooted. So kernel version before kernel built >> was loaded. >> I rebooted machine. >> i renoved logical volume >> i created logical volume > > Hope it landed back in the same place! > >> i tried to mount it and get: >> >> Aug 25 18:43:15 backupserver kernel: md4: unknown partition table >> Aug 25 18:43:15 backupserver syslog-ng[1417]: Internal error, >> alarm_set() called while an alarm is still active; >> Aug 25 18:43:56 backupserver kernel: md4: unknown partition table >> Aug 25 18:44:01 backupserver kernel: XFS (dm-2): Invalid superblock >> magic number >> >> pvdisplay shows: >> >> # pvdisplay >> --- Physical volume --- >> PV Name /dev/md4 >> VG Name VolGroup01 >> PV Size 2.69 TiB / not usable 1.25 MiB >> >> >> so what is XFS missing? > > what does blkid /dev/md4 say? > > It looks like you might have a storage problem, now, and xfs can't > even find a proper magic number on that device. eric, i rebootet the machine and created a new logical volume. i formatted the lv with mkfs.xfs i tried to mount it on the new kernel: Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled! Aug 26 00:47:17 backupserver kernel: Use of these features in this kernel is at your own risk! Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has unknown read-only compatible features (0x1) enabled. Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Attempted to mount read-only compatible filesystem read-write. Aug 26 00:47:17 backupserver kernel: Filesystem can only be safely mounted read only. Aug 26 00:47:17 backupserver kernel: XFS (dm-2): SB validate failed with error 22. this happens with the newly created logical volume. the other 2 lvm partitions with xfs are fine. any idea? marko > > -Eric From sandeen@sandeen.net Tue Aug 25 17:58:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 868E67F47 for ; Tue, 25 Aug 2015 17:58:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 62A5B8F8037 for ; Tue, 25 Aug 2015 15:58:03 -0700 (PDT) X-ASG-Debug-ID: 1440543481-04cb6c4a28639e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id WlGJeEj6QtVYUG0S for ; Tue, 25 Aug 2015 15:58:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1684763C77A5; Tue, 25 Aug 2015 17:58:01 -0500 (CDT) Message-ID: <55DCF2F8.8010008@sandeen.net> Date: Tue, 25 Aug 2015 17:58:00 -0500 From: Eric Sandeen MIME-Version: 1.0 To: weber@zbfmail.de, Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440543481 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.10 BSF_SC0_SA085 Custom Rule SA085 On 8/25/15 5:53 PM, Marko Weber|8000 wrote: > eric, > i rebootet the machine and created a new logical volume. > i formatted the lv with mkfs.xfs > i tried to mount it on the new kernel: > > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled! > Aug 26 00:47:17 backupserver kernel: Use of these features in this kernel is at your own risk! > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has unknown read-only compatible features (0x1) enabled. > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Attempted to mount read-only compatible filesystem read-write. > Aug 26 00:47:17 backupserver kernel: Filesystem can only be safely mounted read only. > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): SB validate failed with error 22. http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F ... > this happens with the newly created logical volume. > > the other 2 lvm partitions with xfs are fine. > > any idea? Without any actual information (i.e. kernel versions or userspace version), I'll have to assume that you have recent xfsprogs which sets some features by default which older kernels cannot understand. > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has unknown read-only compatible features (0x1) enabled. #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ mkfs.xfs with -m crc=0,finobt=0 to turn off these features if you have an older kernel which doesn't understand them. -Eric From weber@zbfmail.de Tue Aug 25 18:03:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 707D37F47 for ; Tue, 25 Aug 2015 18:03:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 013E7AC008 for ; Tue, 25 Aug 2015 16:03:28 -0700 (PDT) X-ASG-Debug-ID: 1440543783-04cbb07cbe6e5c0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id GbOYEcrC8ZvCTLZs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 16:03:04 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id E7DC01129A3 for ; Wed, 26 Aug 2015 01:02:58 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de E7DC01129A3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440543783; bh=crXx2G6iGLZLqEi3S6X6g+SKcTqVCM/5EWDB75y8nVw=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=xywyC/74uV480SnNSq2QeHN83ApU0OP/trhpBLFCnSNAX3OJHRYf8jDIEQ0YHmkpA gLwjWEiHGYH7SvcFEXEdxYpqxQobqP9pnOP6ZpPc6bVLUNki2fMOGJIZM6E/gHYst4 +7SxCWWXfSVy5jU9nyoAQivPeT7pNVdTErkdsalI= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 26 Aug 2015 01:02:58 +0200 From: Marko Weber|8000 To: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <55DCF2F8.8010008@sandeen.net> References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> <55DCF2F8.8010008@sandeen.net> Message-ID: <5576eb52ccfa8182ca150a99436be93c@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-debian-Metrics: mailserver 1169; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440543784 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.10 BSF_SC0_SA085 Custom Rule SA085 Am 2015-08-26 00:58, schrieb Eric Sandeen: > On 8/25/15 5:53 PM, Marko Weber|8000 wrote: > >> eric, >> i rebootet the machine and created a new logical volume. >> i formatted the lv with mkfs.xfs >> i tried to mount it on the new kernel: >> >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Version 5 superblock >> detected. This kernel has EXPERIMENTAL support enabled! >> Aug 26 00:47:17 backupserver kernel: Use of these features in this >> kernel is at your own risk! >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has >> unknown read-only compatible features (0x1) enabled. >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Attempted to mount >> read-only compatible filesystem read-write. >> Aug 26 00:47:17 backupserver kernel: Filesystem can only be safely >> mounted read only. >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): SB validate failed >> with error 22. > l > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > ... > >> this happens with the newly created logical volume. >> >> the other 2 lvm partitions with xfs are fine. >> >> any idea? > > Without any actual information (i.e. kernel versions or userspace > version), > I'll have to assume that you have recent xfsprogs which sets some > features by > default which older kernels cannot understand. ok, what info do you need? on gentoo-linux: xfsprogs: v 3.2.4 (Useflag, nls readline) kernel: 3.14.51 > >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has >> unknown read-only compatible features (0x1) enabled. > > #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode > btree */ > > mkfs.xfs with -m crc=0,finobt=0 to turn off these features if you have > an older kernel which > doesn't understand them. > > -Eric From david@fromorbit.com Tue Aug 25 18:04:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C606D7F47 for ; Tue, 25 Aug 2015 18:04:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B0DEC30404E for ; Tue, 25 Aug 2015 16:04:09 -0700 (PDT) X-ASG-Debug-ID: 1440543846-04cb6c4a2a63b60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4q4o5OHiTgutzBDf for ; Tue, 25 Aug 2015 16:04:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ApCwCv89xV/0DvLHldgxuBPaocAQEBAQEBBopQkRAEAgKBOE0BAQEBAQGBC0EFg14BAQQ6HCMQCAMhJQ8FJQM0iC3IPQELIBmGCoU0hQoHF4QVBYcmhnGHIIxvgU2EMoMcjVKDaiaEECwzgQclgSABAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 08:34:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUNFx-00044y-5F; Wed, 26 Aug 2015 09:03:53 +1000 Date: Wed, 26 Aug 2015 09:03:53 +1000 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Message-ID: <20150825230353.GK714@dastard> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440543846 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 26, 2015 at 12:53:51AM +0200, Marko Weber|8000 wrote: [....] > i rebootet the machine and created a new logical volume. > i formatted the lv with mkfs.xfs > i tried to mount it on the new kernel: > > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Version 5 > superblock detected. This kernel has EXPERIMENTAL support enabled! > Aug 26 00:47:17 backupserver kernel: Use of these features in this > kernel is at your own risk! > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has > unknown read-only compatible features (0x1) enabled. > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Attempted to mount > read-only compatible filesystem read-write. > Aug 26 00:47:17 backupserver kernel: Filesystem can only be safely > mounted read only. > Aug 26 00:47:17 backupserver kernel: XFS (dm-2): SB validate failed > with error 22. > > > this happens with the newly created logical volume. > > the other 2 lvm partitions with xfs are fine. > > any idea? Clearly you have a kernel too old to read the on-disk format that mkfs.xfs has written - as I pointed out originally. Would you please tell us what the versions of the kernels you are using, as well as the mkfs.xfs version? Cheers, Dave. -- Dave Chinner david@fromorbit.com From shrinand@maginatics.com Tue Aug 25 18:09:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A3AAD7F47 for ; Tue, 25 Aug 2015 18:09:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D2BDAC007 for ; Tue, 25 Aug 2015 16:09:36 -0700 (PDT) X-ASG-Debug-ID: 1440544173-04bdf0239867ac0001-NocioJ Received: from mail-lb0-f169.google.com (mail-lb0-f169.google.com [209.85.217.169]) by cuda.sgi.com with ESMTP id BrMgFfuGD5um7hlB (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Aug 2015 16:09:35 -0700 (PDT) X-Barracuda-Envelope-From: shrinand@maginatics.com X-Barracuda-Apparent-Source-IP: 209.85.217.169 Received: by lbbpu9 with SMTP id pu9so109622067lbb.3 for ; Tue, 25 Aug 2015 16:09:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=ZZXwVFz2msJDDRFrQSgRDRY9V/rqgrsTTw8HvjbGYFk=; b=gxyyAx+sCzhuycMeUXQ4E+TAu0Cxw9oQq5rxC569VUsA7HsHqPbmXX4TXn0xxV/WT7 B3qSvyhIKORcc0ToXtC+Mh7mDcHx+0ObH6YtncmL+fGfsj1gz44ddVcJaG2qjLgQ4iBU BYaEB5o+PU3KYznNnkvuiWfYGVmjKzscVqiKMnxssZI6nN8De5PpVq5SLRCwNIf10RY3 vgx88kgZNK2F9ZEpXmTDmg2qCFEgjpqFZ6QF75Up5CLwNvVnFMlnOvPKSYfGMACk+Sf+ hJYTsy8uMoTCQy1mJvwEGdDuB43esW1oSdD8veAE/j3BHxlLPVoWv6TduVytdaE+cft8 K88A== X-Gm-Message-State: ALoCoQlW5JDGzDK+22hIy0F7K3/+AzKTqLIR8oYy1T4inQBD7R46cLIp0Kb+B1Z0obhO4S90bHeP MIME-Version: 1.0 X-Received: by 10.152.28.229 with SMTP id e5mr28119371lah.110.1440544173576; Tue, 25 Aug 2015 16:09:33 -0700 (PDT) Received: by 10.25.31.7 with HTTP; Tue, 25 Aug 2015 16:09:33 -0700 (PDT) In-Reply-To: <55DCE1CF.5030708@sandeen.net> References: <55DCE1CF.5030708@sandeen.net> Date: Tue, 25 Aug 2015 16:09:33 -0700 Message-ID: Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f From: Shrinand Javadekar X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f169.google.com[209.85.217.169] X-Barracuda-Start-Time: 1440544174 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 Thanks for the reply Eric. Please see my responses inline: On Tue, Aug 25, 2015 at 2:44 PM, Eric Sandeen wrote: > On 8/25/15 3:32 PM, Shrinand Javadekar wrote: >> Hi, >> >> I have 23 disks formatted with XFS on a single server. The workload is >> Openstack Swift. See this email from a few months ago about the >> details: >> >> http://oss.sgi.com/archives/xfs/2015-06/msg00108.html >> >> I am observing some strange behavior and would like to get some >> feedback about why this is happening. >> >> I formatted the disks with xfs (mkfs.xfs) and deployed Openstack Swift >> on it. Writing 100GB of data into Swift in batches of 20GB each gave >> us the following throughput: >> >> 20 GB: 93MB/s >> 40 GB: 65MB/s >> 60 GB: 52MB/s >> 80 GB: 50MB/s >> 100 GB: 48MB/s >> >> I then re-formatted the disks with mkfs.xfs -f and ran the experiment >> again. This time I got the following throughput: >> >> 20 GB: 118MB/s >> 40 GB: 95MB/s >> 60 GB: 74MB/s >> 80 GB: 68MB/s >> 100 GB: 63MB/s >> >> I've seen similar results twice. > > How did you do the above twice, out of curiosity? If it's the same set of disks, > the 3rd mkfs would require "-f" to overwrite the old format. I did this on 2 different setups. Formatted the new disks with mkfs.xfs. Ran the workload. Reformatted the disks with mkfs.xfs -f. Ran the workload. > >> Any ideas why this might be happening? > > With the paucity of information you've provided, nope! Apologies. What more information can I provide? > > What version of xfsprogs are you using? # xfs_repair -V xfs_repair version 3.1.9 > What was the output of mkfs.xfs each time; did the geometry differ? I have the output of xfs_info /mount/point from the first experiment and that of mkfs.xfs -f. One difference I see is that reformatting adds projid32bit=0 for the inode section. > > -f sets force_overwrite, which only does 3 things: > > 1) overwrite existing filesystem signatures > 3) zeros out old xfs structures on disk > 2) allow mkfs to proceed on a misaligned device > > I don't see why any of those behaviors would change runtime behavior. > > Maybe you have other variables in your performance testing, and two > tests isn't enough to sort out noise? We have seen this again on a third setup of one of my colleagues. What more data can I look at for identifying the differences? > > -Eric > >> Thanks in advance. >> -Shri >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > From weber@zbfmail.de Tue Aug 25 18:10:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9AA967F47 for ; Tue, 25 Aug 2015 18:10:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86303304043 for ; Tue, 25 Aug 2015 16:10:44 -0700 (PDT) X-ASG-Debug-ID: 1440544241-04cbb07cbb6e7d0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id a4zHugbxZR48Ofkx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 16:10:42 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id 5D79211C6FC for ; Wed, 26 Aug 2015 01:10:41 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de 5D79211C6FC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440544241; bh=7XWy1Bu6fZMBpty0YMHrTLINLtq98vCBzeEv+YNHjHc=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=p7B6cD99BRjM2e0oDcqAPlKV/OHk1aLS8ohTXzDMkbKbuMg5l8z543WyD5A0abwjG dhGtaCoRr8oVmujUFsKoY3HAS0bdG5E8BbAgIm25+CwSylwzRk9B+s2PLKC2gDao1V Aa9FL5vkFHPeXJ4vcTTdu6Bclb9KuWHm695UNzbw= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 26 Aug 2015 01:10:41 +0200 From: Marko Weber|8000 To: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <20150825230353.GK714@dastard> References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> <20150825230353.GK714@dastard> Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-debian-Metrics: mailserver 1169; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440544242 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Am 2015-08-26 01:03, schrieb Dave Chinner: > On Wed, Aug 26, 2015 at 12:53:51AM +0200, Marko Weber|8000 wrote: > [....] >> i rebootet the machine and created a new logical volume. >> i formatted the lv with mkfs.xfs >> i tried to mount it on the new kernel: >> >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Version 5 >> superblock detected. This kernel has EXPERIMENTAL support enabled! >> Aug 26 00:47:17 backupserver kernel: Use of these features in this >> kernel is at your own risk! >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has >> unknown read-only compatible features (0x1) enabled. >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Attempted to mount >> read-only compatible filesystem read-write. >> Aug 26 00:47:17 backupserver kernel: Filesystem can only be safely >> mounted read only. >> Aug 26 00:47:17 backupserver kernel: XFS (dm-2): SB validate failed >> with error 22. >> >> >> this happens with the newly created logical volume. >> >> the other 2 lvm partitions with xfs are fine. >> >> any idea? > > Clearly you have a kernel too old to read the on-disk format that > mkfs.xfs has written - as I pointed out originally. > > Would you please tell us what the versions of the kernels > you are using, as well as the mkfs.xfs version? Kernel vanilla-sources 3.14.51 (longterm support) xfs-progs 3.2.4 (gentoo) mkfs.xfs 3.2.4 AND HEY! Eric, your hint worked: backupserver ~ # mkfs.xfs -f -m crc=0,finobt=0 /dev/VolGroup01/vmstore meta-data=/dev/VolGroup01/vmstore isize=256 agcount=4, agsize=19660800 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=78643200, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=38400, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 backupserver ~ # mount /dev/VolGroup01/vmstore /var/storage01/ backupserver ~ # df -h Filesystem Size Used Avail Use% Mounted on /dev/root 35G 21G 15G 60% / devtmpfs 10M 0 10M 0% /dev tmpfs 1.6G 464K 1.6G 1% /run shm 7.7G 72K 7.7G 1% /dev/shm cgroup_root 10M 0 10M 0% /sys/fs/cgroup /dev/mapper/VolGroup01-backup 500G 396G 105G 80% /var/volgroup01/backup /dev/mapper/VolGroup01-dumps 200G 89G 112G 45% /var/dumps /dev/mapper/VolGroup01-vmstore 300G 33M 300G 1% /var/storage01 dave, so the latest lts kernel 3.14.51 does not support to mount lvm2 partitions formatted with mkfs.xfs 3.2.4? marko > > Cheers, > > Dave. From david@fromorbit.com Tue Aug 25 18:17:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2D98B7F47 for ; Tue, 25 Aug 2015 18:17:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1BFB68F8037 for ; Tue, 25 Aug 2015 16:17:25 -0700 (PDT) X-ASG-Debug-ID: 1440544639-04cb6c4a2a63fa0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id t7ydEAhDjk21AEzo for ; Tue, 25 Aug 2015 16:17:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DEBgAv99xV/0DvLHlDGoMbVGmqHAEBAQEBAQaKUIsdhXMEAgKBOE0BAQEBAQGBC4QkAQEEOhwjEAgDGAklDwUlAzSILQ48x24BAQgCIBmGCoU0hQoHF4QVBYcmhnGECoMWhQaHaYFNh06NUoNqJoQQLDMBgQYlgSABAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 08:46:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUNSG-00046L-JS; Wed, 26 Aug 2015 09:16:36 +1000 Date: Wed, 26 Aug 2015 09:16:36 +1000 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Message-ID: <20150825231636.GL714@dastard> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> <55DCF2F8.8010008@sandeen.net> <5576eb52ccfa8182ca150a99436be93c@zbfmail.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5576eb52ccfa8182ca150a99436be93c@zbfmail.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440544639 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0713, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21925 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Aug 26, 2015 at 01:02:58AM +0200, Marko Weber|8000 wrote: > Am 2015-08-26 00:58, schrieb Eric Sandeen: > >On 8/25/15 5:53 PM, Marko Weber|8000 wrote: > > > >>eric, > >>i rebootet the machine and created a new logical volume. > >>i formatted the lv with mkfs.xfs > >>i tried to mount it on the new kernel: > >> > >>Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Version 5 > >>superblock detected. This kernel has EXPERIMENTAL support > >>enabled! > >>Aug 26 00:47:17 backupserver kernel: Use of these features in > >>this kernel is at your own risk! > >>Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Superblock has > >>unknown read-only compatible features (0x1) enabled. > >>Aug 26 00:47:17 backupserver kernel: XFS (dm-2): Attempted to > >>mount read-only compatible filesystem read-write. > >>Aug 26 00:47:17 backupserver kernel: Filesystem can only be > >>safely mounted read only. > >>Aug 26 00:47:17 backupserver kernel: XFS (dm-2): SB validate > >>failed with error 22. > >l > >http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > >... > > > >>this happens with the newly created logical volume. > >> > >>the other 2 lvm partitions with xfs are fine. > >> > >>any idea? > > > >Without any actual information (i.e. kernel versions or userspace > >version), > >I'll have to assume that you have recent xfsprogs which sets some > >features by > >default which older kernels cannot understand. > > ok, what info do you need? > > on gentoo-linux: > > xfsprogs: v 3.2.4 (Useflag, nls readline) > kernel: 3.14.51 Kernel is too old for finobt=1, and really too old for CRCs to be enabled (not fully supported until 3.16). So, either: > >mkfs.xfs with -m crc=0,finobt=0 to turn off these features if you have > >an older kernel which > >doesn't understand them. or upgrade your kernel. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 25 18:34:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 030FE7F47 for ; Tue, 25 Aug 2015 18:34:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 843CAAC009 for ; Tue, 25 Aug 2015 16:34:03 -0700 (PDT) X-ASG-Debug-ID: 1440545641-04bdf02397681c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id I0iaIBnlz3JzqiG9 for ; Tue, 25 Aug 2015 16:34:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ApCwDA+txV/0DvLHldgxuBPaocAQEBAQEBBopQkRAEAgKBOE0BAQEBAQGBC0EFg14BAQQ6HCMQCAMYCSUPBSUDNIgtyB0BCyAZhgqFNIRIQgcXhBUFhyaGcYcgjG+aVyaEECwzgQeBRQEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 09:04:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUNiu-00048Y-9h; Wed, 26 Aug 2015 09:33:48 +1000 Date: Wed, 26 Aug 2015 09:33:48 +1000 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Message-ID: <20150825233348.GM714@dastard> X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> <20150825230353.GK714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440545641 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21926 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 26, 2015 at 01:10:41AM +0200, Marko Weber|8000 wrote: > dave, so the latest lts kernel 3.14.51 does not support to mount > lvm2 partitions formatted with mkfs.xfs 3.2.4? As we've always done in the past, we've waited for around a year after upstream kernel support for a feature has been supported before turning on the feature by default in xfsprogs. Kernel 3.16 was released just over a year ago with full CRC support. Our hand was kinda forced by distros independently enabling these features by default before upstream enabled them, so we enabled it a bt sooner than previous feature default changes. Clearly we (upstream) have no control over what distros ship and enable. We can't stop distros from upgrading userspace out of step with the kernel they ship, nor can we stop them from changing default feature enablement. However, it's up to the distro to make sure that the userspace package and the default configurations they ship work correctly with the kernel they ship. i.e. if Gentoo are shipping xfsprogs 3.2.4 w/ kernel 3.14.51, then Gentoo has a quality control problem - they have failed to verify that the packages they are shipping work correctly before shipping them to users... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 25 18:43:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28B117F47 for ; Tue, 25 Aug 2015 18:43:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 057768F8037 for ; Tue, 25 Aug 2015 16:43:20 -0700 (PDT) X-ASG-Debug-ID: 1440546193-04cbb07cbc6f290001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ok9JwfQmNUcfQMcG for ; Tue, 25 Aug 2015 16:43:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BxHQDm/NxV/0DvLHlDGoMbVGmMf50dAQEBAQEBBopQix2FcwQCAoE4TQEBAQEBAYELQQECAoNdAQEBAwE6HCMFCwgDGAklDwUlAyETiCYHDjzHWgELIBmGCoU0hQoHhCwFlTeFBodpgU2EMpRYJoIOHIFmLDMBgksBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 09:13:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUNro-00049a-6V; Wed, 26 Aug 2015 09:43:00 +1000 Date: Wed, 26 Aug 2015 09:43:00 +1000 From: Dave Chinner To: Shrinand Javadekar Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f Message-ID: <20150825234300.GN714@dastard> X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f References: <55DCE1CF.5030708@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440546193 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21926 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, Aug 25, 2015 at 04:09:33PM -0700, Shrinand Javadekar wrote: > I did this on 2 different setups. Details? > Formatted the new disks with mkfs.xfs. Ran the workload. > Reformatted the disks with mkfs.xfs -f. Ran the workload. > > > > >> Any ideas why this might be happening? > > > > With the paucity of information you've provided, nope! > > Apologies. What more information can I provide? http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > What version of xfsprogs are you using? > > # xfs_repair -V > xfs_repair version 3.1.9 That's pretty old. > > What was the output of mkfs.xfs each time; did the geometry differ? > > I have the output of xfs_info /mount/point from the first experiment > and that of mkfs.xfs -f. One difference I see is that reformatting > adds projid32bit=0 for the inode section. xfs_info didn't get projid32bit status output until 3.2.0. Anyway, please post the output so we can see the differences for ourselves. What we need is mkfs output in both cases, and xfs_info output in both cases after mount. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 25 19:32:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CDED97F47 for ; Tue, 25 Aug 2015 19:32:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD0638F8040 for ; Tue, 25 Aug 2015 17:32:25 -0700 (PDT) X-ASG-Debug-ID: 1440549143-04cb6c4a2a65260001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id CX9DN3QAoaqfpSOH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:32:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0WLJO029206 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:32:22 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WLLq010750 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:21 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WLsq007115; Wed, 26 Aug 2015 00:32:21 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:20 -0700 Subject: [PATCH v3 00/11] xfsprogs fuzzing fixes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v3 00/11] xfsprogs fuzzing fixes To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:20 -0700 Message-ID: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440549144 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 Hi all, This is a rollup of various fuzzing fixes for xfsprogs 4.2.0-rc3. The first patch fixes a crash in xfs_repair where args.geo wasn't getting initialized when killing a directory block. Previously sent by sandeen, but seemed to have fallen off everyone's radars? Patch 2, a port of a kernel patch, ensures that the dir/attr verifier marks the buffer corrupt if the magic number isn't recognized. This helps us to fail faster in the event of magic number corruption. Patch 3 fixes libxfs' WANT_CORRUPTED macros to return negative error codes like the rest of libxfs does. Patch 4 amends libxfs_getbuf*() to clear the buffer state if the buffer isn't dirty. This prevents repair from throwing CRC errors if a block is prefetched, freed without being examined (the exam clears the UNCHECKED flag), reallocated to some other data structure, and then read for a subsequent operation. Patch 5 fixes a bug in xfs_repair wherein if xfs_repair fixes a broken xattr block and later decides to unmap the block, the "repaired" flag inadvertently prohibits the unmapping of that block. Patch 6 forces repair's xattr block checker to take a look at the header for incorrect owner data. If the header info looks bad, we'll discard the xattr block. Patch 7 forces prefetch to mark corrupt bmbt blocks UNCHECKED so that the regular bmbt examination will fix the bad CRC if it doesn't take any other action against the block. Without this, a corruption in the unused area will trigger a kernel error yet never get fixed by repair. Patch 8 implements a 'reflink' and 'dedupe' command in xfs_io. This will be used in future xfstests to test reflink and dedupe features of btrfs and xfs filesystems. Patch 9 fixes xfs_db/blocktrash to not fail write verification when corrupting a block and allows trashing of log and symlink blocks. Patch 10 enhances the blocktrash command with a '-z' option that trashes the block at the top of the cursor stack and doesn't require blockget to have been run. Patch 11 implements blockget for v5 filesystems. This is a second try at a previous patch which didn't quite catch all the new magic numbers and had some problems iterating directory index data. I've tested these xfsprogs changes against the for-next branch as of 8/24. The rmap/reflink patches will be dealt with separately. Scary rewound github repo with everything attached: https://github.com/djwong/xfsprogs Fuzz tests and more are at: https://github.com/djwong/xfstests Comments and questions are, as always, welcome. --D From darrick.wong@oracle.com Tue Aug 25 19:32:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7551E7F54 for ; Tue, 25 Aug 2015 19:32:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04567AC007 for ; Tue, 25 Aug 2015 17:32:30 -0700 (PDT) X-ASG-Debug-ID: 1440549149-04cbb07cbe701a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 8SzqhBLzRRAceL7q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:32:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0WST0029147 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:32:28 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WRC5006951 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:27 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WRg0007136; Wed, 26 Aug 2015 00:32:27 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:26 -0700 Subject: [PATCH 01/11] xfs_repair: set args.geo in dir2_kill_block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/11] xfs_repair: set args.geo in dir2_kill_block To: david@fromorbit.com, darrick.wong@oracle.com Cc: Eric Sandeen , xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:27 -0700 Message-ID: <20150826003227.23973.77842.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440549149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Frøm: Eric Sandeen This path in xfs_repair: dir2_kill_block libxfs_da_shrink_inode xfs_dir2_shrink_inode xfs_dir2_db_to_da segfaults, because dir2_kill_block() does not initialize args.geo, and a null geometry winds up in xfs_dir2_db_to_da(), which dereferences it. Fix that. Signed-off-by: Eric Sandeen --- repair/phase6.c | 1 + 1 file changed, 1 insertion(+) diff --git a/repair/phase6.c b/repair/phase6.c index 04638c2..7e275cd 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1444,6 +1444,7 @@ dir2_kill_block( args.firstblock = &firstblock; args.flist = &flist; args.whichfork = XFS_DATA_FORK; + args.geo = mp->m_dir_geo; if (da_bno >= mp->m_dir_geo->leafblk && da_bno < mp->m_dir_geo->freeblk) error = -libxfs_da_shrink_inode(&args, da_bno, bp); else From darrick.wong@oracle.com Tue Aug 25 19:32:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4DBF37F58 for ; Tue, 25 Aug 2015 19:32:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFEFBAC009 for ; Tue, 25 Aug 2015 17:32:36 -0700 (PDT) X-ASG-Debug-ID: 1440549155-04cbb07cbc701b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Fk6dCBFRoDG2v1u9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:32:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0WYrA029305 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:32:34 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WYin027870 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:34 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WXKi026230; Wed, 26 Aug 2015 00:32:34 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:33 -0700 Subject: [PATCH 02/11] libxfs: verifier should set buffer error when da block has a bad magic number From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/11] libxfs: verifier should set buffer error when da block has a bad magic number To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:33 -0700 Message-ID: <20150826003233.23973.47226.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440549155 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If xfs_da3_node_read_verify() doesn't recognize the magic number of a buffer it's just read, set the buffer error to -EFSCORRUPTED so that the error can be sent up to userspace. Without this patch we'll notice the bad magic eventually while trying to traverse or change the block, but we really ought to fail early in the verifier. Signed-off-by: Darrick J. Wong --- libxfs/xfs_da_btree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index c874164..289dc1e 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -229,6 +229,7 @@ xfs_da3_node_read_verify( bp->b_ops->verify_read(bp); return; default: + xfs_buf_ioerror(bp, -EFSCORRUPTED); break; } From darrick.wong@oracle.com Tue Aug 25 19:32:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18BAC7F47 for ; Tue, 25 Aug 2015 19:32:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB772AC007 for ; Tue, 25 Aug 2015 17:32:42 -0700 (PDT) X-ASG-Debug-ID: 1440549160-04bdf0239869310001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id nY9Uwrfi0D72Hjw3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:32:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0WeWD029260 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:32:40 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0Wenn007333 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:40 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0Wdnf025744; Wed, 26 Aug 2015 00:32:39 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:39 -0700 Subject: [PATCH 03/11] libxfs: fix XFS_WANT_CORRUPTED_* macros to return negative error codes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/11] libxfs: fix XFS_WANT_CORRUPTED_* macros to return negative error codes To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:39 -0700 Message-ID: <20150826003239.23973.614.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440549161 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since the rest of libxfs returns negative error codes, these two sanity checking macros ought to have the same applied. While we're at it, fix a couple more sign errors in the same file. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_priv.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 2a8b850..22f2d53 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -148,9 +148,9 @@ enum ce { CE_DEBUG, CE_CONT, CE_NOTE, CE_WARN, CE_ALERT, CE_PANIC }; #define XFS_TRANS_UNRESERVE_QUOTA_NBLKS(mp,tp,ip,nblks,ninos,fl) 0 #define XFS_TEST_ERROR(expr,a,b,c) ( expr ) #define XFS_WANT_CORRUPTED_GOTO(mp, expr, l) \ - { (mp) = (mp); if (!(expr)) { error = EFSCORRUPTED; goto l; } } + { (mp) = (mp); if (!(expr)) { error = -EFSCORRUPTED; goto l; } } #define XFS_WANT_CORRUPTED_RETURN(mp, expr) \ - { (mp) = (mp); if (!(expr)) { return EFSCORRUPTED; } } + { (mp) = (mp); if (!(expr)) { return -EFSCORRUPTED; } } #ifdef __GNUC__ #define __return_address __builtin_return_address(0) @@ -417,8 +417,7 @@ do { \ }) #define xfs_rotorstep 1 -#define xfs_bmap_rtalloc(a) (ENOSYS) -#define xfs_rtpick_extent(mp,tp,len,p) (ENOSYS) +#define xfs_bmap_rtalloc(a) (-ENOSYS) #define xfs_get_extsz_hint(ip) (0) #define xfs_inode_is_filestream(ip) (0) #define xfs_filestream_lookup_ag(ip) (0) From darrick.wong@oracle.com Tue Aug 25 19:32:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7310A7F47 for ; Tue, 25 Aug 2015 19:32:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62253304043 for ; Tue, 25 Aug 2015 17:32:49 -0700 (PDT) X-ASG-Debug-ID: 1440549167-04cb6c4a2865280001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HrxG1hiNAGnDmqnm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:32:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0WkDV029314 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:32:47 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0Wkd2019178 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:46 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WkbS026252; Wed, 26 Aug 2015 00:32:46 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:45 -0700 Subject: [PATCH 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:46 -0700 Message-ID: <20150826003246.23973.12895.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440549167 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 BSF_SC5_SA210e Custom Rule SA210e When we're running xfs_repair with prefetch enabled, it's possible that repair will decide to clear an inode without examining all metadata blocks owned by that inode. This leaves the unreferenced prefetched buffers marked UNCHECKED, which will cause a subsequent CRC error if the block is reallocated to a different structure and read more than once. Typically this happens when a large directory is corrupted and lost+found has to grow to accomodate all the disconnected inodes. In libxfs_getbuf*(), we're supposed to return an unused buffer which has a clean state. Unfortunately, things like UNCHECKED can hang around to cause incorrect verifier errors later, so change those functions to launder the state bits clean. Signed-off-by: Darrick J. Wong --- libxfs/rdwr.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 4f8212f..d28cea8 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -631,15 +631,39 @@ libxfs_getbuf_flags(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, return __cache_lookup(&key, flags); } +/* + * Clean the buffer flags for libxfs_getbuf*(), which wants to return + * an unused buffer with clean state. This prevents CRC errors on a + * re-read of a corrupt block that was prefetched and freed. This + * can happen with a massively corrupt directory that is discarded, + * but whose blocks are then recycled into expanding lost+found. + * + * Note however that if the buffer's dirty (prefetch calls getbuf) + * we'll leave the state alone because we don't want to discard blocks + * that have been fixed. + */ +static void +try_clean_buf( + struct xfs_buf *bp) +{ + if (bp && !(bp->b_flags & LIBXFS_B_DIRTY)) + bp->b_flags &= ~(LIBXFS_B_UNCHECKED | LIBXFS_B_STALE | + LIBXFS_B_UPTODATE); +} + struct xfs_buf * libxfs_getbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len) { - return libxfs_getbuf_flags(btp, blkno, len, 0); + struct xfs_buf *bp; + + bp = libxfs_getbuf_flags(btp, blkno, len, 0); + try_clean_buf(bp); + return bp; } -struct xfs_buf * -libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, - int nmaps, int flags) +static struct xfs_buf * +__libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, + int nmaps, int flags) { struct xfs_bufkey key = {0}; int i; @@ -659,6 +683,17 @@ libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, return __cache_lookup(&key, flags); } +struct xfs_buf * +libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, + int nmaps, int flags) +{ + struct xfs_buf *bp; + + bp = __libxfs_getbuf_map(btp, map, nmaps, flags); + try_clean_buf(bp); + return bp; +} + void libxfs_putbuf(xfs_buf_t *bp) { @@ -779,7 +814,7 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, xfs_buf_t *bp; int error; - bp = libxfs_getbuf(btp, blkno, len); + bp = libxfs_getbuf_flags(btp, blkno, len, 0); if (!bp) return NULL; @@ -860,7 +895,7 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, return libxfs_readbuf(btp, map[0].bm_bn, map[0].bm_len, flags, ops); - bp = libxfs_getbuf_map(btp, map, nmaps, 0); + bp = __libxfs_getbuf_map(btp, map, nmaps, 0); if (!bp) return NULL; From darrick.wong@oracle.com Tue Aug 25 19:32:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6638A29E07 for ; Tue, 25 Aug 2015 19:32:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 470F58F804B for ; Tue, 25 Aug 2015 17:32:56 -0700 (PDT) X-ASG-Debug-ID: 1440549175-04cbb07cbc701d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FmuXx1Zt6tBmxw8N (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:32:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0WsbP029519 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:32:54 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0Wr0e007764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:54 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WrlH007335; Wed, 26 Aug 2015 00:32:53 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:53 -0700 Subject: [PATCH 05/11] xfs_repair: ignore "repaired" flag after we decide to clear xattr block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/11] xfs_repair: ignore "repaired" flag after we decide to clear xattr block To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:52 -0700 Message-ID: <20150826003252.23973.60802.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440549175 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If in the course of examining extended attribute block contents we first decide to repair an entry (*repair = 1) but secondly decide to clear the whole block, set *repair = 0 because the clearing action only happens if *repair == 0. Put another way, if we're nuking a block, don't pretend like we've fixed it too. v2: fix all the paths to clear the attr block if the processing functions error out. Signed-off-by: Darrick J. Wong --- repair/attr_repair.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 83a07a8..c2b7c3a 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -1311,6 +1311,13 @@ process_leaf_attr_block( * we can add it then. */ } + /* + * If we're just going to zap the block, don't pretend like we + * repaired it, because repairing the block stops the clear + * operation. + */ + if (clearit) + *repair = 0; if (*repair) xfs_attr3_leaf_hdr_to_disk(mp->m_attr_geo, leaf, &leafhdr); @@ -1524,6 +1531,7 @@ process_longform_attr( xfs_dahash_t next_hashval; int repairlinks = 0; struct xfs_attr3_icleaf_hdr leafhdr; + int error; *repair = 0; @@ -1589,6 +1597,7 @@ process_longform_attr( case XFS_ATTR3_LEAF_MAGIC: if (process_leaf_attr_block(mp, leaf, 0, ino, blkmap, 0, &next_hashval, repair)) { + *repair = 0; /* the block is bad. lose the attribute fork. */ libxfs_putbuf(bp); return(1); @@ -1604,12 +1613,16 @@ process_longform_attr( libxfs_writebuf(bp, 0); } else libxfs_putbuf(bp); - return (process_node_attr(mp, ino, dip, blkmap)); /* + repair */ + error = process_node_attr(mp, ino, dip, blkmap); /* + repair */ + if (error) + *repair = 0; + return error; default: do_warn( _("bad attribute leaf magic # %#x for dir ino %" PRIu64 "\n"), be16_to_cpu(leaf->hdr.info.magic), ino); libxfs_putbuf(bp); + *repair = 0; return(1); } From darrick.wong@oracle.com Tue Aug 25 19:33:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 458F429E04 for ; Tue, 25 Aug 2015 19:33:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 179B68F8040 for ; Tue, 25 Aug 2015 17:33:03 -0700 (PDT) X-ASG-Debug-ID: 1440549181-04bdf0239869340001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id jLWrWrfNvN65fxWv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:33:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0X0HM029590 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:33:00 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WxRP029060 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:32:59 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0WxEl025825; Wed, 26 Aug 2015 00:32:59 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:32:59 -0700 Subject: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:32:59 -0700 Message-ID: <20150826003259.23973.34038.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440549181 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Check the v5 fields (uuid, blocknr, owner) of attribute blocks for obvious errors while scanning xattr blocks. If the ownership info is incorrect, kill the block. Signed-off-by: Darrick J. Wong --- repair/attr_repair.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/repair/attr_repair.c b/repair/attr_repair.c index c2b7c3a..8d03161 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -1508,6 +1508,44 @@ process_node_attr( return (process_leaf_attr_level(mp, &da_cursor)); } +/* check v5 metadata */ +static int +__check_attr_header( + struct xfs_mount *mp, + struct xfs_buf *bp, + xfs_ino_t ino) +{ + struct xfs_da3_blkinfo *info = bp->b_addr; + + if (info->hdr.magic != cpu_to_be16(XFS_ATTR3_LEAF_MAGIC) && + info->hdr.magic != cpu_to_be16(XFS_DA3_NODE_MAGIC)) + return 0; + + /* verify owner */ + if (be64_to_cpu(info->owner) != ino) { + do_warn( +_("expected owner inode %" PRIu64 ", got %llu, attr block %" PRIu64 "\n"), + ino, be64_to_cpu(info->owner), bp->b_bn); + return 1; + } + /* verify block number */ + if (be64_to_cpu(info->blkno) != bp->b_bn) { + do_warn( +_("expected block %" PRIu64 ", got %llu, inode %" PRIu64 "attr block\n"), + bp->b_bn, be64_to_cpu(info->blkno), ino); + return 1; + } + /* verify uuid */ + if (platform_uuid_compare(&info->uuid, &mp->m_sb.sb_meta_uuid) != 0) { + do_warn( +_("wrong FS UUID, inode %" PRIu64 " attr block %" PRIu64 "\n"), + ino, bp->b_bn); + return 1; + } + + return 0; +} + /* * Start processing for a leaf or fuller btree. * A leaf directory is one where the attribute fork is too big for @@ -1564,6 +1602,13 @@ process_longform_attr( if (bp->b_error == -EFSBADCRC) (*repair)++; + /* is this block sane? */ + if (__check_attr_header(mp, bp, ino)) { + *repair = 0; + libxfs_putbuf(bp); + return 1; + } + /* verify leaf block */ leaf = (xfs_attr_leafblock_t *)XFS_BUF_PTR(bp); xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf); From darrick.wong@oracle.com Tue Aug 25 19:33:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A2D3029E01 for ; Tue, 25 Aug 2015 19:33:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4DCCFAC005 for ; Tue, 25 Aug 2015 17:33:09 -0700 (PDT) X-ASG-Debug-ID: 1440549187-04bdf0239869350001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 3s8XIQUNTPJzzcS3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:33:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0X6fd030003 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:33:07 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0X65I012467 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:33:06 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0X5Fo007420; Wed, 26 Aug 2015 00:33:05 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:33:05 -0700 Subject: [PATCH 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:33:05 -0700 Message-ID: <20150826003305.23973.65768.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440549188 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If during prefetch we encounter a bmbt block that fails the CRC check due to corruption in the unused part of the block, force the buffer back through the non-prefetch verifiers later so that the CRC is updated. Otherwise, the bad checksum goes unfixed and the kernel will still flag the bmbt block as invalid. Signed-off-by: Darrick J. Wong --- repair/prefetch.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/repair/prefetch.c b/repair/prefetch.c index 1de3ec0..77d29c8 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -276,6 +276,14 @@ pf_scan_lbtree( XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); + /* + * Make this bmbt buffer go back through the verifiers later so that + * we correct checksum errors stemming from bitflips in the unused + * parts of the bmbt block. + */ + if (bp->b_error == -EFSBADCRC) + bp->b_flags |= LIBXFS_B_UNCHECKED; + rc = (*func)(XFS_BUF_TO_BLOCK(bp), level - 1, isadir, args); libxfs_putbuf(bp); From darrick.wong@oracle.com Tue Aug 25 19:33:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 43FF829E01 for ; Tue, 25 Aug 2015 19:33:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 338878F8040 for ; Tue, 25 Aug 2015 17:33:17 -0700 (PDT) X-ASG-Debug-ID: 1440549193-04cb6c4a2b652c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id YWdTyDJdpggb9TEy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:33:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0XCxS030108 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:33:12 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XCeJ012606 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:33:12 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XCsh025890; Wed, 26 Aug 2015 00:33:12 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:33:11 -0700 Subject: [PATCH 08/11] xfs_io: support reflinking and deduping file ranges From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/11] xfs_io: support reflinking and deduping file ranges To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:33:11 -0700 Message-ID: <20150826003311.23973.64761.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440549193 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Wire up xfs_io to use the XFS range clone and dedupe ioctls to make files share data blocks. Signed-off-by: Darrick J. Wong --- io/Makefile | 2 - io/dedupe.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++ io/init.c | 2 + io/io.h | 3 + io/reflink.c | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_fs.h | 36 ++++++++++ man/man8/xfs_io.8 | 67 +++++++++++++++++++ 7 files changed, 479 insertions(+), 1 deletion(-) create mode 100644 io/dedupe.c create mode 100644 io/reflink.c diff --git a/io/Makefile b/io/Makefile index a08a782..6c4810e 100644 --- a/io/Makefile +++ b/io/Makefile @@ -11,7 +11,7 @@ HFILES = init.h io.h CFILES = init.c \ attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c link.c \ mmap.c open.c parent.c pread.c prealloc.c pwrite.c seek.c shutdown.c \ - sync.c truncate.c + sync.c truncate.c reflink.c dedupe.c LLDLIBS = $(LIBXCMD) $(LIBHANDLE) LTDEPENDENCIES = $(LIBXCMD) $(LIBHANDLE) diff --git a/io/dedupe.c b/io/dedupe.c new file mode 100644 index 0000000..59c3d0f --- /dev/null +++ b/io/dedupe.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2015 Oracle, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "command.h" +#include "input.h" +#include "init.h" +#include "io.h" + +static cmdinfo_t dedupe_cmd; + +static void +dedupe_help(void) +{ + printf(_( +"\n" +" Links a range of bytes (in block size increments) from a file into a range \n" +" of bytes in the open file. The contents of both file ranges must match.\n" +"\n" +" Example:\n" +" 'dedupe some_file 0 4096 32768' - links 32768 bytes from some_file at \n" +" offset 0 to into the open file at \n" +" position 4096\n" +"\n" +" Reflink a range of blocks from a given input file to the open file. Both\n" +" files share the same range of physical disk blocks; a write to the shared\n" +" range of either file should result in the write landing in a new block and\n" +" that range of the file being remapped (i.e. copy-on-write). Both files\n" +" must reside on the same filesystem, and the contents of both ranges must\n" +" match.\n" +" -w -- call fdatasync(2) at the end (included in timing results)\n" +" -W -- call fsync(2) at the end (included in timing results)\n" +"\n")); +} + +static int +dedupe_f( + int argc, + char **argv) +{ + off64_t soffset, doffset; + long long count, total; + char s1[64], s2[64], ts[64]; + char *infile; + int Cflag, qflag, wflag, Wflag; + struct xfs_ioctl_file_extent_same_args *args = NULL; + struct xfs_ioctl_file_extent_same_info *info; + size_t fsblocksize, fssectsize; + struct timeval t1, t2; + int c, fd = -1; + + Cflag = qflag = wflag = Wflag = 0; + init_cvtnum(&fsblocksize, &fssectsize); + + while ((c = getopt(argc, argv, "CqwW")) != EOF) { + switch (c) { + case 'C': + Cflag = 1; + break; + case 'q': + qflag = 1; + break; + case 'w': + wflag = 1; + break; + case 'W': + Wflag = 1; + break; + default: + return command_usage(&dedupe_cmd); + } + } + if (optind != argc - 4) + return command_usage(&dedupe_cmd); + infile = argv[optind]; + optind++; + soffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (soffset < 0) { + printf(_("non-numeric src offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + doffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (doffset < 0) { + printf(_("non-numeric dest offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + count = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (count < 1) { + printf(_("non-positive length argument -- %s\n"), argv[optind]); + return 0; + } + + c = IO_READONLY; + fd = openfile(infile, NULL, c, 0); + if (fd < 0) + return 0; + + gettimeofday(&t1, NULL); + args = calloc(1, sizeof(struct xfs_ioctl_file_extent_same_args) + + sizeof(struct xfs_ioctl_file_extent_same_info)); + if (!args) + goto done; + info = (struct xfs_ioctl_file_extent_same_info *)(args + 1); + args->logical_offset = soffset; + args->length = count; + args->dest_count = 1; + info->fd = file->fd; + info->logical_offset = doffset; + do { + c = ioctl(fd, XFS_IOC_FILE_EXTENT_SAME, args); + if (c) + break; + args->logical_offset += info->bytes_deduped; + info->logical_offset += info->bytes_deduped; + args->length -= info->bytes_deduped; + } while (c == 0 && info->status == 0 && info->bytes_deduped > 0); + if (c) + perror(_("dedupe ioctl")); + if (info->status < 0) + printf("dedupe: %s\n", _(strerror(-info->status))); + if (info->status == XFS_SAME_DATA_DIFFERS) + printf(_("Extents did not match.\n")); + if (c != 0 || info->status != 0) + goto done; + total = info->bytes_deduped; + c = 1; + if (Wflag) + fsync(file->fd); + if (wflag) + fdatasync(file->fd); + if (qflag) + goto done; + gettimeofday(&t2, NULL); + t2 = tsub(t2, t1); + + /* Finally, report back -- -C gives a parsable format */ + timestr(&t2, ts, sizeof(ts), Cflag ? VERBOSE_FIXED_TIME : 0); + if (!Cflag) { + cvtstr((double)total, s1, sizeof(s1)); + cvtstr(tdiv((double)total, t2), s2, sizeof(s2)); + printf(_("linked %lld/%lld bytes at offset %lld\n"), + total, count, (long long)doffset); + printf(_("%s, %d ops; %s (%s/sec and %.4f ops/sec)\n"), + s1, c, ts, s2, tdiv((double)c, t2)); + } else {/* bytes,ops,time,bytes/sec,ops/sec */ + printf("%lld,%d,%s,%.3f,%.3f\n", + total, c, ts, + tdiv((double)total, t2), tdiv((double)c, t2)); + } +done: + free(args); + close(fd); + return 0; +} + +void +dedupe_init(void) +{ + dedupe_cmd.name = "dedupe"; + dedupe_cmd.altname = "dd"; + dedupe_cmd.cfunc = dedupe_f; + dedupe_cmd.argmin = 4; + dedupe_cmd.argmax = -1; + dedupe_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + dedupe_cmd.args = +_("infile src_off dst_off len"); + dedupe_cmd.oneline = + _("dedupes a number of bytes at a specified offset"); + dedupe_cmd.help = dedupe_help; + + add_command(&dedupe_cmd); +} diff --git a/io/init.c b/io/init.c index 13f35c4..739371e 100644 --- a/io/init.c +++ b/io/init.c @@ -83,6 +83,8 @@ init_commands(void) sync_init(); sync_range_init(); truncate_init(); + reflink_init(); + dedupe_init(); } static int diff --git a/io/io.h b/io/io.h index b115e4a..ec8a530 100644 --- a/io/io.h +++ b/io/io.h @@ -161,3 +161,6 @@ extern void readdir_init(void); #else #define readdir_init() do { } while (0) #endif + +extern void reflink_init(void); +extern void dedupe_init(void); diff --git a/io/reflink.c b/io/reflink.c new file mode 100644 index 0000000..fc2d2b9 --- /dev/null +++ b/io/reflink.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2015 Oracle, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "command.h" +#include "input.h" +#include "init.h" +#include "io.h" + +static cmdinfo_t reflink_cmd; + +static void +reflink_help(void) +{ + printf(_( +"\n" +" Links a range of bytes (in block size increments) from a file into a range \n" +" of bytes in the open file. The two extent ranges need not contain identical\n" +" data. \n" +"\n" +" Example:\n" +" 'reflink some_file 0 4096 32768' - links 32768 bytes from some_file at \n" +" offset 0 to into the open file at \n" +" position 4096\n" +" 'reflink some_file' - links all bytes from some_file into the open file\n" +" at position 0\n" +"\n" +" Reflink a range of blocks from a given input file to the open file. Both\n" +" files share the same range of physical disk blocks; a write to the shared\n" +" range of either file should result in the write landing in a new block and\n" +" that range of the file being remapped (i.e. copy-on-write). Both files\n" +" must reside on the same filesystem.\n" +" -w -- call fdatasync(2) at the end (included in timing results)\n" +" -W -- call fsync(2) at the end (included in timing results)\n" +"\n")); +} + +static int +reflink_f( + int argc, + char **argv) +{ + off64_t soffset, doffset; + long long count = 0, total; + char s1[64], s2[64], ts[64]; + char *infile = NULL; + int Cflag, qflag, wflag, Wflag; + struct xfs_ioctl_clone_range_args args; + size_t fsblocksize, fssectsize; + struct timeval t1, t2; + int c, fd = -1; + + Cflag = qflag = wflag = Wflag = 0; + init_cvtnum(&fsblocksize, &fssectsize); + + while ((c = getopt(argc, argv, "CqwW")) != EOF) { + switch (c) { + case 'C': + Cflag = 1; + break; + case 'q': + qflag = 1; + break; + case 'w': + wflag = 1; + break; + case 'W': + Wflag = 1; + break; + default: + return command_usage(&reflink_cmd); + } + } + if (optind != argc - 4 && optind != argc - 1) + return command_usage(&reflink_cmd); + infile = argv[optind]; + optind++; + if (optind == argc) + goto clone_all; + soffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (soffset < 0) { + printf(_("non-numeric src offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + doffset = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (doffset < 0) { + printf(_("non-numeric dest offset argument -- %s\n"), argv[optind]); + return 0; + } + optind++; + count = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (count < 1) { + printf(_("non-positive length argument -- %s\n"), argv[optind]); + return 0; + } + +clone_all: + c = IO_READONLY; + fd = openfile(infile, NULL, c, 0); + if (fd < 0) + return 0; + + gettimeofday(&t1, NULL); + if (count) { + args.src_fd = fd; + args.src_offset = soffset; + args.src_length = count; + args.dest_offset = doffset; + c = ioctl(file->fd, XFS_IOC_CLONE_RANGE, &args); + } else { + c = ioctl(file->fd, XFS_IOC_CLONE, fd); + } + if (c < 0) { + perror(_("reflink")); + goto done; + } + total = count; + c = 1; + if (Wflag) + fsync(file->fd); + if (wflag) + fdatasync(file->fd); + if (qflag) + goto done; + gettimeofday(&t2, NULL); + t2 = tsub(t2, t1); + + /* Finally, report back -- -C gives a parsable format */ + timestr(&t2, ts, sizeof(ts), Cflag ? VERBOSE_FIXED_TIME : 0); + if (!Cflag) { + cvtstr((double)total, s1, sizeof(s1)); + cvtstr(tdiv((double)total, t2), s2, sizeof(s2)); + printf(_("linked %lld/%lld bytes at offset %lld\n"), + total, count, (long long)doffset); + printf(_("%s, %d ops; %s (%s/sec and %.4f ops/sec)\n"), + s1, c, ts, s2, tdiv((double)c, t2)); + } else {/* bytes,ops,time,bytes/sec,ops/sec */ + printf("%lld,%d,%s,%.3f,%.3f\n", + total, c, ts, + tdiv((double)total, t2), tdiv((double)c, t2)); + } +done: + close(fd); + return 0; +} + +void +reflink_init(void) +{ + reflink_cmd.name = "reflink"; + reflink_cmd.altname = "rl"; + reflink_cmd.cfunc = reflink_f; + reflink_cmd.argmin = 4; + reflink_cmd.argmax = -1; + reflink_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + reflink_cmd.args = +_("infile src_off dst_off len"); + reflink_cmd.oneline = + _("reflinks a number of bytes at a specified offset"); + reflink_cmd.help = reflink_help; + + add_command(&reflink_cmd); +} diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 89689c6..0c922ad 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -559,6 +559,42 @@ typedef struct xfs_swapext #define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ +/* reflink ioctls; these MUST match the btrfs ioctl definitions */ +struct xfs_ioctl_clone_range_args { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +#define XFS_SAME_DATA_DIFFERS 1 +/* For extent-same ioctl */ +struct xfs_ioctl_file_extent_same_info { + __s64 fd; /* in - destination file */ + __u64 logical_offset; /* in - start of extent in destination */ + __u64 bytes_deduped; /* out - total # of bytes we were able + * to dedupe from this file */ + /* status of this dedupe operation: + * 0 if dedup succeeds + * < 0 for error + * == XFS_SAME_DATA_DIFFERS if data differs + */ + __s32 status; /* out - see above description */ + __u32 reserved; +}; + +struct xfs_ioctl_file_extent_same_args { + __u64 logical_offset; /* in - start of extent in source */ + __u64 length; /* in - length of extent */ + __u16 dest_count; /* in - total elements in info array */ + __u16 reserved1; + __u32 reserved2; + struct xfs_ioctl_file_extent_same_info info[0]; +}; + +#define XFS_IOC_CLONE _IOW (0x94, 9, int) +#define XFS_IOC_CLONE_RANGE _IOW (0x94, 13, struct xfs_ioctl_clone_range_args) +#define XFS_IOC_FILE_EXTENT_SAME _IOWR(0x94, 54, struct xfs_ioctl_file_extent_same_args) #ifndef HAVE_BBMACROS /* diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 416206f..305335c 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -490,6 +490,73 @@ Recursively display all the specified segments starting at the specified .B \-s Display the starting lseek(2) offset. This offset will be a calculated value when both data and holes are displayed together or performing a recusively display. +.RE +.PD +.TP +.TP +.BI "reflink [ \-w ] [ \-W ] src_file [src_offset dst_offset length]" +On filesystems that support the +.B XFS_IOC_CLONE_RANGE +or +.B BTRFS_IOC_CLONE_RANGE +ioctls, map +.I length +bytes at offset +.I dst_offset +in the open file to the same physical blocks that are mapped at offset +.I src_offset +in the file +.I src_file +, replacing any contents that may already have been there. If a program +writes into a reflinked block range of either file, the dirty blocks will be +cloned, written to, and remapped ("copy on write") in the affected file, +leaving the other file(s) unchanged. If src_offset, dst_offset, and length +are omitted, all contents of src_file will be reflinked into the open file. +.RS 1.0i +.PD 0 +.TP 0.4i +.B \-w +Call +.BR fdatasync (2) +after executing the ioctl. +.TP +.B \-W +Call +.BR fsync (2) +after executing the command. +.RE +.PD +.TP +.TP +.BI "dedupe [ \-w ] [ \-W ] src_file src_offset dst_offset length" +On filesystems that support the +.B XFS_IOC_FILE_EXTENT_SAME +or +.B BTRFS_IOC_FILE_EXTENT_SAME +ioctls, map +.I length +bytes at offset +.I dst_offset +in the open file to the same physical blocks that are mapped at offset +.I src_offset +in the file +.I src_file +, but only if the contents of both ranges are identical. This is known as +block-based deduplication. If a program writes into a reflinked block range of +either file, the dirty blocks will be cloned, written to, and remapped ("copy +on write") in the affected file, leaving the other file(s) unchanged. +.RS 1.0i +.PD 0 +.TP 0.4i +.B \-w +Call +.BR fdatasync (2) +after executing the ioctl. +.TP +.B \-W +Call +.BR fsync (2) +after executing the command. .TP .SH MEMORY MAPPED I/O COMMANDS From darrick.wong@oracle.com Tue Aug 25 19:33:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5F67E29E0F for ; Tue, 25 Aug 2015 19:33:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E2942AC005 for ; Tue, 25 Aug 2015 17:33:21 -0700 (PDT) X-ASG-Debug-ID: 1440549199-04cbb07cbc701f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id t4nALlN6q0D5CV1L (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:33:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0XIwS030139 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:33:19 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XIJm020487 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:33:18 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XIHD009018; Wed, 26 Aug 2015 00:33:18 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:33:18 -0700 Subject: [PATCH 09/11] xfs_db: enable blocktrash for checksummed filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/11] xfs_db: enable blocktrash for checksummed filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:33:18 -0700 Message-ID: <20150826003318.23973.43518.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440549200 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Disable the write verifiers when we're trashing a block. With this in place, create a xfs fuzzer script that formats, populates, corrupts, tries to use, repairs, and tries again to use a crash test xfs image. Hopefully this will shake out some v5 filesystem bugs. v2: Drop xfsfuzz, don't assume every block is an AGF when blocktrashing. Don't trash log blocks by default, because that skews the blocktrash heavily towards damaging only log blocks. v3: Fix changelog issues, allow trashing of log blocks and symlinks, and require the caller to explicitly ask for trashing of log blocks and super blocks. Allowing log blocks by default skews the trashing heavily in favor of (probably unused) log blocks, which doesn't help us with fuzzing. Furthermore, trashing the superblock results in a time consuming sector by sector superblock hunt. Signed-off-by: Darrick J. Wong --- db/check.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/db/check.c b/db/check.c index d28199d..8f3b5b6 100644 --- a/db/check.c +++ b/db/check.c @@ -944,6 +944,7 @@ blocktrash_b( int mask; int newbit; int offset; + const struct xfs_buf_ops *stashed_ops; static char *modestr[] = { N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") }; @@ -952,8 +953,10 @@ blocktrash_b( offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); newbit = 0; push_cur(); - set_cur(&typtab[DBM_UNKNOWN], + set_cur(NULL, XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); + stashed_ops = iocur_top->bp->b_ops; + iocur_top->bp->b_ops = NULL; if ((buf = iocur_top->data) == NULL) { dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); pop_cur(); @@ -984,6 +987,7 @@ blocktrash_b( buf[byte] &= ~mask; } write_cur(); + iocur_top->bp->b_ops = stashed_ops; pop_cur(); printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), agno, agbno, typename[type], len, len == 1 ? "" : "s", @@ -1040,9 +1044,11 @@ blocktrash_f( (1 << DBM_BTINO) | (1 << DBM_DIR) | (1 << DBM_INODE) | + (1 << DBM_LOG) | (1 << DBM_QUOTA) | (1 << DBM_RTBITMAP) | (1 << DBM_RTSUM) | + (1 << DBM_SYMLINK) | (1 << DBM_SB); while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { switch (c) { @@ -1106,7 +1112,7 @@ blocktrash_f( return 0; } if (tmask == 0) - tmask = goodmask; + tmask = goodmask & ~((1 << DBM_LOG) | (1 << DBM_SB)); lentab = xmalloc(sizeof(ltab_t)); lentab->min = lentab->max = min; lentablen = 1; From darrick.wong@oracle.com Tue Aug 25 19:33:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 361747F54 for ; Tue, 25 Aug 2015 19:33:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 07FC5304059 for ; Tue, 25 Aug 2015 17:33:28 -0700 (PDT) X-ASG-Debug-ID: 1440549206-04bdf0239769370001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id j5bBXBYXAnxvaZGC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:33:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0XPrb030188 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:33:25 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XPiX020690 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:33:25 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XOtC026489; Wed, 26 Aug 2015 00:33:24 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:33:24 -0700 Subject: [PATCH 10/11] xfs_db: trash the block at the top of the cursor stack From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/11] xfs_db: trash the block at the top of the cursor stack To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:33:24 -0700 Message-ID: <20150826003324.23973.96989.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440549206 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a new -z option to blocktrash to make it trash the block that's at the top of the stack, so that we can perform targeted fuzzing. While we're at it, prevent fuzzing off the end of the buffer and add a -o parameter so that we can specify an offset to start fuzzing from. Signed-off-by: Darrick J. Wong --- db/check.c | 85 +++++++++++++++++++++++++++++++++++++++++------------ man/man8/xfs_db.8 | 15 +++++++++ 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/db/check.c b/db/check.c index 8f3b5b6..5b32d07 100644 --- a/db/check.c +++ b/db/check.c @@ -930,8 +930,7 @@ typedef struct ltab { static void blocktrash_b( - xfs_agnumber_t agno, - xfs_agblock_t agbno, + int bit_offset, dbm_t type, ltab_t *ltabp, int mode) @@ -943,27 +942,40 @@ blocktrash_b( int len; int mask; int newbit; - int offset; const struct xfs_buf_ops *stashed_ops; static char *modestr[] = { N_("zeroed"), N_("set"), N_("flipped"), N_("randomized") }; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + agno = XFS_FSB_TO_AGNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); + agbno = XFS_FSB_TO_AGBNO(mp, XFS_DADDR_TO_FSB(mp, iocur_top->bb)); + if (iocur_top->len == 0) { + dbprintf(_("zero-length block %u/%u buffer to trash??\n"), + agno, agbno); + return; + } len = (int)((random() % (ltabp->max - ltabp->min + 1)) + ltabp->min); - offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY)); + /* + * bit_offset >= 0: start fuzzing at this exact bit_offset. + * bit_offset < 0: pick an offset at least as high at -(bit_offset + 1). + */ + if (bit_offset < 0) { + bit_offset = -(bit_offset + 1); + bit_offset += (int)(random() % (int)((iocur_top->len - bit_offset) * NBBY)); + } + if (bit_offset + len >= iocur_top->len * NBBY) + len = (iocur_top->len * NBBY) - bit_offset; newbit = 0; - push_cur(); - set_cur(NULL, - XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL); stashed_ops = iocur_top->bp->b_ops; iocur_top->bp->b_ops = NULL; if ((buf = iocur_top->data) == NULL) { dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno); - pop_cur(); return; } for (bitno = 0; bitno < len; bitno++) { - bit = (offset + bitno) % (mp->m_sb.sb_blocksize * NBBY); + bit = (bit_offset + bitno) % (mp->m_sb.sb_blocksize * NBBY); byte = bit / NBBY; bit %= NBBY; mask = 1 << bit; @@ -988,10 +1000,9 @@ blocktrash_b( } write_cur(); iocur_top->bp->b_ops = stashed_ops; - pop_cur(); printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"), agno, agbno, typename[type], len, len == 1 ? "" : "s", - offset / NBBY, offset % NBBY, modestr[mode]); + bit_offset / NBBY, bit_offset % NBBY, modestr[mode]); } int @@ -1019,11 +1030,9 @@ blocktrash_f( uint seed; int sopt; int tmask; + bool this_block = false; + int bit_offset = -1; - if (!dbmap) { - dbprintf(_("must run blockget first\n")); - return 0; - } optind = 0; count = 1; min = 1; @@ -1050,7 +1059,7 @@ blocktrash_f( (1 << DBM_RTSUM) | (1 << DBM_SYMLINK) | (1 << DBM_SB); - while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) { + while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { switch (c) { case '0': mode = 0; @@ -1071,6 +1080,21 @@ blocktrash_f( return 0; } break; + case 'o': { + int relative = 0; + if (optarg[0] == '+') { + optarg++; + relative = 1; + } + bit_offset = (int)strtol(optarg, &p, 0); + if (*p != '\0' || bit_offset < 0) { + dbprintf(_("bad blocktrash offset %s\n"), optarg); + return 0; + } + if (relative) + bit_offset = -bit_offset - 1; + break; + } case 's': seed = (uint)strtoul(optarg, &p, 0); sopt = 1; @@ -1102,11 +1126,22 @@ blocktrash_f( return 0; } break; + case 'z': + this_block = true; + break; default: dbprintf(_("bad option for blocktrash command\n")); return 0; } } + if (!this_block && !dbmap) { + dbprintf(_("must run blockget first\n")); + return 0; + } + if (this_block && iocur_sp == 0) { + dbprintf(_("nothing on stack\n")); + return 0; + } if (min > max) { dbprintf(_("bad min/max for blocktrash command\n")); return 0; @@ -1125,6 +1160,14 @@ blocktrash_f( } else lentab[lentablen - 1].max = i; } + if (!sopt) + dbprintf(_("blocktrash: seed %u\n"), seed); + srandom(seed); + if (this_block) { + blocktrash_b(bit_offset, DBM_UNKNOWN, + &lentab[random() % lentablen], mode); + goto out; + } for (blocks = 0, agno = 0; agno < mp->m_sb.sb_agcount; agno++) { for (agbno = 0, p = dbmap[agno]; agbno < mp->m_sb.sb_agblocks; @@ -1137,9 +1180,6 @@ blocktrash_f( dbprintf(_("blocktrash: no matching blocks\n")); goto out; } - if (!sopt) - dbprintf(_("blocktrash: seed %u\n"), seed); - srandom(seed); for (i = 0; i < count; i++) { randb = (xfs_rfsblock_t)((((__int64_t)random() << 32) | random()) % blocks); @@ -1153,8 +1193,13 @@ blocktrash_f( continue; if (bi++ < randb) continue; - blocktrash_b(agno, agbno, (dbm_t)*p, + push_cur(); + set_cur(NULL, + XFS_AGB_TO_DADDR(mp, agno, agbno), + blkbb, DB_RING_IGN, NULL); + blocktrash_b(bit_offset, (dbm_t)*p, &lentab[random() % lentablen], mode); + pop_cur(); done = 1; break; } diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index df54bb7..681efc4 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -232,7 +232,7 @@ enables verbose output. Messages will be printed for every block and inode processed. .RE .TP -.BI "blocktrash [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." +.BI "blocktrash [-z] [\-o " offset "] [\-n " count "] [\-x " min "] [\-y " max "] [\-s " seed "] [\-0|1|2|3] [\-t " type "] ..." Trash randomly selected filesystem metadata blocks. Trashing occurs to randomly selected bits in the chosen blocks. This command is available only in debugging versions of @@ -259,6 +259,13 @@ supplies the .I count of block-trashings to perform (default 1). .TP +.B \-o +supplies the bit +.I offset +at which to start trashing the block. If the value is preceded by a '+', the +trashing will start at a randomly chosen offset that is larger than the value +supplied. The default is to randomly choose an offset anywhere in the block. +.TP .B \-s supplies a .I seed @@ -282,6 +289,12 @@ size of bit range to be trashed. The default value is 1. sets the .I maximum size of bit range to be trashed. The default value is 1024. +.TP +.B \-z +trashes the block at the top of the stack. It is not necessary to +run +.BI blockget +if this option is supplied. .RE .TP .BI "blockuse [\-n] [\-c " count ] From darrick.wong@oracle.com Tue Aug 25 19:33:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B774E7F4E for ; Tue, 25 Aug 2015 19:33:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A69E58F8037 for ; Tue, 25 Aug 2015 17:33:34 -0700 (PDT) X-ASG-Debug-ID: 1440549212-04cb6c4a28652e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4mjpNyFJ5mDIdFyr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:33:32 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0XVGX030067 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:33:31 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XVia030289 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:33:31 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0XV4N007545; Wed, 26 Aug 2015 00:33:31 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:33:30 -0700 Subject: [PATCH 11/11] xfs_db: enable blockget for v5 filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/11] xfs_db: enable blockget for v5 filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: xfs@oss.sgi.com Date: Tue, 25 Aug 2015 17:33:30 -0700 Message-ID: <20150826003330.23973.70810.stgit@birch.djwong.org> In-Reply-To: <20150826003220.23973.59731.stgit@birch.djwong.org> References: <20150826003220.23973.59731.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440549212 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the necessary magic number checks and other fixups required to handle v5 filesystems. Signed-off-by: Darrick J. Wong --- db/check.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- db/type.c | 2 + 2 files changed, 214 insertions(+), 26 deletions(-) diff --git a/db/check.c b/db/check.c index 5b32d07..9c1541d 100644 --- a/db/check.c +++ b/db/check.c @@ -44,7 +44,7 @@ typedef enum { DBM_FREE1, DBM_FREE2, DBM_FREELIST, DBM_INODE, DBM_LOG, DBM_MISSING, DBM_QUOTA, DBM_RTBITMAP, DBM_RTDATA, DBM_RTFREE, DBM_RTSUM, DBM_SB, - DBM_SYMLINK, + DBM_SYMLINK, DBM_BTFINO, DBM_NDBM } dbm_t; @@ -170,6 +170,7 @@ static const char *typename[] = { "rtsum", "sb", "symlink", + "btfino", NULL }; static int verbose; @@ -345,6 +346,9 @@ static void scanfunc_cnt(struct xfs_btree_block *block, int level, static void scanfunc_ino(struct xfs_btree_block *block, int level, xfs_agf_t *agf, xfs_agblock_t bno, int isroot); +static void scanfunc_fino(struct xfs_btree_block *block, int level, + struct xfs_agf *agf, xfs_agblock_t bno, + int isroot); static void set_dbmap(xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, dbm_t type, xfs_agnumber_t c_agno, xfs_agblock_t c_agbno); @@ -789,19 +793,6 @@ blockget_f( return 0; } - /* - * XXX: check does not support CRC enabled filesystems. Return - * immediately, silently, with success but without doing anything here - * initially so that xfstests can run without modification on metadata - * enabled filesystems. - * - * XXX: ultimately we need to dump an error message here that xfstests - * filters out, or we need to actually do the work to make check support - * crc enabled filesystems. - */ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return 0; - if (!init(argc, argv)) { if (serious_error) exitcode = 3; @@ -1058,6 +1049,7 @@ blocktrash_f( (1 << DBM_RTBITMAP) | (1 << DBM_RTSUM) | (1 << DBM_SYMLINK) | + (1 << DBM_BTFINO) | (1 << DBM_SB); while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { switch (c) { @@ -2267,7 +2259,9 @@ process_data_dir_v2( data = iocur_top->data; block = iocur_top->data; if (be32_to_cpu(block->magic) != XFS_DIR2_BLOCK_MAGIC && - be32_to_cpu(data->magic) != XFS_DIR2_DATA_MAGIC) { + be32_to_cpu(data->magic) != XFS_DIR2_DATA_MAGIC && + be32_to_cpu(block->magic) != XFS_DIR3_BLOCK_MAGIC && + be32_to_cpu(data->magic) != XFS_DIR3_DATA_MAGIC) { if (!sflag || v) dbprintf(_("bad directory data magic # %#x for dir ino " "%lld block %d\n"), @@ -2278,7 +2272,8 @@ process_data_dir_v2( db = xfs_dir2_da_to_db(mp->m_dir_geo, dabno); bf = M_DIROPS(mp)->data_bestfree_p(data); ptr = (char *)M_DIROPS(mp)->data_unused_p(data); - if (be32_to_cpu(block->magic) == XFS_DIR2_BLOCK_MAGIC) { + if (be32_to_cpu(block->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(block->magic) == XFS_DIR3_BLOCK_MAGIC) { btp = xfs_dir2_block_tail_p(mp->m_dir_geo, block); lep = xfs_dir2_block_leaf_p(btp); endptr = (char *)lep; @@ -2424,7 +2419,8 @@ process_data_dir_v2( (*dot)++; } } - if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC) { + if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(data->magic) == XFS_DIR3_BLOCK_MAGIC) { endptr = (char *)data + mp->m_dir_geo->blksize; for (i = stale = 0; lep && i < be32_to_cpu(btp->count); i++) { if ((char *)&lep[i] >= endptr) { @@ -2456,7 +2452,8 @@ process_data_dir_v2( id->ino, dabno); error++; } - if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC && + if ((be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(data->magic) == XFS_DIR3_BLOCK_MAGIC) && count != be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)) { if (!sflag || v) dbprintf(_("dir %lld block %d bad block tail count %d " @@ -2465,7 +2462,8 @@ process_data_dir_v2( be32_to_cpu(btp->stale)); error++; } - if (be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC && + if ((be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC || + be32_to_cpu(data->magic) == XFS_DIR2_BLOCK_MAGIC) && stale != be32_to_cpu(btp->stale)) { if (!sflag || v) dbprintf(_("dir %lld block %d bad stale tail count %d\n"), @@ -3051,6 +3049,73 @@ process_leaf_node_dir_v2( } static void +process_leaf_node_dir_v3_free( + inodata_t *id, + int v, + xfs_dablk_t dabno, + freetab_t *freetab) +{ + xfs_dir2_data_off_t ent; + struct xfs_dir3_free *free; + int i; + int maxent; + int used; + + free = iocur_top->data; + maxent = M_DIROPS(mp)->free_max_bests(mp->m_dir_geo); + if (be32_to_cpu(free->hdr.firstdb) != xfs_dir2_da_to_db(mp->m_dir_geo, + dabno - mp->m_dir_geo->freeblk) * maxent) { + if (!sflag || v) + dbprintf(_("bad free block firstdb %d for dir ino %lld " + "block %d\n"), + be32_to_cpu(free->hdr.firstdb), id->ino, dabno); + error++; + return; + } + if (be32_to_cpu(free->hdr.nvalid) > maxent || + be32_to_cpu(free->hdr.nvalid) < 0 || + be32_to_cpu(free->hdr.nused) > maxent || + be32_to_cpu(free->hdr.nused) < 0 || + be32_to_cpu(free->hdr.nused) > + be32_to_cpu(free->hdr.nvalid)) { + if (!sflag || v) + dbprintf(_("bad free block nvalid/nused %d/%d for dir " + "ino %lld block %d\n"), + be32_to_cpu(free->hdr.nvalid), + be32_to_cpu(free->hdr.nused), id->ino, dabno); + error++; + return; + } + for (used = i = 0; i < be32_to_cpu(free->hdr.nvalid); i++) { + if (freetab->nents <= be32_to_cpu(free->hdr.firstdb) + i) + ent = NULLDATAOFF; + else + ent = freetab->ents[be32_to_cpu(free->hdr.firstdb) + i]; + if (ent != be16_to_cpu(free->bests[i])) { + if (!sflag || v) + dbprintf(_("bad free block ent %d is %d should " + "be %d for dir ino %lld block %d\n"), + i, be16_to_cpu(free->bests[i]), ent, + id->ino, dabno); + error++; + } + if (be16_to_cpu(free->bests[i]) != NULLDATAOFF) + used++; + if (ent != NULLDATAOFF) + freetab->ents[be32_to_cpu(free->hdr.firstdb) + i] = + NULLDATAOFF; + } + if (used != be32_to_cpu(free->hdr.nused)) { + if (!sflag || v) + dbprintf(_("bad free block nused %d should be %d for dir " + "ino %lld block %d\n"), + be32_to_cpu(free->hdr.nused), used, id->ino, + dabno); + error++; + } +} + +static void process_leaf_node_dir_v2_free( inodata_t *id, int v, @@ -3064,7 +3129,8 @@ process_leaf_node_dir_v2_free( int used; free = iocur_top->data; - if (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC) { + if (be32_to_cpu(free->hdr.magic) != XFS_DIR2_FREE_MAGIC && + be32_to_cpu(free->hdr.magic) != XFS_DIR3_FREE_MAGIC) { if (!sflag || v) dbprintf(_("bad free block magic # %#x for dir ino %lld " "block %d\n"), @@ -3072,6 +3138,10 @@ process_leaf_node_dir_v2_free( error++; return; } + if (be32_to_cpu(free->hdr.magic) == XFS_DIR3_FREE_MAGIC) { + process_leaf_node_dir_v3_free(id, v, dabno, freetab); + return; + } maxent = M_DIROPS(mp)->free_max_bests(mp->m_dir_geo); if (be32_to_cpu(free->hdr.firstdb) != xfs_dir2_da_to_db(mp->m_dir_geo, dabno - mp->m_dir_geo->freeblk) * maxent) { @@ -3125,6 +3195,21 @@ process_leaf_node_dir_v2_free( } } +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline int +xfs_dir3_leaf_ents_count(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + + return be16_to_cpu(lp3->hdr.count); + } + return be16_to_cpu(lp->hdr.count); +} + static void process_leaf_node_dir_v2_int( inodata_t *id, @@ -3135,6 +3220,7 @@ process_leaf_node_dir_v2_int( int i; __be16 *lbp; xfs_dir2_leaf_t *leaf; + struct xfs_dir3_leaf *leaf3 = NULL; xfs_dir2_leaf_entry_t *lep; xfs_dir2_leaf_tail_t *ltp; xfs_da_intnode_t *node; @@ -3143,7 +3229,15 @@ process_leaf_node_dir_v2_int( leaf = iocur_top->data; switch (be16_to_cpu(leaf->hdr.info.magic)) { + case XFS_DIR3_LEAF1_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: + case XFS_DA3_NODE_MAGIC: + leaf3 = iocur_top->data; + break; + } + switch (be16_to_cpu(leaf->hdr.info.magic)) { case XFS_DIR2_LEAF1_MAGIC: + case XFS_DIR3_LEAF1_MAGIC: if (be32_to_cpu(leaf->hdr.info.forw) || be32_to_cpu(leaf->hdr.info.back)) { if (!sflag || v) @@ -3183,10 +3277,12 @@ process_leaf_node_dir_v2_int( } break; case XFS_DIR2_LEAFN_MAGIC: + case XFS_DIR3_LEAFN_MAGIC: /* if it's at the root location then we can check the * pointers are null XXX */ break; case XFS_DA_NODE_MAGIC: + case XFS_DA3_NODE_MAGIC: node = iocur_top->data; M_DIROPS(mp)->node_hdr_from_disk(&nodehdr, node); if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { @@ -3208,7 +3304,7 @@ process_leaf_node_dir_v2_int( return; } lep = M_DIROPS(mp)->leaf_ents_p(leaf); - for (i = stale = 0; i < be16_to_cpu(leaf->hdr.count); i++) { + for (i = stale = 0; i < xfs_dir3_leaf_ents_count(leaf); i++) { if (be32_to_cpu(lep[i].address) == XFS_DIR2_NULL_DATAPTR) stale++; else if (dir_hash_see(be32_to_cpu(lep[i].hashval), @@ -3221,7 +3317,14 @@ process_leaf_node_dir_v2_int( error++; } } - if (stale != be16_to_cpu(leaf->hdr.stale)) { + if (leaf3 && stale != be16_to_cpu(leaf3->hdr.stale)) { + if (!sflag || v) + dbprintf(_("dir3 %lld block %d stale mismatch " + "%d/%d\n"), + id->ino, dabno, stale, + be16_to_cpu(leaf3->hdr.stale)); + error++; + } else if (!leaf && stale != be16_to_cpu(leaf->hdr.stale)) { if (!sflag || v) dbprintf(_("dir %lld block %d stale mismatch " "%d/%d\n"), @@ -3808,6 +3911,12 @@ scan_ag( be32_to_cpu(agi->agi_root), be32_to_cpu(agi->agi_level), 1, scanfunc_ino, TYP_INOBT); + if (agi->agi_free_root) { + scan_sbtree(agf, + be32_to_cpu(agi->agi_free_root), + be32_to_cpu(agi->agi_free_level), + 1, scanfunc_fino, TYP_FINOBT); + } if (be32_to_cpu(agf->agf_freeblks) != agffreeblks) { if (!sflag) dbprintf(_("agf_freeblks %u, counted %u in ag %u\n"), @@ -4007,7 +4116,8 @@ scanfunc_bmap( agno = XFS_FSB_TO_AGNO(mp, bno); agbno = XFS_FSB_TO_AGBNO(mp, bno); - if (be32_to_cpu(block->bb_magic) != XFS_BMAP_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_BMAP_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_BMAP_CRC_MAGIC) { if (!sflag || id->ilist || CHECK_BLIST(bno)) dbprintf(_("bad magic # %#x in inode %lld bmbt block " "%u/%u\n"), @@ -4072,7 +4182,8 @@ scanfunc_bno( xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); xfs_agblock_t lastblock; - if (be32_to_cpu(block->bb_magic) != XFS_ABTB_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_ABTB_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_ABTB_CRC_MAGIC) { dbprintf(_("bad magic # %#x in btbno block %u/%u\n"), be32_to_cpu(block->bb_magic), seqno, bno); serious_error++; @@ -4145,7 +4256,8 @@ scanfunc_cnt( xfs_alloc_rec_t *rp; xfs_extlen_t lastcount; - if (be32_to_cpu(block->bb_magic) != XFS_ABTC_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_ABTC_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_ABTC_CRC_MAGIC) { dbprintf(_("bad magic # %#x in btcnt block %u/%u\n"), be32_to_cpu(block->bb_magic), seqno, bno); serious_error++; @@ -4225,7 +4337,8 @@ scanfunc_ino( xfs_inobt_ptr_t *pp; xfs_inobt_rec_t *rp; - if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC) { + if (be32_to_cpu(block->bb_magic) != XFS_IBT_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_IBT_CRC_MAGIC) { dbprintf(_("bad magic # %#x in inobt block %u/%u\n"), be32_to_cpu(block->bb_magic), seqno, bno); serious_error++; @@ -4321,6 +4434,79 @@ scanfunc_ino( } static void +scanfunc_fino( + struct xfs_btree_block *block, + int level, + struct xfs_agf *agf, + xfs_agblock_t bno, + int isroot) +{ + xfs_agino_t agino; + xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + int i; + int off; + xfs_inobt_ptr_t *pp; + struct xfs_inobt_rec *rp; + + if (be32_to_cpu(block->bb_magic) != XFS_FIBT_MAGIC && + be32_to_cpu(block->bb_magic) != XFS_FIBT_CRC_MAGIC) { + dbprintf(_("bad magic # %#x in finobt block %u/%u\n"), + be32_to_cpu(block->bb_magic), seqno, bno); + serious_error++; + return; + } + if (be16_to_cpu(block->bb_level) != level) { + if (!sflag) + dbprintf(_("expected level %d got %d in finobt block " + "%u/%u\n"), + level, be16_to_cpu(block->bb_level), seqno, bno); + error++; + } + set_dbmap(seqno, bno, 1, DBM_BTFINO, seqno, bno); + if (level == 0) { + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[0] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_inobt_mnr[0])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in " + "finobt block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_inobt_mnr[0], + mp->m_inobt_mxr[0], seqno, bno); + serious_error++; + return; + } + rp = XFS_INOBT_REC_ADDR(mp, block, 1); + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { + agino = be32_to_cpu(rp[i].ir_startino); + off = XFS_INO_TO_OFFSET(mp, agino); + if (off == 0) { + if ((sbversion & XFS_SB_VERSION_ALIGNBIT) && + mp->m_sb.sb_inoalignmt && + (XFS_INO_TO_AGBNO(mp, agino) % + mp->m_sb.sb_inoalignmt)) + sbversion &= ~XFS_SB_VERSION_ALIGNBIT; + check_set_dbmap(seqno, XFS_AGINO_TO_AGBNO(mp, agino), + (xfs_extlen_t)MAX(1, + XFS_INODES_PER_CHUNK >> + mp->m_sb.sb_inopblog), + DBM_INODE, DBM_INODE, seqno, bno); + } + } + return; + } + if (be16_to_cpu(block->bb_numrecs) > mp->m_inobt_mxr[1] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_inobt_mnr[1])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in finobt block " + "%u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_inobt_mnr[1], + mp->m_inobt_mxr[1], seqno, bno); + serious_error++; + return; + } + pp = XFS_INOBT_PTR_ADDR(mp, block, 1, mp->m_inobt_mxr[1]); + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) + scan_sbtree(agf, be32_to_cpu(pp[i]), level, 0, scanfunc_fino, TYP_FINOBT); +} + +static void set_dbmap( xfs_agnumber_t agno, xfs_agblock_t agbno, diff --git a/db/type.c b/db/type.c index 5c60736..955986b 100644 --- a/db/type.c +++ b/db/type.c @@ -141,6 +141,8 @@ static const typ_t __typtab_spcrc[] = { { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld, &xfs_symlink_buf_ops }, { TYP_TEXT, "text", handle_text, NULL, NULL }, + { TYP_FINOBT, "finobt", handle_struct, inobt_crc_hfld, + &xfs_inobt_buf_ops }, { TYP_NONE, NULL } }; From robin.listas@gmail.com Tue Aug 25 19:39:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD0F77F50 for ; Tue, 25 Aug 2015 19:39:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9217E304051 for ; Tue, 25 Aug 2015 17:39:19 -0700 (PDT) X-ASG-Debug-ID: 1440549556-04bdf0239969520001-NocioJ Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by cuda.sgi.com with ESMTP id 0dASSxU4qGXAtdaJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Aug 2015 17:39:17 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] Received: by widdq5 with SMTP id dq5so31004460wid.1 for ; Tue, 25 Aug 2015 17:39:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-type:content-transfer-encoding; bh=o1Nt5F2Bi28FqG5aKcZLn/JIZfQetB4v5kRu1m4Ngmg=; b=ucpo896ez02JxMCrux9WFcjuaw0yaUS4gfLqZ7ysVxoButdsX7c5sfXWq8x5gX5M7A a4pG42/jcExfOA7ZGK2YqDafRmfPXZ3OlZck3YHG2XvomyBtW79+I7cJ8SsVh/QSzxlU Hw+BbuKaSVSufWJne2/Libqen3QsvbSiNr6rhmYAPcsXN+ra0Y5fu0i7qdjLPlLMg8ty xL57arS0MMe0EEXr5wO1KaBBQUD4zW47fGfB53Lq7Sixa1WEZwrofloUIvkdJhN3AV6l ld8Sr9aLdhf/efiMfCoBNF+p/l+A0M0h5RRUZ2N0HHF6J+0zDvyBUeCM5GzAYVj9CMkA nbVQ== X-Received: by 10.180.208.34 with SMTP id mb2mr8831532wic.88.1440549556570; Tue, 25 Aug 2015 17:39:16 -0700 (PDT) Received: from minas-tirith.valinor (17.Red-83-42-75.dynamicIP.rima-tde.net. [83.42.75.17]) by smtp.gmail.com with ESMTPSA id go5sm5001687wib.5.2015.08.25.17.39.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Aug 2015 17:39:15 -0700 (PDT) Sender: Carlos Robinson Received: from minas-tirith.valinor (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id 70E36181DA4 for ; Wed, 26 Aug 2015 02:39:12 +0200 (CEST) Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f To: XFS mailing list X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f References: <55DCE1CF.5030708@sandeen.net> <20150825234300.GN714@dastard> From: "Carlos E. R." Message-ID: <55DD0AAF.9090401@opensuse.org> Date: Wed, 26 Aug 2015 02:39:11 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <20150825234300.GN714@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wi0-f177.google.com[209.85.212.177] X-Barracuda-Start-Time: 1440549557 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 On 2015-08-26 01:43, Dave Chinner wrote: > On Tue, Aug 25, 2015 at 04:09:33PM -0700, Shrinand Javadekar > wrote: >> Formatted the new disks with mkfs.xfs. Ran the workload. >> Reformatted the disks with mkfs.xfs -f. Ran the workload. > Anyway, please post the output so we can see the differences for > ourselves. What we need is mkfs output in both cases, and xfs_info > output in both cases after mount. Suggestion (for the OP): To reformat a third time without "-f", you can reformat as ext4, then format a second time as xfs. But to imitate a new disk, you have to zero it with dd. Then you can replay the test and obtain the requested data :-) - -- Cheers / Saludos, Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) - -- Cheers / Saludos, Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlXdCq8ACgkQja8UbcUWM1zCBgEAoMjVMIAlp0fKEO3CZKtZ/HNY Ek7joAO+gCVO++IJ2boBAIuVMiLnOug7fG46s1vkFEUhWsvUYQbPoqbhCNyYki/u =LcBk -----END PGP SIGNATURE----- From david@fromorbit.com Tue Aug 25 19:45:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41CEC7F50 for ; Tue, 25 Aug 2015 19:45:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E362304039 for ; Tue, 25 Aug 2015 17:45:18 -0700 (PDT) X-ASG-Debug-ID: 1440549915-04cbb07cbc70540001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id A3UnvMHk5TxNSTWp for ; Tue, 25 Aug 2015 17:45:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CbCwAnC91V/0DvLHldgxuBPaobAQEBAQEBBopQkRACAgEBAoE4TQEBAQEBAYELQQWDXgEBBCcTHCMQCAMYCSUPBSUDIROILcgqAQEBBwIgGYYKhTSFCgeELAEElTeMb45ui2kmgg4cgWYsM4EHJYEgAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 10:15:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUOpq-0004Ha-JY; Wed, 26 Aug 2015 10:45:02 +1000 Date: Wed, 26 Aug 2015 10:45:02 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity Message-ID: <20150826004502.GR714@dastard> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003259.23973.34038.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826003259.23973.34038.stgit@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440549915 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 25, 2015 at 05:32:59PM -0700, Darrick J. Wong wrote: > Check the v5 fields (uuid, blocknr, owner) of attribute blocks for > obvious errors while scanning xattr blocks. If the ownership info > is incorrect, kill the block. > > Signed-off-by: Darrick J. Wong Why hasn't the buffer verifier done this validation? > @@ -1564,6 +1602,13 @@ process_longform_attr( > if (bp->b_error == -EFSBADCRC) > (*repair)++; > > + /* is this block sane? */ > + if (__check_attr_header(mp, bp, ino)) { > + *repair = 0; > + libxfs_putbuf(bp); > + return 1; > + } As you can see the above hunk has a bad CRC check from the verifier, and if the attr header is wrong then the verifier should be setting bp->b_error == -EFSCORRUPTED. So shouldn't this simply be: + if (bp->b_error == -EFSCORRUPTED) { + *repair = 0; + libxfs_putbuf(bp); + return 1; + } + Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 25 19:55:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD8DC7F47 for ; Tue, 25 Aug 2015 19:55:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9BC28F8049 for ; Tue, 25 Aug 2015 17:55:02 -0700 (PDT) X-ASG-Debug-ID: 1440550500-04cb6c4a2a65860001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kBlWs6mAcmkfR3j9 for ; Tue, 25 Aug 2015 17:55:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AHBwBCDd1V/0DvLHldgxuBPaobAQEBAQEBBopQkRACAgEBAoE4TQEBAQEBAYELhCQBAQQnExwjEAgDGAklDwUlAyETiC3ILQEBCAIBHxmGCoU0hQoHhCwFkiGDFoxvgU2HToVTi2kmgkCBUCwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 10:25:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUOzH-0004IA-7k; Wed, 26 Aug 2015 10:54:47 +1000 Date: Wed, 26 Aug 2015 10:54:47 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier Message-ID: <20150826005447.GS714@dastard> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003305.23973.65768.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826003305.23973.65768.stgit@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440550500 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 25, 2015 at 05:33:05PM -0700, Darrick J. Wong wrote: > If during prefetch we encounter a bmbt block that fails the CRC check > due to corruption in the unused part of the block, force the buffer > back through the non-prefetch verifiers later so that the CRC is > updated. Otherwise, the bad checksum goes unfixed and the kernel will > still flag the bmbt block as invalid. > > Signed-off-by: Darrick J. Wong > --- > repair/prefetch.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > > diff --git a/repair/prefetch.c b/repair/prefetch.c > index 1de3ec0..77d29c8 100644 > --- a/repair/prefetch.c > +++ b/repair/prefetch.c > @@ -276,6 +276,14 @@ pf_scan_lbtree( > > XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); > > + /* > + * Make this bmbt buffer go back through the verifiers later so that > + * we correct checksum errors stemming from bitflips in the unused > + * parts of the bmbt block. > + */ > + if (bp->b_error == -EFSBADCRC) > + bp->b_flags |= LIBXFS_B_UNCHECKED; This is because the next read of the buffer clears bp->b_error, right? So, while I think this is necessary, I also think the prefetch on this btree should stop as we can't trust the contents of the buffer to be correct. Hence I'd suggest that: /* * If the verfier flagged a problem with the buffer, we * can't trust it's contents for the purposes of readahead. * Stop prefetching the tree, and mark this buffer as * unchecked so that the next read of the buffer by the * repair code will retain the error status and hence be * acted on appropriately. */ if (bp->b_error) { bp->b_flags |= LIBXFS_B_UNCHECKED; libxfs_putbuf(bp); return 0; } Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 25 19:59:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4D08D7F47 for ; Tue, 25 Aug 2015 19:59:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3997B304039 for ; Tue, 25 Aug 2015 17:59:19 -0700 (PDT) X-ASG-Debug-ID: 1440550757-04cb6c4a29659c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id u5X0p0HyUtWc6ujl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 17:59:17 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q0xC8f023064 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 00:59:12 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0xCb6019070 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 00:59:12 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q0xBG2015170; Wed, 26 Aug 2015 00:59:11 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 17:59:11 -0700 Date: Tue, 25 Aug 2015 17:59:11 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity Message-ID: <20150826005911.GA23656@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003259.23973.34038.stgit@birch.djwong.org> <20150826004502.GR714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826004502.GR714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440550757 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 26, 2015 at 10:45:02AM +1000, Dave Chinner wrote: > On Tue, Aug 25, 2015 at 05:32:59PM -0700, Darrick J. Wong wrote: > > Check the v5 fields (uuid, blocknr, owner) of attribute blocks for > > obvious errors while scanning xattr blocks. If the ownership info > > is incorrect, kill the block. > > > > Signed-off-by: Darrick J. Wong > > Why hasn't the buffer verifier done this validation? Maybe I'm confused here, so here's what I think is going on: AFAICT most of the verifiers do things like this: if (crcs_enabled && cksum_verification fails) { xfs_buf_ioerror(bp, -EFSBADCRC); } else if (header_is_insane) { xfs_buf_ioerror(bp, -EFSCORRUPTED); } The fuzzer corrupts the UUID without updating the CRC. The verifier first checks the CRC and it doesn't match, so it sets b_error to -EFSBADCRC and doesn't get to the header check. Then the verifier returns, so we end up back in process_longform_attr. Where do we set -EFSCORRUPTED when the CRC also doesn't match? --D > > > @@ -1564,6 +1602,13 @@ process_longform_attr( > > if (bp->b_error == -EFSBADCRC) > > (*repair)++; > > > > + /* is this block sane? */ > > + if (__check_attr_header(mp, bp, ino)) { > > + *repair = 0; > > + libxfs_putbuf(bp); > > + return 1; > > + } > > As you can see the above hunk has a bad CRC check from the verifier, > and if the attr header is wrong then the verifier should be setting > bp->b_error == -EFSCORRUPTED. > > So shouldn't this simply be: > > + if (bp->b_error == -EFSCORRUPTED) { > + *repair = 0; > + libxfs_putbuf(bp); > + return 1; > + } > + > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Tue Aug 25 20:03:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 190667F47 for ; Tue, 25 Aug 2015 20:03:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D087C8F8049 for ; Tue, 25 Aug 2015 18:03:26 -0700 (PDT) X-ASG-Debug-ID: 1440550991-04bdf0239869de0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 14X6cSbcuJCS6TYf for ; Tue, 25 Aug 2015 18:03:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AHBwDXD91V/0DvLHldgxuBPaobAQEBAQEBBopQkRACAgEBAoE4TQEBAQEBAYELhCQBAQQ6HCMQCAMYCSUPBSUDIROILcgvAQEBBwIBHxmGCoU0hQoHhCwFjGuITIxvgU2HToVTi2kmgg4cFoFQLDOCTAEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 10:32:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUP6m-0004JS-TO; Wed, 26 Aug 2015 11:02:32 +1000 Date: Wed, 26 Aug 2015 11:02:32 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants Message-ID: <20150826010232.GT714@dastard> X-ASG-Orig-Subj: Re: [PATCH 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003246.23973.12895.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826003246.23973.12895.stgit@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440550993 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e On Tue, Aug 25, 2015 at 05:32:46PM -0700, Darrick J. Wong wrote: > When we're running xfs_repair with prefetch enabled, it's possible > that repair will decide to clear an inode without examining all > metadata blocks owned by that inode. This leaves the unreferenced > prefetched buffers marked UNCHECKED, which will cause a subsequent CRC > error if the block is reallocated to a different structure and read > more than once. Typically this happens when a large directory is > corrupted and lost+found has to grow to accomodate all the > disconnected inodes. > > In libxfs_getbuf*(), we're supposed to return an unused buffer which > has a clean state. Unfortunately, things like UNCHECKED can hang > around to cause incorrect verifier errors later, so change those > functions to launder the state bits clean. > > Signed-off-by: Darrick J. Wong > --- > libxfs/rdwr.c | 47 +++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 41 insertions(+), 6 deletions(-) > > > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > index 4f8212f..d28cea8 100644 > --- a/libxfs/rdwr.c > +++ b/libxfs/rdwr.c > @@ -631,15 +631,39 @@ libxfs_getbuf_flags(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, > return __cache_lookup(&key, flags); > } > > +/* > + * Clean the buffer flags for libxfs_getbuf*(), which wants to return > + * an unused buffer with clean state. This prevents CRC errors on a > + * re-read of a corrupt block that was prefetched and freed. This > + * can happen with a massively corrupt directory that is discarded, > + * but whose blocks are then recycled into expanding lost+found. > + * > + * Note however that if the buffer's dirty (prefetch calls getbuf) > + * we'll leave the state alone because we don't want to discard blocks > + * that have been fixed. > + */ > +static void > +try_clean_buf( Only thing I don't like about this patch is the name of this function. It's really a "reset buffer state" function, so I think that calling it something like reset_buf_state() would be more appropriate. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 25 20:09:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DFEEE7F47 for ; Tue, 25 Aug 2015 20:09:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CEED18F8037 for ; Tue, 25 Aug 2015 18:09:42 -0700 (PDT) X-ASG-Debug-ID: 1440551376-04cbb07cbb70d20001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id FNT7ayGtY6CDWYVf for ; Tue, 25 Aug 2015 18:09:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ApCwDWEN1V/0DvLHldgxuBPaobAQEBAQEBBopQkRAEAgKBOE0BAQEBAQGBC0EFg10BAQEDATocIwULCAMYCSUPBSUDIROIJgfIMAEBAQcCIBmGCoU0hQoHhCwFlTeMb4FNhDKUWCaCDR2BZiwzgkwBAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 10:39:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUPDP-0004K4-HO; Wed, 26 Aug 2015 11:09:23 +1000 Date: Wed, 26 Aug 2015 11:09:23 +1000 From: Dave Chinner To: "Carlos E. R." Cc: XFS mailing list Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f Message-ID: <20150826010923.GX3902@dastard> X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f References: <55DCE1CF.5030708@sandeen.net> <20150825234300.GN714@dastard> <55DD0AAF.9090401@opensuse.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DD0AAF.9090401@opensuse.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440551376 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 26, 2015 at 02:39:11AM +0200, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > On 2015-08-26 01:43, Dave Chinner wrote: > > On Tue, Aug 25, 2015 at 04:09:33PM -0700, Shrinand Javadekar > > wrote: > > >> Formatted the new disks with mkfs.xfs. Ran the workload. > >> Reformatted the disks with mkfs.xfs -f. Ran the workload. > > > > Anyway, please post the output so we can see the differences for > > ourselves. What we need is mkfs output in both cases, and xfs_info > > output in both cases after mount. > > Suggestion (for the OP): > > To reformat a third time without "-f", you can reformat as ext4, then > format a second time as xfs. That doesn't work - mkfs.xfs detects that the device has an ext4 filesystem on it, and demands you use -f to overwrite it. > But to imitate a new disk, you have to > zero it with dd. Only the first MB or so - enough for blkid not to be able to see a filesystem signature on it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 25 20:15:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EEF957F3F for ; Tue, 25 Aug 2015 20:15:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DBC458F8049 for ; Tue, 25 Aug 2015 18:15:45 -0700 (PDT) X-ASG-Debug-ID: 1440551743-04cbb07cbc70f20001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 09tXZBopJeG7cEql for ; Tue, 25 Aug 2015 18:15:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AHBwBjEt1V/0DvLHldgxuBPaobAQEBAQEBBopQkRACAgEBAoE4TQEBAQEBAYELhCQBAQQ6DQ8jEAgDGAklDwUlAyETiC24QY9vAQEIAgEfGYYKhTSFCgeELAWVN4xvjm6LaSaCDhyBZiwzgQclgSABAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 10:45:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUPJB-0004KW-0E; Wed, 26 Aug 2015 11:15:21 +1000 Date: Wed, 26 Aug 2015 11:15:20 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity Message-ID: <20150826011520.GU714@dastard> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003259.23973.34038.stgit@birch.djwong.org> <20150826004502.GR714@dastard> <20150826005911.GA23656@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826005911.GA23656@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440551743 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 25, 2015 at 05:59:11PM -0700, Darrick J. Wong wrote: > On Wed, Aug 26, 2015 at 10:45:02AM +1000, Dave Chinner wrote: > > On Tue, Aug 25, 2015 at 05:32:59PM -0700, Darrick J. Wong wrote: > > > Check the v5 fields (uuid, blocknr, owner) of attribute blocks for > > > obvious errors while scanning xattr blocks. If the ownership info > > > is incorrect, kill the block. > > > > > > Signed-off-by: Darrick J. Wong > > > > Why hasn't the buffer verifier done this validation? > > Maybe I'm confused here, so here's what I think is going on: > > AFAICT most of the verifiers do things like this: > > if (crcs_enabled && cksum_verification fails) { > xfs_buf_ioerror(bp, -EFSBADCRC); > } else if (header_is_insane) { > xfs_buf_ioerror(bp, -EFSCORRUPTED); > } > > The fuzzer corrupts the UUID without updating the CRC. The verifier first > checks the CRC and it doesn't match, so it sets b_error to -EFSBADCRC and > doesn't get to the header check. Ok, that explains it - I didn't consider that case. This would seem like a general problem for repair when CRC errors are detected? i.e. we set the repair flag without doing the remaining verifier validity checks? As it is, I don't really like duplicating the verifier checks in repair. ISTR I recently suggested that we need to factor all the common verifier checks (magic, owner, uuid, blockno) into a single function that all verifiers called to remove all the code duplication. If we do this, then repair can also call the function to verify headers after a CRC failure to determine if repair is possible.... This is a bit more work, so I'll probably take this specific patch for 4.2.0, but I'd like to see this all factored out so we aren't duplicating code unnecessarily. Cheers, Dave. -- Dave Chinner david@fromorbit.com From nula.kingmold1@foxmail.com Tue Aug 25 20:42:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=DEAR_SOMETHING, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,FREEMAIL_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABD807F47 for ; Tue, 25 Aug 2015 20:42:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 85C218F8040 for ; Tue, 25 Aug 2015 18:42:38 -0700 (PDT) X-ASG-Debug-ID: 1440553354-04bdf023996a880001-NocioJ Received: from foxmail.com ([119.123.99.19]) by cuda.sgi.com with ESMTP id taOV1NCOjGCwiRRJ for ; Tue, 25 Aug 2015 18:42:35 -0700 (PDT) X-Barracuda-Envelope-From: nula.kingmold1@foxmail.com X-Barracuda-Apparent-Source-IP: 119.123.99.19 Received: from WWW-6F92F2F9510[192.168.1.104] by foxmail.com with SMTP id 1D16FA20; Wed, 26 Aug 2015 09:41:45 +0800 From: "nula" Subject: Re: 15 years in Mold & Molding To: "xfs" X-ASG-Orig-Subj: Re: 15 years in Mold & Molding Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit Reply-To: nula.kingmold@qq.com Date: Wed, 26 Aug 2015 09:41:48 +0800 X-Priority: 2 X-Mailer: FoxMail 4.0 beta 2 [cn] X-Barracuda-Connect: UNKNOWN[119.123.99.19] X-Barracuda-Start-Time: 1440553355 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21930 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.50 BSF_SC0_MV0646 Custom rule MV0646 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20150826014238.19332A42184@cuda.sgi.com> Dear Sir/Madam, This is Nula from Yutong Mold-Tech Limited. We learn your company information from website and we are a manufacturer of plastic injection moulds & moulded parts. Please feel free to contact me for further details or send us your drawings for a quote. If you would no long wish to receive emails from us, please kindly tell us, and we will no longer send them to you. Best Regards Nula Han Yutong Mold / Business Dept. From darrick.wong@oracle.com Tue Aug 25 22:59:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E20E7F47 for ; Tue, 25 Aug 2015 22:59:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B5EBAC007 for ; Tue, 25 Aug 2015 20:59:52 -0700 (PDT) X-ASG-Debug-ID: 1440561587-04cb6c4a2b68770001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ylHEldFUCApLm972 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 20:59:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q3xkkv025988 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 03:59:46 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q3xjk0029125 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 03:59:45 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q3xjtV005470; Wed, 26 Aug 2015 03:59:45 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 20:59:44 -0700 Date: Tue, 25 Aug 2015 20:59:43 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier Message-ID: <20150826035943.GW10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003305.23973.65768.stgit@birch.djwong.org> <20150826005447.GS714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826005447.GS714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1440561587 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 On Wed, Aug 26, 2015 at 10:54:47AM +1000, Dave Chinner wrote: > On Tue, Aug 25, 2015 at 05:33:05PM -0700, Darrick J. Wong wrote: > > If during prefetch we encounter a bmbt block that fails the CRC check > > due to corruption in the unused part of the block, force the buffer > > back through the non-prefetch verifiers later so that the CRC is > > updated. Otherwise, the bad checksum goes unfixed and the kernel will > > still flag the bmbt block as invalid. > > > > Signed-off-by: Darrick J. Wong > > --- > > repair/prefetch.c | 8 ++++++++ > > 1 file changed, 8 insertions(+) > > > > > > diff --git a/repair/prefetch.c b/repair/prefetch.c > > index 1de3ec0..77d29c8 100644 > > --- a/repair/prefetch.c > > +++ b/repair/prefetch.c > > @@ -276,6 +276,14 @@ pf_scan_lbtree( > > > > XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); > > > > + /* > > + * Make this bmbt buffer go back through the verifiers later so that > > + * we correct checksum errors stemming from bitflips in the unused > > + * parts of the bmbt block. > > + */ > > + if (bp->b_error == -EFSBADCRC) > > + bp->b_flags |= LIBXFS_B_UNCHECKED; > > This is because the next read of the buffer clears bp->b_error, > right? > > So, while I think this is necessary, I also think the prefetch on > this btree should stop as we can't trust the contents of the buffer > to be correct. Hence I'd suggest that: > > /* > * If the verfier flagged a problem with the buffer, we > * can't trust it's contents for the purposes of readahead. > * Stop prefetching the tree, and mark this buffer as > * unchecked so that the next read of the buffer by the > * repair code will retain the error status and hence be > * acted on appropriately. > */ > if (bp->b_error) { > bp->b_flags |= LIBXFS_B_UNCHECKED; > libxfs_putbuf(bp); > return 0; > } Ok, I'll change it to stop prefetch on the bmapbt. --D > > Cheers, > > Dave. > > > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Tue Aug 25 23:06:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75FA47F47 for ; Tue, 25 Aug 2015 23:06:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3307AC008 for ; Tue, 25 Aug 2015 21:05:56 -0700 (PDT) X-ASG-Debug-ID: 1440561951-04cbb07cbc744b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id MUPsM8QeP46HQDoy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 21:05:52 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q45oCD005530 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 04:05:50 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q45nbJ022882 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 04:05:50 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q45nF6026567; Wed, 26 Aug 2015 04:05:49 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 21:05:49 -0700 Date: Tue, 25 Aug 2015 21:05:46 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants Message-ID: <20150826040546.GX10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003246.23973.12895.stgit@birch.djwong.org> <20150826010232.GT714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826010232.GT714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440561951 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC5_SA210e, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Aug 26, 2015 at 11:02:32AM +1000, Dave Chinner wrote: > On Tue, Aug 25, 2015 at 05:32:46PM -0700, Darrick J. Wong wrote: > > When we're running xfs_repair with prefetch enabled, it's possible > > that repair will decide to clear an inode without examining all > > metadata blocks owned by that inode. This leaves the unreferenced > > prefetched buffers marked UNCHECKED, which will cause a subsequent CRC > > error if the block is reallocated to a different structure and read > > more than once. Typically this happens when a large directory is > > corrupted and lost+found has to grow to accomodate all the > > disconnected inodes. > > > > In libxfs_getbuf*(), we're supposed to return an unused buffer which > > has a clean state. Unfortunately, things like UNCHECKED can hang > > around to cause incorrect verifier errors later, so change those > > functions to launder the state bits clean. > > > > Signed-off-by: Darrick J. Wong > > --- > > libxfs/rdwr.c | 47 +++++++++++++++++++++++++++++++++++++++++------ > > 1 file changed, 41 insertions(+), 6 deletions(-) > > > > > > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > > index 4f8212f..d28cea8 100644 > > --- a/libxfs/rdwr.c > > +++ b/libxfs/rdwr.c > > @@ -631,15 +631,39 @@ libxfs_getbuf_flags(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, > > return __cache_lookup(&key, flags); > > } > > > > +/* > > + * Clean the buffer flags for libxfs_getbuf*(), which wants to return > > + * an unused buffer with clean state. This prevents CRC errors on a > > + * re-read of a corrupt block that was prefetched and freed. This > > + * can happen with a massively corrupt directory that is discarded, > > + * but whose blocks are then recycled into expanding lost+found. > > + * > > + * Note however that if the buffer's dirty (prefetch calls getbuf) > > + * we'll leave the state alone because we don't want to discard blocks > > + * that have been fixed. > > + */ > > +static void > > +try_clean_buf( > > Only thing I don't like about this patch is the name of this > function. It's really a "reset buffer state" function, so I think > that calling it something like reset_buf_state() would be more > appropriate. Done. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Tue Aug 25 23:50:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 906B57F47 for ; Tue, 25 Aug 2015 23:50:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2CB5AC005 for ; Tue, 25 Aug 2015 21:50:49 -0700 (PDT) X-ASG-Debug-ID: 1440564647-04cbb07cbb75180001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id KROM6OcTd0ESHBSz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 21:50:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q4oj1G013298 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 04:50:45 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q4ojDn010418 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 04:50:45 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q4oikW008537; Wed, 26 Aug 2015 04:50:44 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 21:50:44 -0700 Date: Tue, 25 Aug 2015 21:50:43 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity Message-ID: <20150826045043.GY10043@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003259.23973.34038.stgit@birch.djwong.org> <20150826004502.GR714@dastard> <20150826005911.GA23656@birch.djwong.org> <20150826011520.GU714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826011520.GU714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440564647 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 On Wed, Aug 26, 2015 at 11:15:20AM +1000, Dave Chinner wrote: > On Tue, Aug 25, 2015 at 05:59:11PM -0700, Darrick J. Wong wrote: > > On Wed, Aug 26, 2015 at 10:45:02AM +1000, Dave Chinner wrote: > > > On Tue, Aug 25, 2015 at 05:32:59PM -0700, Darrick J. Wong wrote: > > > > Check the v5 fields (uuid, blocknr, owner) of attribute blocks for > > > > obvious errors while scanning xattr blocks. If the ownership info > > > > is incorrect, kill the block. > > > > > > > > Signed-off-by: Darrick J. Wong > > > > > > Why hasn't the buffer verifier done this validation? > > > > Maybe I'm confused here, so here's what I think is going on: > > > > AFAICT most of the verifiers do things like this: > > > > if (crcs_enabled && cksum_verification fails) { > > xfs_buf_ioerror(bp, -EFSBADCRC); > > } else if (header_is_insane) { > > xfs_buf_ioerror(bp, -EFSCORRUPTED); > > } > > > > The fuzzer corrupts the UUID without updating the CRC. The verifier first > > checks the CRC and it doesn't match, so it sets b_error to -EFSBADCRC and > > doesn't get to the header check. > > Ok, that explains it - I didn't consider that case. This would seem > like a general problem for repair when CRC errors are detected? i.e. > we set the repair flag without doing the remaining verifier validity > checks? Heh, this seems like a moderately large refactoring project... :) AFAICT, repair is at least checking some of that stuff for bmap, directory, and symlink blocks, but as you point out it's scattered all over the place. It looks like the verifiers can easily check the magic, uuid, and block fields; but how would we get the owner info to the verifier? What if we add a "u64 owner" to xfs_buf and change all functions that grab a buffer to take a u64 owner argument? That'd be rather a lot of things to change between the kernel and xfsprogs, but otoh we'd gain owner checking and centralize verification of the v5 fields. I think we'd have to change xfs_trans_{get,read}_buf*() in the kernel and libxfs_{get,read}buf*() in xfsprogs. Then we'd rework the verifiers as such: if (header_is_insane) xfs_buf_ioerror(bp, -EFSCORRUPTED); else if (crcs and crc_fails) xfs_buf_ioerror(bp, -EFSBADCRC); Since the header being garbage seems like a much more severe error than only the checksum being wrong. Then we'd always know when the v5 fields don't match our expectations. Next we'd change repair to do something like this: bp = libxfs_readbuf(...); if (!bp) { /* couldn't get a buffer, abort */ return; } else if (bp->b_error == -EFSBADCRC) { /* just a bad crc; see if the rest of the block is ok */ repair++; } else if (bp->b_error) { /* io error or corrupt header; toss out the owner */ toss_owner(); libxfs_putbuf(bp); return; } /* more checks... */ if (repair) libxfs_writebuf(bp); How's that sound? --D > > As it is, I don't really like duplicating the verifier checks in > repair. ISTR I recently suggested that we need to factor all the > common verifier checks (magic, owner, uuid, blockno) into a single > function that all verifiers called to remove all the code > duplication. If we do this, then repair can also call the function > to verify headers after a CRC failure to determine if repair is > possible.... > > This is a bit more work, so I'll probably take this specific patch > for 4.2.0, but I'd like to see this all factored out so we aren't > duplicating code unnecessarily. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Wed Aug 26 00:23:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FBC07F47 for ; Wed, 26 Aug 2015 00:23:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7F501AC009 for ; Tue, 25 Aug 2015 22:23:45 -0700 (PDT) X-ASG-Debug-ID: 1440566623-04cb6c4a2b69dd0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id fnQfKApPTLc8Il3L (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 22:23:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q5NfL7011464 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 05:23:42 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q5Nf4d013041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 05:23:41 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q5Nf17019853; Wed, 26 Aug 2015 05:23:41 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 22:23:40 -0700 Date: Tue, 25 Aug 2015 22:23:39 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: [PATCH v2 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants Message-ID: <20150826052339.GZ10043@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 04/11] libxfs: clear buffer state flags in libxfs_getbuf and variants References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003246.23973.12895.stgit@birch.djwong.org> <20150826010232.GT714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826010232.GT714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440566623 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 BSF_SC5_SA210e Custom Rule SA210e When we're running xfs_repair with prefetch enabled, it's possible that repair will decide to clear an inode without examining all metadata blocks owned by that inode. This leaves the unreferenced prefetched buffers marked UNCHECKED, which will cause a subsequent CRC error if the block is reallocated to a different structure and read more than once. Typically this happens when a large directory is corrupted and lost+found has to grow to accomodate all the disconnected inodes. In libxfs_getbuf*(), we're supposed to return an unused buffer which has a clean state. Unfortunately, things like UNCHECKED can hang around to cause incorrect verifier errors later, so change those functions to launder the state bits clean. v2: Change the function name to reset_buf_state() to reflect what the function is trying to accomplish. Signed-off-by: Darrick J. Wong --- libxfs/rdwr.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 4f8212f..bc77699 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -631,15 +631,39 @@ libxfs_getbuf_flags(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, return __cache_lookup(&key, flags); } +/* + * Clean the buffer flags for libxfs_getbuf*(), which wants to return + * an unused buffer with clean state. This prevents CRC errors on a + * re-read of a corrupt block that was prefetched and freed. This + * can happen with a massively corrupt directory that is discarded, + * but whose blocks are then recycled into expanding lost+found. + * + * Note however that if the buffer's dirty (prefetch calls getbuf) + * we'll leave the state alone because we don't want to discard blocks + * that have been fixed. + */ +static void +reset_buf_state( + struct xfs_buf *bp) +{ + if (bp && !(bp->b_flags & LIBXFS_B_DIRTY)) + bp->b_flags &= ~(LIBXFS_B_UNCHECKED | LIBXFS_B_STALE | + LIBXFS_B_UPTODATE); +} + struct xfs_buf * libxfs_getbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len) { - return libxfs_getbuf_flags(btp, blkno, len, 0); + struct xfs_buf *bp; + + bp = libxfs_getbuf_flags(btp, blkno, len, 0); + reset_buf_state(bp); + return bp; } -struct xfs_buf * -libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, - int nmaps, int flags) +static struct xfs_buf * +__libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, + int nmaps, int flags) { struct xfs_bufkey key = {0}; int i; @@ -659,6 +683,17 @@ libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, return __cache_lookup(&key, flags); } +struct xfs_buf * +libxfs_getbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, + int nmaps, int flags) +{ + struct xfs_buf *bp; + + bp = __libxfs_getbuf_map(btp, map, nmaps, flags); + reset_buf_state(bp); + return bp; +} + void libxfs_putbuf(xfs_buf_t *bp) { @@ -779,7 +814,7 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, xfs_buf_t *bp; int error; - bp = libxfs_getbuf(btp, blkno, len); + bp = libxfs_getbuf_flags(btp, blkno, len, 0); if (!bp) return NULL; @@ -860,7 +895,7 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, return libxfs_readbuf(btp, map[0].bm_bn, map[0].bm_len, flags, ops); - bp = libxfs_getbuf_map(btp, map, nmaps, 0); + bp = __libxfs_getbuf_map(btp, map, nmaps, 0); if (!bp) return NULL; From darrick.wong@oracle.com Wed Aug 26 00:24:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9379B7F47 for ; Wed, 26 Aug 2015 00:24:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 834E4304043 for ; Tue, 25 Aug 2015 22:24:34 -0700 (PDT) X-ASG-Debug-ID: 1440566673-04cbb07cbb75a60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id QXMaq6EIDMo6DMeV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Aug 2015 22:24:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7Q5OWaD012256 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Aug 2015 05:24:32 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q5OWNQ002149 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 26 Aug 2015 05:24:32 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id t7Q5OWvT003058; Wed, 26 Aug 2015 05:24:32 GMT Received: from localhost (/24.21.154.84) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 25 Aug 2015 22:24:31 -0700 Date: Tue, 25 Aug 2015 22:24:30 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: [PATCH v2 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier Message-ID: <20150826052430.GA10043@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 07/11] xfs_repair: force not-so-bad bmbt blocks back through the verifier References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003305.23973.65768.stgit@birch.djwong.org> <20150826005447.GS714@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826005447.GS714@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1440566673 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If during prefetch we encounter a bmbt block that fails the CRC check due to corruption in the unused part of the block, force the buffer back through the non-prefetch verifiers later so that the CRC is updated. Otherwise, the bad checksum goes unfixed and the kernel will still flag the bmbt block as invalid. v2: Halt all readahead on the bmapbt if any of its blocks produce an error. Signed-off-by: Darrick J. Wong --- repair/prefetch.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/repair/prefetch.c b/repair/prefetch.c index 1de3ec0..32ec55e 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -276,6 +276,18 @@ pf_scan_lbtree( XFS_BUF_SET_PRIORITY(bp, isadir ? B_DIR_BMAP : B_BMAP); + /* + * If the verifier flagged a problem with the buffer, we can't trust + * its contents for the purposes of reading ahead. Stop prefetching + * the tree and mark the buffer unchecked so that the next read of the + * buffer will retain the error status and be acted upon appropriately. + */ + if (bp->b_error) { + bp->b_flags |= LIBXFS_B_UNCHECKED; + libxfs_putbuf(bp); + return 0; + } + rc = (*func)(XFS_BUF_TO_BLOCK(bp), level - 1, isadir, args); libxfs_putbuf(bp); From david@fromorbit.com Wed Aug 26 01:20:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B25807F47 for ; Wed, 26 Aug 2015 01:20:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18C38AC008 for ; Tue, 25 Aug 2015 23:20:57 -0700 (PDT) X-ASG-Debug-ID: 1440570050-04cbb07cbe76a20001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oyufqSld36cA4QCG for ; Tue, 25 Aug 2015 23:20:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CJEQDzWd1V/0DvLHldgxuBPaofAQEBAQEBBopRkRECAgEBAoE0TQEBAQEBAYELQQSDXgEBAQMBJxMcFgoDBQsIAxgJJQ8FJQMhE4gmB8gdAQEIAgEfGYYMhTaFCgeELAWVN4xvgU2HUIVTi24mgg4cgWYsM4EHJYEgAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Aug 2015 15:50:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUU4b-0004ng-3X; Wed, 26 Aug 2015 16:20:37 +1000 Date: Wed, 26 Aug 2015 16:20:37 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity Message-ID: <20150826062037.GV714@dastard> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfs_repair: check v5 filesystem attr block header sanity References: <20150826003220.23973.59731.stgit@birch.djwong.org> <20150826003259.23973.34038.stgit@birch.djwong.org> <20150826004502.GR714@dastard> <20150826005911.GA23656@birch.djwong.org> <20150826011520.GU714@dastard> <20150826045043.GY10043@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826045043.GY10043@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440570051 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 25, 2015 at 09:50:43PM -0700, Darrick J. Wong wrote: > On Wed, Aug 26, 2015 at 11:15:20AM +1000, Dave Chinner wrote: > > On Tue, Aug 25, 2015 at 05:59:11PM -0700, Darrick J. Wong wrote: > > > On Wed, Aug 26, 2015 at 10:45:02AM +1000, Dave Chinner wrote: > > > > On Tue, Aug 25, 2015 at 05:32:59PM -0700, Darrick J. Wong wrote: > > > > > Check the v5 fields (uuid, blocknr, owner) of attribute blocks for > > > > > obvious errors while scanning xattr blocks. If the ownership info > > > > > is incorrect, kill the block. > > > > > > > > > > Signed-off-by: Darrick J. Wong > > > > > > > > Why hasn't the buffer verifier done this validation? > > > > > > Maybe I'm confused here, so here's what I think is going on: > > > > > > AFAICT most of the verifiers do things like this: > > > > > > if (crcs_enabled && cksum_verification fails) { > > > xfs_buf_ioerror(bp, -EFSBADCRC); > > > } else if (header_is_insane) { > > > xfs_buf_ioerror(bp, -EFSCORRUPTED); > > > } > > > > > > The fuzzer corrupts the UUID without updating the CRC. The verifier first > > > checks the CRC and it doesn't match, so it sets b_error to -EFSBADCRC and > > > doesn't get to the header check. > > > > Ok, that explains it - I didn't consider that case. This would seem > > like a general problem for repair when CRC errors are detected? i.e. > > we set the repair flag without doing the remaining verifier validity > > checks? > > Heh, this seems like a moderately large refactoring project... :) > > AFAICT, repair is at least checking some of that stuff for bmap, > directory, and symlink blocks, but as you point out it's scattered all > over the place. > > It looks like the verifiers can easily check the magic, uuid, and > block fields; but how would we get the owner info to the verifier? Make it optional. i.e. if the owner passed in is 0, then don't check it. That way we can pass in the owner if we have it available, otherwise we don't check it. > What if we add a "u64 owner" to xfs_buf and change all functions that > grab a buffer to take a u64 owner argument? That'd be rather a lot of > things to change between the kernel and xfsprogs, but otoh we'd gain > owner checking and centralize verification of the v5 fields. Maybe in the long term, but right now that seems like a lot of churn for not much gain. I think solving the code duplication problem is the immediate issue that we need to fix. > I think > we'd have to change xfs_trans_{get,read}_buf*() in the kernel and > libxfs_{get,read}buf*() in xfsprogs. > > Then we'd rework the verifiers as such: > > if (header_is_insane) > xfs_buf_ioerror(bp, -EFSCORRUPTED); > else if (crcs and crc_fails) > xfs_buf_ioerror(bp, -EFSBADCRC); > > Since the header being garbage seems like a much more severe error > than only the checksum being wrong. Then we'd always know when the > v5 fields don't match our expectations. Except for the fact that the CRC failure tells us the data read from disk is different to what we wrote, and that's a primary protection against having to parse corrupt structures in the kernel. The userspace code is a bit different - bad CRCs are just an indication that there's a problem that needs fixing and a structure that needs further validation. Hence I'd much rather the header validation gets factored and then run explicitly by the repair code if a bad CRC is detected. That way the repair code can take action specific to the problem detected, but we don't compromise the protection the CRCs provide the kernel code... > Next we'd change repair to do something like this: > > bp = libxfs_readbuf(...); > if (!bp) { > /* couldn't get a buffer, abort */ > return; > } else if (bp->b_error == -EFSBADCRC) { > /* just a bad crc; see if the rest of the block is ok */ > repair++; > } else if (bp->b_error) { > /* io error or corrupt header; toss out the owner */ > toss_owner(); > libxfs_putbuf(bp); > return; > } > Use a helper function specific to repair: enum { OK, TOSS, REPAIR, ABORT, }; int repair_readbuf(... struct xfs_buf **bpp) { bp = libxfs_readbuf(...); if (!bp) { /* couldn't get a buffer, abort */ return ABORT; } if (!bp->error) { *bpp = bp; return OK; } if (bp->b_error == -EFSBADCRC) { if (verify_header(....)) { /* just a bad crc; see if the rest of the block is ok */ bp->b_error = 0; return REPAIR; } } /* io error or corrupt header; toss out the owner */ libxfs_putbuf(bp); return TOSS; } Which tells repair exactly what to do ;) -- Dave Chinner david@fromorbit.com From umsxv@ekfm.com Wed Aug 26 01:37:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7F2BB7F47 for ; Wed, 26 Aug 2015 01:37:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3113B8F804C for ; Tue, 25 Aug 2015 23:37:17 -0700 (PDT) X-ASG-Debug-ID: 1440571032-04bdf023976f8a0001-NocioJ Received: from ekfm.com ([60.168.250.74]) by cuda.sgi.com with ESMTP id Uopzqmz5zBuVzO4X for ; Tue, 25 Aug 2015 23:37:13 -0700 (PDT) X-Barracuda-Envelope-From: umsxv@ekfm.com X-Barracuda-Apparent-Source-IP: 60.168.250.74 Received: from SKY-20150201SFT ([127.0.0.1]) by localhost via TCP with ESMTPA; Wed, 26 Aug 2015 14:37:02 +0800 MIME-Version: 1.0 From: "KT Team" Sender: "KT Team" To: xfs@oss.sgi.com Reply-To: "KT Team" Date: 26 Aug 2015 14:37:02 +0800 Subject: =?utf-8?B?UHJvZmVzc2lvbmFsIGluamVjdGlvbiBtb3VsZCBmYWN0b3J5IGluIENoaW5h?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?UHJvZmVzc2lvbmFsIGluamVjdGlvbiBtb3VsZCBmYWN0b3J5IGluIENoaW5h?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[60.168.250.74] X-Barracuda-Start-Time: 1440571032 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150826063716.B620BA42185@cuda.sgi.com> PGh0bWw+PGJvZHk+PFA+SGVsbG8sPC9QPg0KPFA+SXQncyBnbGFkIHRvIHdyaXRlIHRvIHlv dSB3aXRoIGtlZW4gaG9wZSB0byBlc3RhYmxpc2ggYSBidXNpbmVzcyByZWxhdGlvbnNoaXAg d2l0aCB5b3UuPC9QPg0KPFA+V2UgYXJlIGZyb20gQ2hpbmVzZSBLaW5nIFRlY2ggTW91bGQg Q28uLExpbWl0ZWQuIFdlIGFyZSZuYnNwO2EgcmVndWxhciBtYW51ZmFjdHVyZXJzIGFuZCBl eHBvcnRzIG9mIHZhcmlvdXMga2luZHMgb2YgUGxhc3RpYyBtb3VsZCBhbmQgcGFydHMuPEJS PjEuIENvbGQgJmFtcDsgSG90IFJ1bm5lciAvIFNpbmdsZSAmYW1wOyBNdWx0aS1DYXZpdHkt SW5qZWN0aW9uIG1vdWxkaW5nPEJSPjIuIFNpbmdsZSAmYW1wOyBNdXRpLVNob3Q8QlI+My4g RGllIENhc3QtQWx1bWludW0gJmFtcDsgWmluYzxCUj40LiBJbnNlcnQgTW9sZHM8QlI+NS4g UHJvdG90eXBlIFRvb2xpbmcgPEJSPjYuIE92ZXJtb2xkaW5nIDxCUj43LiBNYXNzIHByb2R1 Y3Rpb248L1A+DQo8UD5QbGVhc2Ugc2VuZCAzRC8yRCBkcmF3aW5nIG9yIHNhbXBsZXMgdG8g dXMgaWYgeW91IGhhdmUgYW55IG5lZWRzLCB3ZSB3aWxsIHF1b3RlIGZvciBmcmVlIHdpdGgg YSBzb3VuZCBwcmljZS48QlI+Jm5ic3A7PEJSPkJlc3Qgd2lzaGVzLjxCUj5LVCBUZWFtPC9Q Pg0KPFA+S2luZyBUZWNoIE1vdWxkIENvLixMaW1pdGVkJm5ic3A7IDxCUj5Sb29tNzAyLCAx c3QgQmxkZy4sIEZhbnRhc2lhIE1pYyBQbGF6YSwgTmFuSGFpIFJvYWQsIFNoZWtvdSBTdHJl ZXQsJm5ic3A7Jm5ic3A7Jm5ic3A7IE5hbnNoYW4gRGlzdHJpY3QsIFNoZW56aGVuIENpdHks IEd1YW5nZG9uZyBQcm92aW5jZSwgQ2hpbmEmbmJzcDsgPEJSPlppcCBDb2RlOiA1MTgwNjc8 QlI+VGVsLjogKzg2IDc1NSA4NjE4IDI0MTAmbmJzcDsmbmJzcDsgPEJSPkZheDogKzg2IDc1 NSA4NjE4IDI3NDAgPEJSPjwvUD48L2JvZHk+PC9odG1sPg== From martin@lichtvoll.de Wed Aug 26 02:25:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9FA8B7F47 for ; Wed, 26 Aug 2015 02:25:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2ADCDAC005 for ; Wed, 26 Aug 2015 00:25:36 -0700 (PDT) X-ASG-Debug-ID: 1440573933-04cbb07cbd78080001-NocioJ Received: from mail.lichtvoll.de (mondschein.lichtvoll.de [194.150.191.11]) by cuda.sgi.com with ESMTP id oxjmAIjLYlbKOk2I for ; Wed, 26 Aug 2015 00:25:34 -0700 (PDT) X-Barracuda-Envelope-From: martin@lichtvoll.de X-Barracuda-Apparent-Source-IP: 194.150.191.11 Received: from merkaba.localnet (unknown [91.221.105.244]) by mail.lichtvoll.de (Postfix) with ESMTPSA id A984A495; Wed, 26 Aug 2015 09:25:33 +0200 (CEST) From: Martin Steigerwald To: xfs@oss.sgi.com Cc: Dave Chinner , "Carlos E. R." Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f Date: Wed, 26 Aug 2015 09:25:33 +0200 X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f Message-ID: <1594865.42kc89uJrg@merkaba> User-Agent: KMail/4.14.5 (Linux/4.2.0-rc5-tp520-btrfstrim+; KDE/4.14.2; x86_64; ; ) In-Reply-To: <20150826010923.GX3902@dastard> References: <55DD0AAF.9090401@opensuse.org> <20150826010923.GX3902@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Barracuda-Connect: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Start-Time: 1440573934 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Am Mittwoch, 26. August 2015, 11:09:23 schrieb Dave Chinner: > On Wed, Aug 26, 2015 at 02:39:11AM +0200, Carlos E. R. wrote: > > -----BEGIN PGP SIGNED MESSAGE----- > > Hash: SHA256 > > > > On 2015-08-26 01:43, Dave Chinner wrote: > > > On Tue, Aug 25, 2015 at 04:09:33PM -0700, Shrinand Javadekar > > > > > > wrote: > > >> Formatted the new disks with mkfs.xfs. Ran the workload. > > >> Reformatted the disks with mkfs.xfs -f. Ran the workload. > > > > > > Anyway, please post the output so we can see the differences for > > > ourselves. What we need is mkfs output in both cases, and xfs_info > > > > > > output in both cases after mount. > > > > Suggestion (for the OP): > > > > To reformat a third time without "-f", you can reformat as ext4, then > > format a second time as xfs. > > That doesn't work - mkfs.xfs detects that the device has an ext4 > filesystem on it, and demands you use -f to overwrite it. > > > But to imitate a new disk, you have to > > zero it with dd. > > Only the first MB or so - enough for blkid not to be able to see a > filesystem signature on it. wipefs command. Thanks, -- Martin From jack@suse.cz Wed Aug 26 04:00:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D9C1F7F47 for ; Wed, 26 Aug 2015 04:00:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 654CAAC008 for ; Wed, 26 Aug 2015 02:00:27 -0700 (PDT) X-ASG-Debug-ID: 1440579623-04cb6c4a296dfb0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ARAjNEOwt7UIAzvy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 02:00:24 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4272FADC1; Wed, 26 Aug 2015 09:00:23 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 4BE3182823; Wed, 26 Aug 2015 11:00:19 +0200 (CEST) Date: Wed, 26 Aug 2015 11:00:19 +0200 From: Jan Kara To: Tejun Heo Cc: Jens Axboe , Jan Kara , Eryu Guan , xfs@oss.sgi.com, axboe@fb.com, Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() Message-ID: <20150826090019.GA3871@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() References: <20150812101204.GE17933@dhcp-13-216.nay.redhat.com> <20150813004435.GN3902@dastard> <20150813224415.GG4496@mtj.duckdns.org> <20150825181152.GA26785@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150825181152.GA26785@mtj.duckdns.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1440579624 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On Tue 25-08-15 14:11:52, Tejun Heo wrote: > e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > updated writeback path to avoid kicking writeback work items if there > are no inodes to be written out; unfortunately, the avoidance logic > was too aggressive and broke sync_inodes_sb(). > > * sync_inodes_sb() must write out I_DIRTY_TIME inodes but I_DIRTY_TIME > inodes dont't contribute to bdi/wb_has_dirty_io() tests and were > being skipped over. > > * inodes are taken off wb->b_dirty/io/more_io lists after writeback > starts on them. sync_inodes_sb() skipping wait_sb_inodes() when > bdi_has_dirty_io() breaks it by making it return while writebacks > are in-flight. > > This patch fixes the breakages by > > * Removing bdi_has_dirty_io() shortcut from bdi_split_work_to_wbs(). > The callers are already testing the condition. > > * Removing bdi_has_dirty_io() shortcut from sync_inodes_sb() so that > it always calls into bdi_split_work_to_wbs() and wait_sb_inodes(). > > * Making bdi_split_work_to_wbs() consider the b_dirty_time list for > WB_SYNC_ALL writebacks. > > Kudos to Eryu, Dave and Jan for tracking down the issue. > > Signed-off-by: Tejun Heo > Fixes: e79729123f63 ("writeback: don't issue wb_writeback_work if clean") > Link: http://lkml.kernel.org/g/20150812101204.GE17933@dhcp-13-216.nay.redhat.com > Reported-and-bisected-by: Eryu Guan > Cc: Dave Chinner > Cc: Jan Kara > Cc: Ted Ts'o > --- > fs/fs-writeback.c | 22 +++++++++++++--------- > 1 file changed, 13 insertions(+), 9 deletions(-) The patch looks good. You can add: Reviewed-by: Jan Kara Honza > > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -844,14 +844,15 @@ static void bdi_split_work_to_wbs(struct > struct wb_iter iter; > > might_sleep(); > - > - if (!bdi_has_dirty_io(bdi)) > - return; > restart: > rcu_read_lock(); > bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) { > - if (!wb_has_dirty_io(wb) || > - (skip_if_busy && writeback_in_progress(wb))) > + /* SYNC_ALL writes out I_DIRTY_TIME too */ > + if (!wb_has_dirty_io(wb) && > + (base_work->sync_mode == WB_SYNC_NONE || > + list_empty(&wb->b_dirty_time))) > + continue; > + if (skip_if_busy && writeback_in_progress(wb)) > continue; > > base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages); > @@ -899,8 +900,7 @@ static void bdi_split_work_to_wbs(struct > { > might_sleep(); > > - if (bdi_has_dirty_io(bdi) && > - (!skip_if_busy || !writeback_in_progress(&bdi->wb))) { > + if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) { > base_work->auto_free = 0; > base_work->single_wait = 0; > base_work->single_done = 0; > @@ -2275,8 +2275,12 @@ void sync_inodes_sb(struct super_block * > }; > struct backing_dev_info *bdi = sb->s_bdi; > > - /* Nothing to do? */ > - if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info) > + /* > + * Can't skip on !bdi_has_dirty() because we should wait for !dirty > + * inodes under writeback and I_DIRTY_TIME inodes ignored by > + * bdi_has_dirty() need to be written out too. > + */ > + if (bdi == &noop_backing_dev_info) > return; > WARN_ON(!rwsem_is_locked(&sb->s_umount)); > > -- Jan Kara SUSE Labs, CR From zhao.mingyue@h3c.com Wed Aug 26 04:58:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A4F7F7F47 for ; Wed, 26 Aug 2015 04:58:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9516E30404E for ; Wed, 26 Aug 2015 02:58:05 -0700 (PDT) X-ASG-Debug-ID: 1440583081-04cbb07cbc7bf50001-NocioJ Received: from h3cmg01-ex.h3c.com (smtp.h3c.com [60.191.123.56]) by cuda.sgi.com with ESMTP id NF35OHZfHzgLe3FO for ; Wed, 26 Aug 2015 02:58:02 -0700 (PDT) X-Barracuda-Envelope-From: zhao.mingyue@h3c.com X-Barracuda-Apparent-Source-IP: 60.191.123.56 Received: from H3CHUB03-EX.srv.huawei-3com.com (unknown [10.63.20.169]) by h3cmg01-ex.h3c.com with smtp id 384c_1bb3_a9ec931a_a750_4280_b5bf_67094c29bcaf; Wed, 26 Aug 2015 17:58:00 +0800 Received: from H3CMLB12-EX.srv.huawei-3com.com ([fe80::f091:bd11:f0a9:5cbe]) by H3CHUB03-EX.srv.huawei-3com.com ([fe80::ec6c:67e6:67f8:ce53%15]) with mapi id 14.01.0355.002; Wed, 26 Aug 2015 17:57:52 +0800 From: "zhao.mingyue@h3c.com" To: "xfs@oss.sgi.com" Subject: disk is broken after mount , then fix the disk ,i still can not use the mount path Thread-Topic: disk is broken after mount , then fix the disk ,i still can not use the mount path X-ASG-Orig-Subj: disk is broken after mount , then fix the disk ,i still can not use the mount path Thread-Index: AdDf5aDX9YR8Q7qpRw6wIs4o96hEIQ== Date: Wed, 26 Aug 2015 09:58:26 +0000 Message-ID: <1CB94550540AE44E9CAAE8CD5AF40BF846CE8508@H3CMLB12-EX.srv.huawei-3com.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.96.70.129] Content-Type: multipart/alternative; boundary="_000_1CB94550540AE44E9CAAE8CD5AF40BF846CE8508H3CMLB12EXsrvhu_" MIME-Version: 1.0 X-Barracuda-Connect: smtp.h3c.com[60.191.123.56] X-Barracuda-Start-Time: 1440583081 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.69 X-Barracuda-Spam-Status: No, SCORE=1.69 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HELO_DYNAMIC_DHCP, HELO_DYNAMIC_DHCP_2, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HELO_DYNAMIC_DHCP Relay HELO'd using suspicious hostname (DHCP) 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message 1.66 HELO_DYNAMIC_DHCP_2 HELO_DYNAMIC_DHCP_2 --_000_1CB94550540AE44E9CAAE8CD5AF40BF846CE8508H3CMLB12EXsrvhu_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 aGmjug0KICAgSSBoYXZlIGEgcHJvYmxlbSBhYm91dCB4ZnMgLGNhbiBzb21lb25lIGhlbHAgbWU/ DQogICAxIC4gbW91bnQgIC9kZXYvc2RiICAvaG9tZS90ZXN0LA0KICAgMi4gL2Rldi9zZGIgaXMg ZG93bihteSBkaXNrIGhhcyBzb21ldGhpbmcgd3JvbmcpDQogICAzLkkgcHVsbCBvdXQgdGhlIGRp c2ssIGZpeCBpdCBhbmQgaW5zZXJ0DQogICB0aGVuIEkgZmluZCB0aGF0IEkgc3RpbGwgY2FuIG5v dCBvcGVyYXRlIGluIC9ob21lL3Rlc3QNCklzIHRoZSBtZWNoYW5pc20gb2YgWEZTIGxpa2UgdGhp cz8gaWYgSSB3YW50IHRvIHVzZSAvaG9tZS90ZXN0IGFnYWluLCBJIG11c3QgdW1vdW50IGZpcnN0 IGFuZCBtb3VudCBhZ2Fpbj8NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCrG+08q8/rywxuS4vbz+uqzT 0Lq81t27qsj9zajQxby8yvXT0M/euavLvrXEsaPD3NDFz6KjrL32z97T2reiy824+MnPw+a12Na3 1tDB0LP2DQq1xLj2yMu78si61+mho7371rnIzrrOxuTL+8jL0tTIzrrO0M7Kvcq508OjqLD8wKi1 q7K7z97T2sirsr+78rK/t9a12NC5wrahori01sahog0Ku/LJoreio6mxvtPKvP7W0LXE0MXPoqGj yOe5+8T6tO3K1cHLsb7Tyrz+o6zH68T6waK8tLXnu7C78tPKvP7NqNaqt6K8/sjLsqLJvrP9sb4N CtPKvP6joQ0KVGhpcyBlLW1haWwgYW5kIGl0cyBhdHRhY2htZW50cyBjb250YWluIGNvbmZpZGVu dGlhbCBpbmZvcm1hdGlvbiBmcm9tIEgzQywgd2hpY2ggaXMNCmludGVuZGVkIG9ubHkgZm9yIHRo ZSBwZXJzb24gb3IgZW50aXR5IHdob3NlIGFkZHJlc3MgaXMgbGlzdGVkIGFib3ZlLiBBbnkgdXNl IG9mIHRoZQ0KaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpbiBhbnkgd2F5IChpbmNsdWRp bmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdG90YWwgb3IgcGFydGlhbA0KZGlzY2xvc3VyZSwgcmVw cm9kdWN0aW9uLCBvciBkaXNzZW1pbmF0aW9uKSBieSBwZXJzb25zIG90aGVyIHRoYW4gdGhlIGlu dGVuZGVkDQpyZWNpcGllbnQocykgaXMgcHJvaGliaXRlZC4gSWYgeW91IHJlY2VpdmUgdGhpcyBl LW1haWwgaW4gZXJyb3IsIHBsZWFzZSBub3RpZnkgdGhlIHNlbmRlcg0KYnkgcGhvbmUgb3IgZW1h aWwgaW1tZWRpYXRlbHkgYW5kIGRlbGV0ZSBpdCENCg== --_000_1CB94550540AE44E9CAAE8CD5AF40BF846CE8508H3CMLB12EXsrvhu_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable

hi=A3=BA

   I have a problem a= bout xfs ,can someone help me?

   1 . mount  /d= ev/sdb  /home/test,

   2. /dev/sdb is dow= n(my disk has something wrong)

   3.I pull out the d= isk, fix it and insert

   then I find t= hat I still can not operate in /home/test

Is the mechanism of XFS like th= is? if I want to use /home/test again, I must umount first and mount again?=

-----------------------------------------------= ---------------------------------------------------------------------------= -----------
=B1=BE=D3=CA=BC=FE=BC=B0=C6=E4=B8=BD=BC=FE=BA=AC=D3=D0=BA=BC=D6=DD= =BB=AA=C8=FD=CD=A8=D0=C5=BC=BC=CA=F5=D3=D0=CF=DE=B9=AB=CB=BE=B5=C4=B1=A3=C3= =DC=D0=C5=CF=A2=A3=AC=BD=F6=CF=DE=D3=DA=B7=A2=CB=CD=B8=F8=C9=CF=C3=E6=B5=D8= =D6=B7=D6=D0=C1=D0=B3=F6
=B5=C4=B8=F6=C8=CB=BB=F2=C8=BA=D7=E9=A1=A3=BD=FB=D6=B9=C8=CE=BA=CE= =C6=E4=CB=FB=C8=CB=D2=D4=C8=CE=BA=CE=D0=CE=CA=BD=CA=B9=D3=C3=A3=A8=B0=FC=C0= =A8=B5=AB=B2=BB=CF=DE=D3=DA=C8=AB=B2=BF=BB=F2=B2=BF=B7=D6=B5=D8=D0=B9=C2=B6= =A1=A2=B8=B4=D6=C6=A1=A2
=BB=F2=C9=A2=B7=A2=A3=A9=B1=BE=D3=CA=BC=FE=D6=D0=B5=C4=D0=C5=CF=A2= =A1=A3=C8=E7=B9=FB=C4=FA=B4=ED=CA=D5=C1=CB=B1=BE=D3=CA=BC=FE=A3=AC=C7=EB=C4= =FA=C1=A2=BC=B4=B5=E7=BB=B0=BB=F2=D3=CA=BC=FE=CD=A8=D6=AA=B7=A2=BC=FE=C8=CB= =B2=A2=C9=BE=B3=FD=B1=BE
=D3=CA=BC=FE=A3=A1
This e-mail and its att= achments contain confidential information from H3C, which is
intended only for the person or entity whose address is listed above. Any u= se of the
information contained herein in any way (including, but not limited to, tot= al or partial
disclosure, reproduction, or dissemination) by persons other than the inten= ded
recipient(s) is prohibited. If you receive this e-mail in error, please not= ify the sender
by phone or email immediately and delete it!
--_000_1CB94550540AE44E9CAAE8CD5AF40BF846CE8508H3CMLB12EXsrvhu_-- From weber@zbfmail.de Wed Aug 26 05:30:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E92C7F47 for ; Wed, 26 Aug 2015 05:30:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1CFCC304066 for ; Wed, 26 Aug 2015 03:30:49 -0700 (PDT) X-ASG-Debug-ID: 1440585046-04cbb07cbd7cc90001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id tl7anTUTCpIDRRQ2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 03:30:46 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id C0E376EE0E9 for ; Wed, 26 Aug 2015 12:30:45 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de C0E376EE0E9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1440585045; bh=kj7ocp8LkZIImCXpllfr15SA9CxMgu6B42TvS/bRQHs=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=FKWoRmsDCznWqH6e7X9avF8LQ4dOqTll3P/29dOnEoj1VTUdoGV5I6Lo9O3Q1pSV/ 8MA2ZMTeYhJoBYgofCF8g61/hcZhGILNed3f6aoR/WXPPdWCmhOxa4qrKhiHIvWe5n 1cdDWu5tmgysaWKSdNnRf8SJlVQJk4xPyUaNbRxY= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Wed, 26 Aug 2015 12:30:45 +0200 From: Marko Weber|8000 To: Xfs Subject: Re: Cant mount xfs lvm. Experimental Features? Organization: zbf mail X-ASG-Orig-Subj: Re: Cant mount xfs lvm. Experimental Features? Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <20150825233348.GM714@dastard> References: <8a6d5afa8829aec73d911f35815d7b92@zbfmail.de> <20150825115412.GI714@dastard> <5ab00519660fd5ed1b3d347658dba1f2@zbfmail.de> <55DCB158.20505@sandeen.net> <20150825230353.GK714@dastard> <20150825233348.GM714@dastard> Message-ID: <01b4c31b71895d772a0db8a024e6ec12@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-wuwien-Metrics: mailserver 1290; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1440585046 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature dave, Am 2015-08-26 01:33, schrieb Dave Chinner: > On Wed, Aug 26, 2015 at 01:10:41AM +0200, Marko Weber|8000 wrote: >> dave, so the latest lts kernel 3.14.51 does not support to mount >> lvm2 partitions formatted with mkfs.xfs 3.2.4? > > As we've always done in the past, we've waited for around a year > after upstream kernel support for a feature has been supported > before turning on the feature by default in xfsprogs. Kernel 3.16 > was released just over a year ago with full CRC support. Our hand > was kinda forced by distros independently enabling these features by > default before upstream enabled them, so we enabled it a bt sooner > than previous feature default changes. > > Clearly we (upstream) have no control over what distros ship and > enable. We can't stop distros from upgrading userspace out of step > with the kernel they ship, nor can we stop them from changing > default feature enablement. However, it's up to the distro to make > sure that the userspace package and the default configurations they > ship work correctly with the kernel they ship. > > i.e. if Gentoo are shipping xfsprogs 3.2.4 w/ kernel 3.14.51, then > Gentoo has a quality control problem - they have failed to verify > that the packages they are shipping work correctly before shipping > them to users... > > Cheers, > > Dave. just want to report that with vanilla-kernel 3.18.19 all is fine again. marko From bfoster@redhat.com Wed Aug 26 05:56:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 31B6D7F37 for ; Wed, 26 Aug 2015 05:56:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D20AB30404E for ; Wed, 26 Aug 2015 03:56:46 -0700 (PDT) X-ASG-Debug-ID: 1440586605-04bdf0239775ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VA75P5GEwsdljUOD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 03:56:45 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id E1004248; Wed, 26 Aug 2015 10:56:43 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QAuhY2004199; Wed, 26 Aug 2015 06:56:43 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CA354123E8A; Wed, 26 Aug 2015 06:56:42 -0400 (EDT) Date: Wed, 26 Aug 2015 06:56:42 -0400 From: Brian Foster To: "zhao.mingyue@h3c.com" Cc: "xfs@oss.sgi.com" Subject: Re: disk is broken after mount , then fix the disk ,i still can not use the mount path Message-ID: <20150826105642.GA11759@bfoster.bfoster> X-ASG-Orig-Subj: Re: disk is broken after mount , then fix the disk ,i still can not use the mount path References: <1CB94550540AE44E9CAAE8CD5AF40BF846CE8508@H3CMLB12-EX.srv.huawei-3com.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1CB94550540AE44E9CAAE8CD5AF40BF846CE8508@H3CMLB12-EX.srv.huawei-3com.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440586605 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 26, 2015 at 09:58:26AM +0000, zhao.mingyue@h3c.com wrote: > hi: > I have a problem about xfs ,can someone help me? > 1 . mount /dev/sdb /home/test, > 2. /dev/sdb is down(my disk has something wrong) > 3.I pull out the disk, fix it and insert > then I find that I still can not operate in /home/test > Is the mechanism of XFS like this? if I want to use /home/test again, I must umount first and mount again? Yes, once the filesystem has errors or a disk is physically removed, the fs will shutdown and not allow further modification until it is remounted correctly. This is most likely the behavior you'll see for any local filesystem unless there's some kind of block device abstraction in the stack that doesn't expose the errors to the fs (e.g., md raid). Also note that the fs holds the underlying block device open. That means the device node (sdb) won't disappear just because it's been unplugged. If the device is reattached, it most likely has a new device node. You'll have to inspect the logs or /sys/block/... to find it. The old one will probably go away when the old mount is removed. FWIW, it's probably best to umount and release any active references on the block device beforehand if you know you're going to physically disconnect it. Brian > ------------------------------------------------------------------------------------------------------------------------------------- > 本邮件åŠå…¶é™„件嫿œ‰æ­å·žåŽä¸‰é€šä¿¡æŠ€æœ¯æœ‰é™å…¬å¸çš„ä¿å¯†ä¿¡æ¯ï¼Œä»…é™äºŽå‘é€ç»™ä¸Šé¢åœ°å€ä¸­åˆ—出 > çš„ä¸ªäººæˆ–ç¾¤ç»„ã€‚ç¦æ­¢ä»»ä½•其他人以任何形å¼ä½¿ç”¨ï¼ˆåŒ…括但ä¸é™äºŽå…¨éƒ¨æˆ–部分地泄露ã€å¤åˆ¶ã€ > 或散å‘)本邮件中的信æ¯ã€‚如果您错收了本邮件,请您立å³ç”µè¯æˆ–邮件通知å‘件人并删除本 > é‚®ä»¶ï¼ > This e-mail and its attachments contain confidential information from H3C, which is > intended only for the person or entity whose address is listed above. Any use of the > information contained herein in any way (including, but not limited to, total or partial > disclosure, reproduction, or dissemination) by persons other than the intended > recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender > by phone or email immediately and delete it! > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Aug 26 06:53:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D88677F37 for ; Wed, 26 Aug 2015 06:53:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B80DD304043 for ; Wed, 26 Aug 2015 04:53:12 -0700 (PDT) X-ASG-Debug-ID: 1440589991-04bdf0239a77230001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HorS72QoiPZpaaYp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 04:53:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 44BCD8CF41 for ; Wed, 26 Aug 2015 11:53:11 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QBrAQN013151; Wed, 26 Aug 2015 07:53:11 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 13A77123E8A; Wed, 26 Aug 2015 07:53:10 -0400 (EDT) Date: Wed, 26 Aug 2015 07:53:10 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: properly terminate string in quota's restore_file() Message-ID: <20150826115308.GB11759@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: properly terminate string in quota's restore_file() References: <55DC9A41.8060006@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DC9A41.8060006@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440589991 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 25, 2015 at 11:39:29AM -0500, Eric Sandeen wrote: > This code copies up to the entire size of devbuffer, and then > tries to use "strlen" to null terminate it. > > But strlen works by *finding* the null, so it's at best a > no-op, and at worst not properly terminating the string. > > Fix this by placing the null at the last byte of the buffer. > > Addresses-Coverity-Id: 1297519 > Signed-off-by: Eric Sandeen > --- > > diff --git a/quota/edit.c b/quota/edit.c > index d226e89..a53a7e6 100644 > --- a/quota/edit.c > +++ b/quota/edit.c > @@ -385,7 +385,7 @@ restore_file( > while (fgets(buffer, sizeof(buffer), fp) != NULL) { > if (strncmp("fs = ", buffer, 5) == 0) { > dev = strncpy(devbuffer, buffer+5, sizeof(devbuffer)); > - dev[strlen(dev) - 1] = '\0'; > + dev[sizeof(devbuffer) - 1] = '\0'; According to the man page, fgets() NULL terminates the provided buffer. Next, we attempt to strncpy() just the device name part of the string (copying up to 512 bytes from a 512-5 byte buffer). I'm not quite sure, but it looks like the above line could be trying to replace a newline with a NULL terminator..? E.g., it expects the last character in an already NULL terminated line to be a newline. Brian > continue; > } > rtbsoft = rtbhard = 0; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Wed Aug 26 07:00:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A57B97F37 for ; Wed, 26 Aug 2015 07:00:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 91AB78F8040 for ; Wed, 26 Aug 2015 05:00:59 -0700 (PDT) X-ASG-Debug-ID: 1440590458-04cbb07cbe7ecf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1A6odVsVFz5B4N6M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:00:58 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 31D458EA37; Wed, 26 Aug 2015 12:00:58 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC0uCJ025044; Wed, 26 Aug 2015 08:00:57 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 00/11 v4] xfsprogs: Partial OSX support Date: Wed, 26 Aug 2015 14:00:49 +0200 X-ASG-Orig-Subj: [PATCH 00/11 v4] xfsprogs: Partial OSX support Message-Id: <1440590449-20372-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590458 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Fourth iteration. Most of the patches in this set are from splitting one patch in the previous iteration. Specifically, only patch 1 is from the previous set as it wasn't in a good shape yet. Patch 3 is a delta for an older version which was merged accidentaly instead of the newest one. All the other patches in this set originate from [PATCH 05/11] xfsprogs: missing and dummy calls for OS X support. FSR is still compiled, even if it requires empty functions. There is no drawback from this for other platforms. Some of the calls can be made working. However, for example the mntent calls are not usefull anywhere else, and as fsr can't work without a mounted system, there is no way how to use and test the alternative implementation. If in futre xfs can be mounted on OS X, then at least the empty functions are clear as "TODO". If there is an untested code, they will most likely need to be debugged and possibly even rewritten to respect future changes in OS X. So in short, I see implementing them as a waste of time. Stopping the FSR build is, with the current target audience of this port between developers, unnecessary. Cheers, Jan CHANGELOG: v4: - added #warning message (patch 1) - use dummy blkid_get_topology instead of #ifdefs (patch 1) - fix autoconf (wasn't passing -DENABLE_BLKID flag, lost during patch cleaning.) (patch 1) - remove dependency on linux XATTR_ constants (patch 2) - add autoconf detection for fsetxattr (patch 4) - use uuid_t instead of unsigned char (patch 5) - add a basic timer functionality (patch 8) - mremap replacement now returns MAP_FAILED (patch 11) Version 3: - better commit messages (patch 1) - formatting fixes (patch 2, 8) - autoconf updates (patch 6, 7) - changed default behaviour if BLKID is disabled such that mkfs -f is required (patch 11) Jan Tulak (11): xfsprogs: Add a way to compile without blkid xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX xfsprogs: Add includes required for OS X builds (delta) xfsprogs: Add autoconf check for fsetxattr call xfsprogs: uuid changes for OS X xfsprogs: Remove conflicting define for OS X xfsprogs: add nftw64 translation for OS X xfsprogs: Add a timer implementation for OS X xfsprogs: Add statvfs64 for osx xfsprogs: add dummy mntent for OS X xfsprogs: add dummy mremap for OS X configure.ac | 11 +++- fsr/xfs_fsr.c | 8 +++ include/builddefs.in | 11 +++- include/darwin.h | 157 ++++++++++++++++++++++++++++++++++++++++++----- libhandle/handle.c | 6 +- libhandle/jdm.c | 6 +- libxfs/xfs_attr_remote.c | 2 +- libxfs/xfs_format.h | 11 +++- m4/package_libcdev.m4 | 13 ++++ mkfs/xfs_mkfs.c | 37 ++++++++++- repair/progress.c | 16 ++++- 11 files changed, 251 insertions(+), 27 deletions(-) -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8B0807F37 for ; Wed, 26 Aug 2015 07:02:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66598304051 for ; Wed, 26 Aug 2015 05:02:46 -0700 (PDT) X-ASG-Debug-ID: 1440590565-04bdf0239a77550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KHjpA7za2p5qDTnc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:45 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 806FE8E779; Wed, 26 Aug 2015 12:02:45 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSf022412; Wed, 26 Aug 2015 08:02:44 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 03/11] xfsprogs: Add includes required for OS X builds (delta) Date: Wed, 26 Aug 2015 14:02:27 +0200 X-ASG-Orig-Subj: [PATCH 03/11] xfsprogs: Add includes required for OS X builds (delta) Message-Id: <1440590555-20463-3-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590565 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Delta patch, an older version missing 3 includes was merged into 4.2.0-rc2. Signed-off-by: Jan Tulak --- include/darwin.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index b904898..8b5a661 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -18,6 +18,9 @@ #ifndef __XFS_DARWIN_H__ #define __XFS_DARWIN_H__ +#include +#include +#include #include #include #include -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CC7E37F54 for ; Wed, 26 Aug 2015 07:02:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A0DC8304051 for ; Wed, 26 Aug 2015 05:02:47 -0700 (PDT) X-ASG-Debug-ID: 1440590566-04bdf0239977550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PlS72pZC848csnLU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:46 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id A02DBCE1; Wed, 26 Aug 2015 12:02:46 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSg022412; Wed, 26 Aug 2015 08:02:45 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 04/11] xfsprogs: Add autoconf check for fsetxattr call Date: Wed, 26 Aug 2015 14:02:28 +0200 X-ASG-Orig-Subj: [PATCH 04/11] xfsprogs: Add autoconf check for fsetxattr call Message-Id: <1440590555-20463-4-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590566 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 OS X has fsetxattr() in another header and with different arguments. For now, check for the Linux variant and if not available, skip the code using the call. Signed-off-by: Jan Tulak --- configure.ac | 1 + fsr/xfs_fsr.c | 2 ++ include/builddefs.in | 4 ++++ m4/package_libcdev.m4 | 13 +++++++++++++ 4 files changed, 20 insertions(+) diff --git a/configure.ac b/configure.ac index 0446620..13aa308 100644 --- a/configure.ac +++ b/configure.ac @@ -123,6 +123,7 @@ AC_HAVE_SYNC_FILE_RANGE AC_HAVE_MNTENT AC_HAVE_FLS AC_HAVE_READDIR +AC_HAVE_FSETXATTR if test "$enable_blkid" = yes; then AC_HAVE_BLKID_TOPO diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index b673761..e1b7bd6 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1025,6 +1025,7 @@ fsr_setup_attr_fork( int tfd, xfs_bstat_t *bstatp) { +#ifdef HAVE_FSETXATTR struct stat64 tstatbuf; int i; int diff = 0; @@ -1199,6 +1200,7 @@ out: if (dflag && diff) fsrprintf(_("failed to match fork offset\n"));; +#endif /* HAVE_FSETXATTR */ return 0; } diff --git a/include/builddefs.in b/include/builddefs.in index 6c16a65..25b8816 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -106,6 +106,7 @@ HAVE_SYNC_FILE_RANGE = @have_sync_file_range@ HAVE_READDIR = @have_readdir@ HAVE_MNTENT = @have_mntent@ HAVE_FLS = @have_fls@ +HAVE_FSETXATTR = @have_fsetxattr@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -139,6 +140,9 @@ endif ifeq ($(HAVE_MNTENT),yes) PCFLAGS+= -DHAVE_MNTENT endif +ifeq ($(HAVE_FSETXATTR),yes) +PCFLAGS+= -DHAVE_FSETXATTR +endif ifeq ($(ENABLE_BLKID),yes) PCFLAGS+= -DENABLE_BLKID endif diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 4a96374..5e900ab 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -215,6 +215,19 @@ AC_DEFUN([AC_HAVE_FLS], ]) # +# Check if we have a fsetxattr call (Mac OS X) +# +AC_DEFUN([AC_HAVE_FSETXATTR], + [ AC_CHECK_DECL([fsetxattr], + have_fsetxattr=yes, + [], + [#include + #include ] + ) + AC_SUBST(have_fsetxattr) + ]) + +# # Check if there is mntent.h # AC_DEFUN([AC_HAVE_MNTENT], -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 878977F55 for ; Wed, 26 Aug 2015 07:02:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76AE7304051 for ; Wed, 26 Aug 2015 05:02:45 -0700 (PDT) X-ASG-Debug-ID: 1440590564-04cbb07cbd7ee20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cr4tDZx2XQ9VHAfw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:44 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 36DE3341ACF; Wed, 26 Aug 2015 12:02:44 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSe022412; Wed, 26 Aug 2015 08:02:43 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Date: Wed, 26 Aug 2015 14:02:26 +0200 X-ASG-Orig-Subj: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Message-Id: <1440590555-20463-2-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590564 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- libhandle/handle.c | 6 ++++-- libhandle/jdm.c | 6 ++++-- libxfs/xfs_attr_remote.c | 2 +- libxfs/xfs_format.h | 11 ++++++++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libhandle/handle.c b/libhandle/handle.c index b1c0c10..d532f44 100644 --- a/libhandle/handle.c +++ b/libhandle/handle.c @@ -21,6 +21,8 @@ #include "xfs.h" #include "handle.h" #include "parent.h" +#include "xfs/xfs_arch.h" +#include "xfs/xfs_format.h" /* just pick a value we know is more than big enough */ #define MAXHANSIZ 64 @@ -397,8 +399,8 @@ attr_list_by_handle( alhreq.buffer = buf; alhreq.buflen = bufsize; /* prevent needless EINVAL from the kernel */ - if (alhreq.buflen > XATTR_LIST_MAX) - alhreq.buflen = XATTR_LIST_MAX; + if (alhreq.buflen > XFS_XATTR_LIST_MAX) + alhreq.buflen = XFS_XATTR_LIST_MAX; error = xfsctl(path, fd, XFS_IOC_ATTRLIST_BY_HANDLE, &alhreq); diff --git a/libhandle/jdm.c b/libhandle/jdm.c index d804423..db7d1fe 100644 --- a/libhandle/jdm.c +++ b/libhandle/jdm.c @@ -21,6 +21,8 @@ #include "handle.h" #include "jdm.h" #include "parent.h" +#include "xfs/xfs_arch.h" +#include "xfs/xfs_format.h" /* internal fshandle - typecast to a void for external use */ #define FSHANDLE_SZ 8 @@ -168,8 +170,8 @@ jdm_attr_list( jdm_fshandle_t *fshp, int rval; /* prevent needless EINVAL from the kernel */ - if (bufsz > XATTR_LIST_MAX) - bufsz = XATTR_LIST_MAX; + if (bufsz > XFS_XATTR_LIST_MAX) + bufsz = XFS_XATTR_LIST_MAX; jdm_fill_filehandle( &filehandle, fshandlep, statp ); rval = attr_list_by_handle (( void * )&filehandle, diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index 5feaf55..98893e2 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -102,7 +102,7 @@ xfs_attr3_rmt_verify( if (be32_to_cpu(rmt->rm_bytes) > fsbsize - sizeof(*rmt)) return false; if (be32_to_cpu(rmt->rm_offset) + - be32_to_cpu(rmt->rm_bytes) > XATTR_SIZE_MAX) + be32_to_cpu(rmt->rm_bytes) > XFS_XATTR_SIZE_MAX) return false; if (rmt->rm_owner == 0) return false; diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index bb7cc04..2380084 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -60,6 +60,14 @@ struct xfs_ifork; #define XFS_SB_VERSION_MOREBITSBIT 0x8000 /* + * Avoid dependency on linux values of XATTR. + * It has to be on the beginning of this file, because we use these Values + * later in this header file. + */ +#define XFS_XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ +#define XFS_XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ + +/* * Supported feature bit list is just all bits in the versionnum field because * we've used them all up and understand them all. Except, of course, for the * shared superblock bit, which nobody knows what it does and so is unsupported. @@ -1483,7 +1491,7 @@ struct xfs_acl { */ #define XFS_ACL_MAX_ENTRIES(mp) \ (xfs_sb_version_hascrc(&mp->m_sb) \ - ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ + ? (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ sizeof(struct xfs_acl_entry) \ : 25) @@ -1497,4 +1505,5 @@ struct xfs_acl { #define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1) #define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1) + #endif /* __XFS_FORMAT_H__ */ -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CE6F97F59 for ; Wed, 26 Aug 2015 07:02:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6965EAC001 for ; Wed, 26 Aug 2015 05:02:49 -0700 (PDT) X-ASG-Debug-ID: 1440590568-04cb6c4a2b71f10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id U4h0Pghgh8tMHR4i (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id DA22EFA9CE; Wed, 26 Aug 2015 12:02:47 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSh022412; Wed, 26 Aug 2015 08:02:46 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 05/11] xfsprogs: uuid changes for OS X Date: Wed, 26 Aug 2015 14:02:29 +0200 X-ASG-Orig-Subj: [PATCH 05/11] xfsprogs: uuid changes for OS X Message-Id: <1440590555-20463-5-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590568 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 UUID API changed in OS X in last few years, so fix the platform_ calls. Signed-off-by: Jan Tulak --- include/darwin.h | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index 8b5a661..82ccf04 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -76,45 +76,37 @@ static __inline__ void platform_getoptreset(void) static __inline__ int platform_uuid_compare(uuid_t *uu1, uuid_t *uu2) { - return uuid_compare(uu1, uu2, NULL); + return uuid_compare(*uu1, *uu2); } static __inline__ void platform_uuid_unparse(uuid_t *uu, char *buffer) { - uint32_t status; - char *s; - uuid_to_string(uu, &s, &status); - if (status == uuid_s_ok) - strcpy(buffer, s); - else buffer[0] = '\0'; - free(s); + uuid_unparse(*uu, buffer); } static __inline__ int platform_uuid_parse(char *buffer, uuid_t *uu) { - uint32_t status; - uuid_from_string(buffer, uu, &status); - return (status == uuid_s_ok); + return uuid_parse(buffer, *uu); } static __inline__ int platform_uuid_is_null(uuid_t *uu) { - return uuid_is_nil(uu, NULL); + return uuid_is_null(*uu); } static __inline__ void platform_uuid_generate(uuid_t *uu) { - uuid_create(uu, NULL); + uuid_generate(*uu); } static __inline__ void platform_uuid_clear(uuid_t *uu) { - uuid_create_nil(uu, NULL); + uuid_clear(*uu); } static __inline__ void platform_uuid_copy(uuid_t *dst, uuid_t *src) { - memcpy(dst, src, sizeof(uuid_t)); + uuid_copy(*dst, *src); } typedef unsigned char __u8; -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 349AD7F60 for ; Wed, 26 Aug 2015 07:02:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1E0EAC003 for ; Wed, 26 Aug 2015 05:02:50 -0700 (PDT) X-ASG-Debug-ID: 1440590569-04cb6c4a2871f10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AwDVSD0np1nmZzA7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:49 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 2FD428E3CB; Wed, 26 Aug 2015 12:02:49 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSi022412; Wed, 26 Aug 2015 08:02:48 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 06/11] xfsprogs: Remove conflicting define for OS X Date: Wed, 26 Aug 2015 14:02:30 +0200 X-ASG-Orig-Subj: [PATCH 06/11] xfsprogs: Remove conflicting define for OS X Message-Id: <1440590555-20463-6-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590569 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ENOATTR already exists in OS X. Signed-off-by: Jan Tulak --- include/darwin.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/darwin.h b/include/darwin.h index 82ccf04..72d9c1d 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -151,7 +151,6 @@ typedef int64_t xfs_daddr_t; #define O_SYNC 0 #endif -#define ENOATTR 989 /* Attribute not found */ #define EFSCORRUPTED 990 /* Filesystem is corrupted */ #define EFSBADCRC 991 /* Bad CRC detected */ #define constpp char * const * -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E4DE87F5F for ; Wed, 26 Aug 2015 07:02:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6F3BFAC001 for ; Wed, 26 Aug 2015 05:02:44 -0700 (PDT) X-ASG-Debug-ID: 1440590563-04cbb07cbe7ee20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Dj8j2GdcclUXZXqH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:43 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id EE94F8A179; Wed, 26 Aug 2015 12:02:42 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSd022412; Wed, 26 Aug 2015 08:02:41 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 01/11] xfsprogs: Add a way to compile without blkid Date: Wed, 26 Aug 2015 14:02:25 +0200 X-ASG-Orig-Subj: [PATCH 01/11] xfsprogs: Add a way to compile without blkid Message-Id: <1440590555-20463-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590449-20372-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590563 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Because not all platforms have up-to-date blkid with required functions, allow at least partial functionality by adding --enable-blkid=yes/no optional configure argument. When blkid is disabled, signature detection and device geometry detection doesn't work. Signed-off-by: Jan Tulak --- configure.ac | 10 +++++++++- include/builddefs.in | 5 +++++ mkfs/xfs_mkfs.c | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 665b65f..0446620 100644 --- a/configure.ac +++ b/configure.ac @@ -26,6 +26,11 @@ AC_ARG_ENABLE(gettext, enable_gettext=yes) AC_SUBST(enable_gettext) +AC_ARG_ENABLE(blkid, +[ --enable-blkid=[yes/no] Enable use of block device id library [default=yes]],, + enable_blkid=yes) +AC_SUBST(enable_blkid) + AC_ARG_ENABLE(readline, [ --enable-readline=[yes/no] Enable readline command editing [default=no]], test $enable_readline = yes && libreadline="-lreadline", @@ -117,9 +122,12 @@ AC_HAVE_PREADV AC_HAVE_SYNC_FILE_RANGE AC_HAVE_MNTENT AC_HAVE_FLS -AC_HAVE_BLKID_TOPO AC_HAVE_READDIR +if test "$enable_blkid" = yes; then +AC_HAVE_BLKID_TOPO +fi + AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([char *]) AC_TYPE_UMODE_T diff --git a/include/builddefs.in b/include/builddefs.in index 8851956..6c16a65 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -89,6 +89,7 @@ ENABLE_SHARED = @enable_shared@ ENABLE_GETTEXT = @enable_gettext@ ENABLE_EDITLINE = @enable_editline@ ENABLE_READLINE = @enable_readline@ +ENABLE_BLKID = @enable_blkid@ HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ @@ -138,6 +139,10 @@ endif ifeq ($(HAVE_MNTENT),yes) PCFLAGS+= -DHAVE_MNTENT endif +ifeq ($(ENABLE_BLKID),yes) +PCFLAGS+= -DENABLE_BLKID +endif + GCFLAGS = $(OPTIMIZER) $(DEBUG) \ -DVERSION=\"$(PKG_VERSION)\" -DLOCALEDIR=\"$(PKG_LOCALE_DIR)\" \ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d993fc0..5964eaf 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -18,7 +18,9 @@ #include "libxfs.h" #include -#include +#ifdef ENABLE_BLKID +# include +#endif /* ENABLE_BLKID */ #include "xfs_mkfs.h" /* @@ -298,6 +300,7 @@ calc_stripe_factors( * 0 for nothing found * -1 for internal error */ +#ifdef ENABLE_BLKID static int check_overwrite( char *device) @@ -451,6 +454,38 @@ out_free_probe: _("warning: unable to probe device topology for device %s\n"), device); } +#else /* ifdef ENABLE_BLKID */ +/* + * Without blkid, we can't do a good check for signatures. + * So instead of some messy attempts, just disable any checks + * and always return 'nothing found'. + */ +# warning BLKID is disabled, so signature detection and block device\ + access are not working! +static int +check_overwrite( + char *device) +{ + return 1; +} + +static void blkid_get_topology( + const char *device, + int *sunit, + int *swidth, + int *lsectorsize, + int *psectorsize, + int force_overwrite) +{ + /* + * Shouldn't make any difference (no blkid = no block device access), + * but make sure this dummy replacement returns with at least some + * sanity. + */ + *lsectorsize = *psectorsize = 512; +} + +#endif /* ENABLE_BLKID */ static void get_topology( libxfs_init_t *xi, -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D8DB7F5F for ; Wed, 26 Aug 2015 07:02:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2ADBFAC001 for ; Wed, 26 Aug 2015 05:02:51 -0700 (PDT) X-ASG-Debug-ID: 1440590570-04bdf0239877560001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kuXMhajznIPVHejt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:50 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 67363341ACA; Wed, 26 Aug 2015 12:02:50 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSj022412; Wed, 26 Aug 2015 08:02:49 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 07/11] xfsprogs: add nftw64 translation for OS X Date: Wed, 26 Aug 2015 14:02:31 +0200 X-ASG-Orig-Subj: [PATCH 07/11] xfsprogs: add nftw64 translation for OS X Message-Id: <1440590555-20463-7-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590570 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 OS X has only nftw variant - not the 64 suffix used in xfs. Signed-off-by: Jan Tulak --- include/darwin.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index 72d9c1d..94e7551 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -163,4 +163,10 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) return 0; } +static inline int nftw64(const char *path, int (*fn)(const char *, const struct stat *ptr, int flag, struct FTW *), int depth, + int flags) +{ + return nftw(path, fn, depth, flags); +} + #endif /* __XFS_DARWIN_H__ */ -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 75A2629DF6 for ; Wed, 26 Aug 2015 07:02:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B3A18F8049 for ; Wed, 26 Aug 2015 05:02:54 -0700 (PDT) X-ASG-Debug-ID: 1440590573-04cbb07cbe7ee50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id okoGfFtkxZg4sZtF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:53 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 29DE3341AD4; Wed, 26 Aug 2015 12:02:53 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSl022412; Wed, 26 Aug 2015 08:02:52 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 09/11] xfsprogs: Add statvfs64 for osx Date: Wed, 26 Aug 2015 14:02:33 +0200 X-ASG-Orig-Subj: [PATCH 09/11] xfsprogs: Add statvfs64 for osx Message-Id: <1440590555-20463-9-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590573 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Use dummy stuff. It is used only in xfs_fsr, so it is not a big issue. However, there is a part of an attempted solution to translate it to OS X variant - statfs. OS X statfs is missing f_frsize member in the struct, so its use would require some #ifdef in fsr code. Because of this, the dummy stuff is used. Signed-off-by: Jan Tulak --- fsr/xfs_fsr.c | 6 ++++++ include/builddefs.in | 2 +- include/darwin.h | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index e1b7bd6..b7ac1b2 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -36,6 +36,12 @@ # include #endif +#ifdef __APPLE__ +//# define statvfs64 statfs; +# include +# include +#endif + #ifndef XFS_XFLAG_NODEFRAG #define XFS_XFLAG_NODEFRAG 0x00002000 /* src dependancy, remove later */ #endif diff --git a/include/builddefs.in b/include/builddefs.in index 25b8816..31e21ba 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -123,7 +123,7 @@ PCFLAGS = -D_GNU_SOURCE $(GCCFLAGS) endif ifeq ($(PKG_PLATFORM),darwin) PCFLAGS = $(GCCFLAGS) -DEPENDFLAGS = -D__APPLE__ +DEPENDFLAGS = -D__APPLE__ -D_DARWIN_FEATURE_64_BIT_INODE endif ifeq ($(PKG_PLATFORM),irix) PLDLIBS = -ldisk -lgen diff --git a/include/darwin.h b/include/darwin.h index f5f28df..c8fcb3c 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -217,4 +217,37 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) return getitimer(ITIMER_REAL, value); } +/* FSR */ + +//#define statvfs64 statfs +#define _PATH_MOUNTED "/etc/mtab" + +typedef int __fsblkcnt_t; +typedef int __fsfilcnt_t; +typedef long long int __fsblkcnt64_t; +typedef long long int __fsfilcnt64_t; + +struct statvfs64 +{ + unsigned long int f_bsize; + unsigned long int f_frsize; + __fsblkcnt64_t f_blocks; + __fsblkcnt64_t f_bfree; + __fsblkcnt64_t f_bavail; + __fsfilcnt64_t f_files; + __fsfilcnt64_t f_ffree; + __fsfilcnt64_t f_favail; + unsigned long int f_fsid; + int __f_unused; + unsigned long int f_flag; + unsigned long int f_namemax; + int __f_spare[6]; +}; + +static inline int statvfs64 (const char *__restrict __file, + struct statfs *__restrict __buf) +{ + return 0; +} + #endif /* __XFS_DARWIN_H__ */ -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A1D5E29E01 for ; Wed, 26 Aug 2015 07:02:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 39E7BAC001 for ; Wed, 26 Aug 2015 05:02:55 -0700 (PDT) X-ASG-Debug-ID: 1440590574-04bdf0239977570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UaFEVvAbZdfyzEPQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:54 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 74C1DA2C2C; Wed, 26 Aug 2015 12:02:54 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSm022412; Wed, 26 Aug 2015 08:02:53 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 10/11] xfsprogs: add dummy mntent for OS X Date: Wed, 26 Aug 2015 14:02:34 +0200 X-ASG-Orig-Subj: [PATCH 10/11] xfsprogs: add dummy mntent for OS X Message-Id: <1440590555-20463-10-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590574 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Because these calls are used only by xfs_fsr, which can't work on OS X unless a way how to mount XFS is found, there is not use in implementing these calls. Signed-off-by: Jan Tulak --- include/darwin.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index c8fcb3c..d47c96c 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -244,6 +244,41 @@ struct statvfs64 int __f_spare[6]; }; +struct mntent +{ + char *mnt_fsname; /* Device or server for filesystem. */ + char *mnt_dir; /* Directory mounted on. */ + char *mnt_type; /* Type of filesystem: ufs, nfs, etc. */ + char *mnt_opts; /* Comma-separated options for fs. */ + int mnt_freq; /* Dump frequency (in days). */ + int mnt_passno; /* Pass number for `fsck'. */ +}; + +static inline FILE *setmntent(const char *filename, const char *type) +{ + return NULL; +} + +static inline int endmntent(FILE *fp) +{ + return 0; +} + +static inline struct mntent *getmntent(FILE *fp) +{ + return NULL; +} + +static inline int addmntent(FILE *fp, const struct mntent *mnt) +{ + return 0; +} + +static inline char *hasmntopt(const struct mntent *mnt, const char *opt) +{ + return NULL; +} + static inline int statvfs64 (const char *__restrict __file, struct statfs *__restrict __buf) { -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 83A7E29E01 for ; Wed, 26 Aug 2015 07:02:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 707118F8049 for ; Wed, 26 Aug 2015 05:02:53 -0700 (PDT) X-ASG-Debug-ID: 1440590572-04cbb07cbe7ee40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PLYAkhH7DX7vno4Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:52 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 31F1F43; Wed, 26 Aug 2015 12:02:52 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSk022412; Wed, 26 Aug 2015 08:02:50 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 08/11] xfsprogs: Add a timer implementation for OS X Date: Wed, 26 Aug 2015 14:02:32 +0200 X-ASG-Orig-Subj: [PATCH 08/11] xfsprogs: Add a timer implementation for OS X Message-Id: <1440590555-20463-8-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590572 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 OS X does not have the timer used in xfs_repair. Add a simple implementation providing the required capabilities. Signed-off-by: Jan Tulak --- include/darwin.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ repair/progress.c | 16 ++++++++++++++-- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index 94e7551..f5f28df 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -169,4 +170,51 @@ static inline int nftw64(const char *path, int (*fn)(const char *, const struct return nftw(path, fn, depth, flags); } +/* + * POSIX timer replacement. + * It really just do the minimum we need for xfs_repair. + * Also, as setitimer can't create multiple timers, + * the timerid things are useless - we have only one ITIMER_REAL + * timer. + */ +#define CLOCK_REALTIME ITIMER_REAL +#define itimerspec itimerval +typedef uint64_t timer_t; +typedef double timer_c; +typedef clock_id_t clockid_t; + + +static inline int timer_create (clockid_t __clock_id, + struct sigevent *__restrict __evp, + timer_t *__restrict timer) +{ + // set something, to initialize the variable, just in case + *timer = 0; + return 0; +} + +static inline int timer_settime (timer_t timerid, int flags, + const struct itimerspec *__restrict timerspec, + struct itimerspec *__restrict ovalue) +{ + return setitimer(ITIMER_REAL, timerspec, ovalue); +} + +static inline int timer_delete (timer_t timerid) +{ + struct itimerspec timespec; + + timespec.it_interval.tv_sec=0; + timespec.it_interval.tv_usec=0; + timespec.it_value.tv_sec=0; + timespec.it_value.tv_usec=0; + + return setitimer(ITIMER_REAL, ×pec, NULL); +} + +static inline int timer_gettime (timer_t timerid, struct itimerspec *value) +{ + return getitimer(ITIMER_REAL, value); +} + #endif /* __XFS_DARWIN_H__ */ diff --git a/repair/progress.c b/repair/progress.c index 27cbaef..0fee7dc 100644 --- a/repair/progress.c +++ b/repair/progress.c @@ -184,10 +184,22 @@ progress_rpt_thread (void *p) */ timespec.it_value.tv_sec = msgp->interval; - timespec.it_value.tv_nsec = 0; timespec.it_interval.tv_sec = msgp->interval; + /* + * On some platforms (like OS X), timers and time things are slightly + * different: itimerspec is replaced with itimerval and timeval struct + * has no tv_nsec, but just tv_usec member. + * For compatibility, itimerspec is a macro defined to the existing + * itimerval on these platforms, and in such case, use usec instead + * of nsec. + */ +#ifndef itimerspec + timespec.it_value.tv_nsec = 0; timespec.it_interval.tv_nsec = 0; - +#else + timespec.it_value.tv_usec = 0; + timespec.it_interval.tv_usec = 0; +#endif if (timer_create (CLOCK_REALTIME, NULL, &timerid)) do_error(_("progress_rpt: cannot create timer\n")); -- 2.4.5 From jtulak@redhat.com Wed Aug 26 07:02:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 992FB29E0B for ; Wed, 26 Aug 2015 07:02:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1FBD7AC001 for ; Wed, 26 Aug 2015 05:02:57 -0700 (PDT) X-ASG-Debug-ID: 1440590575-04cbb07cbb7ee60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NHvMxC3Repk7GVm6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 05:02:56 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id A90A7461C4; Wed, 26 Aug 2015 12:02:55 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QC2fSn022412; Wed, 26 Aug 2015 08:02:54 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 11/11] xfsprogs: add dummy mremap for OS X Date: Wed, 26 Aug 2015 14:02:35 +0200 X-ASG-Orig-Subj: [PATCH 11/11] xfsprogs: add dummy mremap for OS X Message-Id: <1440590555-20463-11-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440590576 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Signed-off-by: Jan Tulak --- include/darwin.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index d47c96c..2e16f65 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #define __BYTE_ORDER BYTE_ORDER @@ -217,6 +218,14 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) return getitimer(ITIMER_REAL, value); } +#define MREMAP_FIXED 1 +#define MREMAP_MAYMOVE 2 +static inline void *mremap(void *old_address, size_t old_size, + size_t new_size, int flags, ...) +{ + return MAP_FAILED; +} + /* FSR */ //#define statvfs64 statfs -- 2.4.5 From rjohnston@sgi.com Wed Aug 26 09:33:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C9157F37 for ; Wed, 26 Aug 2015 09:33:54 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6005C304039; Wed, 26 Aug 2015 07:33:51 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id 0E19F7002506; Wed, 26 Aug 2015 09:33:51 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id DB92260EDE2F0; Wed, 26 Aug 2015 09:33:50 -0500 (CDT) Message-Id: <20150924193241.975348815@gulag1.americas.sgi.com> User-Agent: quilt/0.47-15.17.1 From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH] xfsdump: prevent segfault in cb_add_inogrp Content-Disposition: inline; filename=prevent-segfault-in-cb_add_inogrp.patch Date: Wed, 26 Aug 2015 09:33:50 -0500 (CDT) The call to memset will segfault because the offset for the first parameter is done twice. We are using pointer math to do the calculation. The first time is when calculating oldsize, the size of i2gseg_t is accounted for. oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); Then in the call to memset, oldsize is again multiplied by the size of i2gmap_t. memset(inomap.i2gmap + oldsize, ...) i2gmap holds the used inodes in each chunk. When there are 2^31 chunk entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). With 100s of millions of inodes there are enough entries to wrap the 32 bit variable oldsize. Switching to use array index notation instead of calculating the pointer address twice ;) would resolve this issue. The unneeded local variable oldsize can be removed as well. --- dump/inomap.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) Index: b/dump/inomap.c =================================================================== --- a/dump/inomap.c +++ b/dump/inomap.c @@ -1125,8 +1125,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd lastsegp->segoff = 0; if (lastsegp->hnkoff == inomap.hnkmaplen) { - intgen_t numsegs; - intgen_t oldsize; + int64_t numsegs; inomap.hnkmaplen++; inomap.hnkmap = (hnk_t *) @@ -1140,10 +1139,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd return -1; /* zero the new portion of the i2gmap */ - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); - - memset(inomap.i2gmap + oldsize, - 0, + memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, SEGPERHNK * sizeof(i2gseg_t)); } From rjohnston@sgi.com Wed Aug 26 09:33:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B41B37F37 for ; Wed, 26 Aug 2015 09:33:55 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay2.corp.sgi.com (Postfix) with ESMTP id 94846304039; Wed, 26 Aug 2015 07:33:55 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Wed, 26 Aug 2015 09:33:54 -0500 Message-ID: <55DDCE52.9070105@sgi.com> Date: Wed, 26 Aug 2015 09:33:54 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Eric Sandeen , Subject: Re: [PATCH 0/2] xfsdump: fix problems in cb_add_inogrp References: <20150821193047.661578219@gulag1.americas.sgi.com> <55D747FE.4070401@sandeen.net> <55D7854A.9030706@sgi.com> <55D785E7.8050503@sandeen.net> In-Reply-To: <55D785E7.8050503@sandeen.net> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 08/21/2015 03:11 PM, Eric Sandeen wrote: > On 8/21/15 3:08 PM, Rich Johnston wrote: >> On 08/21/2015 10:47 AM, Eric Sandeen wrote: >>> Hi - >>> >>> Are there any testcases for these? xfsdump is alien code, I swear; >>> I'm not quite sure offhand how to tickle any of these bugs. >>> >>> Thanks, >>> -Eric >>> >> >> Hey Eric, >> >> Many thanks for taking the time to review these patches. >> I take a look at all your responses and get a V2 out early next week. > > Sounds good. If I was off track about the need for the extra 64-bit vars, > just educate me. ;) > > -Eric > Ok you convinced me, there is no need for patch 1 and patch 2 can be solved by removing the local variable oldsize. A new patch has been submitted. [PATCH] xfsdump: prevent segfault in cb_add_inogrp From rjohnston@sgi.com Wed Aug 26 11:27:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ACF027F37 for ; Wed, 26 Aug 2015 11:27:16 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 63339304043 for ; Wed, 26 Aug 2015 09:27:13 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id 19E58700257B for ; Wed, 26 Aug 2015 11:27:13 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 0106560EDE2F0; Wed, 26 Aug 2015 11:27:12 -0500 (CDT) Subject: [PATCH] xfsrestore: fix fs uuid order check for incremental restores From: Rich Johnston To: Message-ID: <55D5DB95.1280108@sgi.com> Content-Disposition: inline; filename=fix-fs-uuid-order-check.patch Date: Wed, 26 Aug 2015 11:27:12 -0500 (CDT) Restoring an incremental level 1 dump will fail with the following error if the fs uuid of the most recent level 0 dump in the inventory does not match level 1 dump we are restoring. xfsrestore: ERROR: selected dump not based on previously applied dump This can happen when you have multiple filesystems and you are restoring a level 1 or greater dump of filesystem FS1 but the most recent level 0 dump in the inventory was filesystem FS2 The fix is to ensure the fs uuid of the inventory entry and the dump to be restored match. Signed-off-by: Rich Johnston --- dump/content.c | 8 ++- inventory/inv_api.c | 108 ++++++++++++++++++++++++++++++-------------------- inventory/inv_mgr.c | 32 ++++++++++---- inventory/inv_priv.h | 7 +-- inventory/inventory.h | 5 ++ restore/content.c | 17 +++++-- 6 files changed, 113 insertions(+), 64 deletions(-) Index: b/dump/content.c =================================================================== --- a/dump/content.c +++ b/dump/content.c @@ -872,7 +872,7 @@ content_init( intgen_t argc, sameinterruptedpr = BOOL_FALSE; interruptedpr = BOOL_FALSE; - ok = inv_get_session_byuuid( &baseuuid, &sessp ); + ok = inv_get_session_byuuid( &fsid, &baseuuid, &sessp ); if ( ! ok ) { mlog( MLOG_NORMAL | MLOG_ERROR, _( "could not find specified base dump (%s) " @@ -983,7 +983,8 @@ content_init( intgen_t argc, "online inventory not available\n") ); return BOOL_FALSE; } - ok = inv_lastsession_level_lessthan( inv_idbt, + ok = inv_lastsession_level_lessthan( &fsid, + inv_idbt, ( u_char_t )sc_level, &sessp ); if ( ! ok ) { @@ -1022,7 +1023,8 @@ content_init( intgen_t argc, if ( inv_idbt != INV_TOKEN_NULL ) { /* REFERENCED */ bool_t ok1; - ok = inv_lastsession_level_equalto( inv_idbt, + ok = inv_lastsession_level_equalto( &fsid, + inv_idbt, ( u_char_t )sc_level, &sessp ); ok1 = inv_close( inv_idbt ); Index: b/inventory/inv_api.c =================================================================== --- a/inventory/inv_api.c +++ b/inventory/inv_api.c @@ -596,69 +596,78 @@ inv_free_session( /*----------------------------------------------------------------------*/ -/* inventory_lasttime_level_lessthan */ -/* */ -/* Given a token that refers to a file system, and a level, this returns*/ -/* the last time when a session of a lesser level was done. */ -/* */ -/* returns -1 on error. */ +/* inv_lasttime_level_lessthan */ +/* */ +/* Given a file system uuid, token that refers to a file system, and a */ +/* level, tm is populated with last time when a session of a lesser */ +/* level was done. */ +/* */ +/* Returns TRUE on success. */ /*----------------------------------------------------------------------*/ bool_t inv_lasttime_level_lessthan( - inv_idbtoken_t tok, - u_char level, - time32_t **tm ) + uuid_t *fsidp, + inv_idbtoken_t tok, + u_char level, + time32_t **tm ) { int rval; if ( tok != INV_TOKEN_NULL ) { - rval = search_invt( tok->d_invindex_fd, &level, (void **) tm, - (search_callback_t) tm_level_lessthan ); + rval = search_invt(fsidp, tok->d_invindex_fd, &level, + (void **) tm, + (search_callback_t) tm_level_lessthan); return ( rval < 0) ? BOOL_FALSE: BOOL_TRUE; } - return invmgr_query_all_sessions((void *) &level, /* in */ - (void **) tm, /* out */ + return invmgr_query_all_sessions(fsidp, /* fs uuid ptr*/ + (void *) &level, /* in */ + (void **) tm, /* out */ (search_callback_t) tm_level_lessthan); } - - - - /*----------------------------------------------------------------------*/ -/* */ -/* */ -/* */ +/* inv_lastsession_level_lessthan */ +/* */ +/* Given a file system uuid, token that refers to a file system, and a */ +/* level, ses is populated with a session of lesser than the level */ +/* passed in. */ +/* */ +/* Returns FALSE on an error, TRUE if not. If (*ses) is NULL, then the */ +/* search failed. */ /*----------------------------------------------------------------------*/ bool_t inv_lastsession_level_lessthan( - inv_idbtoken_t tok, + uuid_t *fsidp, + inv_idbtoken_t tok, u_char level, - inv_session_t **ses ) + inv_session_t **ses ) { int rval; if ( tok != INV_TOKEN_NULL ) { - rval = search_invt( tok->d_invindex_fd, &level, (void **) ses, - (search_callback_t) lastsess_level_lessthan ); + rval = search_invt(fsidp, tok->d_invindex_fd, &level, + (void **) ses, + (search_callback_t) lastsess_level_lessthan); return ( rval < 0) ? BOOL_FALSE: BOOL_TRUE; } - return invmgr_query_all_sessions((void *) &level, /* in */ + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) &level, /* in */ (void **) ses, /* out */ (search_callback_t) lastsess_level_lessthan); } - - - /*----------------------------------------------------------------------*/ -/* */ -/* */ +/* inv_lastsession_level_equalto */ +/* */ +/* Given a file system uuid, token that refers to a file system, and a */ +/* level, this populates ses with last time when a session of a lesser */ +/* level was done. */ +/* */ /* Return FALSE on an error, TRUE if not. If (*ses) is NULL, then the */ /* search failed. */ /*----------------------------------------------------------------------*/ @@ -666,19 +675,22 @@ inv_lastsession_level_lessthan( bool_t inv_lastsession_level_equalto( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, inv_session_t **ses ) { int rval; if ( tok != INV_TOKEN_NULL ) { - rval = search_invt( tok->d_invindex_fd, &level, (void **) ses, - (search_callback_t) lastsess_level_equalto ); + rval = search_invt(fsidp, tok->d_invindex_fd, &level, + (void **) ses, + (search_callback_t) lastsess_level_equalto); return ( rval < 0) ? BOOL_FALSE: BOOL_TRUE; } - return invmgr_query_all_sessions((void *) &level, /* in */ + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) &level, /* in */ (void **) ses, /* out */ (search_callback_t) lastsess_level_equalto); @@ -688,35 +700,45 @@ inv_lastsession_level_equalto( /*----------------------------------------------------------------------*/ /* inv_getsession_byuuid */ /* */ +/* Given a file system uuid and a session uuid , ses is populated with */ +/* the session that contains the matching system uuid. */ +/* */ +/* Returns FALSE on an error, TRUE if the session was found. */ /*----------------------------------------------------------------------*/ bool_t inv_get_session_byuuid( + uuid_t *fsidp, uuid_t *sesid, inv_session_t **ses) { - return (invmgr_query_all_sessions((void *)sesid, /* in */ - (void **) ses, /* out */ - (search_callback_t) stobj_getsession_byuuid)); + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) sesid, /* in */ + (void **) ses, /* out */ + (search_callback_t) stobj_getsession_byuuid); } - - /*----------------------------------------------------------------------*/ -/* inv_getsession_byuuid */ +/* inv_getsession_bylabel */ /* */ +/* Given a file system uuid and a session uuid, ses is populated with */ +/* the session that contains the matching system label. */ +/* */ +/* Returns FALSE on an error, TRUE if the session was found. */ /*----------------------------------------------------------------------*/ bool_t inv_get_session_bylabel( + uuid_t *fsidp, char *session_label, inv_session_t **ses) { - return (invmgr_query_all_sessions((void *)session_label, /* in */ - (void **) ses, /* out */ - (search_callback_t) stobj_getsession_bylabel)); + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) session_label, /* in */ + (void **) ses, /* out */ + (search_callback_t) stobj_getsession_bylabel); } @@ -786,7 +808,7 @@ inv_delete_mediaobj( uuid_t *moid ) return BOOL_FALSE; } - if ( search_invt( invfd, NULL, (void **)&moid, + if ( search_invt( &arr[i].ft_uuid, invfd, NULL, (void **)&moid, (search_callback_t) stobj_delete_mobj ) < 0 ) return BOOL_FALSE; Index: b/inventory/inv_mgr.c =================================================================== --- a/inventory/inv_mgr.c +++ b/inventory/inv_mgr.c @@ -134,6 +134,7 @@ get_sesstoken( inv_idbtoken_t tok ) /*---------------------------------------------------------------------------*/ bool_t invmgr_query_all_sessions ( + uuid_t *fsidp, void *inarg, void **outarg, search_callback_t func) @@ -169,7 +170,7 @@ invmgr_query_all_sessions ( mlog( MLOG_NORMAL | MLOG_INV, _( "INV: Cant get inv-name for uuid\n") ); - return BOOL_FALSE; + continue; } strcat( fname, INV_INVINDEX_PREFIX ); invfd = open( fname, INV_OFLAG(forwhat) ); @@ -178,9 +179,9 @@ invmgr_query_all_sessions ( "INV: Open failed on %s\n"), fname ); - return BOOL_FALSE; + continue; } - result = search_invt( invfd, inarg, &objectfound, func ); + result = search_invt(fsidp, invfd, inarg, &objectfound, func); close(invfd); /* if error return BOOL_FALSE */ @@ -213,6 +214,7 @@ invmgr_query_all_sessions ( intgen_t search_invt( + uuid_t *fsidp, int invfd, void *arg, void **buf, @@ -247,7 +249,7 @@ search_invt( /* we need to get all the invindex headers and seshdrs in reverse order */ for (i = nindices - 1; i >= 0; i--) { - int nsess; + int nsess, j; invt_sescounter_t *scnt = NULL; invt_seshdr_t *harr = NULL; bool_t found; @@ -272,19 +274,31 @@ search_invt( } free ( scnt ); - while ( nsess ) { + for (j = nsess - 1; j >= 0; j--) { + invt_session_t ses; + /* fd is kept locked until we return from the callback routine */ /* Check to see if this session has been pruned * by xfsinvutil before checking it. */ - if ( harr[nsess - 1].sh_pruned ) { - --nsess; + if (harr[j].sh_pruned) { continue; } - found = (* do_chkcriteria ) ( fd, &harr[ --nsess ], - arg, buf ); + + /* if we need to check the fs uuid's and they don't + * match or we fail to get the session record, + * then keep looking + */ + if (fsidp && + (GET_REC_NOLOCK(fd, &ses, sizeof(invt_session_t), + harr[j].sh_sess_off) == + sizeof(invt_session_t)) && + uuid_compare(ses.s_fsid, *fsidp)) + continue ; + + found = (* do_chkcriteria ) (fd, &harr[j], arg, buf); if (! found ) continue; /* we found what we need; just return */ Index: b/inventory/inv_priv.h =================================================================== --- a/inventory/inv_priv.h +++ b/inventory/inv_priv.h @@ -548,11 +548,12 @@ get_headerinfo( int fd, void **hdrs, voi size_t hdrsz, size_t cntsz, bool_t doblock ); bool_t -invmgr_query_all_sessions (void *inarg, void **outarg, search_callback_t func); +invmgr_query_all_sessions(uuid_t *fsidp, void *inarg, void **outarg, + search_callback_t func); intgen_t -search_invt( int invfd, void *arg, void **buf, - search_callback_t do_chkcriteria ); +search_invt(uuid_t *fsidp, int invfd, void *arg, void **buf, + search_callback_t do_chkcriteria); intgen_t invmgr_inv_print( int invfd, invt_pr_ctx_t *prctx); Index: b/inventory/inventory.h =================================================================== --- a/inventory/inventory.h +++ b/inventory/inventory.h @@ -247,18 +247,21 @@ inv_put_mediafile( */ extern bool_t inv_lasttime_level_lessthan( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, time32_t **time );/* out */ extern bool_t inv_lastsession_level_lessthan( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, inv_session_t **ses );/* out */ extern bool_t inv_lastsession_level_equalto( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, inv_session_t **ses );/* out */ @@ -266,11 +269,13 @@ inv_lastsession_level_equalto( /* Given a uuid of a session, return the session structure.*/ extern bool_t inv_get_session_byuuid( + uuid_t *fsidp, uuid_t *sesid, inv_session_t **ses); extern bool_t inv_get_session_bylabel( + uuid_t *fsidp, char *session_label, inv_session_t **ses); Index: b/restore/content.c =================================================================== --- a/restore/content.c +++ b/restore/content.c @@ -2179,8 +2179,9 @@ content_stream_restore( ix_t thrdix ) if ( ! drivep->d_isnamedpipepr && ! drivep->d_isunnamedpipepr ) { - ok = inv_get_session_byuuid( &grhdrp->gh_dumpid, - &sessp ); + ok = inv_get_session_byuuid((uuid_t *)0, + &grhdrp->gh_dumpid, + &sessp); if ( ok && sessp ) { mlog( MLOG_VERBOSE, _( "using online session inventory\n") ); @@ -3736,9 +3737,11 @@ Inv_validate_cmdline( void ) ok = BOOL_FALSE; sessp = 0; if ( tranp->t_reqdumpidvalpr ) { - ok = inv_get_session_byuuid( &tranp->t_reqdumpid, &sessp ); + ok = inv_get_session_byuuid((uuid_t *)0, &tranp->t_reqdumpid, + &sessp ); } else if ( tranp->t_reqdumplabvalpr ) { - ok = inv_get_session_bylabel( tranp->t_reqdumplab, &sessp ); + ok = inv_get_session_bylabel((uuid_t *)0, tranp->t_reqdumplab, + &sessp ); } rok = BOOL_FALSE; if ( ok && sessp ) { @@ -6812,11 +6815,13 @@ askinvforbaseof( uuid_t baseid, inv_sess /* get the base session */ if ( resumedpr ) { - ok = inv_lastsession_level_equalto( invtok, + ok = inv_lastsession_level_equalto( &sessp->s_fsid, + invtok, ( u_char_t )level, &basesessp ); } else { - ok = inv_lastsession_level_lessthan( invtok, + ok = inv_lastsession_level_lessthan( &sessp->s_fsid, + invtok, ( u_char_t )level, &basesessp ); } From sandeen@sandeen.net Wed Aug 26 11:42:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 52C9A7F37 for ; Wed, 26 Aug 2015 11:42:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 41FC88F8033 for ; Wed, 26 Aug 2015 09:42:11 -0700 (PDT) X-ASG-Debug-ID: 1440607329-04cbb07cbd879d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BBG2tGtDLRYm9TGo for ; Wed, 26 Aug 2015 09:42:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1FFEC63C77A5; Wed, 26 Aug 2015 11:42:09 -0500 (CDT) Message-ID: <55DDEC60.4040509@sandeen.net> Date: Wed, 26 Aug 2015 11:42:08 -0500 From: Eric Sandeen MIME-Version: 1.0 To: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfsdump: prevent segfault in cb_add_inogrp In-Reply-To: <20150924193241.975348815@gulag1.americas.sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440607329 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21945 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On 8/26/15 9:33 AM, rjohnston@sgi.com wrote: > The call to memset will segfault because the offset for the first > parameter is done twice. We are using pointer math to do the > calculation. > The first time is when calculating oldsize, the size of i2gseg_t > is accounted for. > oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > Then in the call to memset, oldsize is again multiplied by the size > of i2gmap_t. > memset(inomap.i2gmap + oldsize, ...) > > i2gmap holds the used inodes in each chunk. When there are 2^31 chunk > entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). > > With 100s of millions of inodes there are enough entries to wrap the > 32 bit variable oldsize. > > Switching to use array index notation instead of calculating the > pointer address twice ;) would resolve this issue. The unneeded > local variable oldsize can be removed as well. Ok, this doesn't explain the type change for numsegs, does it? Can you walk me through why that's needed? At what point would numsegs = inomap.hnkmaplen * SEGPERHNK; overflow? Thanks, -Eric > --- > dump/inomap.c | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > Index: b/dump/inomap.c > =================================================================== > --- a/dump/inomap.c > +++ b/dump/inomap.c > @@ -1125,8 +1125,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > lastsegp->segoff = 0; > > if (lastsegp->hnkoff == inomap.hnkmaplen) { > - intgen_t numsegs; > - intgen_t oldsize; > + int64_t numsegs; > > inomap.hnkmaplen++; > inomap.hnkmap = (hnk_t *) > @@ -1140,10 +1139,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > return -1; > > /* zero the new portion of the i2gmap */ > - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > - > - memset(inomap.i2gmap + oldsize, > - 0, > + memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, > SEGPERHNK * sizeof(i2gseg_t)); > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Wed Aug 26 12:10:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 07EB07F37 for ; Wed, 26 Aug 2015 12:10:47 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB5DC30404E; Wed, 26 Aug 2015 10:10:43 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Wed, 26 Aug 2015 12:10:43 -0500 Message-ID: <55DDF312.1050402@sgi.com> Date: Wed, 26 Aug 2015 12:10:42 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Eric Sandeen , Subject: Re: [PATCH] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55DDEC60.4040509@sandeen.net> In-Reply-To: <55DDEC60.4040509@sandeen.net> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 08/26/2015 11:42 AM, Eric Sandeen wrote: > On 8/26/15 9:33 AM, rjohnston@sgi.com wrote: >> The call to memset will segfault because the offset for the first >> parameter is done twice. We are using pointer math to do the >> calculation. >> The first time is when calculating oldsize, the size of i2gseg_t >> is accounted for. >> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); >> Then in the call to memset, oldsize is again multiplied by the size >> of i2gmap_t. >> memset(inomap.i2gmap + oldsize, ...) >> >> i2gmap holds the used inodes in each chunk. When there are 2^31 chunk >> entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). >> >> With 100s of millions of inodes there are enough entries to wrap the >> 32 bit variable oldsize. >> >> Switching to use array index notation instead of calculating the >> pointer address twice ;) would resolve this issue. The unneeded >> local variable oldsize can be removed as well. > > Ok, this doesn't explain the type change for numsegs, does it? Nope that was a typo, as it is an array index I meant to change it from a signed int (intgen_t) to an unsigned (uint32_t). > > Can you walk me through why that's needed? At what point would > numsegs = inomap.hnkmaplen * SEGPERHNK; overflow? > > Thanks, > -Eric > >> --- >> dump/inomap.c | 8 ++------ >> 1 file changed, 2 insertions(+), 6 deletions(-) >> >> Index: b/dump/inomap.c >> =================================================================== >> --- a/dump/inomap.c >> +++ b/dump/inomap.c >> @@ -1125,8 +1125,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd >> lastsegp->segoff = 0; >> >> if (lastsegp->hnkoff == inomap.hnkmaplen) { >> - intgen_t numsegs; >> - intgen_t oldsize; >> + int64_t numsegs; >> >> inomap.hnkmaplen++; >> inomap.hnkmap = (hnk_t *) >> @@ -1140,10 +1139,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd >> return -1; >> >> /* zero the new portion of the i2gmap */ >> - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); >> - >> - memset(inomap.i2gmap + oldsize, >> - 0, >> + memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, >> SEGPERHNK * sizeof(i2gseg_t)); >> } >> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > From rjohnston@sgi.com Wed Aug 26 12:36:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 547D67F37 for ; Wed, 26 Aug 2015 12:36:46 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3038AC009 for ; Wed, 26 Aug 2015 10:36:42 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id 8432E7002E03 for ; Wed, 26 Aug 2015 12:36:42 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 6976E60EDE2F0; Wed, 26 Aug 2015 12:36:42 -0500 (CDT) Message-ID: <55EDF3BA.60409@sgi.com> From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> In-Reply-To: <20150924193241.975348815@gulag1.americas.sgi.com> Content-Disposition: inline; filename=prevent-segfault-in-cb_add_inogrp-V2.patch Date: Wed, 26 Aug 2015 12:36:42 -0500 (CDT) The call to memset will segfault because the offset for the first parameter is done twice. We are using pointer math to do the calculation. The first time is when calculating oldsize, the size of i2gseg_t is accounted for. oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); Then in the call to memset, oldsize is again multiplied by the size of i2gmap_t. memset(inomap.i2gmap + oldsize, ...) i2gmap holds the used inodes in each chunk. When there are 2^31 chunk entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). With 100s of millions of inodes there are enough entries to wrap the 32 bit variable oldsize. Switching to use array index notation instead of calculating the pointer address twice ;) would resolve this issue. The unneeded local variable oldsize can be removed as well. numsegs is used to calculate an array index, change it from a signed int (intgen_t) to an unsigned (uint32_t). --- dump/inomap.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) Index: b/dump/inomap.c =================================================================== --- a/dump/inomap.c +++ b/dump/inomap.c @@ -1125,8 +1125,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd lastsegp->segoff = 0; if (lastsegp->hnkoff == inomap.hnkmaplen) { - intgen_t numsegs; - intgen_t oldsize; + int32_t numsegs; inomap.hnkmaplen++; inomap.hnkmap = (hnk_t *) @@ -1140,10 +1139,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd return -1; /* zero the new portion of the i2gmap */ - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); - - memset(inomap.i2gmap + oldsize, - 0, + memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, SEGPERHNK * sizeof(i2gseg_t)); } From shrinand@maginatics.com Wed Aug 26 12:48:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D15797F37 for ; Wed, 26 Aug 2015 12:48:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5B332AC005 for ; Wed, 26 Aug 2015 10:48:57 -0700 (PDT) X-ASG-Debug-ID: 1440611332-04cb6c4a297b3c0001-NocioJ Received: from mail-la0-f46.google.com (mail-la0-f46.google.com [209.85.215.46]) by cuda.sgi.com with ESMTP id 0PzgK0yYMAnUmJma (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 26 Aug 2015 10:48:53 -0700 (PDT) X-Barracuda-Envelope-From: shrinand@maginatics.com X-Barracuda-Apparent-Source-IP: 209.85.215.46 Received: by labia3 with SMTP id ia3so60249797lab.3 for ; Wed, 26 Aug 2015 10:48:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=9qsQae45A1nUXCiHl6HzVdZH79SdSaIty5jP3cE6aOg=; b=SN5kUyse5AO24PXZkybNAOngse33BvANrHEk5W+PWmuE04jjpiJBxnuQTa4NdRtlMa WSTofw+sucTL4C/7UaHHzZfvtAzXN7zyy6T8afbSQsMT0Bb71VIBQne5wjYojDv4a32l oZChQWoFbUQZ0eAzx8vmmfRCZ5Cc2AQA0mPDFt55bvMQ3z6YYSxzzEIoG9WjMYla+PuL fGyB88XI+KuD6IJSavaadJSM+/1aQrxH+4RW0v95QvkpN+dH8/xP7mFxXtfip6FVlybA ecdzHIR7QC7w7ffs/hix3UtNrh/oZRn2LAXNcT8nD9Oirv/H61mSpitJ84gWzmgg9+jn fndQ== X-Gm-Message-State: ALoCoQnjrubiQoO7PXjaC26Y852Sjo7qAFNs9w9wgJ5jIX3mjhJv2XlfsGv0kRuXEooULkKvKWEb MIME-Version: 1.0 X-Received: by 10.112.92.101 with SMTP id cl5mr30779322lbb.67.1440611332551; Wed, 26 Aug 2015 10:48:52 -0700 (PDT) Received: by 10.25.31.7 with HTTP; Wed, 26 Aug 2015 10:48:52 -0700 (PDT) In-Reply-To: <20150825234300.GN714@dastard> References: <55DCE1CF.5030708@sandeen.net> <20150825234300.GN714@dastard> Date: Wed, 26 Aug 2015 10:48:52 -0700 Message-ID: Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f From: Shrinand Javadekar X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-la0-f46.google.com[209.85.215.46] X-Barracuda-Start-Time: 1440611333 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.10 BSF_SC0_SA085 Custom Rule SA085 Please see my responses inline. I am seeing this behavior again. On Tue, Aug 25, 2015 at 4:43 PM, Dave Chinner wrote: > On Tue, Aug 25, 2015 at 04:09:33PM -0700, Shrinand Javadekar wrote: >> I did this on 2 different setups. > > Details? [Shri] On hardware box 1: 1. # of disks: 23 2. Type: Rotational disks 3. Ran mkfs.xfs and mounted disks 4. Installed Swift 5. Ran benchmark 6. Stopped Swift 7. unmounted disks 8. mkfs.xfs -f on all 23 disks 9. mounted disks 10. Installed Swift 11. Ran benchmark Benchmark #s are as reported earlier. The same steps mentioned above were performed on hardware box #2. > >> Formatted the new disks with mkfs.xfs. Ran the workload. >> Reformatted the disks with mkfs.xfs -f. Ran the workload. >> >> > >> >> Any ideas why this might be happening? >> > >> > With the paucity of information you've provided, nope! >> >> Apologies. What more information can I provide? > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F [Shri] I mentioned this in my first email. Here's the information: http://oss.sgi.com/archives/xfs/2015-06/msg00108.html > >> > What version of xfsprogs are you using? >> >> # xfs_repair -V >> xfs_repair version 3.1.9 > > That's pretty old. [Shri] We're using xfs progs version 3.1.9 whereas the kernel is newer one: 3.16.0-38-generic. Does that matter? For e.g. one of my colleagues found that the formatting with crc enabled is only available in newer version of xfsprogs. > >> > What was the output of mkfs.xfs each time; did the geometry differ? >> >> I have the output of xfs_info /mount/point from the first experiment >> and that of mkfs.xfs -f. One difference I see is that reformatting >> adds projid32bit=0 for the inode section. > > xfs_info didn't get projid32bit status output until 3.2.0. > > Anyway, please post the output so we can see the differences for > ourselves. What we need is mkfs output in both cases, and xfs_info > output in both cases after mount. Step 1: mkfs.xfs Good formatting: http://pastie.org/private/new2zmwvdqvgm7h7coc4g else: meta-data=/dev/mapper/35000c50062e6a567-part2 isize=256 agcount=4, agsize=183141504 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=732566016, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=357698, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Step 2: xfs_info meta-data=/dev/mapper/35000c50062e6a567-part2 isize=256 agcount=4, agsize=183141504 blks = sectsz=512 attr=2 data = bsize=4096 blocks=732566016, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=357698, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Step 3: Ran the benchmark (each run of 20GB) Bandwidth (KB/s): 62294.9 Bandwidth (KB/s): 34407.7 Bandwidth (KB/s): 26949.8 Step 4: mkfs.xfs -f Good formatting: http://pastie.org/private/bmzfateuuneddwg1zgymq else: meta-data=/dev/mapper/35000c50062e6a567-part2 isize=256 agcount=4, agsize=183141504 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=732566016, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=357698, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Step 5: xfs_info meta-data=/dev/mapper/35000c50062e6a567-part2 isize=256 agcount=4, agsize=183141504 blks = sectsz=512 attr=2 data = bsize=4096 blocks=732566016, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=357698, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Step 6: Ran the same Benchmark (each run of 20GB): Bandwidth (KB/s): 97061.6 Bandwidth (KB/s): 42811.7 Bandwidth (KB/s): 32111.7 -Shri > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From sandeen@sandeen.net Wed Aug 26 13:44:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B40417F37 for ; Wed, 26 Aug 2015 13:44:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 856298F8035 for ; Wed, 26 Aug 2015 11:44:23 -0700 (PDT) X-ASG-Debug-ID: 1440614658-04bdf0239a82e50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id YcC4BwZ4ufgnO8Su for ; Wed, 26 Aug 2015 11:44:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.example.com (50-77-61-73-static.hfc.comcastbusiness.net [50.77.61.73]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 62DD463C77A5; Wed, 26 Aug 2015 13:44:17 -0500 (CDT) Message-ID: <55DE08FF.10904@sandeen.net> Date: Wed, 26 Aug 2015 13:44:15 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Shrinand Javadekar , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f References: <55DCE1CF.5030708@sandeen.net> <20150825234300.GN714@dastard> X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440614658 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/26/15 12:48 PM, Shrinand Javadekar wrote: > Please see my responses inline. I am seeing this behavior again. > > On Tue, Aug 25, 2015 at 4:43 PM, Dave Chinner wrote: >> On Tue, Aug 25, 2015 at 04:09:33PM -0700, Shrinand Javadekar wrote: >>> I did this on 2 different setups. >> >> Details? > > [Shri] On hardware box 1: > > 1. # of disks: 23 > 2. Type: Rotational disks > 3. Ran mkfs.xfs and mounted disks > 4. Installed Swift > 5. Ran benchmark Details of "the benchmark?" (buffered or direct? IO sizes, file layout etc?) > 6. Stopped Swift > 7. unmounted disks > 8. mkfs.xfs -f on all 23 disks > 9. mounted disks > 10. Installed Swift > 11. Ran benchmark >>>> What version of xfsprogs are you using? >>> >>> # xfs_repair -V >>> xfs_repair version 3.1.9 >> >> That's pretty old. > > [Shri] We're using xfs progs version 3.1.9 whereas the kernel is newer > one: 3.16.0-38-generic. Does that matter? > For e.g. one of my colleagues found that the formatting with crc > enabled is only available in newer version of xfsprogs. It's fine to use xfsprogs 3.1.9 with kenrel 3.16. (In fact nothing is going to be problematic, other than possibly running into unknown features if one is too far out of sync with the other. In that case, you'd just get a hard stop on the unknown feature, not a cryptic behavior...) >> >>>> What was the output of mkfs.xfs each time; did the geometry differ? >>> >>> I have the output of xfs_info /mount/point from the first experiment >>> and that of mkfs.xfs -f. One difference I see is that reformatting >>> adds projid32bit=0 for the inode section. >> >> xfs_info didn't get projid32bit status output until 3.2.0. >> >> Anyway, please post the output so we can see the differences for >> ourselves. What we need is mkfs output in both cases, and xfs_info >> output in both cases after mount. > > Step 1: mkfs.xfs Ok, the mkfs output & xfs_info output is identical with and without -f (as they should be). What is your storage, i.e. what's behind /dev/mapper/35000c50062e6a567-part2 ? Is it thinly-provisioned, or anything else interesting like that? (thin provisioning probably shouldn't matter, because in theory we discard the whole device on mkfs anyway). But is it possible that the first benchmark primed the storage in some way? To that end, what does: 1) mkfs.xfs, benchmark 2) benchmark show? is the 2nd one faster as well? Or, possibly: 1) mkfs.xfs, benchmark 2) mkfs.xfs -f, benchmark 3) wipefs, mkfs.xfs, benchmark That would leave old xfs superblocks in place for the 3rd test, and not wiped by mkfs itself, but I can't imagine why that would matter. (mkfs should reinitialize them anyway, I think the call to zero_old_xfs_structures() is just so that an xfs_repair search for backups won't find old unrelated signatures from a prior different geometry...) Right now I'm actually wondering more about your storage, I guess. -Eric From sandeen@sandeen.net Wed Aug 26 14:04:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9DCAD7F37 for ; Wed, 26 Aug 2015 14:04:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D8A9304043 for ; Wed, 26 Aug 2015 12:04:54 -0700 (PDT) X-ASG-Debug-ID: 1440615892-04cbb07cbb8b730001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Dm1336kULtBCt53r for ; Wed, 26 Aug 2015 12:04:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.example.com (50-77-61-73-static.hfc.comcastbusiness.net [50.77.61.73]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2FAB163C77A5; Wed, 26 Aug 2015 14:04:52 -0500 (CDT) Message-ID: <55DE0DD3.90108@sandeen.net> Date: Wed, 26 Aug 2015 14:04:51 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Shrinand Javadekar , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f References: <55DCE1CF.5030708@sandeen.net> <20150825234300.GN714@dastard> X-ASG-Orig-Subj: Re: Performance impact of mkfs.xfs vs mkfs.xfs -f In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440615892 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 0.10 BSF_SC0_SA085 Custom Rule SA085 On 8/26/15 12:48 PM, Shrinand Javadekar wrote: >>>>> >> >> Any ideas why this might be happening? >>>> >> > >>>> >> > With the paucity of information you've provided, nope! >>> >> >>> >> Apologies. What more information can I provide? >> > >> > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > [Shri] I mentioned this in my first email. Here's the information: > http://oss.sgi.com/archives/xfs/2015-06/msg00108.html Just as an aside: A 3 month old email under a different subject doesn't really help us in this thread. ;) You're the only one who knows if this is the same machine, whether you've upgraded since, etc. So we had to ask... For anyone reading: If you're having a problem, please, please always start with as much information about your environment as you can provide, as described in the xfs.org URL above. It saves many email round-trips, and helps us help you better. Thanks, -Eric From djeffery@redhat.com Wed Aug 26 14:06:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 10C847F37 for ; Wed, 26 Aug 2015 14:06:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4587304062 for ; Wed, 26 Aug 2015 12:06:41 -0700 (PDT) X-ASG-Debug-ID: 1440616000-04bdf0239983890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TnQVTcmXNJudiuCY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 12:06:40 -0700 (PDT) X-Barracuda-Envelope-From: djeffery@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id D819D8CF40 for ; Wed, 26 Aug 2015 19:06:39 +0000 (UTC) Received: from rage.redhat.com (unused [10.10.50.192] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7QJ6brm013519 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 26 Aug 2015 15:06:38 -0400 Date: Wed, 26 Aug 2015 15:06:36 -0400 From: David Jeffery To: xfs@oss.sgi.com Subject: [PATCH] xfs: return errors from partial I/O failures to files Message-ID: <20150826190636.GA16540@rage.redhat.com> X-ASG-Orig-Subj: [PATCH] xfs: return errors from partial I/O failures to files MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440616000 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There is an issue with xfs's error reporting in some cases of I/O partially failing and partially succeeding. Calls like fsync() can report success even though not all I/O was successful. The issue can occur when there are multiple bio per xfs_ioend struct. Each call to xfs_end_bio() for a bio completing will write a value to ioend->io_error. If a successful bio completes after any failed bio, no error is reported do to it writing 0 over the error code set by any failed bio. The I/O error information is now lost and when the ioend is completed only success is reported back up the filesystem stack. xfs_end_bio() should only set ioend->io_error in the case of BIO_UPTODATE being clear. ioend->io_error is initialized to 0 at allocation so only needs to be updated by any failed bio structs. This ensures an error can be reported to the application. Signed-off-by: David Jeffery --- diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 3859f5e..b82b128 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -356,7 +356,8 @@ xfs_end_bio( { xfs_ioend_t *ioend = bio->bi_private; - ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; + if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) + ioend->io_error = error; /* Toss bio and pass work off to an xfsdatad thread */ bio->bi_private = NULL; From david@fromorbit.com Wed Aug 26 16:26:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 321467F37 for ; Wed, 26 Aug 2015 16:26:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3291AC005 for ; Wed, 26 Aug 2015 14:26:37 -0700 (PDT) X-ASG-Debug-ID: 1440624392-04bdf0239886a50001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id grF5VGYr6Un0kxpf for ; Wed, 26 Aug 2015 14:26:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BaBwDMLd5V/0DvLHldgxuBPYJVpy8GilGREQQCAoFATQEBAQEBAYELhCQBAQQ6HCMQCAMOCgklDwUlAyETiC3JJAEBAQEBBQEBAQEeGYYMhTaFCgeDGIEUBZU5jG+OcItxJoQRLDOCTQEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 06:56:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUiD4-0006fC-UX; Thu, 27 Aug 2015 07:26:18 +1000 Date: Thu, 27 Aug 2015 07:26:18 +1000 From: Dave Chinner To: Rich Johnston Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfsdump: prevent segfault in cb_add_inogrp Message-ID: <20150826212618.GA3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55DDEC60.4040509@sandeen.net> <55DDF312.1050402@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DDF312.1050402@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440624392 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 26, 2015 at 12:10:42PM -0500, Rich Johnston wrote: > On 08/26/2015 11:42 AM, Eric Sandeen wrote: > >On 8/26/15 9:33 AM, rjohnston@sgi.com wrote: > >>The call to memset will segfault because the offset for the first > >>parameter is done twice. We are using pointer math to do the > >>calculation. > >>The first time is when calculating oldsize, the size of i2gseg_t > >>is accounted for. > >> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > >>Then in the call to memset, oldsize is again multiplied by the size > >>of i2gmap_t. > >> memset(inomap.i2gmap + oldsize, ...) > >> > >>i2gmap holds the used inodes in each chunk. When there are 2^31 chunk > >>entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). > >> > >>With 100s of millions of inodes there are enough entries to wrap the > >>32 bit variable oldsize. > >> > >>Switching to use array index notation instead of calculating the > >>pointer address twice ;) would resolve this issue. The unneeded > >>local variable oldsize can be removed as well. > > > >Ok, this doesn't explain the type change for numsegs, does it? > Nope that was a typo, as it is an array index I meant to change it from > a signed int (intgen_t) to an unsigned (uint32_t). That doesn't fix anything. If you push the index down through zero by decrementing it too much, it will still result in an array bound overrun. i.e. It will index array element UINT_MAX rather than -1. And the compiler still won't catch it because it can't bounds check runtime calculated index values... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 26 16:31:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A11F17F37 for ; Wed, 26 Aug 2015 16:31:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2CB54AC008 for ; Wed, 26 Aug 2015 14:31:52 -0700 (PDT) X-ASG-Debug-ID: 1440624706-04cb6c4a2a80440001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id huYlQwqnArdhkd1w for ; Wed, 26 Aug 2015 14:31:47 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CmBwAuL95V/0DvLHldgxuBPYJVpy8GilGREQICAQECgUBNAQEBAQEBgQuEJAEBBDocIxAIAw4KCSUPBSUDIROILckoAQEBBwIBHxmGDIU2hQoHgxiBFAWHKY4Qh3KEfYFNhDKJU4sPJoIPHIFmLDOCTQEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 07:01:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUiI9-0006gB-GQ; Thu, 27 Aug 2015 07:31:33 +1000 Date: Thu, 27 Aug 2015 07:31:33 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsrestore: fix fs uuid order check for incremental restores Message-ID: <20150826213133.GB3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsrestore: fix fs uuid order check for incremental restores References: <55D5DB95.1280108@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55D5DB95.1280108@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440624706 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 26, 2015 at 11:27:12AM -0500, Rich Johnston wrote: > Restoring an incremental level 1 dump will fail with the following error > if the fs uuid of the most recent level 0 dump in the inventory does not > match level 1 dump we are restoring. > > xfsrestore: ERROR: selected dump not based on previously applied dump > > This can happen when you have multiple filesystems and you are restoring > a level 1 or greater dump of filesystem FS1 but the most recent level 0 > dump in the inventory was filesystem FS2 > > The fix is to ensure the fs uuid of the inventory entry and the dump to > be restored match. > > Signed-off-by: Rich Johnston > --- > dump/content.c | 8 ++- > inventory/inv_api.c | 108 ++++++++++++++++++++++++++++++-------------------- > inventory/inv_mgr.c | 32 ++++++++++---- > inventory/inv_priv.h | 7 +-- > inventory/inventory.h | 5 ++ > restore/content.c | 17 +++++-- > 6 files changed, 113 insertions(+), 64 deletions(-) > > Index: b/dump/content.c > =================================================================== > --- a/dump/content.c > +++ b/dump/content.c > @@ -872,7 +872,7 @@ content_init( intgen_t argc, > sameinterruptedpr = BOOL_FALSE; > interruptedpr = BOOL_FALSE; > - ok = inv_get_session_byuuid( &baseuuid, &sessp ); > + ok = inv_get_session_byuuid( &fsid, &baseuuid, &sessp ); > if ( ! ok ) { > mlog( MLOG_NORMAL | MLOG_ERROR, _( > "could not find specified base dump (%s) " This patch has whitespace problems all through it (bad indenting, all tabs converted to spaces, etc) and so it won't apply. Please fix and resend. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 26 16:38:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A5F27F37 for ; Wed, 26 Aug 2015 16:38:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7845C8F8040 for ; Wed, 26 Aug 2015 14:38:32 -0700 (PDT) X-ASG-Debug-ID: 1440625110-04cbb07cbb8ef40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 2RFhKfOSEwCwq9r9 for ; Wed, 26 Aug 2015 14:38:31 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AhDACHMd5V/0DvLHldgxuBPYJVpy8GilGREQQCAoFATQEBAQEBAYELQQWDXgEBBDocIxAIAxgJJQ8FJQM0iC3JKQEBAQEGAgEfGYYMhTaFCgcXgwGBFAWVOYxvjnCLcSaEESwzgk0BAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 07:08:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUiOB-0006ig-1S; Thu, 27 Aug 2015 07:37:47 +1000 Date: Thu, 27 Aug 2015 07:37:47 +1000 From: Dave Chinner To: rjohnston@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp Message-ID: <20150826213746.GC3902@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55EDF3BA.60409@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55EDF3BA.60409@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440625110 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 26, 2015 at 12:36:42PM -0500, rjohnston@sgi.com wrote: > The call to memset will segfault because the offset for the first > parameter is done twice. We are using pointer math to do the > calculation. > The first time is when calculating oldsize, the size of i2gseg_t > is accounted for. > oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > Then in the call to memset, oldsize is again multiplied by the size > of i2gmap_t. > memset(inomap.i2gmap + oldsize, ...) > > i2gmap holds the used inodes in each chunk. When there are 2^31 chunk > entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). > > With 100s of millions of inodes there are enough entries to wrap the > 32 bit variable oldsize. > > Switching to use array index notation instead of calculating the > pointer address twice ;) would resolve this issue. The unneeded > local variable oldsize can be removed as well. > > numsegs is used to calculate an array index, change it from a > signed int (intgen_t) to an unsigned (uint32_t). Description does not match code: > - intgen_t numsegs; > - intgen_t oldsize; > + int32_t numsegs; It's still a signed int here. And, really, just a plain old "int" is fine here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Aug 26 16:56:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 293E07F37 for ; Wed, 26 Aug 2015 16:56:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF1DF8F8033 for ; Wed, 26 Aug 2015 14:56:19 -0700 (PDT) X-ASG-Debug-ID: 1440626177-04bdf0239a87340001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0SSvjrBMmI1hDGsW for ; Wed, 26 Aug 2015 14:56:17 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3249963C77A5; Wed, 26 Aug 2015 16:56:17 -0500 (CDT) Message-ID: <55DE3600.4000401@sandeen.net> Date: Wed, 26 Aug 2015 16:56:16 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfsprogs: properly terminate string in quota's restore_file() References: <55DC9A41.8060006@redhat.com> <20150826115308.GB11759@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: properly terminate string in quota's restore_file() In-Reply-To: <20150826115308.GB11759@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440626177 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On 8/26/15 6:53 AM, Brian Foster wrote: > On Tue, Aug 25, 2015 at 11:39:29AM -0500, Eric Sandeen wrote: >> This code copies up to the entire size of devbuffer, and then >> tries to use "strlen" to null terminate it. >> >> But strlen works by *finding* the null, so it's at best a >> no-op, and at worst not properly terminating the string. >> >> Fix this by placing the null at the last byte of the buffer. >> >> Addresses-Coverity-Id: 1297519 >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/quota/edit.c b/quota/edit.c >> index d226e89..a53a7e6 100644 >> --- a/quota/edit.c >> +++ b/quota/edit.c >> @@ -385,7 +385,7 @@ restore_file( >> while (fgets(buffer, sizeof(buffer), fp) != NULL) { >> if (strncmp("fs = ", buffer, 5) == 0) { >> dev = strncpy(devbuffer, buffer+5, sizeof(devbuffer)); >> - dev[strlen(dev) - 1] = '\0'; >> + dev[sizeof(devbuffer) - 1] = '\0'; > > According to the man page, fgets() NULL terminates the provided buffer. Yep, I should have looked more closely. It copies at most size-1 (511 bytes), including the newline if it fits, and terminates with \0. > Next, we attempt to strncpy() just the device name part of the string > (copying up to 512 bytes from a 512-5 byte buffer). In fact since the original buffer (via fgets, 512) will be <= 512 long, copying again from 5 bytes in will always result in less than 512 bytes copied. > I'm not quite sure, > but it looks like the above line could be trying to replace a newline > with a NULL terminator..? E.g., it expects the last character in an > already NULL terminated line to be a newline. Yes, that's exactly it, thanks. There is one very corner case where if the last char in the buffer is part of the device name, the buffer won't contain the newline, and the '\0' will actually take out one char, rather than the newline. But that's one heck of a corner case, the exactly-sized-device-name case ... probably not worth worrying about, though I might send a patch just to satisfy my OCD. Thanks for keeping me straight on this one, sorry for the noise. -Eric > Brian > >> continue; >> } >> rtbsoft = rtbhard = 0; >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Wed Aug 26 16:57:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE1E97F37 for ; Wed, 26 Aug 2015 16:57:38 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD4FC8F8033; Wed, 26 Aug 2015 14:57:38 -0700 (PDT) Received: from [134.15.0.245] (134.15.0.245) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Wed, 26 Aug 2015 16:57:38 -0500 Message-ID: <55DE3651.5030803@sgi.com> Date: Wed, 26 Aug 2015 16:57:37 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Dave Chinner CC: Subject: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55EDF3BA.60409@sgi.com> <20150826213746.GC3902@dastard> In-Reply-To: <20150826213746.GC3902@dastard> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.245] Dave, On 08/26/2015 04:37 PM, Dave Chinner wrote: > On Wed, Aug 26, 2015 at 12:36:42PM -0500, rjohnston@sgi.com wrote: >> The call to memset will segfault because the offset for the first >> parameter is done twice. We are using pointer math to do the >> calculation. >> The first time is when calculating oldsize, the size of i2gseg_t >> is accounted for. >> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); >> Then in the call to memset, oldsize is again multiplied by the size >> of i2gmap_t. >> memset(inomap.i2gmap + oldsize, ...) >> >> i2gmap holds the used inodes in each chunk. When there are 2^31 chunk >> entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). >> >> With 100s of millions of inodes there are enough entries to wrap the >> 32 bit variable oldsize. >> >> Switching to use array index notation instead of calculating the >> pointer address twice ;) would resolve this issue. The unneeded >> local variable oldsize can be removed as well. >> Per your other comment I will add a bounds check after calculating numsegs: if (numsegs < 0) return -1; The description above will change to: Adding a bounds check (numsegs < 0) and switching to use array index notation instead of calculating the pointer address twice ;) would resolve this issue. The unneeded local variable oldsize can be removed as well. >> numsegs is used to calculate an array index, change it from a >> signed int (intgen_t) to an unsigned (uint32_t). > I will remove the above description and leave it as is (intgen_t) > Description does not match code: > >> - intgen_t numsegs; >> - intgen_t oldsize; >> + int32_t numsegs; > > It's still a signed int here. And, really, just a plain old "int" is > fine here. > > Cheers, > > Dave. > From david@fromorbit.com Wed Aug 26 17:01:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 332AF7F37 for ; Wed, 26 Aug 2015 17:01:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12471304066 for ; Wed, 26 Aug 2015 15:01:41 -0700 (PDT) X-ASG-Debug-ID: 1440626498-04cbb07cbb8f680001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9rMfr6y80KgwCq14 for ; Wed, 26 Aug 2015 15:01:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CnBwA0Nt5V/0DvLHldgxuBPYJVpy8GilGREQICAQECgTVNAQEBAQEBgQuEIwEBAQMBOhwjBQsIAw4KCSUPBSUDIROIJgfJJQEBAQEGAQEBAR4ZhgyFNoQxAVgHgxiBFAWVOYxvjnCLcSaCDB+BZiwzgQUBH4EoAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 07:31:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUil0-0006mr-U9; Thu, 27 Aug 2015 08:01:22 +1000 Date: Thu, 27 Aug 2015 08:01:22 +1000 From: Dave Chinner To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Message-ID: <20150826220122.GD3902@dastard> X-ASG-Orig-Subj: Re: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-2-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-2-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440626498 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 26, 2015 at 02:02:26PM +0200, Jan Tulak wrote: > Signed-off-by: Jan Tulak Explanation of the change? > --- > libhandle/handle.c | 6 ++++-- > libhandle/jdm.c | 6 ++++-- > libxfs/xfs_attr_remote.c | 2 +- > libxfs/xfs_format.h | 11 ++++++++++- > 4 files changed, 19 insertions(+), 6 deletions(-) > > diff --git a/libhandle/handle.c b/libhandle/handle.c > index b1c0c10..d532f44 100644 > --- a/libhandle/handle.c > +++ b/libhandle/handle.c .... > diff --git a/libhandle/jdm.c b/libhandle/jdm.c > index d804423..db7d1fe 100644 > --- a/libhandle/jdm.c > +++ b/libhandle/jdm.c > @@ -21,6 +21,8 @@ > #include "handle.h" > #include "jdm.h" > #include "parent.h" > +#include "xfs/xfs_arch.h" > +#include "xfs/xfs_format.h" I don't think you need the xfs/ prefix now. > diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h > index bb7cc04..2380084 100644 > --- a/libxfs/xfs_format.h > +++ b/libxfs/xfs_format.h > @@ -60,6 +60,14 @@ struct xfs_ifork; > #define XFS_SB_VERSION_MOREBITSBIT 0x8000 > > /* > + * Avoid dependency on linux values of XATTR. > + * It has to be on the beginning of this file, because we use these Values > + * later in this header file. > + */ This is an explanation of why the change is being made, not what the definitions are for. This belongs in the commit message, not the code. > +#define XFS_XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ We try to avoid comments like these for defines (they tend only to be added to structure definitions now). /* * The size of a single extended attribute on disk is limited by * the size of index values within the attribute entries themselves. * These are be16 fields, so we can only support attribute data * sizes up to 2^16 bytes in length. */ #define XFS_XATTR_SIZE_MAX (1 << 16) > +#define XFS_XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ XATTR_LIST_MAX is not an on-disk format definition - it's a syscall buffer size limit and is defined by the OS. This belongs in the platform headers, such as: #ifndef XATTR_LIST_MAX #define XATTR_LIST_MAX 65536 #endif And so in a common header (e.g. include/xfs.h after including the platform headers): #define XFS_XATTR_LIST_MAX XATTR_LIST_MAX IOWs, this is really two separate patches - one for the XFS_XATTR_SIZE_MAX change (which also needs to go back to the kernel) and one for XFS_XATTR_LIST_MAX (which is purely userspace). Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Aug 26 17:19:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3ACF57F37 for ; Wed, 26 Aug 2015 17:19:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27BBC304043 for ; Wed, 26 Aug 2015 15:19:42 -0700 (PDT) X-ASG-Debug-ID: 1440627580-04cb6c4a2981210001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZqF8TAHwdKqKnllB for ; Wed, 26 Aug 2015 15:19:40 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8C91763C77A5; Wed, 26 Aug 2015 17:19:40 -0500 (CDT) Message-ID: <55DE3B7B.8010608@sandeen.net> Date: Wed, 26 Aug 2015 17:19:39 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Rich Johnston , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55EDF3BA.60409@sgi.com> <20150826213746.GC3902@dastard> <55DE3651.5030803@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp In-Reply-To: <55DE3651.5030803@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440627580 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21954 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On 8/26/15 4:57 PM, Rich Johnston wrote: > Dave, > > On 08/26/2015 04:37 PM, Dave Chinner wrote: >> On Wed, Aug 26, 2015 at 12:36:42PM -0500, rjohnston@sgi.com wrote: >>> The call to memset will segfault because the offset for the first >>> parameter is done twice. We are using pointer math to do the >>> calculation. >>> The first time is when calculating oldsize, the size of i2gseg_t >>> is accounted for. >>> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); >>> Then in the call to memset, oldsize is again multiplied by the size >>> of i2gmap_t. >>> memset(inomap.i2gmap + oldsize, ...) >>> >>> i2gmap holds the used inodes in each chunk. When there are 2^31 chunk >>> entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). >>> >>> With 100s of millions of inodes there are enough entries to wrap the >>> 32 bit variable oldsize. >>> >>> Switching to use array index notation instead of calculating the >>> pointer address twice ;) would resolve this issue. The unneeded >>> local variable oldsize can be removed as well. >>> > Per your other comment I will add a bounds check after calculating numsegs: > if (numsegs < 0) > return -1; probably fine, but probably not really necessary. numsegs = inomap.hnkmaplen * SEGPERHNK; hnkmaplen initializes as: inomap.hnkmaplen = (igrpcnt + SEGPERHNK - 1) / SEGPERHNK; >From my prior email, if I was right, > so I guess that means that if we have more than 2^31 inode groups, > i.e. 2^31 * 256 = 500 billion inodes, (int) igrpcnt could overflow. so unless you have > 500 billion inodes, it's not going to be a problem... I'd just focus on the single problem at hand (extending a pointer to an array by number of bytes, not number of elements) and leave it at that. -Eric > The description above will change to: > > Adding a bounds check (numsegs < 0) and switching to use array > index notation instead of calculating the pointer address twice ;) > would resolve this issue. The unneeded local variable oldsize > can be removed as well. > >>> numsegs is used to calculate an array index, change it from a >>> signed int (intgen_t) to an unsigned (uint32_t). >> > I will remove the above description and leave it as is (intgen_t) >> Description does not match code: >> >>> - intgen_t numsegs; >>> - intgen_t oldsize; >>> + int32_t numsegs; >> >> It's still a signed int here. And, really, just a plain old "int" is >> fine here. >> >> Cheers, >> >> Dave. >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Wed Aug 26 17:20:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C00EE7F37 for ; Wed, 26 Aug 2015 17:20:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE7CF8F8035 for ; Wed, 26 Aug 2015 15:20:07 -0700 (PDT) X-ASG-Debug-ID: 1440627605-04cbb07cbb8fca0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id zGHAvBhcDEyCHSPb for ; Wed, 26 Aug 2015 15:20:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CnBwDzOt5V/0DvLHldgxuBPYJVpy8GilGREQICAQECgTVNAQEBAQEBgQuEIwEBAQMBJxMcIwULCAMOCgklDwUlAyETiCYHySgBAQgCIBmGDIU2hQoHgxiBFAWHJoZxhyKMb4FNh1CJEIRJg2smgg8cgWYsM4JNAQEB Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 07:50:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUj2u-0006oS-1a; Thu, 27 Aug 2015 08:19:52 +1000 Date: Thu, 27 Aug 2015 08:19:52 +1000 From: Dave Chinner To: David Jeffery Cc: xfs@oss.sgi.com, Eryu Guan Subject: Re: [PATCH] xfs: return errors from partial I/O failures to files Message-ID: <20150826221951.GE3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: return errors from partial I/O failures to files References: <20150826190636.GA16540@rage.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826190636.GA16540@rage.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440627605 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 26, 2015 at 03:06:36PM -0400, David Jeffery wrote: > There is an issue with xfs's error reporting in some cases of I/O partially > failing and partially succeeding. Calls like fsync() can report success even > though not all I/O was successful. Hi David, I read your bug report last night and after considering all the work you put into it, I was going to ask if you wanted to finish off the job by writing the patch to fix it. But you beat me to it. Nice work! :) > The issue can occur when there are multiple bio per xfs_ioend struct. > Each call to xfs_end_bio() for a bio completing will write a value to > ioend->io_error. If a successful bio completes after any failed bio, no > error is reported do to it writing 0 over the error code set by any failed bio. > The I/O error information is now lost and when the ioend is completed > only success is reported back up the filesystem stack. It's worth mentioning the case that this was seen in - a single failed disk in a raid 0 stripe, and the error from the bio to the failed disk was overwritten by the successes from the bios to the other disks. FWIW, I think that we also need to create an xfstest for this case, too, because it's clear that this is a big hole in our test coverage (i.e. partial block device failure). It might be best to talk to Eryu (cc'd) to get your reproducer converted into a xfstest case that we can then test all filesystems against? > xfs_end_bio() should only set ioend->io_error in the case of BIO_UPTODATE > being clear. ioend->io_error is initialized to 0 at allocation so only needs > to be updated by any failed bio structs. This ensures an error can be reported > to the application. > > Signed-off-by: David Jeffery > --- Best to add a "cc: " so that it gets pushed back to all the stable kernels automatically which it hits Linus' tree. One minor change to the fix: > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 3859f5e..b82b128 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -356,7 +356,8 @@ xfs_end_bio( > { > xfs_ioend_t *ioend = bio->bi_private; > > - ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; > + if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) > + ioend->io_error = error; We should preserve the original error that was reported, rather than report the last one. ioend->io_error is always initialised to zero, so we can simply do: if (!ioend->io_error && !test_bit(BIO_UPTODATE, &bio->bi_flags)) ioend->io_error = error; Can you update the patch and resend it? I've got a couple of other fixes that I need to push to the for-next tree in the next couple of days (i.e. before the 4.3. merge window opens) and I'd like to get this one in as well. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 26 17:21:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 80D767F37 for ; Wed, 26 Aug 2015 17:21:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 60CE78F8035 for ; Wed, 26 Aug 2015 15:21:31 -0700 (PDT) X-ASG-Debug-ID: 1440627689-04cbb07cbe8fd30001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id TOL5Tzlkjk6oIXo9 for ; Wed, 26 Aug 2015 15:21:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BaBwDzOt5V/0DvLHldgxuBPYJVpy8GilGREQQCAoE1TQEBAQEBAYELhCQBAQQ6HCMQCAMOCgklDwUlAyETiC3JKAEBAQEBBQEBAQEeGYYMhTaFCgeDGIEUBZU5jG+BTY0jiAaDayaEESwzgk0BAQE Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 07:51:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUj4G-0006od-0O; Thu, 27 Aug 2015 08:21:16 +1000 Date: Thu, 27 Aug 2015 08:21:15 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp Message-ID: <20150826222115.GF3902@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55EDF3BA.60409@sgi.com> <20150826213746.GC3902@dastard> <55DE3651.5030803@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DE3651.5030803@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440627689 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 26, 2015 at 04:57:37PM -0500, Rich Johnston wrote: > Dave, > > On 08/26/2015 04:37 PM, Dave Chinner wrote: > >On Wed, Aug 26, 2015 at 12:36:42PM -0500, rjohnston@sgi.com wrote: > >>The call to memset will segfault because the offset for the first > >>parameter is done twice. We are using pointer math to do the > >>calculation. > >>The first time is when calculating oldsize, the size of i2gseg_t > >>is accounted for. > >> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > >>Then in the call to memset, oldsize is again multiplied by the size > >>of i2gmap_t. > >> memset(inomap.i2gmap + oldsize, ...) > >> > >>i2gmap holds the used inodes in each chunk. When there are 2^31 chunk > >>entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). > >> > >>With 100s of millions of inodes there are enough entries to wrap the > >>32 bit variable oldsize. > >> > >>Switching to use array index notation instead of calculating the > >>pointer address twice ;) would resolve this issue. The unneeded > >>local variable oldsize can be removed as well. > >> > Per your other comment I will add a bounds check after calculating numsegs: > if (numsegs < 0) > return -1; > > The description above will change to: > > Adding a bounds check (numsegs < 0) and switching to use array > index notation instead of calculating the pointer address twice ;) > would resolve this issue. The unneeded local variable oldsize > can be removed as well. Sounds good. Thanks, Rich. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Aug 26 17:27:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3737C7F37 for ; Wed, 26 Aug 2015 17:27:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 05E9B8F8037 for ; Wed, 26 Aug 2015 15:27:38 -0700 (PDT) X-ASG-Debug-ID: 1440628056-04bdf0239a87cc0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yoFKbWmtIyeCsLqV for ; Wed, 26 Aug 2015 15:27:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6391D63C77A5; Wed, 26 Aug 2015 17:27:36 -0500 (CDT) Message-ID: <55DE3D58.5090706@sandeen.net> Date: Wed, 26 Aug 2015 17:27:36 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Rich Johnston , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <55EDF3BA.60409@sgi.com> <20150826213746.GC3902@dastard> <55DE3651.5030803@sgi.com> <55DE3B7B.8010608@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH V2] xfsdump: prevent segfault in cb_add_inogrp In-Reply-To: <55DE3B7B.8010608@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440628056 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On 8/26/15 5:19 PM, Eric Sandeen wrote: > On 8/26/15 4:57 PM, Rich Johnston wrote: >> Dave, >> >> On 08/26/2015 04:37 PM, Dave Chinner wrote: >>> On Wed, Aug 26, 2015 at 12:36:42PM -0500, rjohnston@sgi.com wrote: >>>> The call to memset will segfault because the offset for the first >>>> parameter is done twice. We are using pointer math to do the >>>> calculation. >>>> The first time is when calculating oldsize, the size of i2gseg_t >>>> is accounted for. >>>> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); >>>> Then in the call to memset, oldsize is again multiplied by the size >>>> of i2gmap_t. >>>> memset(inomap.i2gmap + oldsize, ...) >>>> >>>> i2gmap holds the used inodes in each chunk. When there are 2^31 chunk >>>> entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). >>>> >>>> With 100s of millions of inodes there are enough entries to wrap the >>>> 32 bit variable oldsize. >>>> >>>> Switching to use array index notation instead of calculating the >>>> pointer address twice ;) would resolve this issue. The unneeded >>>> local variable oldsize can be removed as well. >>>> >> Per your other comment I will add a bounds check after calculating numsegs: >> if (numsegs < 0) >> return -1; > > probably fine, but probably not really necessary. > > numsegs = inomap.hnkmaplen * SEGPERHNK; > > hnkmaplen initializes as: > > inomap.hnkmaplen = (igrpcnt + SEGPERHNK - 1) / SEGPERHNK; > > From my prior email, if I was right, > >> so I guess that means that if we have more than 2^31 inode groups, >> i.e. 2^31 * 256 = 500 billion inodes, (int) igrpcnt could overflow. > > so unless you have > 500 billion inodes, it's not going to be a problem... sorry, then * SEGPERHNK (511), so overflow around 1 billion inodes. Yeah, ok, closer to a possibility, maybe worth being defensive after all. :) thanks, -Eric > I'd just focus on the single problem at hand (extending a pointer > to an array by number of bytes, not number of elements) and leave it > at that. > > -Eric > >> The description above will change to: >> >> Adding a bounds check (numsegs < 0) and switching to use array >> index notation instead of calculating the pointer address twice ;) >> would resolve this issue. The unneeded local variable oldsize >> can be removed as well. >> >>>> numsegs is used to calculate an array index, change it from a >>>> signed int (intgen_t) to an unsigned (uint32_t). >>> >> I will remove the above description and leave it as is (intgen_t) >>> Description does not match code: >>> >>>> - intgen_t numsegs; >>>> - intgen_t oldsize; >>>> + int32_t numsegs; >>> >>> It's still a signed int here. And, really, just a plain old "int" is >>> fine here. >>> >>> Cheers, >>> >>> Dave. >>> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From rjohnston@sgi.com Wed Aug 26 17:29:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E4DC77F37 for ; Wed, 26 Aug 2015 17:29:55 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA6038F8033 for ; Wed, 26 Aug 2015 15:29:55 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id 999A1700262B for ; Wed, 26 Aug 2015 17:29:55 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 6AAB760EDE2F0; Wed, 26 Aug 2015 17:29:55 -0500 (CDT) Message-ID: <77EDF3BA.60409@sgi.com> From: rjohnston@sgi.com To: xfs@oss.sgi.com Subject: [PATCH V3] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> In-Reply-To: <20150924193241.975348815@gulag1.americas.sgi.com> Content-Disposition: inline; filename=prevent-segfault-in-cb_add_inogrp-V3.patch Date: Wed, 26 Aug 2015 17:29:55 -0500 (CDT) The call to memset will segfault because the offset for the first parameter is done twice. We are using pointer math to do the calculation. The first time is when calculating oldsize, the size of i2gseg_t is accounted for. oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); Then in the call to memset, oldsize is again multiplied by the size of i2gmap_t. memset(inomap.i2gmap + oldsize, ...) i2gmap holds the used inodes in each chunk. When there are 2^31 chunk entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). With 100s of millions of inodes there are enough entries to wrap the 32 bit variable oldsize. Adding a bounds check (numsegs < 0) and switching to use array index notation instead of calculating the pointer address twice would resolve this issue. The unneeded local variable oldsize can be removed as well. --- V3: Per review comments: add a bounds check after calculating numsegs: if (numsegs < 0) return -1; Remove the description that does not match the code and leave numsegs as is (intgen_t) dump/inomap.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) Index: b/dump/inomap.c =================================================================== --- a/dump/inomap.c +++ b/dump/inomap.c @@ -1126,13 +1126,14 @@ cb_add_inogrp( void *arg1, intgen_t fsfd if (lastsegp->hnkoff == inomap.hnkmaplen) { intgen_t numsegs; - intgen_t oldsize; inomap.hnkmaplen++; inomap.hnkmap = (hnk_t *) realloc(inomap.hnkmap, inomap.hnkmaplen * HNKSZ); numsegs = inomap.hnkmaplen * SEGPERHNK; + if (numsegs < 0) + return -1; inomap.i2gmap = (i2gseg_t *) realloc(inomap.i2gmap, numsegs * sizeof(i2gseg_t)); @@ -1140,10 +1141,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd return -1; /* zero the new portion of the i2gmap */ - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); - - memset(inomap.i2gmap + oldsize, - 0, + memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, SEGPERHNK * sizeof(i2gseg_t)); } From rjohnston@sgi.com Wed Aug 26 17:53:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 446967F37 for ; Wed, 26 Aug 2015 17:53:59 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1485E304039 for ; Wed, 26 Aug 2015 15:53:59 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id D666F7002622 for ; Wed, 26 Aug 2015 17:53:58 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id B724160EDE2F0; Wed, 26 Aug 2015 17:53:58 -0500 (CDT) Subject: [PATCH] xfsrestore: fix fs uuid order check for incremental restores From: Rich Johnston To: Message-ID: <55D5FB95.1280108@sgi.com> References: <55D5DB95.1280108@sgi.com> In-Reply-To: <55D5DB95.1280108@sgi.com> Content-Disposition: inline; filename="fix-fs-uuid-order-check.patch" Date: Wed, 26 Aug 2015 17:53:58 -0500 (CDT) Restoring an incremental level 1 dump will fail with the following error if the fs uuid of the most recent level 0 dump in the inventory does not match level 1 dump we are restoring. xfsrestore: ERROR: selected dump not based on previously applied dump This can happen when you have multiple filesystems and you are restoring a level 1 or greater dump of filesystem FS1 but the most recent level 0 dump in the inventory was filesystem FS2 The fix is to ensure the fs uuid of the inventory entry and the dump to be restored match. Signed-off-by: Rich Johnston --- dump/content.c | 8 ++- inventory/inv_api.c | 108 ++++++++++++++++++++++++++++++-------------------- inventory/inv_mgr.c | 32 ++++++++++---- inventory/inv_priv.h | 7 +-- inventory/inventory.h | 5 ++ restore/content.c | 17 +++++-- 6 files changed, 113 insertions(+), 64 deletions(-) Index: b/dump/content.c =================================================================== --- a/dump/content.c +++ b/dump/content.c @@ -872,7 +872,7 @@ content_init( intgen_t argc, sameinterruptedpr = BOOL_FALSE; interruptedpr = BOOL_FALSE; - ok = inv_get_session_byuuid( &baseuuid, &sessp ); + ok = inv_get_session_byuuid( &fsid, &baseuuid, &sessp ); if ( ! ok ) { mlog( MLOG_NORMAL | MLOG_ERROR, _( "could not find specified base dump (%s) " @@ -983,7 +983,8 @@ content_init( intgen_t argc, "online inventory not available\n") ); return BOOL_FALSE; } - ok = inv_lastsession_level_lessthan( inv_idbt, + ok = inv_lastsession_level_lessthan( &fsid, + inv_idbt, ( u_char_t )sc_level, &sessp ); if ( ! ok ) { @@ -1022,7 +1023,8 @@ content_init( intgen_t argc, if ( inv_idbt != INV_TOKEN_NULL ) { /* REFERENCED */ bool_t ok1; - ok = inv_lastsession_level_equalto( inv_idbt, + ok = inv_lastsession_level_equalto( &fsid, + inv_idbt, ( u_char_t )sc_level, &sessp ); ok1 = inv_close( inv_idbt ); Index: b/inventory/inv_api.c =================================================================== --- a/inventory/inv_api.c +++ b/inventory/inv_api.c @@ -596,69 +596,78 @@ inv_free_session( /*----------------------------------------------------------------------*/ -/* inventory_lasttime_level_lessthan */ -/* */ -/* Given a token that refers to a file system, and a level, this returns*/ -/* the last time when a session of a lesser level was done. */ -/* */ -/* returns -1 on error. */ +/* inv_lasttime_level_lessthan */ +/* */ +/* Given a file system uuid, token that refers to a file system, and a */ +/* level, tm is populated with last time when a session of a lesser */ +/* level was done. */ +/* */ +/* Returns TRUE on success. */ /*----------------------------------------------------------------------*/ bool_t inv_lasttime_level_lessthan( - inv_idbtoken_t tok, - u_char level, - time32_t **tm ) + uuid_t *fsidp, + inv_idbtoken_t tok, + u_char level, + time32_t **tm ) { int rval; if ( tok != INV_TOKEN_NULL ) { - rval = search_invt( tok->d_invindex_fd, &level, (void **) tm, - (search_callback_t) tm_level_lessthan ); + rval = search_invt(fsidp, tok->d_invindex_fd, &level, + (void **) tm, + (search_callback_t) tm_level_lessthan); return ( rval < 0) ? BOOL_FALSE: BOOL_TRUE; } - return invmgr_query_all_sessions((void *) &level, /* in */ - (void **) tm, /* out */ + return invmgr_query_all_sessions(fsidp, /* fs uuid ptr*/ + (void *) &level, /* in */ + (void **) tm, /* out */ (search_callback_t) tm_level_lessthan); } - - - - /*----------------------------------------------------------------------*/ -/* */ -/* */ -/* */ +/* inv_lastsession_level_lessthan */ +/* */ +/* Given a file system uuid, token that refers to a file system, and a */ +/* level, ses is populated with a session of lesser than the level */ +/* passed in. */ +/* */ +/* Returns FALSE on an error, TRUE if not. If (*ses) is NULL, then the */ +/* search failed. */ /*----------------------------------------------------------------------*/ bool_t inv_lastsession_level_lessthan( - inv_idbtoken_t tok, + uuid_t *fsidp, + inv_idbtoken_t tok, u_char level, - inv_session_t **ses ) + inv_session_t **ses ) { int rval; if ( tok != INV_TOKEN_NULL ) { - rval = search_invt( tok->d_invindex_fd, &level, (void **) ses, - (search_callback_t) lastsess_level_lessthan ); + rval = search_invt(fsidp, tok->d_invindex_fd, &level, + (void **) ses, + (search_callback_t) lastsess_level_lessthan); return ( rval < 0) ? BOOL_FALSE: BOOL_TRUE; } - return invmgr_query_all_sessions((void *) &level, /* in */ + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) &level, /* in */ (void **) ses, /* out */ (search_callback_t) lastsess_level_lessthan); } - - - /*----------------------------------------------------------------------*/ -/* */ -/* */ +/* inv_lastsession_level_equalto */ +/* */ +/* Given a file system uuid, token that refers to a file system, and a */ +/* level, this populates ses with last time when a session of a lesser */ +/* level was done. */ +/* */ /* Return FALSE on an error, TRUE if not. If (*ses) is NULL, then the */ /* search failed. */ /*----------------------------------------------------------------------*/ @@ -666,19 +675,22 @@ inv_lastsession_level_lessthan( bool_t inv_lastsession_level_equalto( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, inv_session_t **ses ) { int rval; if ( tok != INV_TOKEN_NULL ) { - rval = search_invt( tok->d_invindex_fd, &level, (void **) ses, - (search_callback_t) lastsess_level_equalto ); + rval = search_invt(fsidp, tok->d_invindex_fd, &level, + (void **) ses, + (search_callback_t) lastsess_level_equalto); return ( rval < 0) ? BOOL_FALSE: BOOL_TRUE; } - return invmgr_query_all_sessions((void *) &level, /* in */ + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) &level, /* in */ (void **) ses, /* out */ (search_callback_t) lastsess_level_equalto); @@ -688,35 +700,45 @@ inv_lastsession_level_equalto( /*----------------------------------------------------------------------*/ /* inv_getsession_byuuid */ /* */ +/* Given a file system uuid and a session uuid , ses is populated with */ +/* the session that contains the matching system uuid. */ +/* */ +/* Returns FALSE on an error, TRUE if the session was found. */ /*----------------------------------------------------------------------*/ bool_t inv_get_session_byuuid( + uuid_t *fsidp, uuid_t *sesid, inv_session_t **ses) { - return (invmgr_query_all_sessions((void *)sesid, /* in */ - (void **) ses, /* out */ - (search_callback_t) stobj_getsession_byuuid)); + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) sesid, /* in */ + (void **) ses, /* out */ + (search_callback_t) stobj_getsession_byuuid); } - - /*----------------------------------------------------------------------*/ -/* inv_getsession_byuuid */ +/* inv_getsession_bylabel */ /* */ +/* Given a file system uuid and a session uuid, ses is populated with */ +/* the session that contains the matching system label. */ +/* */ +/* Returns FALSE on an error, TRUE if the session was found. */ /*----------------------------------------------------------------------*/ bool_t inv_get_session_bylabel( + uuid_t *fsidp, char *session_label, inv_session_t **ses) { - return (invmgr_query_all_sessions((void *)session_label, /* in */ - (void **) ses, /* out */ - (search_callback_t) stobj_getsession_bylabel)); + return invmgr_query_all_sessions(fsidp, /* fs uuid */ + (void *) session_label, /* in */ + (void **) ses, /* out */ + (search_callback_t) stobj_getsession_bylabel); } @@ -786,7 +808,7 @@ inv_delete_mediaobj( uuid_t *moid ) return BOOL_FALSE; } - if ( search_invt( invfd, NULL, (void **)&moid, + if ( search_invt( &arr[i].ft_uuid, invfd, NULL, (void **)&moid, (search_callback_t) stobj_delete_mobj ) < 0 ) return BOOL_FALSE; Index: b/inventory/inv_mgr.c =================================================================== --- a/inventory/inv_mgr.c +++ b/inventory/inv_mgr.c @@ -134,6 +134,7 @@ get_sesstoken( inv_idbtoken_t tok ) /*---------------------------------------------------------------------------*/ bool_t invmgr_query_all_sessions ( + uuid_t *fsidp, void *inarg, void **outarg, search_callback_t func) @@ -169,7 +170,7 @@ invmgr_query_all_sessions ( mlog( MLOG_NORMAL | MLOG_INV, _( "INV: Cant get inv-name for uuid\n") ); - return BOOL_FALSE; + continue; } strcat( fname, INV_INVINDEX_PREFIX ); invfd = open( fname, INV_OFLAG(forwhat) ); @@ -178,9 +179,9 @@ invmgr_query_all_sessions ( "INV: Open failed on %s\n"), fname ); - return BOOL_FALSE; + continue; } - result = search_invt( invfd, inarg, &objectfound, func ); + result = search_invt(fsidp, invfd, inarg, &objectfound, func); close(invfd); /* if error return BOOL_FALSE */ @@ -213,6 +214,7 @@ invmgr_query_all_sessions ( intgen_t search_invt( + uuid_t *fsidp, int invfd, void *arg, void **buf, @@ -247,7 +249,7 @@ search_invt( /* we need to get all the invindex headers and seshdrs in reverse order */ for (i = nindices - 1; i >= 0; i--) { - int nsess; + int nsess, j; invt_sescounter_t *scnt = NULL; invt_seshdr_t *harr = NULL; bool_t found; @@ -272,19 +274,31 @@ search_invt( } free ( scnt ); - while ( nsess ) { + for (j = nsess - 1; j >= 0; j--) { + invt_session_t ses; + /* fd is kept locked until we return from the callback routine */ /* Check to see if this session has been pruned * by xfsinvutil before checking it. */ - if ( harr[nsess - 1].sh_pruned ) { - --nsess; + if (harr[j].sh_pruned) { continue; } - found = (* do_chkcriteria ) ( fd, &harr[ --nsess ], - arg, buf ); + + /* if we need to check the fs uuid's and they don't + * match or we fail to get the session record, + * then keep looking + */ + if (fsidp && + (GET_REC_NOLOCK(fd, &ses, sizeof(invt_session_t), + harr[j].sh_sess_off) == + sizeof(invt_session_t)) && + uuid_compare(ses.s_fsid, *fsidp)) + continue ; + + found = (* do_chkcriteria ) (fd, &harr[j], arg, buf); if (! found ) continue; /* we found what we need; just return */ Index: b/inventory/inv_priv.h =================================================================== --- a/inventory/inv_priv.h +++ b/inventory/inv_priv.h @@ -548,11 +548,12 @@ get_headerinfo( int fd, void **hdrs, voi size_t hdrsz, size_t cntsz, bool_t doblock ); bool_t -invmgr_query_all_sessions (void *inarg, void **outarg, search_callback_t func); +invmgr_query_all_sessions(uuid_t *fsidp, void *inarg, void **outarg, + search_callback_t func); intgen_t -search_invt( int invfd, void *arg, void **buf, - search_callback_t do_chkcriteria ); +search_invt(uuid_t *fsidp, int invfd, void *arg, void **buf, + search_callback_t do_chkcriteria); intgen_t invmgr_inv_print( int invfd, invt_pr_ctx_t *prctx); Index: b/inventory/inventory.h =================================================================== --- a/inventory/inventory.h +++ b/inventory/inventory.h @@ -247,18 +247,21 @@ inv_put_mediafile( */ extern bool_t inv_lasttime_level_lessthan( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, time32_t **time );/* out */ extern bool_t inv_lastsession_level_lessthan( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, inv_session_t **ses );/* out */ extern bool_t inv_lastsession_level_equalto( + uuid_t *fsidp, inv_idbtoken_t tok, u_char level, inv_session_t **ses );/* out */ @@ -266,11 +269,13 @@ inv_lastsession_level_equalto( /* Given a uuid of a session, return the session structure.*/ extern bool_t inv_get_session_byuuid( + uuid_t *fsidp, uuid_t *sesid, inv_session_t **ses); extern bool_t inv_get_session_bylabel( + uuid_t *fsidp, char *session_label, inv_session_t **ses); Index: b/restore/content.c =================================================================== --- a/restore/content.c +++ b/restore/content.c @@ -2179,8 +2179,9 @@ content_stream_restore( ix_t thrdix ) if ( ! drivep->d_isnamedpipepr && ! drivep->d_isunnamedpipepr ) { - ok = inv_get_session_byuuid( &grhdrp->gh_dumpid, - &sessp ); + ok = inv_get_session_byuuid((uuid_t *)0, + &grhdrp->gh_dumpid, + &sessp); if ( ok && sessp ) { mlog( MLOG_VERBOSE, _( "using online session inventory\n") ); @@ -3736,9 +3737,11 @@ Inv_validate_cmdline( void ) ok = BOOL_FALSE; sessp = 0; if ( tranp->t_reqdumpidvalpr ) { - ok = inv_get_session_byuuid( &tranp->t_reqdumpid, &sessp ); + ok = inv_get_session_byuuid((uuid_t *)0, &tranp->t_reqdumpid, + &sessp ); } else if ( tranp->t_reqdumplabvalpr ) { - ok = inv_get_session_bylabel( tranp->t_reqdumplab, &sessp ); + ok = inv_get_session_bylabel((uuid_t *)0, tranp->t_reqdumplab, + &sessp ); } rok = BOOL_FALSE; if ( ok && sessp ) { @@ -6812,11 +6815,13 @@ askinvforbaseof( uuid_t baseid, inv_sess /* get the base session */ if ( resumedpr ) { - ok = inv_lastsession_level_equalto( invtok, + ok = inv_lastsession_level_equalto( &sessp->s_fsid, + invtok, ( u_char_t )level, &basesessp ); } else { - ok = inv_lastsession_level_lessthan( invtok, + ok = inv_lastsession_level_lessthan( &sessp->s_fsid, + invtok, ( u_char_t )level, &basesessp ); } From david@fromorbit.com Wed Aug 26 17:56:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 04F537F37 for ; Wed, 26 Aug 2015 17:56:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2FEC30405F for ; Wed, 26 Aug 2015 15:56:16 -0700 (PDT) X-ASG-Debug-ID: 1440629774-04bdf0239888540001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4iYVw4QwDnOS4WMs for ; Wed, 26 Aug 2015 15:56:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AhDAAoQ95V/0DvLHldgxuBPYJVpzMGilGREQQCAoE1TQEBAQEBAYELQQWDXgEBBDocIxAIAxgJJQ8FJQM0iC3JKwEBCAIgGYYMhTaFCgcXhBUFlTmMb4FNjSOIBoNrJoQRLDOCTQEBAQ Received: from ppp121-44-239-64.lns20.syd7.internode.on.net (HELO dastard) ([121.44.239.64]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2015 08:26:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZUjbt-0006sU-7T; Thu, 27 Aug 2015 08:56:01 +1000 Date: Thu, 27 Aug 2015 08:56:01 +1000 From: Dave Chinner To: rjohnston@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH V3] xfsdump: prevent segfault in cb_add_inogrp Message-ID: <20150826225601.GG3902@dastard> X-ASG-Orig-Subj: Re: [PATCH V3] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <77EDF3BA.60409@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <77EDF3BA.60409@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1440629774 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 26, 2015 at 05:29:55PM -0500, rjohnston@sgi.com wrote: > > The call to memset will segfault because the offset for the first > parameter is done twice. We are using pointer math to do the > calculation. > > The first time is when calculating oldsize, the size of i2gseg_t > is accounted for. > oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > Then in the call to memset, oldsize is again multiplied by the size > of i2gmap_t. > memset(inomap.i2gmap + oldsize, ...) > > i2gmap holds the used inodes in each chunk. When there are 2^31 chunk > entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). > > With 100s of millions of inodes there are enough entries to wrap the > 32 bit variable oldsize. > > Adding a bounds check (numsegs < 0) and switching to use array > index notation instead of calculating the pointer address twice > would resolve this issue. The unneeded local variable oldsize > can be removed as well. Can't believe I missed this first two times time through - the patch is missing your signed-off-by. Just reply with it, and I'll fix it up on commit. :) Thanks, Rich! Cheers, Dave. -- Dave Chinner david@fromorbit.com From rjohnston@sgi.com Wed Aug 26 17:58:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 25A8C7F37 for ; Wed, 26 Aug 2015 17:58:28 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0490D304039; Wed, 26 Aug 2015 15:58:27 -0700 (PDT) Received: from [134.15.0.245] (134.15.0.245) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.195.1; Wed, 26 Aug 2015 17:58:27 -0500 Message-ID: <55DE4492.90105@sgi.com> Date: Wed, 26 Aug 2015 17:58:26 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Dave Chinner CC: Subject: Re: [PATCH V3] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <77EDF3BA.60409@sgi.com> <20150826225601.GG3902@dastard> In-Reply-To: <20150826225601.GG3902@dastard> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [134.15.0.245] On 08/26/2015 05:56 PM, Dave Chinner wrote: > On Wed, Aug 26, 2015 at 05:29:55PM -0500, rjohnston@sgi.com wrote: >> >> The call to memset will segfault because the offset for the first >> parameter is done twice. We are using pointer math to do the >> calculation. >> >> The first time is when calculating oldsize, the size of i2gseg_t >> is accounted for. >> oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); >> Then in the call to memset, oldsize is again multiplied by the size >> of i2gmap_t. >> memset(inomap.i2gmap + oldsize, ...) >> >> i2gmap holds the used inodes in each chunk. When there are 2^31 chunk >> entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). >> >> With 100s of millions of inodes there are enough entries to wrap the >> 32 bit variable oldsize. >> >> Adding a bounds check (numsegs < 0) and switching to use array >> index notation instead of calculating the pointer address twice >> would resolve this issue. The unneeded local variable oldsize >> can be removed as well. > > Can't believe I missed this first two times time through - the patch > is missing your signed-off-by. Just reply with it, and I'll fix it > up on commit. :) Dooh my bad Signed-off-by: Rich Johnston > > Thanks, Rich! > > Cheers, > > Dave. > From sandeen@sandeen.net Wed Aug 26 18:00:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 853BF7F37 for ; Wed, 26 Aug 2015 18:00:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 578FF8F8033 for ; Wed, 26 Aug 2015 16:00:59 -0700 (PDT) X-ASG-Debug-ID: 1440630057-04bdf0239888710001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cYhH1irN6TF7QVGP for ; Wed, 26 Aug 2015 16:00:57 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F015A63C77A6; Wed, 26 Aug 2015 18:00:56 -0500 (CDT) Message-ID: <55DE4528.3080408@sandeen.net> Date: Wed, 26 Aug 2015 18:00:56 -0500 From: Eric Sandeen MIME-Version: 1.0 To: rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH V3] xfsdump: prevent segfault in cb_add_inogrp References: <20150924193241.975348815@gulag1.americas.sgi.com> <77EDF3BA.60409@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V3] xfsdump: prevent segfault in cb_add_inogrp In-Reply-To: <77EDF3BA.60409@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1440630057 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On 8/26/15 5:29 PM, rjohnston@sgi.com wrote: > The call to memset will segfault because the offset for the first > parameter is done twice. We are using pointer math to do the > calculation. > > The first time is when calculating oldsize, the size of i2gseg_t > is accounted for. > oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > Then in the call to memset, oldsize is again multiplied by the size > of i2gmap_t. > memset(inomap.i2gmap + oldsize, ...) > > i2gmap holds the used inodes in each chunk. When there are 2^31 chunk > entries, it could describe 2^31 (1 inode/chunk)- 2^40 (64 inodes/chunk). > > With 100s of millions of inodes there are enough entries to wrap the > 32 bit variable oldsize. > > Adding a bounds check (numsegs < 0) and switching to use array > index notation instead of calculating the pointer address twice > would resolve this issue. The unneeded local variable oldsize > can be removed as well. Reviewed-by: Eric Sandeen thanks, -Eric > --- > V3: > Per review comments: > add a bounds check after calculating numsegs: > if (numsegs < 0) > return -1; > > Remove the description that does not match the code and > leave numsegs as is (intgen_t) > > dump/inomap.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > Index: b/dump/inomap.c > =================================================================== > --- a/dump/inomap.c > +++ b/dump/inomap.c > @@ -1126,13 +1126,14 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > > if (lastsegp->hnkoff == inomap.hnkmaplen) { > intgen_t numsegs; > - intgen_t oldsize; > > inomap.hnkmaplen++; > inomap.hnkmap = (hnk_t *) > realloc(inomap.hnkmap, inomap.hnkmaplen * HNKSZ); > > numsegs = inomap.hnkmaplen * SEGPERHNK; > + if (numsegs < 0) > + return -1; > inomap.i2gmap = (i2gseg_t *) > realloc(inomap.i2gmap, numsegs * sizeof(i2gseg_t)); > > @@ -1140,10 +1141,7 @@ cb_add_inogrp( void *arg1, intgen_t fsfd > return -1; > > /* zero the new portion of the i2gmap */ > - oldsize = (numsegs - SEGPERHNK) * sizeof(i2gseg_t); > - > - memset(inomap.i2gmap + oldsize, > - 0, > + memset(&inomap.i2gmap[numsegs - SEGPERHNK], 0, > SEGPERHNK * sizeof(i2gseg_t)); > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From zorro.lang@gmail.com Wed Aug 26 22:35:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A75127F37 for ; Wed, 26 Aug 2015 22:35:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 43202AC006 for ; Wed, 26 Aug 2015 20:35:24 -0700 (PDT) X-ASG-Debug-ID: 1440646521-04bdf023978d3d0001-NocioJ Received: from mail-la0-f54.google.com (mail-la0-f54.google.com [209.85.215.54]) by cuda.sgi.com with ESMTP id eG897zvBHEAb7wWV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 26 Aug 2015 20:35:22 -0700 (PDT) X-Barracuda-Envelope-From: zorro.lang@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.54 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.54] Received: by labgv11 with SMTP id gv11so4003139lab.2 for ; Wed, 26 Aug 2015 20:35:20 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.54] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.54] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=13CUdXM6mDchEsb8ZPzsUxmJoWDXOYu0L/G5ZdrcUZs=; b=buTJfFW+TsoUsHOk62iHGk5DRPqI1KjMTFl/YvrbJ7Ydt1LjmvkLkEVaAB0bQgeUOs NWlkff5zL0c/popIXZiA60gsXYmyjS70ILH8taIiq7Xu8P5IHaGPJS3Mt+CbW17kiklA K5srCAjuSltBCvXEgzT7XSM8A8Zpo+FDP64bC+D5ZvDLRC/xotOj+MrqAvvPmybBokeM FIaLSVx0e6cE0Ql01QE/auHKKys8Xd9Fhey2rcEG5WqBvSryupUOQVCoftpg26c/x/TB rrgUDVlxr4ZP02cO7fgIQmaBR4hcsMS9OV6ZxsTfNivne2fxWmHPv3X01/VBUE0UWgY+ TKew== MIME-Version: 1.0 X-Received: by 10.112.144.69 with SMTP id sk5mr1385351lbb.6.1440646520821; Wed, 26 Aug 2015 20:35:20 -0700 (PDT) Received: by 10.114.83.34 with HTTP; Wed, 26 Aug 2015 20:35:20 -0700 (PDT) In-Reply-To: <20150813071524.GI17933@dhcp-13-216.nay.redhat.com> References: <1439449276-1699-1-git-send-email-eguan@redhat.com> <20150813071524.GI17933@dhcp-13-216.nay.redhat.com> Date: Thu, 27 Aug 2015 11:35:20 +0800 Message-ID: Subject: Re: [PATCH] repair: fix wrong logic when validating node magic number From: Zorro Lang X-ASG-Orig-Subj: Re: [PATCH] repair: fix wrong logic when validating node magic number To: Eryu Guan Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-la0-f54.google.com[209.85.215.54] X-Barracuda-Start-Time: 1440646522 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21962 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_MV0713 Custom rule MV0713 2015-08-13 15:15 GMT+08:00 Eryu Guan : > On Thu, Aug 13, 2015 at 03:01:16PM +0800, Eryu Guan wrote: >> Magic number is wrong only when != XFS_DA_NODE_MAGIC and >> != XFS_DA3_NODE_MAGIC. >> >> This is triggered by shared/002 when testing 512 block size XFS. >> >> Phase 1 - find and verify superblock... >> Phase 2 - using internal log >> - scan filesystem freespace and inode maps... >> - found root inode chunk >> Phase 3 - for each AG... >> - scan (but don't clear) agi unlinked lists... >> - process known inodes and perform inode discovery... >> - agno = 0 >> bad magic number febe in block 64 (108) for directory inode 35 >> ...... >> >> Fix it by changing "||" to "&&". >> >> Signed-off-by: Eryu Guan > > With this patch applied, shared/002 still fails on 512 block size XFS, This failure not only be reproduced on 512 block size XFS. When I increase the stress of shared/002, this bug can be reproduced on any block size XFS. For example, on my test machine, when I increase $num_attrs to 6000, this bug be reproduced on 1k block size xfs. When increased $num_attrs to 80k, this bug be reproduced on 4k block size xfs. So this's not a block size related bug. BTW, xfs_repair can repair this corruption. And from shared/002 output, we can see shared/002 use getfattr to sure all xattrs haven been wrote in device correctly. So this corruption maybe due to xfs log problems. Thanks, Zorro Lang > full xfs_repair -n output is > > *** xfs_repair -n output *** > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - scan filesystem freespace and inode maps... > - found root inode chunk > Phase 3 - for each AG... > - scan (but don't clear) agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > problem with attribute contents in inode 35 > would clear attr fork > bad nblocks 67 for inode 35, would reset to 0 > bad anextents 5 for inode 35, would reset to 0 > - agno = 1 > - agno = 2 > - agno = 3 > - process newly discovered inodes... > Phase 4 - check for duplicate blocks... > - setting up duplicate extent list... > - check for inodes claiming duplicate blocks... > - agno = 0 > - agno = 1 > - agno = 2 > - agno = 3 > No modify flag set, skipping phase 5 > Phase 6 - check inode connectivity... > - traversing filesystem ... > - traversal finished ... > - moving disconnected inodes to lost+found ... > Phase 7 - verify link counts... > No modify flag set, skipping filesystem flush and exiting. > *** end xfs_repair output > > And a simplified reproducer is just adding >= 577 xattrs to file foo on > 512 block size XFS, no dmflaky is needed. > > num_xattrs=577 > for ((i = 1; i <= $num_xattrs; i++)); do > name="user.attr_$(printf "%04d" $i)" > $SETFATTR_PROG -n $name -v "val_$(printf "%04d" $i)" $SCRATCH_MNT/foo > done > > And it's easily reproduced. > > Thanks, > Eryu > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jtulak@redhat.com Thu Aug 27 01:02:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E77C7F37 for ; Thu, 27 Aug 2015 01:02:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4009A8F8033 for ; Wed, 26 Aug 2015 23:02:31 -0700 (PDT) X-ASG-Debug-ID: 1440655346-04cb6c4a2989050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mUtdgyyG9DHpDLNC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 23:02:27 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 70B008C1AB; Thu, 27 Aug 2015 06:02:26 +0000 (UTC) Received: from jtulak-t430.brq.redhat.com (jtulak.brq.redhat.com [10.34.1.5]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7R62OD5012861; Thu, 27 Aug 2015 02:02:25 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: david@fromorbit.com, hch@infradead.org, Jan Tulak Subject: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Date: Thu, 27 Aug 2015 08:02:20 +0200 X-ASG-Orig-Subj: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Message-Id: <1440655340-27550-1-git-send-email-jtulak@redhat.com> In-Reply-To: <1440590555-20463-2-git-send-email-jtulak@redhat.com> References: <1440590555-20463-2-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440655347 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently, we depends on Linux XATTR values for on disk definitions. Which causes trouble on other platforms and maybe also if these values were to change. Fix it by creating a custom definition independent from those in Linux (although with the same values). Signed-off-by: Jan Tulak --- libhandle/handle.c | 6 ++++-- libhandle/jdm.c | 6 ++++-- libxfs/xfs_attr_remote.c | 2 +- libxfs/xfs_format.h | 11 ++++++++++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libhandle/handle.c b/libhandle/handle.c index b1c0c10..d532f44 100644 --- a/libhandle/handle.c +++ b/libhandle/handle.c @@ -21,6 +21,8 @@ #include "xfs.h" #include "handle.h" #include "parent.h" +#include "xfs/xfs_arch.h" +#include "xfs/xfs_format.h" /* just pick a value we know is more than big enough */ #define MAXHANSIZ 64 @@ -397,8 +399,8 @@ attr_list_by_handle( alhreq.buffer = buf; alhreq.buflen = bufsize; /* prevent needless EINVAL from the kernel */ - if (alhreq.buflen > XATTR_LIST_MAX) - alhreq.buflen = XATTR_LIST_MAX; + if (alhreq.buflen > XFS_XATTR_LIST_MAX) + alhreq.buflen = XFS_XATTR_LIST_MAX; error = xfsctl(path, fd, XFS_IOC_ATTRLIST_BY_HANDLE, &alhreq); diff --git a/libhandle/jdm.c b/libhandle/jdm.c index d804423..db7d1fe 100644 --- a/libhandle/jdm.c +++ b/libhandle/jdm.c @@ -21,6 +21,8 @@ #include "handle.h" #include "jdm.h" #include "parent.h" +#include "xfs/xfs_arch.h" +#include "xfs/xfs_format.h" /* internal fshandle - typecast to a void for external use */ #define FSHANDLE_SZ 8 @@ -168,8 +170,8 @@ jdm_attr_list( jdm_fshandle_t *fshp, int rval; /* prevent needless EINVAL from the kernel */ - if (bufsz > XATTR_LIST_MAX) - bufsz = XATTR_LIST_MAX; + if (bufsz > XFS_XATTR_LIST_MAX) + bufsz = XFS_XATTR_LIST_MAX; jdm_fill_filehandle( &filehandle, fshandlep, statp ); rval = attr_list_by_handle (( void * )&filehandle, diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index 5feaf55..98893e2 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -102,7 +102,7 @@ xfs_attr3_rmt_verify( if (be32_to_cpu(rmt->rm_bytes) > fsbsize - sizeof(*rmt)) return false; if (be32_to_cpu(rmt->rm_offset) + - be32_to_cpu(rmt->rm_bytes) > XATTR_SIZE_MAX) + be32_to_cpu(rmt->rm_bytes) > XFS_XATTR_SIZE_MAX) return false; if (rmt->rm_owner == 0) return false; diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index bb7cc04..2380084 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -60,6 +60,14 @@ struct xfs_ifork; #define XFS_SB_VERSION_MOREBITSBIT 0x8000 /* + * Avoid dependency on linux values of XATTR. + * It has to be on the beginning of this file, because we use these Values + * later in this header file. + */ +#define XFS_XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ +#define XFS_XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ + +/* * Supported feature bit list is just all bits in the versionnum field because * we've used them all up and understand them all. Except, of course, for the * shared superblock bit, which nobody knows what it does and so is unsupported. @@ -1483,7 +1491,7 @@ struct xfs_acl { */ #define XFS_ACL_MAX_ENTRIES(mp) \ (xfs_sb_version_hascrc(&mp->m_sb) \ - ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ + ? (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ sizeof(struct xfs_acl_entry) \ : 25) @@ -1497,4 +1505,5 @@ struct xfs_acl { #define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1) #define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1) + #endif /* __XFS_FORMAT_H__ */ -- 2.4.5 From jtulak@redhat.com Thu Aug 27 01:06:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D0F987F37 for ; Thu, 27 Aug 2015 01:06:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BEEBA8F8033 for ; Wed, 26 Aug 2015 23:06:26 -0700 (PDT) X-ASG-Debug-ID: 1440655585-04cb6c4a2989190001-NocioJ Received: from mail-ig0-f176.google.com (mail-ig0-f176.google.com [209.85.213.176]) by cuda.sgi.com with ESMTP id XE0poYVs5wec1CGU (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 26 Aug 2015 23:06:25 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com Received: by igcse8 with SMTP id se8so59466411igc.1 for ; Wed, 26 Aug 2015 23:06:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=Cmdk9jrBk2Hj2UwBsjXUIrzK4IOhA1/gQOxjo4CDiKE=; b=JZwY7eZYiYpuHTzlWAQ/LKnPuPJgXdLzFS4lIBaZ2lbWpr4dcRdMVwP4AJB4uEBHna IDL3iOJCEj4u9J57NshHF3ZV4WwEwDqgtKrtDIWrMYPAIHW++O6vb3dHuxmGX9yWOATD ykyGrKD4DxhanWbYuyyguq5LScTmAYAPdVYXZbFu+vjpPDmgDjj6P3D29WFyZBoC2SX7 pU/2dVBoZvmOhSzuWZYCs1WcO6cnBt5c7AcuHpQgOwj1pqnrBm8odjau+bVLpTJFzai1 U+6BVk8uiMh71d28tzjsvrpy7QOEzYPyad87kNBaUVGGsMmtUNV1bP6dC2tOh0sy+RNQ LY1w== X-Gm-Message-State: ALoCoQnu/9KaE7mrlhcnHvfWzqrpEBaKO/4BxGdHqMoFwgg2cekkOg+0lUFVQTVeHyaiqJZmU8r+ X-Received: by 10.50.112.227 with SMTP id it3mr2657537igb.93.1440655585014; Wed, 26 Aug 2015 23:06:25 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.64.75 with HTTP; Wed, 26 Aug 2015 23:06:05 -0700 (PDT) In-Reply-To: <20150826220122.GD3902@dastard> References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-2-git-send-email-jtulak@redhat.com> <20150826220122.GD3902@dastard> From: Jan Tulak Date: Thu, 27 Aug 2015 08:06:05 +0200 Message-ID: Subject: Re: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Cc: xfs-oss , Christoph Hellwig Content-Type: multipart/alternative; boundary=089e0102f83e639adb051e44c428 X-Barracuda-Connect: mail-ig0-f176.google.com[209.85.213.176] X-Barracuda-Start-Time: 1440655585 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21964 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e0102f83e639adb051e44c428 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Thu, Aug 27, 2015 at 12:01 AM, Dave Chinner wrote: > On Wed, Aug 26, 2015 at 02:02:26PM +0200, Jan Tulak wrote: > > Signed-off-by: Jan Tulak > > Explanation of the change? > Submitted. And sorry, I realized I didn't add v2 to the patch the moment I sent it. =E2=80=8B =E2=80=8B :-( Though only the commit message is changed. =E2=80=8BCheers, Jan=E2=80=8B -- Jan Tulak jtulak@redhat.com / jan@tulak.me --089e0102f83e639adb051e44c428 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


On Thu, Aug 27, 2015 at 12:01 AM, Dave Chinner <david@fromo= rbit.com> wrote:
On Wed, = Aug 26, 2015 at 02:02:26PM +0200, Jan Tulak wrote:
> Signed-off-by: Jan Tulak <jtulak@redhat.com>

Explanation of the change?

Submitted. And sorry, I real= ized I didn't add v2 to the patch the moment
I sent it.
=E2=80=8B =E2=80=8B
:-( Though only the commit message is changed= .

= =E2=80=8BCheers,
Jan=E2=80=8B

--
--089e0102f83e639adb051e44c428-- From eguan@redhat.com Thu Aug 27 01:09:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0B3147F37 for ; Thu, 27 Aug 2015 01:09:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F0C24304039 for ; Wed, 26 Aug 2015 23:09:47 -0700 (PDT) X-ASG-Debug-ID: 1440655786-04cbb07cbe98f80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LlMeiD694U5bEEXG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Aug 2015 23:09:47 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 78AD4C15CA80; Thu, 27 Aug 2015 06:09:46 +0000 (UTC) Received: from localhost (dhcp12-142.nay.redhat.com [10.66.12.142] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7R69iSN026559; Thu, 27 Aug 2015 02:09:45 -0400 Date: Thu, 27 Aug 2015 14:09:44 +0800 From: Eryu Guan To: Dave Chinner Cc: David Jeffery , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: return errors from partial I/O failures to files Message-ID: <20150827060943.GX17933@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: return errors from partial I/O failures to files References: <20150826190636.GA16540@rage.redhat.com> <20150826221951.GE3902@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150826221951.GE3902@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440655786 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 27, 2015 at 08:19:52AM +1000, Dave Chinner wrote: > On Wed, Aug 26, 2015 at 03:06:36PM -0400, David Jeffery wrote: > > There is an issue with xfs's error reporting in some cases of I/O partially > > failing and partially succeeding. Calls like fsync() can report success even > > though not all I/O was successful. > > Hi David, > > I read your bug report last night and after considering all the work > you put into it, I was going to ask if you wanted to finish off the > job by writing the patch to fix it. But you beat me to it. > > Nice work! :) > > > The issue can occur when there are multiple bio per xfs_ioend struct. > > Each call to xfs_end_bio() for a bio completing will write a value to > > ioend->io_error. If a successful bio completes after any failed bio, no > > error is reported do to it writing 0 over the error code set by any failed bio. > > The I/O error information is now lost and when the ioend is completed > > only success is reported back up the filesystem stack. > > It's worth mentioning the case that this was seen in - a single > failed disk in a raid 0 stripe, and the error from the bio to the > failed disk was overwritten by the successes from the bios to the > other disks. > > FWIW, I think that we also need to create an xfstest for this case, > too, because it's clear that this is a big hole in our test coverage > (i.e. partial block device failure). It might be best to talk to > Eryu (cc'd) to get your reproducer converted into a xfstest case > that we can then test all filesystems against? Sure, I'll look into the reproducer and work on a fstests case. Thanks, Eryu From djeffery@redhat.com Thu Aug 27 08:41:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8DFDD29DF5 for ; Thu, 27 Aug 2015 08:41:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28D89AC008 for ; Thu, 27 Aug 2015 06:41:55 -0700 (PDT) X-ASG-Debug-ID: 1440682913-04bdf02397a5af0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gbH3wHBELGEN535E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Aug 2015 06:41:54 -0700 (PDT) X-Barracuda-Envelope-From: djeffery@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 98340C1C49F7; Thu, 27 Aug 2015 13:41:53 +0000 (UTC) Received: from [10.10.55.85] (vpn-55-85.rdu2.redhat.com [10.10.55.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7RDfqY4030481; Thu, 27 Aug 2015 09:41:53 -0400 Message-ID: <55DF13A0.1090706@redhat.com> Date: Thu, 27 Aug 2015 09:41:52 -0400 From: David Jeffery User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: return errors from partial I/O failures to files References: <20150826190636.GA16540@rage.redhat.com> <20150826221951.GE3902@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: return errors from partial I/O failures to files In-Reply-To: <20150826221951.GE3902@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440682914 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/26/2015 06:19 PM, Dave Chinner wrote: > On Wed, Aug 26, 2015 at 03:06:36PM -0400, David Jeffery wrote: >> There is an issue with xfs's error reporting in some cases of I/O partially >> failing and partially succeeding. Calls like fsync() can report success even >> though not all I/O was successful. > > Hi David, > > I read your bug report last night and after considering all the work > you put into it, I was going to ask if you wanted to finish off the > job by writing the patch to fix it. But you beat me to it. > > Nice work! :) > >> The issue can occur when there are multiple bio per xfs_ioend struct. >> Each call to xfs_end_bio() for a bio completing will write a value to >> ioend->io_error. If a successful bio completes after any failed bio, no >> error is reported do to it writing 0 over the error code set by any failed bio. >> The I/O error information is now lost and when the ioend is completed >> only success is reported back up the filesystem stack. > > It's worth mentioning the case that this was seen in - a single > failed disk in a raid 0 stripe, and the error from the bio to the > failed disk was overwritten by the successes from the bios to the > other disks. > > FWIW, I think that we also need to create an xfstest for this case, > too, because it's clear that this is a big hole in our test coverage > (i.e. partial block device failure). It might be best to talk to > Eryu (cc'd) to get your reproducer converted into a xfstest case > that we can then test all filesystems against? > >> xfs_end_bio() should only set ioend->io_error in the case of BIO_UPTODATE >> being clear. ioend->io_error is initialized to 0 at allocation so only needs >> to be updated by any failed bio structs. This ensures an error can be reported >> to the application. >> >> Signed-off-by: David Jeffery >> --- > > Best to add a "cc: " so that it gets pushed > back to all the stable kernels automatically which it hits Linus' > tree. > > One minor change to the fix: > >> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c >> index 3859f5e..b82b128 100644 >> --- a/fs/xfs/xfs_aops.c >> +++ b/fs/xfs/xfs_aops.c >> @@ -356,7 +356,8 @@ xfs_end_bio( >> { >> xfs_ioend_t *ioend = bio->bi_private; >> >> - ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; >> + if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) >> + ioend->io_error = error; > > We should preserve the original error that was reported, rather than > report the last one. ioend->io_error is always initialised to zero, > so we can simply do: Is there a particular reason to prefer the first error? Is it just standard practice? I originally made a version which preserved the first error but couldn't think of a reason why the first or last would be best. So I went with the patch which has the simpler if statement. > > if (!ioend->io_error && !test_bit(BIO_UPTODATE, &bio->bi_flags)) > ioend->io_error = error; > > Can you update the patch and resend it? I've got a couple of other > fixes that I need to push to the for-next tree in the next couple of > days (i.e. before the 4.3. merge window opens) and I'd like to get > this one in as well. > > Cheers, > > Dave > I'll get a new version sent. David Jeffery From djeffery@redhat.com Thu Aug 27 13:02:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 07E7B29DF5 for ; Thu, 27 Aug 2015 13:02:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 956ACAC008 for ; Thu, 27 Aug 2015 11:02:04 -0700 (PDT) X-ASG-Debug-ID: 1440698523-04cbb07cbdc3490001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id p6dlecQbwzFXD3QK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Aug 2015 11:02:03 -0700 (PDT) X-Barracuda-Envelope-From: djeffery@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 380FA8E764 for ; Thu, 27 Aug 2015 18:02:03 +0000 (UTC) Received: from rage.redhat.com (vpn-55-85.rdu2.redhat.com [10.10.55.85]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7RI21oe018244 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 27 Aug 2015 14:02:02 -0400 Date: Thu, 27 Aug 2015 14:02:01 -0400 From: David Jeffery To: xfs@oss.sgi.com Subject: [PATCH v2] xfs: return errors from partial I/O failures to files Message-ID: <20150827180201.GA19633@rage.redhat.com> X-ASG-Orig-Subj: [PATCH v2] xfs: return errors from partial I/O failures to files MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440698523 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There is an issue with xfs's error reporting in some cases of I/O partially failing and partially succeeding. Calls like fsync() can report success even though not all I/O was successful in partial-failure cases such as one disk of a RAID0 array being offline. The issue can occur when there are more than one bio per xfs_ioend struct. Each call to xfs_end_bio() for a bio completing will write a value to ioend->io_error. If a successful bio completes after any failed bio, no error is reported do to it writing 0 over the error code set by any failed bio. The I/O error information is now lost and when the ioend is completed only success is reported back up the filesystem stack. xfs_end_bio() should only set ioend->io_error in the case of BIO_UPTODATE being clear. ioend->io_error is initialized to 0 at allocation so only needs to be updated by a failed bio. Also check that ioend->io_error is 0 so that the first error reported will be the error code returned. Signed-off-by: David Jeffery Cc: stable@vger.kernel.org --- diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 3859f5e..458fced 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -356,7 +356,8 @@ xfs_end_bio( { xfs_ioend_t *ioend = bio->bi_private; - ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; + if (!ioend->io_error && !test_bit(BIO_UPTODATE, &bio->bi_flags)) + ioend->io_error = error; /* Toss bio and pass work off to an xfsdatad thread */ bio->bi_private = NULL; From rjohnston@sgi.com Thu Aug 27 13:54:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E398F29DF5 for ; Thu, 27 Aug 2015 13:54:48 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id C78B5304062 for ; Thu, 27 Aug 2015 11:54:45 -0700 (PDT) Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by estes.americas.sgi.com (Postfix) with ESMTP id 9594970030FB for ; Thu, 27 Aug 2015 13:54:45 -0500 (CDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48222) id 6E13960EDE2F0; Thu, 27 Aug 2015 13:54:45 -0500 (CDT) Subject: xfsrestore: fix 2GB directory dump limitation for multi-stream From: Rich Johnston To: xfs@oss.sgi.com Content-Disposition: inline; filename=fix-2GB-directory-dump-limitation-for-multi-stream.patch Message-Id: <20150827185445.6E13960EDE2F0@gulag1.americas.sgi.com> Date: Thu, 27 Aug 2015 13:54:45 -0500 (CDT) The drive_simple restore path has a 2GB directory limit. Instead of ASSERTing if nreadneeded64 is greater than INTGENMAX (2GB), add a loop to handle it. Signed-off-by: Rich Johnston --- common/drive_simple.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) Index: b/common/drive_simple.c =================================================================== --- a/common/drive_simple.c +++ b/common/drive_simple.c @@ -765,18 +765,20 @@ do_seek_mark( drive_t *drivep, drive_mar /* use read_buf util func to eat up difference */ nreadneeded64 = mark - strmoff; - ASSERT( nreadneeded64 <= INTGENMAX ); - nreadneeded = ( intgen_t )nreadneeded64; - nread = read_buf( 0, - ( size_t )nreadneeded, - ( void * )drivep, - ( rfp_t )drivep->d_opsp->do_read, - ( rrbfp_t )drivep->d_opsp->do_return_read_buf, - &rval ); - if ( rval ) { - return rval; + while ( nreadneeded64 > 0 ) { + if ( nreadneeded64 > INTGENMAX ) + nreadneeded = INTGENMAX; + else + nreadneeded = ( intgen_t )nreadneeded64; + nread = read_buf( 0, nreadneeded, drivep, + ( rfp_t )drivep->d_opsp->do_read, + ( rrbfp_t )drivep->d_opsp->do_return_read_buf, + &rval ); + if ( rval ) { + return rval; + } + nreadneeded64 -= nread; } - ASSERT( nread == nreadneeded ); /* verify we are on the mark */ From dev@lynxeye.de Thu Aug 27 14:04:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 67B8729DF5 for ; Thu, 27 Aug 2015 14:04:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 48F7A30405F for ; Thu, 27 Aug 2015 12:04:30 -0700 (PDT) X-ASG-Debug-ID: 1440702266-04cb6c4a2ab4ac0001-NocioJ Received: from lynxeye.de (ns.lynxeye.de [87.118.118.114]) by cuda.sgi.com with ESMTP id 6kEHQrNa91eKdD4F for ; Thu, 27 Aug 2015 12:04:27 -0700 (PDT) X-Barracuda-Envelope-From: dev@lynxeye.de X-Barracuda-Apparent-Source-IP: 87.118.118.114 Received: by lynxeye.de (Postfix, from userid 501) id 4000326C2001; Thu, 27 Aug 2015 21:04:26 +0200 (CEST) Received: from antimon.intern.lynxeye.de (p57B5E453.dip0.t-ipconnect.de [87.181.228.83]) by lynxeye.de (Postfix) with ESMTPA id 6A45426C2001; Thu, 27 Aug 2015 21:04:25 +0200 (CEST) From: Lucas Stach To: Dave Chinner Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: add mssing inode cache attempts counter increment Date: Thu, 27 Aug 2015 21:04:21 +0200 X-ASG-Orig-Subj: [PATCH] xfs: add mssing inode cache attempts counter increment Message-Id: <1440702261-3018-1-git-send-email-dev@lynxeye.de> X-Mailer: git-send-email 2.4.3 X-Barracuda-Connect: ns.lynxeye.de[87.118.118.114] X-Barracuda-Start-Time: 1440702267 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21981 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Increasing the inode cache attempt counter was apparently dropped while refactoring the cache code and so stayed at the initial 0 value. Add the increment back to make the runtime stats more useful. Signed-off-by: Lucas Stach --- fs/xfs/xfs_icache.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 76a9f27..0a326bd 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -412,6 +412,8 @@ xfs_iget( if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) return -EINVAL; + XFS_STATS_INC(xs_ig_attempts); + /* get the perag structure and ensure that it's inode capable */ pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); agino = XFS_INO_TO_AGINO(mp, ino); -- 2.4.3 From mqrt@mick.com Thu Aug 27 14:33:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D73E29DF5 for ; Thu, 27 Aug 2015 14:33:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4BC8B304062 for ; Thu, 27 Aug 2015 12:33:22 -0700 (PDT) X-ASG-Debug-ID: 1440703998-04cbb07cbcca680001-NocioJ Received: from mick.com ([114.96.64.94]) by cuda.sgi.com with ESMTP id 6B5akLLkkThDwoQU for ; Thu, 27 Aug 2015 12:33:19 -0700 (PDT) X-Barracuda-Envelope-From: mqrt@mick.com X-Barracuda-Apparent-Source-IP: 114.96.64.94 Received: from SKY-20150201SFT ([127.0.0.1]) by localhost via TCP with ESMTPA; Fri, 28 Aug 2015 03:33:11 +0800 MIME-Version: 1.0 From: Ivy Sender: Ivy To: xfs@oss.sgi.com Reply-To: Ivy Date: 28 Aug 2015 03:33:11 +0800 Subject: =?utf-8?B?UmU6IFBDQiBhbmQgUENCQSBtYW51ZmFjdHVyZXI=?= Content-Type: text/html; charset=utf-8 X-ASG-Orig-Subj: =?utf-8?B?UmU6IFBDQiBhbmQgUENCQSBtYW51ZmFjdHVyZXI=?= Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[114.96.64.94] X-Barracuda-Start-Time: 1440703999 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21984 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150827193322.15DD3106C922@cuda.sgi.com> PGh0bWw+PGJvZHk+PFA+PEJSPkhlbGxvLDwvUD4NCjxQPldlIGFyZSBhIHByb2Zlc3Npb25h bCBwcm90b3R5cGUgUENCICZhbXA7IFBDQkEgbWFudWZhY3R1cmVyIGluIENoaW5hIGZvciAx MCB5ZWFycywgd2Ugc3BlY2lhbGl6ZSBpbiBQQ0IsMS0xMiBsYXllcnMsIGluY2x1ZGluZyZu YnNwOyBQQ0JBIHdpdGggaGlnaCBxdWFsaXR5IGFuZCBjb21wZXRpdGl2ZSBwcmljZS4gPC9Q Pg0KPFA+SWYgeW91IGFyZSBsb29raW5nIGZvciBQQ0JzIG9yIFBDQkEgc3VwcGxpZXIsIGl0 IGlzIG15IGdyZWF0IGhvbm9yIHRvIGJlIHlvdXImbmJzcDsgc3VwcGxpZXJzLjwvUD4NCjxQ PkkgaG9wZSB0byBnZXQgY2hhbmNlIHRvIGNvbXBldGUgd2l0aCB0aGVtIGFuZCBoZWxwIHlv dSByZWR1Y2UgcHVyY2hhc2UgY29zdCBhbmQgY3JlYXRlIHByb2ZpdCBmb3IgeW91LiB0aGFu a3MhPEJSPiZuYnNwOzxCUj5CZXN0IHJlZ2FyZHMhPEJSPkl2eTwvUD4NCjxQPlRlbDorODYt NzU1LTI5NDcyOTk1PEJSPkZheDorODYtNzU1Mjk0NzI5OTA8L1A+DQo8UD48QlI+Jm5ic3A7 PC9QPjwvYm9keT48L2h0bWw+ From sandeen@redhat.com Thu Aug 27 16:27:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1053E29DF5 for ; Thu, 27 Aug 2015 16:27:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5EDC30404E for ; Thu, 27 Aug 2015 14:27:28 -0700 (PDT) X-ASG-Debug-ID: 1440710844-04cbb07cbbd0dd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wcI9323n8xtDk2jA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Aug 2015 14:27:24 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 0D1828C1AC for ; Thu, 27 Aug 2015 21:27:24 +0000 (UTC) Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7RLRMvb010685 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 27 Aug 2015 17:27:23 -0400 Message-ID: <55DF80BA.9020101@redhat.com> Date: Thu, 27 Aug 2015 16:27:22 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: fix error gotos in xfs_setattr_nonsize Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs: fix error gotos in xfs_setattr_nonsize Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440710844 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 As the code stands today, if xfs_trans_reserve() fails, we goto out_dqrele, which does not free the allocated transaction. Fix up the goto targets to undo everything properly. Addresses-Coverity-Id: 145571 Signed-off-by: Eric Sandeen --- Full disclosure: build tested only, as these are error paths which we don't easily fail... diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 766b23f..8294132 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -609,7 +609,7 @@ xfs_setattr_nonsize( tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); if (error) - goto out_dqrele; + goto out_trans_cancel; xfs_ilock(ip, XFS_ILOCK_EXCL); @@ -640,7 +640,7 @@ xfs_setattr_nonsize( NULL, capable(CAP_FOWNER) ? XFS_QMOPT_FORCE_RES : 0); if (error) /* out of quota */ - goto out_trans_cancel; + goto out_unlock; } } @@ -729,10 +729,10 @@ xfs_setattr_nonsize( return 0; +out_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); out_trans_cancel: xfs_trans_cancel(tp); - xfs_iunlock(ip, XFS_ILOCK_EXCL); -out_dqrele: xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); return error; From david@fromorbit.com Thu Aug 27 19:21:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2B76F29DF5 for ; Thu, 27 Aug 2015 19:21:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A43C304043 for ; Thu, 27 Aug 2015 17:21:55 -0700 (PDT) X-ASG-Debug-ID: 1440721311-04cb6c4a2ac41e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jIeyJmb759RUhSro for ; Thu, 27 Aug 2015 17:21:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BzDwBMqN9VPAUaLHlegxuBPYZRozIBAQEGilSREgQCAoE+TQEBAQEBAQcBAQEBQT9BBYNeAQEEJxMcIxAIAw4KCSUPBSUDBxoTiC3GJgEBAQEGAgEfGYYOhTqFCweDGIEUBZU9jHCaZIQ3LDOCTQEBAQ Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2015 09:50:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZV7PA-00019Q-MR; Fri, 28 Aug 2015 10:20:28 +1000 Date: Fri, 28 Aug 2015 10:20:28 +1000 From: Dave Chinner To: David Jeffery Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: return errors from partial I/O failures to files Message-ID: <20150828002028.GA26895@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: return errors from partial I/O failures to files References: <20150826190636.GA16540@rage.redhat.com> <20150826221951.GE3902@dastard> <55DF13A0.1090706@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DF13A0.1090706@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1440721311 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21991 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 27, 2015 at 09:41:52AM -0400, David Jeffery wrote: > On 08/26/2015 06:19 PM, Dave Chinner wrote: > >> index 3859f5e..b82b128 100644 > >> --- a/fs/xfs/xfs_aops.c > >> +++ b/fs/xfs/xfs_aops.c > >> @@ -356,7 +356,8 @@ xfs_end_bio( > >> { > >> xfs_ioend_t *ioend = bio->bi_private; > >> > >> - ioend->io_error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : error; > >> + if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) > >> + ioend->io_error = error; > > > > We should preserve the original error that was reported, rather than > > report the last one. ioend->io_error is always initialised to zero, > > so we can simply do: > > Is there a particular reason to prefer the first error? Is it just > standard practice? I originally made a version which preserved the > first error but couldn't think of a reason why the first or last would > be best. So I went with the patch which has the simpler if statement. Standard practice in XFS - it's the first error that matters in most cases. Subsequent errors are usually less meaningful as they are either a result of the first error (i.e. cascading hardware errors), tainted by the first error (e.g. first IO completion error shuts down the fs, second IO completion error caused by the detection of a shut down filesystem) or just unrelated noise.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Thu Aug 27 20:23:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8273B29DF5 for ; Thu, 27 Aug 2015 20:23:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEE8DAC004 for ; Thu, 27 Aug 2015 18:23:52 -0700 (PDT) X-ASG-Debug-ID: 1440725028-04cbb07cbbdb7e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bAQ5AQD9OCGkvrXG for ; Thu, 27 Aug 2015 18:23:48 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BaCgCJt99VPAUaLHlegxuBPYZRozMBAQEGnS1NAQEBAQEBBwEBAQFAAT+EUS8eBRgYagMHLYgtxk6GJ454BYcqjhOOPYdQhROEAIg0gXABCzkcgWYsM4JNAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2015 10:53:11 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1ZV8Nq-0001Fh-Ky; Fri, 28 Aug 2015 11:23:10 +1000 Received: from dave by disappointment with local (Exim 4.86) (envelope-from ) id 1ZV8Nq-0006X3-Jv; Fri, 28 Aug 2015 11:23:10 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: sage@redhat.com Subject: [PATCH] xfs: timestamp updates cause excessive fdatasync log traffic Date: Fri, 28 Aug 2015 11:23:10 +1000 X-ASG-Orig-Subj: [PATCH] xfs: timestamp updates cause excessive fdatasync log traffic Message-Id: <1440724990-25073-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.5.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1440725028 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Sage Weil reported that a ceph test workload was writing to the log on every fdatasync during an overwrite workload. Event tracing showed that the only metadata modification being made was the timestamp updates during the write(2) syscall, but fdatasync(2) is supposed to ignore them. The key observation was that the transactions in the log all looked like this: INODE: #regs: 4 ino: 0x8b flags: 0x45 dsize: 32 And contained a flags field of 0x45 or 0x85, and had data and attribute forks following the inode core. This means that the timestamp updates were triggering dirty relogging of previously logged parts of the inode that hadn't yet been flushed back to disk. This is caused by xfs_trans_log_inode(), where it folds the dirty fields that have previously been logged back into the current transaction dirty fields from the inode item ili_last_fields. The issue is that ili_last_fields only contains a non-zero value when the inode is in the process of being flushed. The typical state progression is this, using a core field update as the modification occuring: state ili_fields ili_last_fields clean 0 0 modified, logged XFS_ILOG_CORE 0 flushed to buffer 0 XFS_ILOG_CORE buffer IO done (clean) 0 0 However, if we run a new transaction after it has been flushed to buffer but before the buffer IO is done, we don't know if the modifications in the inode buffer (i.e. what is in ili_last_fields) will reach the disk before the new transaction reaches the log. Hence to keep transactional ordering correct in recovery, we need to ensure the new transaction re-logs the modifications that are being flushed to disk. By relogging, we ensure that if the transaction makes it to disk and the buffer doesn't, then recovery replays all the changes upto that point correctly. If the transaction does not make it disk, but the buffer does, then recovery will see that the inode on disk is more recent than in the log and won't overwrite it with changes that it already contains. The upshot of this is that while the inode buffer sits in memory with the inode in the "flushed" state, fdatasync is going to see the relogged state in the ili_fields. i.e: What is happening here is this: state ili_fields ili_last_fields clean 0 0 modified, logged CORE 0 flushed to buffer 0 CORE timestamp update TIMESTAMP CORE CORE|TIMESTAMP CORE sees field other than TIMESTAMP in ili_fields, triggers xfs_log_force_lsn to flush inode buffer IO done (clean) CORE|TIMESTAMP 0 ..... timestamp update CORE|TIMESTAMP 0 sees field other than TIMESTAMP in ili_fields, triggers xfs_log_force_lsn to flush inode ..... timestamp update CORE|TIMESTAMP 0 sees field other than TIMESTAMP in ili_fields, triggers xfs_log_force_lsn to flush inode So, essentially, once a race condition on the buffer flush has occurred, the condition is not cleared until the inode is flushed to the buffer again and it is written without racing against the inode being dirtied again. The behaviour we really want here is to capture the timestamp update transactionally, but not trigger fdatasync because of the relogged fields that haven't been modified since the inode was flushed to the buffer. We still need to relog them, but we don't need to force the log in the fdatasync case. To do this, don't fold the ili_last_fields value into ili_fields when logging the inode. Instead, fold it into the fields that get logged during formatting of the inode item. This means that we will stop logging those fields the moment we know that there is a more recent version of the inode on disk than we have in the log and so we don't need to log those fields anymore as the next transaction on disk doesn't need to replay them. Doing this separates changes that are in memory but are not being flushed from those that have been flushed. Hence we can now look at ili_fields and hence see what fields have been modified since the last flush, and hence whether fdatasync needs to force the log or not. If non-timestamp changes have been made since the inode was flushed to the backing buffer, then fdatasync will do exactly the right thing (i.e. force the log). Reported-by: Sage Weil Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode_item.c | 161 ++++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_inode_item.h | 1 + 2 files changed, 115 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 62bd80f..be04eb2 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -29,6 +29,63 @@ #include "xfs_trans_priv.h" #include "xfs_log.h" +/* + * Notes on ili_fields, ili_format_fields and ili_last_fields. + * + * ili_fields contains the flags that reflect the current changes that are in + * memory and have been logged, but have not been flushed to the backing buffer + * for writeback yet. When a transaction is done, the fields that are modified + * are added to ili_fields and all those fields are logged. This results in + * repeated transactions correctly relogging all the other changes in memory and + * allows the inode to be re-ordered (moved forward) in the AIL safely. + * ili_fields is copied to ili_last_fields when the inode is flushed to the + * backing buffer and is then cleared, indicating that the inode in memory is + * now clean from a transactional change point of view and does not need to + * relog those fields anymore on tranaction commit. + * + * ili_last_fields, therefore, is only set while there is an unresolved inode + * flush being done (i.e. flush lock is held). We need to keep this state + * available to avoid a transaction recovery vs inode buffer IO completion race + * if we crash. If the inode is logged again makes it to disk before the inode + * buffer IO complete, log recovery will replay the latest inode transaction and + * can lose the changes that were in the inode buffer. Hence we still need to + * log the changes that have been flushed so that transactions issued during the + * inode buffer write still contain the modifications being flushed. Once the + * inode buffer IO completes, we no longer need to log those changes as the + * inode on disk the same as the inode in memory apart from the changes made + * since the inode was flushed (i.e. those recorded in ili_fields). + * + * ili_format_fields is only used during transaction commit. It is the + * aggregation of ili_fields and ili_last_fields, as sampled during the sizing + * of the inode item to be logged. We need this field definition to be constant + * between sizing and formatting, but inode buffer IO can complete + * asynchronously with transaction commit and so we must only read it once so + * that the different stages of the item formatting work correctly. We don't + * care about the async completion clearing ili_last_fields after we've sampled + * it - if we log too much then so be it - we won't log it next time. Once we've + * formatted the inode item, we need to propagate the ili_format_fields value to + * the on-disk inode log item format field, and then use it to clear all the + * fields that we marked for logging but were not dirty from ili_fields. + * + * This separation of changes allows us to accurately determine what fields in + * the inode have changed since it was last flushed to disk. This is important + * for fdatasync() performance as there are certain fields that, if modified, + * should not trigger log forces because they contain metadata that fdatasync() + * does not need to guarantee is safe on disk. This is, currently, just + * XFS_ILOG_TIMESTAMP, though may be extended in future to cover other metadata. + * + * If we simply fold ili_last_fields back into ili_fields when we log the inode + * in a transaction, then if we have a flush/modification race it results in + * every timestamp update causing fdatasync to flush the log because ili_fields + * has fields other than XFS_ILOG_TIMESTAMP set in it. This behaviour will + * persist until the inode is next flushed to it's backing buffer and that + * buffer is written and completed without another flush/modification race + * occuring. Hence we keep the change state separate and only combine them when + * formatting the inode into the log. + * + * For more information, there's another big comment in xfs_iflush_int() about + * this flush/modification race condition. + */ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ @@ -40,6 +97,7 @@ static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip) STATIC void xfs_inode_item_data_fork_size( struct xfs_inode_log_item *iip, + unsigned int fields, int *nvecs, int *nbytes) { @@ -47,7 +105,7 @@ xfs_inode_item_data_fork_size( switch (ip->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - if ((iip->ili_fields & XFS_ILOG_DEXT) && + if ((fields & XFS_ILOG_DEXT) && ip->i_d.di_nextents > 0 && ip->i_df.if_bytes > 0) { /* worst case, doesn't subtract delalloc extents */ @@ -56,14 +114,14 @@ xfs_inode_item_data_fork_size( } break; case XFS_DINODE_FMT_BTREE: - if ((iip->ili_fields & XFS_ILOG_DBROOT) && + if ((fields & XFS_ILOG_DBROOT) && ip->i_df.if_broot_bytes > 0) { *nbytes += ip->i_df.if_broot_bytes; *nvecs += 1; } break; case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_fields & XFS_ILOG_DDATA) && + if ((fields & XFS_ILOG_DDATA) && ip->i_df.if_bytes > 0) { *nbytes += roundup(ip->i_df.if_bytes, 4); *nvecs += 1; @@ -82,6 +140,7 @@ xfs_inode_item_data_fork_size( STATIC void xfs_inode_item_attr_fork_size( struct xfs_inode_log_item *iip, + unsigned int fields, int *nvecs, int *nbytes) { @@ -89,7 +148,7 @@ xfs_inode_item_attr_fork_size( switch (ip->i_d.di_aformat) { case XFS_DINODE_FMT_EXTENTS: - if ((iip->ili_fields & XFS_ILOG_AEXT) && + if ((fields & XFS_ILOG_AEXT) && ip->i_d.di_anextents > 0 && ip->i_afp->if_bytes > 0) { /* worst case, doesn't subtract unused space */ @@ -98,14 +157,14 @@ xfs_inode_item_attr_fork_size( } break; case XFS_DINODE_FMT_BTREE: - if ((iip->ili_fields & XFS_ILOG_ABROOT) && + if ((fields & XFS_ILOG_ABROOT) && ip->i_afp->if_broot_bytes > 0) { *nbytes += ip->i_afp->if_broot_bytes; *nvecs += 1; } break; case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_fields & XFS_ILOG_ADATA) && + if ((fields & XFS_ILOG_ADATA) && ip->i_afp->if_bytes > 0) { *nbytes += roundup(ip->i_afp->if_bytes, 4); *nvecs += 1; @@ -133,13 +192,17 @@ xfs_inode_item_size( struct xfs_inode_log_item *iip = INODE_ITEM(lip); struct xfs_inode *ip = iip->ili_inode; + iip->ili_format_fields = iip->ili_fields | iip->ili_last_fields; + *nvecs += 2; *nbytes += sizeof(struct xfs_inode_log_format) + xfs_icdinode_size(ip->i_d.di_version); - xfs_inode_item_data_fork_size(iip, nvecs, nbytes); + xfs_inode_item_data_fork_size(iip, iip->ili_format_fields, + nvecs, nbytes); if (XFS_IFORK_Q(ip)) - xfs_inode_item_attr_fork_size(iip, nvecs, nbytes); + xfs_inode_item_attr_fork_size(iip, iip->ili_format_fields, + nvecs, nbytes); } STATIC void @@ -151,14 +214,14 @@ xfs_inode_item_format_data_fork( { struct xfs_inode *ip = iip->ili_inode; size_t data_bytes; + unsigned int fields = iip->ili_format_fields; switch (ip->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | - XFS_ILOG_DEV | XFS_ILOG_UUID); + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | + XFS_ILOG_DEV | XFS_ILOG_UUID); - if ((iip->ili_fields & XFS_ILOG_DEXT) && + if ((fields & XFS_ILOG_DEXT) && ip->i_d.di_nextents > 0 && ip->i_df.if_bytes > 0) { struct xfs_bmbt_rec *p; @@ -175,15 +238,14 @@ xfs_inode_item_format_data_fork( ilf->ilf_dsize = data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_DEXT; + fields &= ~XFS_ILOG_DEXT; } break; case XFS_DINODE_FMT_BTREE: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | - XFS_ILOG_DEV | XFS_ILOG_UUID); + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | + XFS_ILOG_DEV | XFS_ILOG_UUID); - if ((iip->ili_fields & XFS_ILOG_DBROOT) && + if ((fields & XFS_ILOG_DBROOT) && ip->i_df.if_broot_bytes > 0) { ASSERT(ip->i_df.if_broot != NULL); xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IBROOT, @@ -192,16 +254,15 @@ xfs_inode_item_format_data_fork( ilf->ilf_dsize = ip->i_df.if_broot_bytes; ilf->ilf_size++; } else { - ASSERT(!(iip->ili_fields & - XFS_ILOG_DBROOT)); - iip->ili_fields &= ~XFS_ILOG_DBROOT; + ASSERT(!(fields & XFS_ILOG_DBROOT)); + fields &= ~XFS_ILOG_DBROOT; } break; case XFS_DINODE_FMT_LOCAL: - iip->ili_fields &= - ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | - XFS_ILOG_DEV | XFS_ILOG_UUID); - if ((iip->ili_fields & XFS_ILOG_DDATA) && + fields &= ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | + XFS_ILOG_DEV | XFS_ILOG_UUID); + + if ((fields & XFS_ILOG_DDATA) && ip->i_df.if_bytes > 0) { /* * Round i_bytes up to a word boundary. @@ -218,27 +279,28 @@ xfs_inode_item_format_data_fork( ilf->ilf_dsize = (unsigned)data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_DDATA; + fields &= ~XFS_ILOG_DDATA; } break; case XFS_DINODE_FMT_DEV: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | - XFS_ILOG_DEXT | XFS_ILOG_UUID); - if (iip->ili_fields & XFS_ILOG_DEV) + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | + XFS_ILOG_DEXT | XFS_ILOG_UUID); + if (fields & XFS_ILOG_DEV) ilf->ilf_u.ilfu_rdev = ip->i_df.if_u2.if_rdev; break; case XFS_DINODE_FMT_UUID: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | - XFS_ILOG_DEXT | XFS_ILOG_DEV); - if (iip->ili_fields & XFS_ILOG_UUID) + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | + XFS_ILOG_DEXT | XFS_ILOG_DEV); + if (fields & XFS_ILOG_UUID) ilf->ilf_u.ilfu_uuid = ip->i_df.if_u2.if_uuid; break; default: ASSERT(0); break; } + + /* reflect the logged fields back in ili_format_fields */ + iip->ili_format_fields = fields; } STATIC void @@ -250,13 +312,13 @@ xfs_inode_item_format_attr_fork( { struct xfs_inode *ip = iip->ili_inode; size_t data_bytes; + unsigned int fields = iip->ili_format_fields; switch (ip->i_d.di_aformat) { case XFS_DINODE_FMT_EXTENTS: - iip->ili_fields &= - ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); + fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); - if ((iip->ili_fields & XFS_ILOG_AEXT) && + if ((fields & XFS_ILOG_AEXT) && ip->i_d.di_anextents > 0 && ip->i_afp->if_bytes > 0) { struct xfs_bmbt_rec *p; @@ -272,14 +334,13 @@ xfs_inode_item_format_attr_fork( ilf->ilf_asize = data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_AEXT; + fields &= ~XFS_ILOG_AEXT; } break; case XFS_DINODE_FMT_BTREE: - iip->ili_fields &= - ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); + fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); - if ((iip->ili_fields & XFS_ILOG_ABROOT) && + if ((fields & XFS_ILOG_ABROOT) && ip->i_afp->if_broot_bytes > 0) { ASSERT(ip->i_afp->if_broot != NULL); @@ -289,14 +350,13 @@ xfs_inode_item_format_attr_fork( ilf->ilf_asize = ip->i_afp->if_broot_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_ABROOT; + fields &= ~XFS_ILOG_ABROOT; } break; case XFS_DINODE_FMT_LOCAL: - iip->ili_fields &= - ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); + fields &= ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); - if ((iip->ili_fields & XFS_ILOG_ADATA) && + if ((fields & XFS_ILOG_ADATA) && ip->i_afp->if_bytes > 0) { /* * Round i_bytes up to a word boundary. @@ -313,13 +373,16 @@ xfs_inode_item_format_attr_fork( ilf->ilf_asize = (unsigned)data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_ADATA; + fields &= ~XFS_ILOG_ADATA; } break; default: ASSERT(0); break; } + + /* reflect the logged fields back in ili_format_fields */ + iip->ili_format_fields = fields; } /* @@ -359,12 +422,16 @@ xfs_inode_item_format( if (XFS_IFORK_Q(ip)) { xfs_inode_item_format_attr_fork(iip, ilf, lv, &vecp); } else { - iip->ili_fields &= + iip->ili_format_fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); } /* update the format with the exact fields we actually logged */ - ilf->ilf_fields |= (iip->ili_fields & ~XFS_ILOG_TIMESTAMP); + ilf->ilf_fields |= (iip->ili_format_fields & ~XFS_ILOG_TIMESTAMP); + + /* clear any fields we didn't log from ili_fields */ + iip->ili_fields &= iip->ili_format_fields; + iip->ili_format_fields = 0; } /* diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index 488d812..43a9e1c 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -34,6 +34,7 @@ typedef struct xfs_inode_log_item { unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ unsigned int ili_fields; /* fields to be logged */ + unsigned int ili_format_fields; /* combined log fields */ } xfs_inode_log_item_t; static inline int xfs_inode_clean(xfs_inode_t *ip) -- 2.5.0 From david@fromorbit.com Thu Aug 27 23:33:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 673B329DF5 for ; Thu, 27 Aug 2015 23:33:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 47CF28F8033 for ; Thu, 27 Aug 2015 21:33:03 -0700 (PDT) X-ASG-Debug-ID: 1440736375-04cbb07cbde2990001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 380B82mV5URlsNlz for ; Thu, 27 Aug 2015 21:32:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A/CwBX499VPAUaLHlegxuBPYZRozQBAQEGilSREgICAQECgUFNAQEBAQEBBwEBAQFAAT+EJAEBBCcTHB4FEAgYDCUPBSUDBy2ILcY0AQEBBwEBAQEeGYYOikUHgxiBFAWHKo4TjHCBTYdQiROINII1HIFmLDOCTQEBAQ Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2015 14:02:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZVBLR-0001VW-Ef; Fri, 28 Aug 2015 14:32:53 +1000 Date: Fri, 28 Aug 2015 14:32:53 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: sage@redhat.com Subject: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: <20150828043253.GB26895@dastard> X-ASG-Orig-Subj: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic References: <1440724990-25073-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440724990-25073-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1440736375 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.21996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Sage Weil reported that a ceph test workload was writing to the log on every fdatasync during an overwrite workload. Event tracing showed that the only metadata modification being made was the timestamp updates during the write(2) syscall, but fdatasync(2) is supposed to ignore them. The key observation was that the transactions in the log all looked like this: INODE: #regs: 4 ino: 0x8b flags: 0x45 dsize: 32 And contained a flags field of 0x45 or 0x85, and had data and attribute forks following the inode core. This means that the timestamp updates were triggering dirty relogging of previously logged parts of the inode that hadn't yet been flushed back to disk. This is caused by xfs_trans_log_inode(), where it folds the dirty fields that have previously been logged back into the current transaction dirty fields from the inode item ili_last_fields. The issue is that ili_last_fields only contains a non-zero value when the inode is in the process of being flushed. The typical state progression is this, using a core field update as the modification occuring: state ili_fields ili_last_fields clean 0 0 modified, logged XFS_ILOG_CORE 0 flushed to buffer 0 XFS_ILOG_CORE buffer IO done (clean) 0 0 However, if we run a new transaction after it has been flushed to buffer but before the buffer IO is done, we don't know if the modifications in the inode buffer (i.e. what is in ili_last_fields) will reach the disk before the new transaction reaches the log. Hence to keep transactional ordering correct in recovery, we need to ensure the new transaction re-logs the modifications that are being flushed to disk. By relogging, we ensure that if the transaction makes it to disk and the buffer doesn't, then recovery replays all the changes upto that point correctly. If the transaction does not make it disk, but the buffer does, then recovery will see that the inode on disk is more recent than in the log and won't overwrite it with changes that it already contains. The upshot of this is that while the inode buffer sits in memory with the inode in the "flushed" state, fdatasync is going to see the relogged state in the ili_fields. i.e: What is happening here is this: state ili_fields ili_last_fields clean 0 0 modified, logged CORE 0 flushed to buffer 0 CORE timestamp update TIMESTAMP CORE CORE|TIMESTAMP CORE sees field other than TIMESTAMP in ili_fields, triggers xfs_log_force_lsn to flush inode buffer IO done (clean) CORE|TIMESTAMP 0 ..... timestamp update CORE|TIMESTAMP 0 sees field other than TIMESTAMP in ili_fields, triggers xfs_log_force_lsn to flush inode ..... timestamp update CORE|TIMESTAMP 0 sees field other than TIMESTAMP in ili_fields, triggers xfs_log_force_lsn to flush inode So, essentially, once a race condition on the buffer flush has occurred, the condition is not cleared until the inode is flushed to the buffer again and it is written without racing against the inode being dirtied again. The behaviour we really want here is to capture the timestamp update transactionally, but not trigger fdatasync because of the relogged fields that haven't been modified since the inode was flushed to the buffer. We still need to relog them, but we don't need to force the log in the fdatasync case. To do this, don't fold the ili_last_fields value into ili_fields when logging the inode. Instead, fold it into the fields that get logged during formatting of the inode item. This means that we will stop logging those fields the moment we know that there is a more recent version of the inode on disk than we have in the log and so we don't need to log those fields anymore as the next transaction on disk doesn't need to replay them. Doing this separates changes that are in memory but are not being flushed from those that have been flushed. Hence we can now look at ili_fields and hence see what fields have been modified since the last flush, and hence whether fdatasync needs to force the log or not. If non-timestamp changes have been made since the inode was flushed to the backing buffer, then fdatasync will do exactly the right thing (i.e. force the log). Reported-by: Sage Weil Signed-off-by: Dave Chinner --- Version 2: - include the hunk from fs/xfs/xfs_trans_inode.c that I missed when committing the patch locally the first time. fs/xfs/xfs_inode_item.c | 161 +++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_inode_item.h | 1 + fs/xfs/xfs_trans_inode.c | 8 --- 3 files changed, 115 insertions(+), 55 deletions(-) diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 62bd80f..be04eb2 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -29,6 +29,63 @@ #include "xfs_trans_priv.h" #include "xfs_log.h" +/* + * Notes on ili_fields, ili_format_fields and ili_last_fields. + * + * ili_fields contains the flags that reflect the current changes that are in + * memory and have been logged, but have not been flushed to the backing buffer + * for writeback yet. When a transaction is done, the fields that are modified + * are added to ili_fields and all those fields are logged. This results in + * repeated transactions correctly relogging all the other changes in memory and + * allows the inode to be re-ordered (moved forward) in the AIL safely. + * ili_fields is copied to ili_last_fields when the inode is flushed to the + * backing buffer and is then cleared, indicating that the inode in memory is + * now clean from a transactional change point of view and does not need to + * relog those fields anymore on tranaction commit. + * + * ili_last_fields, therefore, is only set while there is an unresolved inode + * flush being done (i.e. flush lock is held). We need to keep this state + * available to avoid a transaction recovery vs inode buffer IO completion race + * if we crash. If the inode is logged again makes it to disk before the inode + * buffer IO complete, log recovery will replay the latest inode transaction and + * can lose the changes that were in the inode buffer. Hence we still need to + * log the changes that have been flushed so that transactions issued during the + * inode buffer write still contain the modifications being flushed. Once the + * inode buffer IO completes, we no longer need to log those changes as the + * inode on disk the same as the inode in memory apart from the changes made + * since the inode was flushed (i.e. those recorded in ili_fields). + * + * ili_format_fields is only used during transaction commit. It is the + * aggregation of ili_fields and ili_last_fields, as sampled during the sizing + * of the inode item to be logged. We need this field definition to be constant + * between sizing and formatting, but inode buffer IO can complete + * asynchronously with transaction commit and so we must only read it once so + * that the different stages of the item formatting work correctly. We don't + * care about the async completion clearing ili_last_fields after we've sampled + * it - if we log too much then so be it - we won't log it next time. Once we've + * formatted the inode item, we need to propagate the ili_format_fields value to + * the on-disk inode log item format field, and then use it to clear all the + * fields that we marked for logging but were not dirty from ili_fields. + * + * This separation of changes allows us to accurately determine what fields in + * the inode have changed since it was last flushed to disk. This is important + * for fdatasync() performance as there are certain fields that, if modified, + * should not trigger log forces because they contain metadata that fdatasync() + * does not need to guarantee is safe on disk. This is, currently, just + * XFS_ILOG_TIMESTAMP, though may be extended in future to cover other metadata. + * + * If we simply fold ili_last_fields back into ili_fields when we log the inode + * in a transaction, then if we have a flush/modification race it results in + * every timestamp update causing fdatasync to flush the log because ili_fields + * has fields other than XFS_ILOG_TIMESTAMP set in it. This behaviour will + * persist until the inode is next flushed to it's backing buffer and that + * buffer is written and completed without another flush/modification race + * occuring. Hence we keep the change state separate and only combine them when + * formatting the inode into the log. + * + * For more information, there's another big comment in xfs_iflush_int() about + * this flush/modification race condition. + */ kmem_zone_t *xfs_ili_zone; /* inode log item zone */ @@ -40,6 +97,7 @@ static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip) STATIC void xfs_inode_item_data_fork_size( struct xfs_inode_log_item *iip, + unsigned int fields, int *nvecs, int *nbytes) { @@ -47,7 +105,7 @@ xfs_inode_item_data_fork_size( switch (ip->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - if ((iip->ili_fields & XFS_ILOG_DEXT) && + if ((fields & XFS_ILOG_DEXT) && ip->i_d.di_nextents > 0 && ip->i_df.if_bytes > 0) { /* worst case, doesn't subtract delalloc extents */ @@ -56,14 +114,14 @@ xfs_inode_item_data_fork_size( } break; case XFS_DINODE_FMT_BTREE: - if ((iip->ili_fields & XFS_ILOG_DBROOT) && + if ((fields & XFS_ILOG_DBROOT) && ip->i_df.if_broot_bytes > 0) { *nbytes += ip->i_df.if_broot_bytes; *nvecs += 1; } break; case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_fields & XFS_ILOG_DDATA) && + if ((fields & XFS_ILOG_DDATA) && ip->i_df.if_bytes > 0) { *nbytes += roundup(ip->i_df.if_bytes, 4); *nvecs += 1; @@ -82,6 +140,7 @@ xfs_inode_item_data_fork_size( STATIC void xfs_inode_item_attr_fork_size( struct xfs_inode_log_item *iip, + unsigned int fields, int *nvecs, int *nbytes) { @@ -89,7 +148,7 @@ xfs_inode_item_attr_fork_size( switch (ip->i_d.di_aformat) { case XFS_DINODE_FMT_EXTENTS: - if ((iip->ili_fields & XFS_ILOG_AEXT) && + if ((fields & XFS_ILOG_AEXT) && ip->i_d.di_anextents > 0 && ip->i_afp->if_bytes > 0) { /* worst case, doesn't subtract unused space */ @@ -98,14 +157,14 @@ xfs_inode_item_attr_fork_size( } break; case XFS_DINODE_FMT_BTREE: - if ((iip->ili_fields & XFS_ILOG_ABROOT) && + if ((fields & XFS_ILOG_ABROOT) && ip->i_afp->if_broot_bytes > 0) { *nbytes += ip->i_afp->if_broot_bytes; *nvecs += 1; } break; case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_fields & XFS_ILOG_ADATA) && + if ((fields & XFS_ILOG_ADATA) && ip->i_afp->if_bytes > 0) { *nbytes += roundup(ip->i_afp->if_bytes, 4); *nvecs += 1; @@ -133,13 +192,17 @@ xfs_inode_item_size( struct xfs_inode_log_item *iip = INODE_ITEM(lip); struct xfs_inode *ip = iip->ili_inode; + iip->ili_format_fields = iip->ili_fields | iip->ili_last_fields; + *nvecs += 2; *nbytes += sizeof(struct xfs_inode_log_format) + xfs_icdinode_size(ip->i_d.di_version); - xfs_inode_item_data_fork_size(iip, nvecs, nbytes); + xfs_inode_item_data_fork_size(iip, iip->ili_format_fields, + nvecs, nbytes); if (XFS_IFORK_Q(ip)) - xfs_inode_item_attr_fork_size(iip, nvecs, nbytes); + xfs_inode_item_attr_fork_size(iip, iip->ili_format_fields, + nvecs, nbytes); } STATIC void @@ -151,14 +214,14 @@ xfs_inode_item_format_data_fork( { struct xfs_inode *ip = iip->ili_inode; size_t data_bytes; + unsigned int fields = iip->ili_format_fields; switch (ip->i_d.di_format) { case XFS_DINODE_FMT_EXTENTS: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | - XFS_ILOG_DEV | XFS_ILOG_UUID); + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | + XFS_ILOG_DEV | XFS_ILOG_UUID); - if ((iip->ili_fields & XFS_ILOG_DEXT) && + if ((fields & XFS_ILOG_DEXT) && ip->i_d.di_nextents > 0 && ip->i_df.if_bytes > 0) { struct xfs_bmbt_rec *p; @@ -175,15 +238,14 @@ xfs_inode_item_format_data_fork( ilf->ilf_dsize = data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_DEXT; + fields &= ~XFS_ILOG_DEXT; } break; case XFS_DINODE_FMT_BTREE: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | - XFS_ILOG_DEV | XFS_ILOG_UUID); + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | + XFS_ILOG_DEV | XFS_ILOG_UUID); - if ((iip->ili_fields & XFS_ILOG_DBROOT) && + if ((fields & XFS_ILOG_DBROOT) && ip->i_df.if_broot_bytes > 0) { ASSERT(ip->i_df.if_broot != NULL); xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IBROOT, @@ -192,16 +254,15 @@ xfs_inode_item_format_data_fork( ilf->ilf_dsize = ip->i_df.if_broot_bytes; ilf->ilf_size++; } else { - ASSERT(!(iip->ili_fields & - XFS_ILOG_DBROOT)); - iip->ili_fields &= ~XFS_ILOG_DBROOT; + ASSERT(!(fields & XFS_ILOG_DBROOT)); + fields &= ~XFS_ILOG_DBROOT; } break; case XFS_DINODE_FMT_LOCAL: - iip->ili_fields &= - ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | - XFS_ILOG_DEV | XFS_ILOG_UUID); - if ((iip->ili_fields & XFS_ILOG_DDATA) && + fields &= ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | + XFS_ILOG_DEV | XFS_ILOG_UUID); + + if ((fields & XFS_ILOG_DDATA) && ip->i_df.if_bytes > 0) { /* * Round i_bytes up to a word boundary. @@ -218,27 +279,28 @@ xfs_inode_item_format_data_fork( ilf->ilf_dsize = (unsigned)data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_DDATA; + fields &= ~XFS_ILOG_DDATA; } break; case XFS_DINODE_FMT_DEV: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | - XFS_ILOG_DEXT | XFS_ILOG_UUID); - if (iip->ili_fields & XFS_ILOG_DEV) + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | + XFS_ILOG_DEXT | XFS_ILOG_UUID); + if (fields & XFS_ILOG_DEV) ilf->ilf_u.ilfu_rdev = ip->i_df.if_u2.if_rdev; break; case XFS_DINODE_FMT_UUID: - iip->ili_fields &= - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | - XFS_ILOG_DEXT | XFS_ILOG_DEV); - if (iip->ili_fields & XFS_ILOG_UUID) + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | + XFS_ILOG_DEXT | XFS_ILOG_DEV); + if (fields & XFS_ILOG_UUID) ilf->ilf_u.ilfu_uuid = ip->i_df.if_u2.if_uuid; break; default: ASSERT(0); break; } + + /* reflect the logged fields back in ili_format_fields */ + iip->ili_format_fields = fields; } STATIC void @@ -250,13 +312,13 @@ xfs_inode_item_format_attr_fork( { struct xfs_inode *ip = iip->ili_inode; size_t data_bytes; + unsigned int fields = iip->ili_format_fields; switch (ip->i_d.di_aformat) { case XFS_DINODE_FMT_EXTENTS: - iip->ili_fields &= - ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); + fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); - if ((iip->ili_fields & XFS_ILOG_AEXT) && + if ((fields & XFS_ILOG_AEXT) && ip->i_d.di_anextents > 0 && ip->i_afp->if_bytes > 0) { struct xfs_bmbt_rec *p; @@ -272,14 +334,13 @@ xfs_inode_item_format_attr_fork( ilf->ilf_asize = data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_AEXT; + fields &= ~XFS_ILOG_AEXT; } break; case XFS_DINODE_FMT_BTREE: - iip->ili_fields &= - ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); + fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); - if ((iip->ili_fields & XFS_ILOG_ABROOT) && + if ((fields & XFS_ILOG_ABROOT) && ip->i_afp->if_broot_bytes > 0) { ASSERT(ip->i_afp->if_broot != NULL); @@ -289,14 +350,13 @@ xfs_inode_item_format_attr_fork( ilf->ilf_asize = ip->i_afp->if_broot_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_ABROOT; + fields &= ~XFS_ILOG_ABROOT; } break; case XFS_DINODE_FMT_LOCAL: - iip->ili_fields &= - ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); + fields &= ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); - if ((iip->ili_fields & XFS_ILOG_ADATA) && + if ((fields & XFS_ILOG_ADATA) && ip->i_afp->if_bytes > 0) { /* * Round i_bytes up to a word boundary. @@ -313,13 +373,16 @@ xfs_inode_item_format_attr_fork( ilf->ilf_asize = (unsigned)data_bytes; ilf->ilf_size++; } else { - iip->ili_fields &= ~XFS_ILOG_ADATA; + fields &= ~XFS_ILOG_ADATA; } break; default: ASSERT(0); break; } + + /* reflect the logged fields back in ili_format_fields */ + iip->ili_format_fields = fields; } /* @@ -359,12 +422,16 @@ xfs_inode_item_format( if (XFS_IFORK_Q(ip)) { xfs_inode_item_format_attr_fork(iip, ilf, lv, &vecp); } else { - iip->ili_fields &= + iip->ili_format_fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); } /* update the format with the exact fields we actually logged */ - ilf->ilf_fields |= (iip->ili_fields & ~XFS_ILOG_TIMESTAMP); + ilf->ilf_fields |= (iip->ili_format_fields & ~XFS_ILOG_TIMESTAMP); + + /* clear any fields we didn't log from ili_fields */ + iip->ili_fields &= iip->ili_format_fields; + iip->ili_format_fields = 0; } /* diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index 488d812..43a9e1c 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -34,6 +34,7 @@ typedef struct xfs_inode_log_item { unsigned short ili_logged; /* flushed logged data */ unsigned int ili_last_fields; /* fields when flushed */ unsigned int ili_fields; /* fields to be logged */ + unsigned int ili_format_fields; /* combined log fields */ } xfs_inode_log_item_t; static inline int xfs_inode_clean(xfs_inode_t *ip) diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 17280cd..77f1e8a 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -123,13 +123,5 @@ xfs_trans_log_inode( tp->t_flags |= XFS_TRANS_DIRTY; ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; - /* - * Always OR in the bits from the ili_last_fields field. - * This is to coordinate with the xfs_iflush() and xfs_iflush_done() - * routines in the eventual clearing of the ili_fields bits. - * See the big comment in xfs_iflush() for an explanation of - * this coordination mechanism. - */ - flags |= ip->i_itemp->ili_last_fields; ip->i_itemp->ili_fields |= flags; } From gavin.guo@canonical.com Fri Aug 28 07:54:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4440D7F37 for ; Fri, 28 Aug 2015 07:54:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33FE68F8033 for ; Fri, 28 Aug 2015 05:54:06 -0700 (PDT) X-ASG-Debug-ID: 1440766444-04cb6c4a28d7950001-NocioJ Received: from mail-yk0-f182.google.com (mail-yk0-f182.google.com [209.85.160.182]) by cuda.sgi.com with ESMTP id Kiuy6DxOl60T69Cv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 28 Aug 2015 05:54:04 -0700 (PDT) X-Barracuda-Envelope-From: gavin.guo@canonical.com X-Barracuda-Apparent-Source-IP: 209.85.160.182 Received: by ykba134 with SMTP id a134so830715ykb.1 for ; Fri, 28 Aug 2015 05:54:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=JOPivfLQhjr1iKEkqG1sJdRJ7oRxrGVoHlBvjLDBtbc=; b=EzfrlUsqE7s1nwMUB6Nv339KVhyPfAL8AgXPMfXCt3XlSg5rY0jlqYFQ/k93ePirM+ TveRywPcPTUf0Kh6tj+/+8qqp99Eag5ahWejqyPoXUe++C1XWVLcO78DHQDmy4oIypTh wQ+QJN5df58KzbzhCYJU39vaoihSKLDEHwQb6s0w+nYTBKp+vqgJZRuqlZMabs5ImJN3 NjqSh/44xjlxhqP/ttaNbSBdIq1aI49BzwxOIQsapkAy/ybNJLU3RLlTh9mGO0cfOZHR fvXRIAsAWDxywKwrHWTKgDtojjMc8p+B+ITTFNcovQ9F/ZUN5z8fWV41nVv9HUb38Koi oUvw== X-Gm-Message-State: ALoCoQlwu7/D5rPTfjgWJQ7bicoO6ohhBzxL5w7hgpiWKHXcaIjgMa1iQb2Wc82gjeC8m2xPKpch MIME-Version: 1.0 X-Received: by 10.129.75.3 with SMTP id y3mr8704729ywa.90.1440766444190; Fri, 28 Aug 2015 05:54:04 -0700 (PDT) Received: by 10.37.124.2 with HTTP; Fri, 28 Aug 2015 05:54:04 -0700 (PDT) In-Reply-To: <20150707233743.GZ7943@dastard> References: <20150707233743.GZ7943@dastard> Date: Fri, 28 Aug 2015 20:54:04 +0800 Message-ID: Subject: Re: Possible memory allocation deadlock in kmem_alloc and hung task in xfs_log_commit_cil and xlog_cil_push From: Gavin Guo X-ASG-Orig-Subj: Re: Possible memory allocation deadlock in kmem_alloc and hung task in xfs_log_commit_cil and xlog_cil_push To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-yk0-f182.google.com[209.85.160.182] X-Barracuda-Start-Time: 1440766444 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22004 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On Wed, Jul 8, 2015 at 7:37 AM, Dave Chinner wrote: > On Tue, Jul 07, 2015 at 05:29:43PM +0800, Gavin Guo wrote: >> Hi all, >> >> Recently, we observed that there is the error message in >> Ubuntu-3.13.0-48.80: >> >> "XFS: possible memory allocation deadlock in kmem_alloc (mode:0x8250)" >> >> repeatedly shows in the dmesg. Temporarily, our workaround is to tune the >> parameters, such as, vfs_cache_pressure, min_free_kbytes, and dirty_ratio. >> >> And we also found that there are different error messages regarding the >> hung tasks which happened in xfs_log_commit_cil and xlog_cil_push. >> >> The log is available at: http://paste.ubuntu.com/11835007/ >> >> The following link seems the same problem we suffered: >> >> XFS hangs with XFS: possible memory allocation deadlock in kmem_alloc >> http://oss.sgi.com/archives/xfs/2015-03/msg00172.html >> >> I read the mail and found that there might be some modification regarding >> to move the memory allocation outside the ctx lock. And I also read the >> latest patch from February of 2015 to see if there is any new change >> about that. Unfortunately, I didn't find anything regarding the change (may >> be I'm not familiar with the XFS, so didn't find the commit). If it's >> possible for someone who is familiar with the code to point out the commits >> related to the bug if already exist or any status about the plan. > > No commits - the approach I thought we might be able to take to > avoid the problem didn't work out. I have another idea of how we > might solve the problem, but I haven't ad a chance to prototype it > yet. I have read the code for a while and still can't figure out how to fix. My current understanding is that the problem is Buddy system is running out of memory so the XFS kmem_alloc(), called by xfs_log_commit_cil-> xlog_cil_insert_items-> xlog_cil_insert_format_items-> kmem_zalloc, fail and stuck in the while loop and retry. There are also 2 other threads running in the same time: 1). xfs_log_commit_cil->down_read(&cil->xc_ctx_lock); 2). xlog_cil_push->down_write(&cil->xc_ctx_lock); So, the both threads are blocked and waiting for the first kmem_zalloc() to succeed. However, if there is a way to decrease the memory request or if it's possible to elaborate more on the idea you mentioned. I know it's a problem which cannot be solved in a short time. And I'd like to help if there is any possibility. Thanks, Gavin From sage@newdream.net Fri Aug 28 10:11:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 238E17F37 for ; Fri, 28 Aug 2015 10:11:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 110C88F804B for ; Fri, 28 Aug 2015 08:11:27 -0700 (PDT) X-ASG-Debug-ID: 1440774681-04cb6c4a29da700001-NocioJ Received: from cobra.newdream.net (cobra.newdream.net [66.33.216.30]) by cuda.sgi.com with ESMTP id LFpp95lXLAXKIPus for ; Fri, 28 Aug 2015 08:11:22 -0700 (PDT) X-Barracuda-Envelope-From: sage@newdream.net X-Barracuda-Apparent-Source-IP: 66.33.216.30 Received: from cobra.newdream.net (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id 06CA18048A; Fri, 28 Aug 2015 08:11:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=newdream.net; h=date:from :to:cc:subject:in-reply-to:message-id:references:mime-version :content-type; s=newdream.net; bh=5tmJHqd7DkYwKn3yxSg5mcb6nDs=; b= 2cYVDNCVTmiwKDn3rXbTpGtyteZuT4wetW39TWkFmFSzjZ8DyrVCsxFB4R7sEoGa cctrbk6hr4yYQ1z+A3DnfnGnJ9ytdefkC/85tZYe7BAaVdW5z2EGZzrc1CEZMVYh U4GkL8v7f1SmgY4+EcMJC04DyE1n2Tju/jFeiQJlugA= Received: by cobra.newdream.net (Postfix, from userid 1031) id 049D08140B; Fri, 28 Aug 2015 08:11:21 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id 0305B8048A; Fri, 28 Aug 2015 08:11:21 -0700 (PDT) Date: Fri, 28 Aug 2015 08:11:20 -0700 (PDT) From: Sage Weil To: Dave Chinner cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic In-Reply-To: <20150828043253.GB26895@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: References: <1440724990-25073-1-git-send-email-david@fromorbit.com> <20150828043253.GB26895@dastard> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: cobra.newdream.net[66.33.216.30] X-Barracuda-Start-Time: 1440774681 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22006 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_MV0713 Custom rule MV0713 Hi Dave, On Fri, 28 Aug 2015, Dave Chinner wrote: > > From: Dave Chinner > > Sage Weil reported that a ceph test workload was writing to the > log on every fdatasync during an overwrite workload. Event tracing > showed that the only metadata modification being made was the > timestamp updates during the write(2) syscall, but fdatasync(2) > is supposed to ignore them. The key observation was that the > transactions in the log all looked like this: > > INODE: #regs: 4 ino: 0x8b flags: 0x45 dsize: 32 > > And contained a flags field of 0x45 or 0x85, and had data and > attribute forks following the inode core. This means that the > timestamp updates were triggering dirty relogging of previously > logged parts of the inode that hadn't yet been flushed back to > disk. > > This is caused by xfs_trans_log_inode(), where it folds the dirty > fields that have previously been logged back into the current > transaction dirty fields from the inode item ili_last_fields. The > issue is that ili_last_fields only contains a non-zero value when > the inode is in the process of being flushed. The typical state > progression is this, using a core field update as the modification > occuring: > > state ili_fields ili_last_fields > clean 0 0 > modified, logged XFS_ILOG_CORE 0 > flushed to buffer 0 XFS_ILOG_CORE > > buffer IO done (clean) 0 0 > > However, if we run a new transaction after it has been flushed to > buffer but before the buffer IO is done, we don't know if the > modifications in the inode buffer (i.e. what is in ili_last_fields) > will reach the disk before the new transaction reaches the log. > Hence to keep transactional ordering correct in recovery, we need to > ensure the new transaction re-logs the modifications that are being > flushed to disk. > > By relogging, we ensure that if the transaction makes it to disk and > the buffer doesn't, then recovery replays all the changes upto that > point correctly. If the transaction does not make it disk, but the > buffer does, then recovery will see that the inode on disk is more > recent than in the log and won't overwrite it with changes that it > already contains. > > The upshot of this is that while the inode buffer sits in memory > with the inode in the "flushed" state, fdatasync is going to see > the relogged state in the ili_fields. i.e: > > What is happening here is this: > > state ili_fields ili_last_fields > clean 0 0 > modified, logged CORE 0 > flushed to buffer 0 CORE > > timestamp update TIMESTAMP CORE > > CORE|TIMESTAMP CORE > > sees field other than TIMESTAMP in ili_fields, > triggers xfs_log_force_lsn to flush inode > > > buffer IO done (clean) CORE|TIMESTAMP 0 > ..... > > timestamp update CORE|TIMESTAMP 0 > > sees field other than TIMESTAMP in ili_fields, > triggers xfs_log_force_lsn to flush inode > ..... > > timestamp update CORE|TIMESTAMP 0 > > sees field other than TIMESTAMP in ili_fields, > triggers xfs_log_force_lsn to flush inode > > So, essentially, once a race condition on the buffer flush has > occurred, the condition is not cleared until the inode is flushed to > the buffer again and it is written without racing against the inode > being dirtied again. > > The behaviour we really want here is to capture the timestamp > update transactionally, but not trigger fdatasync because of the > relogged fields that haven't been modified since the inode was > flushed to the buffer. We still need to relog them, but we don't > need to force the log in the fdatasync case. > > To do this, don't fold the ili_last_fields value into ili_fields > when logging the inode. Instead, fold it into the fields that get > logged during formatting of the inode item. This means that we will > stop logging those fields the moment we know that there is a more > recent version of the inode on disk than we have in the log and so > we don't need to log those fields anymore as the next transaction on > disk doesn't need to replay them. > > Doing this separates changes that are in memory but are not being > flushed from those that have been flushed. Hence we can now look at > ili_fields and hence see what fields have been modified since the > last flush, and hence whether fdatasync needs to force the log or > not. If non-timestamp changes have been made since the inode was > flushed to the backing buffer, then fdatasync will do exactly the > right thing (i.e. force the log). > > Reported-by: Sage Weil > Signed-off-by: Dave Chinner > --- > Version 2: > - include the hunk from fs/xfs/xfs_trans_inode.c that I missed > when committing the patch locally the first time. I gave this a go on my machine but I'm still seeing the same symptom. I've gathered the trace, strace, and other useful bits at http://newdream.net/~sage/drop/rocksdb.2/ This is pretty easy to reproduce with the ceph_test_keyvaluedb binary (built on fedora 22), also in that dir: rm -rf kv_test_temp_dir/ ./ceph_test_keyvaluedb --gtest_filter=KeyValueDB/KVTest.BenchCommit/1 Thanks for looking into this! sage > > fs/xfs/xfs_inode_item.c | 161 +++++++++++++++++++++++++++++++++-------------- > fs/xfs/xfs_inode_item.h | 1 + > fs/xfs/xfs_trans_inode.c | 8 --- > 3 files changed, 115 insertions(+), 55 deletions(-) > > diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c > index 62bd80f..be04eb2 100644 > --- a/fs/xfs/xfs_inode_item.c > +++ b/fs/xfs/xfs_inode_item.c > @@ -29,6 +29,63 @@ > #include "xfs_trans_priv.h" > #include "xfs_log.h" > > +/* > + * Notes on ili_fields, ili_format_fields and ili_last_fields. > + * > + * ili_fields contains the flags that reflect the current changes that are in > + * memory and have been logged, but have not been flushed to the backing buffer > + * for writeback yet. When a transaction is done, the fields that are modified > + * are added to ili_fields and all those fields are logged. This results in > + * repeated transactions correctly relogging all the other changes in memory and > + * allows the inode to be re-ordered (moved forward) in the AIL safely. > + * ili_fields is copied to ili_last_fields when the inode is flushed to the > + * backing buffer and is then cleared, indicating that the inode in memory is > + * now clean from a transactional change point of view and does not need to > + * relog those fields anymore on tranaction commit. > + * > + * ili_last_fields, therefore, is only set while there is an unresolved inode > + * flush being done (i.e. flush lock is held). We need to keep this state > + * available to avoid a transaction recovery vs inode buffer IO completion race > + * if we crash. If the inode is logged again makes it to disk before the inode > + * buffer IO complete, log recovery will replay the latest inode transaction and > + * can lose the changes that were in the inode buffer. Hence we still need to > + * log the changes that have been flushed so that transactions issued during the > + * inode buffer write still contain the modifications being flushed. Once the > + * inode buffer IO completes, we no longer need to log those changes as the > + * inode on disk the same as the inode in memory apart from the changes made > + * since the inode was flushed (i.e. those recorded in ili_fields). > + * > + * ili_format_fields is only used during transaction commit. It is the > + * aggregation of ili_fields and ili_last_fields, as sampled during the sizing > + * of the inode item to be logged. We need this field definition to be constant > + * between sizing and formatting, but inode buffer IO can complete > + * asynchronously with transaction commit and so we must only read it once so > + * that the different stages of the item formatting work correctly. We don't > + * care about the async completion clearing ili_last_fields after we've sampled > + * it - if we log too much then so be it - we won't log it next time. Once we've > + * formatted the inode item, we need to propagate the ili_format_fields value to > + * the on-disk inode log item format field, and then use it to clear all the > + * fields that we marked for logging but were not dirty from ili_fields. > + * > + * This separation of changes allows us to accurately determine what fields in > + * the inode have changed since it was last flushed to disk. This is important > + * for fdatasync() performance as there are certain fields that, if modified, > + * should not trigger log forces because they contain metadata that fdatasync() > + * does not need to guarantee is safe on disk. This is, currently, just > + * XFS_ILOG_TIMESTAMP, though may be extended in future to cover other metadata. > + * > + * If we simply fold ili_last_fields back into ili_fields when we log the inode > + * in a transaction, then if we have a flush/modification race it results in > + * every timestamp update causing fdatasync to flush the log because ili_fields > + * has fields other than XFS_ILOG_TIMESTAMP set in it. This behaviour will > + * persist until the inode is next flushed to it's backing buffer and that > + * buffer is written and completed without another flush/modification race > + * occuring. Hence we keep the change state separate and only combine them when > + * formatting the inode into the log. > + * > + * For more information, there's another big comment in xfs_iflush_int() about > + * this flush/modification race condition. > + */ > > kmem_zone_t *xfs_ili_zone; /* inode log item zone */ > > @@ -40,6 +97,7 @@ static inline struct xfs_inode_log_item *INODE_ITEM(struct xfs_log_item *lip) > STATIC void > xfs_inode_item_data_fork_size( > struct xfs_inode_log_item *iip, > + unsigned int fields, > int *nvecs, > int *nbytes) > { > @@ -47,7 +105,7 @@ xfs_inode_item_data_fork_size( > > switch (ip->i_d.di_format) { > case XFS_DINODE_FMT_EXTENTS: > - if ((iip->ili_fields & XFS_ILOG_DEXT) && > + if ((fields & XFS_ILOG_DEXT) && > ip->i_d.di_nextents > 0 && > ip->i_df.if_bytes > 0) { > /* worst case, doesn't subtract delalloc extents */ > @@ -56,14 +114,14 @@ xfs_inode_item_data_fork_size( > } > break; > case XFS_DINODE_FMT_BTREE: > - if ((iip->ili_fields & XFS_ILOG_DBROOT) && > + if ((fields & XFS_ILOG_DBROOT) && > ip->i_df.if_broot_bytes > 0) { > *nbytes += ip->i_df.if_broot_bytes; > *nvecs += 1; > } > break; > case XFS_DINODE_FMT_LOCAL: > - if ((iip->ili_fields & XFS_ILOG_DDATA) && > + if ((fields & XFS_ILOG_DDATA) && > ip->i_df.if_bytes > 0) { > *nbytes += roundup(ip->i_df.if_bytes, 4); > *nvecs += 1; > @@ -82,6 +140,7 @@ xfs_inode_item_data_fork_size( > STATIC void > xfs_inode_item_attr_fork_size( > struct xfs_inode_log_item *iip, > + unsigned int fields, > int *nvecs, > int *nbytes) > { > @@ -89,7 +148,7 @@ xfs_inode_item_attr_fork_size( > > switch (ip->i_d.di_aformat) { > case XFS_DINODE_FMT_EXTENTS: > - if ((iip->ili_fields & XFS_ILOG_AEXT) && > + if ((fields & XFS_ILOG_AEXT) && > ip->i_d.di_anextents > 0 && > ip->i_afp->if_bytes > 0) { > /* worst case, doesn't subtract unused space */ > @@ -98,14 +157,14 @@ xfs_inode_item_attr_fork_size( > } > break; > case XFS_DINODE_FMT_BTREE: > - if ((iip->ili_fields & XFS_ILOG_ABROOT) && > + if ((fields & XFS_ILOG_ABROOT) && > ip->i_afp->if_broot_bytes > 0) { > *nbytes += ip->i_afp->if_broot_bytes; > *nvecs += 1; > } > break; > case XFS_DINODE_FMT_LOCAL: > - if ((iip->ili_fields & XFS_ILOG_ADATA) && > + if ((fields & XFS_ILOG_ADATA) && > ip->i_afp->if_bytes > 0) { > *nbytes += roundup(ip->i_afp->if_bytes, 4); > *nvecs += 1; > @@ -133,13 +192,17 @@ xfs_inode_item_size( > struct xfs_inode_log_item *iip = INODE_ITEM(lip); > struct xfs_inode *ip = iip->ili_inode; > > + iip->ili_format_fields = iip->ili_fields | iip->ili_last_fields; > + > *nvecs += 2; > *nbytes += sizeof(struct xfs_inode_log_format) + > xfs_icdinode_size(ip->i_d.di_version); > > - xfs_inode_item_data_fork_size(iip, nvecs, nbytes); > + xfs_inode_item_data_fork_size(iip, iip->ili_format_fields, > + nvecs, nbytes); > if (XFS_IFORK_Q(ip)) > - xfs_inode_item_attr_fork_size(iip, nvecs, nbytes); > + xfs_inode_item_attr_fork_size(iip, iip->ili_format_fields, > + nvecs, nbytes); > } > > STATIC void > @@ -151,14 +214,14 @@ xfs_inode_item_format_data_fork( > { > struct xfs_inode *ip = iip->ili_inode; > size_t data_bytes; > + unsigned int fields = iip->ili_format_fields; > > switch (ip->i_d.di_format) { > case XFS_DINODE_FMT_EXTENTS: > - iip->ili_fields &= > - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | > - XFS_ILOG_DEV | XFS_ILOG_UUID); > + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | > + XFS_ILOG_DEV | XFS_ILOG_UUID); > > - if ((iip->ili_fields & XFS_ILOG_DEXT) && > + if ((fields & XFS_ILOG_DEXT) && > ip->i_d.di_nextents > 0 && > ip->i_df.if_bytes > 0) { > struct xfs_bmbt_rec *p; > @@ -175,15 +238,14 @@ xfs_inode_item_format_data_fork( > ilf->ilf_dsize = data_bytes; > ilf->ilf_size++; > } else { > - iip->ili_fields &= ~XFS_ILOG_DEXT; > + fields &= ~XFS_ILOG_DEXT; > } > break; > case XFS_DINODE_FMT_BTREE: > - iip->ili_fields &= > - ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | > - XFS_ILOG_DEV | XFS_ILOG_UUID); > + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | > + XFS_ILOG_DEV | XFS_ILOG_UUID); > > - if ((iip->ili_fields & XFS_ILOG_DBROOT) && > + if ((fields & XFS_ILOG_DBROOT) && > ip->i_df.if_broot_bytes > 0) { > ASSERT(ip->i_df.if_broot != NULL); > xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IBROOT, > @@ -192,16 +254,15 @@ xfs_inode_item_format_data_fork( > ilf->ilf_dsize = ip->i_df.if_broot_bytes; > ilf->ilf_size++; > } else { > - ASSERT(!(iip->ili_fields & > - XFS_ILOG_DBROOT)); > - iip->ili_fields &= ~XFS_ILOG_DBROOT; > + ASSERT(!(fields & XFS_ILOG_DBROOT)); > + fields &= ~XFS_ILOG_DBROOT; > } > break; > case XFS_DINODE_FMT_LOCAL: > - iip->ili_fields &= > - ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | > - XFS_ILOG_DEV | XFS_ILOG_UUID); > - if ((iip->ili_fields & XFS_ILOG_DDATA) && > + fields &= ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | > + XFS_ILOG_DEV | XFS_ILOG_UUID); > + > + if ((fields & XFS_ILOG_DDATA) && > ip->i_df.if_bytes > 0) { > /* > * Round i_bytes up to a word boundary. > @@ -218,27 +279,28 @@ xfs_inode_item_format_data_fork( > ilf->ilf_dsize = (unsigned)data_bytes; > ilf->ilf_size++; > } else { > - iip->ili_fields &= ~XFS_ILOG_DDATA; > + fields &= ~XFS_ILOG_DDATA; > } > break; > case XFS_DINODE_FMT_DEV: > - iip->ili_fields &= > - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | > - XFS_ILOG_DEXT | XFS_ILOG_UUID); > - if (iip->ili_fields & XFS_ILOG_DEV) > + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | > + XFS_ILOG_DEXT | XFS_ILOG_UUID); > + if (fields & XFS_ILOG_DEV) > ilf->ilf_u.ilfu_rdev = ip->i_df.if_u2.if_rdev; > break; > case XFS_DINODE_FMT_UUID: > - iip->ili_fields &= > - ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | > - XFS_ILOG_DEXT | XFS_ILOG_DEV); > - if (iip->ili_fields & XFS_ILOG_UUID) > + fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DBROOT | > + XFS_ILOG_DEXT | XFS_ILOG_DEV); > + if (fields & XFS_ILOG_UUID) > ilf->ilf_u.ilfu_uuid = ip->i_df.if_u2.if_uuid; > break; > default: > ASSERT(0); > break; > } > + > + /* reflect the logged fields back in ili_format_fields */ > + iip->ili_format_fields = fields; > } > > STATIC void > @@ -250,13 +312,13 @@ xfs_inode_item_format_attr_fork( > { > struct xfs_inode *ip = iip->ili_inode; > size_t data_bytes; > + unsigned int fields = iip->ili_format_fields; > > switch (ip->i_d.di_aformat) { > case XFS_DINODE_FMT_EXTENTS: > - iip->ili_fields &= > - ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); > + fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT); > > - if ((iip->ili_fields & XFS_ILOG_AEXT) && > + if ((fields & XFS_ILOG_AEXT) && > ip->i_d.di_anextents > 0 && > ip->i_afp->if_bytes > 0) { > struct xfs_bmbt_rec *p; > @@ -272,14 +334,13 @@ xfs_inode_item_format_attr_fork( > ilf->ilf_asize = data_bytes; > ilf->ilf_size++; > } else { > - iip->ili_fields &= ~XFS_ILOG_AEXT; > + fields &= ~XFS_ILOG_AEXT; > } > break; > case XFS_DINODE_FMT_BTREE: > - iip->ili_fields &= > - ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); > + fields &= ~(XFS_ILOG_ADATA | XFS_ILOG_AEXT); > > - if ((iip->ili_fields & XFS_ILOG_ABROOT) && > + if ((fields & XFS_ILOG_ABROOT) && > ip->i_afp->if_broot_bytes > 0) { > ASSERT(ip->i_afp->if_broot != NULL); > > @@ -289,14 +350,13 @@ xfs_inode_item_format_attr_fork( > ilf->ilf_asize = ip->i_afp->if_broot_bytes; > ilf->ilf_size++; > } else { > - iip->ili_fields &= ~XFS_ILOG_ABROOT; > + fields &= ~XFS_ILOG_ABROOT; > } > break; > case XFS_DINODE_FMT_LOCAL: > - iip->ili_fields &= > - ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); > + fields &= ~(XFS_ILOG_AEXT | XFS_ILOG_ABROOT); > > - if ((iip->ili_fields & XFS_ILOG_ADATA) && > + if ((fields & XFS_ILOG_ADATA) && > ip->i_afp->if_bytes > 0) { > /* > * Round i_bytes up to a word boundary. > @@ -313,13 +373,16 @@ xfs_inode_item_format_attr_fork( > ilf->ilf_asize = (unsigned)data_bytes; > ilf->ilf_size++; > } else { > - iip->ili_fields &= ~XFS_ILOG_ADATA; > + fields &= ~XFS_ILOG_ADATA; > } > break; > default: > ASSERT(0); > break; > } > + > + /* reflect the logged fields back in ili_format_fields */ > + iip->ili_format_fields = fields; > } > > /* > @@ -359,12 +422,16 @@ xfs_inode_item_format( > if (XFS_IFORK_Q(ip)) { > xfs_inode_item_format_attr_fork(iip, ilf, lv, &vecp); > } else { > - iip->ili_fields &= > + iip->ili_format_fields &= > ~(XFS_ILOG_ADATA | XFS_ILOG_ABROOT | XFS_ILOG_AEXT); > } > > /* update the format with the exact fields we actually logged */ > - ilf->ilf_fields |= (iip->ili_fields & ~XFS_ILOG_TIMESTAMP); > + ilf->ilf_fields |= (iip->ili_format_fields & ~XFS_ILOG_TIMESTAMP); > + > + /* clear any fields we didn't log from ili_fields */ > + iip->ili_fields &= iip->ili_format_fields; > + iip->ili_format_fields = 0; > } > > /* > diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h > index 488d812..43a9e1c 100644 > --- a/fs/xfs/xfs_inode_item.h > +++ b/fs/xfs/xfs_inode_item.h > @@ -34,6 +34,7 @@ typedef struct xfs_inode_log_item { > unsigned short ili_logged; /* flushed logged data */ > unsigned int ili_last_fields; /* fields when flushed */ > unsigned int ili_fields; /* fields to be logged */ > + unsigned int ili_format_fields; /* combined log fields */ > } xfs_inode_log_item_t; > > static inline int xfs_inode_clean(xfs_inode_t *ip) > diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c > index 17280cd..77f1e8a 100644 > --- a/fs/xfs/xfs_trans_inode.c > +++ b/fs/xfs/xfs_trans_inode.c > @@ -123,13 +123,5 @@ xfs_trans_log_inode( > tp->t_flags |= XFS_TRANS_DIRTY; > ip->i_itemp->ili_item.li_desc->lid_flags |= XFS_LID_DIRTY; > > - /* > - * Always OR in the bits from the ili_last_fields field. > - * This is to coordinate with the xfs_iflush() and xfs_iflush_done() > - * routines in the eventual clearing of the ili_fields bits. > - * See the big comment in xfs_iflush() for an explanation of > - * this coordination mechanism. > - */ > - flags |= ip->i_itemp->ili_last_fields; > ip->i_itemp->ili_fields |= flags; > } > > From bfoster@redhat.com Fri Aug 28 13:03:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 670237F37 for ; Fri, 28 Aug 2015 13:03:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 452178F8033 for ; Fri, 28 Aug 2015 11:03:37 -0700 (PDT) X-ASG-Debug-ID: 1440785015-04cb6c4a2bddf70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 72sKnQgNhWfFL1Ra (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:03:36 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 6E2448EA3E for ; Fri, 28 Aug 2015 18:03:35 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI3Y81004423 for ; Fri, 28 Aug 2015 14:03:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A840C123E8A; Fri, 28 Aug 2015 14:03:33 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC] xfs: validate metadata LSNs against log on v5 superblocks Date: Fri, 28 Aug 2015 14:03:33 -0400 X-ASG-Orig-Subj: [PATCH RFC] xfs: validate metadata LSNs against log on v5 superblocks Message-Id: <1440785013-17035-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785016 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Since the onset of v5 superblocks, the LSN of the last modification has been included in a variety of on-disk data structures. This LSN is used to provide log recovery ordering guarantees (e.g., to ensure an older log recovery item is not replayed over a newer target data structure). While this works correctly from the point a filesystem is formatted and mounted, userspace tools have some problematic behaviors that defeat this mechanism. For example, xfs_repair historically zeroes out the log unconditionally (regardless of whether corruption is detected). If this occurs, the LSN of the filesystem is reset and the log is now in a problematic state with respect to on-disk metadata structures that might have a larger LSN. Until either the log catches up to the highest previously used metadata LSN or each affected data structure is modified and written out without incident (which resets the metadata LSN), log recovery is susceptible to filesystem corruption. Going foward, this problem is primarily addressed in the associated userspace tools. The kernel is still responsible to detect the problem and notify the user that something is wrong. Update the kernel to verify metadata LSNs against the current log in the associated read/write verifier helper functions. If a metadata LSN is ahead of the current LSN, fire a warning about the problem and trigger a verifier error. XXX: - The WARN_ONCE() mechanism seems pointless if we always trigger verifier errors. The failure is going to be noisy and hard and not warning just removes useful information about the problem. I'm also not a fan of causing the subsequent fs shutdown for something that is not a severe, unrecoverable error. Perhaps we should not fail the verifier and replace the WARN_ONCE() with a mechanism that fires a warning every so often (once per-day per-fs?). Thoughts? Signed-off-by: Brian Foster --- This is an RFC as this is only lightly tested so far. I'm not quite sure verifier failure is the right thing to do (see above). Finally, this depends on the existence of a not yet available mechanism to resolve the problem. I'm posting this for further discussion and to serve as a basis for the associated userspace patches that are forthcoming. Thoughts, reviews, flames appreciated. Brian fs/xfs/libxfs/xfs_alloc.c | 10 +++++++-- fs/xfs/libxfs/xfs_attr_leaf.c | 3 +++ fs/xfs/libxfs/xfs_btree.c | 18 +++++++++++++-- fs/xfs/libxfs/xfs_da_btree.c | 3 +++ fs/xfs/libxfs/xfs_dir2_block.c | 2 ++ fs/xfs/libxfs/xfs_dir2_data.c | 2 ++ fs/xfs/libxfs/xfs_dir2_leaf.c | 2 ++ fs/xfs/libxfs/xfs_dir2_node.c | 2 ++ fs/xfs/libxfs/xfs_ialloc.c | 9 ++++++-- fs/xfs/libxfs/xfs_sb.c | 9 ++++++++ fs/xfs/libxfs/xfs_symlink_remote.c | 3 +++ fs/xfs/xfs_log_recover.c | 15 ++++++++++++- fs/xfs/xfs_mount.c | 46 ++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_mount.h | 2 ++ 14 files changed, 119 insertions(+), 7 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index ffad7f2..8628225 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -468,6 +468,8 @@ xfs_agfl_verify( return false; if (be32_to_cpu(agfl->agfl_magicnum) != XFS_AGFL_MAGIC) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(XFS_BUF_TO_AGFL(bp)->agfl_lsn))) + return false; /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't @@ -2259,9 +2261,13 @@ xfs_agf_verify( { struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); - if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid)) return false; + if (!xfs_valid_lsn(mp, + be64_to_cpu(XFS_BUF_TO_AGF(bp)->agf_lsn))) + return false; + } if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 33df52d..dcb30d4 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -266,6 +266,9 @@ xfs_attr3_leaf_verify( return false; if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) return false; + + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->info.lsn))) + return false; } else { if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) return false; diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index f7d7ee7..4be8053 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -243,8 +243,15 @@ bool xfs_btree_lblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) { + if (!xfs_valid_lsn(mp, be64_to_cpu(block->bb_u.l.bb_lsn))) + return false; + return xfs_buf_verify_cksum(bp, XFS_BTREE_LBLOCK_CRC_OFF); + } return true; } @@ -275,8 +282,15 @@ bool xfs_btree_sblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) { + if (!xfs_valid_lsn(mp, be64_to_cpu(block->bb_u.s.bb_lsn))) + return false; + return xfs_buf_verify_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF); + } return true; } diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index cd2201f..7ce7354 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -150,6 +150,9 @@ xfs_da3_node_verify( return false; if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) return false; + + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->info.lsn))) + return false; } else { if (ichdr.magic != XFS_DA_NODE_MAGIC) return false; diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c index 4778d1d..1b37f6d 100644 --- a/fs/xfs/libxfs/xfs_dir2_block.c +++ b/fs/xfs/libxfs/xfs_dir2_block.c @@ -71,6 +71,8 @@ xfs_dir3_block_verify( return false; if (be64_to_cpu(hdr3->blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->lsn))) + return false; } else { if (hdr3->magic != cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) return false; diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index 824131e..3632703 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c @@ -224,6 +224,8 @@ xfs_dir3_data_verify( return false; if (be64_to_cpu(hdr3->blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->lsn))) + return false; } else { if (hdr3->magic != cpu_to_be32(XFS_DIR2_DATA_MAGIC)) return false; diff --git a/fs/xfs/libxfs/xfs_dir2_leaf.c b/fs/xfs/libxfs/xfs_dir2_leaf.c index f300240..1072b7d 100644 --- a/fs/xfs/libxfs/xfs_dir2_leaf.c +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c @@ -164,6 +164,8 @@ xfs_dir3_leaf_verify( return false; if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(leaf3->info.lsn))) + return false; } else { if (leaf->hdr.info.magic != cpu_to_be16(magic)) return false; diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c index cc28e92..9131c3b 100644 --- a/fs/xfs/libxfs/xfs_dir2_node.c +++ b/fs/xfs/libxfs/xfs_dir2_node.c @@ -97,6 +97,8 @@ xfs_dir3_free_verify( return false; if (be64_to_cpu(hdr3->blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->lsn))) + return false; } else { if (hdr->magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)) return false; diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 54deb2d..c426438 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2500,9 +2500,14 @@ xfs_agi_verify( struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); - if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid)) + return false; + if (!xfs_valid_lsn(mp, + be64_to_cpu(XFS_BUF_TO_AGI(bp)->agi_lsn))) return false; + } + /* * Validate the magic number of the agi block. */ diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 4742514..c4fe6f1 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -163,6 +163,15 @@ xfs_mount_validate_sb( "Filesystem can not be safely mounted by this kernel."); return -EINVAL; } + } else if (xfs_sb_version_hascrc(sbp)) { + /* + * We can't read verify the sb LSN because the read verifier is + * called before the log is allocated and processed. We know the + * log is set up before write verifier (!check_version) calls, + * so just check it here. + */ + if (!xfs_valid_lsn(mp, sbp->sb_lsn)) + return -EINVAL; } if (xfs_sb_version_has_pquotino(sbp)) { diff --git a/fs/xfs/libxfs/xfs_symlink_remote.c b/fs/xfs/libxfs/xfs_symlink_remote.c index 8f8af05..1362190 100644 --- a/fs/xfs/libxfs/xfs_symlink_remote.c +++ b/fs/xfs/libxfs/xfs_symlink_remote.c @@ -60,6 +60,7 @@ xfs_symlink_hdr_set( if (!xfs_sb_version_hascrc(&mp->m_sb)) return 0; + memset(dsl, 0, sizeof(struct xfs_dsymlink_hdr)); dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); dsl->sl_offset = cpu_to_be32(offset); dsl->sl_bytes = cpu_to_be32(size); @@ -116,6 +117,8 @@ xfs_symlink_verify( return false; if (dsl->sl_owner == 0) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(dsl->sl_lsn))) + return false; return true; } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 512a094..fe25e53 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4609,9 +4609,22 @@ xlog_recover( int error; /* find the tail of the log */ - if ((error = xlog_find_tail(log, &head_blk, &tail_blk))) + error = xlog_find_tail(log, &head_blk, &tail_blk); + if (error) return error; + /* + * The superblock was read before the log was available and thus the LSN + * could not be verified. Check the superblock LSN against the current + * LSN now that it's known. + */ + if (xfs_sb_version_hascrc(&log->l_mp->m_sb) && + !xfs_valid_lsn(log->l_mp, log->l_mp->m_sb.sb_lsn)) { + xfs_warn(log->l_mp, + "Invalid superblock LSN (ahead of log). Please run xfs_repair."); + return -EINVAL; + } + if (tail_blk != head_blk) { /* There used to be a comment here: * diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index bf92e0c..45ed63d 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -41,6 +41,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_sysfs.h" +#include "xfs_log_priv.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -1301,3 +1302,48 @@ xfs_dev_is_read_only( } return 0; } + +/* + * Verify that an LSN stamped into a piece of metadata is valid. This is + * intended for use in read verifiers on v5 superblocks. Returns true for a + * valid LSN, false otherwise. + */ +bool +xfs_valid_lsn( + struct xfs_mount *mp, + xfs_lsn_t lsn) +{ + struct xlog *log = mp->m_log; + int cycle = CYCLE_LSN(lsn); + int block = BLOCK_LSN(lsn); + bool valid = true; + + /* + * 'norecovery' mode skips mount-time log processing and unconditionally + * resets the LSN. + */ + if (mp->m_flags & XFS_MOUNT_NORECOVERY) + return valid; + + /* + * The LSN is valid so long as it is behind the current LSN. If it + * isn't, this means that the next log record that includes this + * metadata could have a smaller LSN. In turn, this means that the + * modification in the log would not replay. + */ + if (cycle > log->l_curr_cycle) + valid = false; + else if (cycle == log->l_curr_cycle && + block > log->l_curr_block) + valid = false; + + /* + * XXX: is WARN_ONCE() appropriate? This is a per-fs state after all... + */ + WARN_ONCE(!valid, + "%s: Metadata has LSN (%d:%d) ahead of current LSN (%d:%d). " + "Please unmount and run xfs_repair to resolve.", mp->m_fsname, + cycle, block, log->l_curr_cycle, log->l_curr_block); + + return valid; +} diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 7999e91..156567d 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -336,4 +336,6 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); extern void xfs_set_low_space_thresholds(struct xfs_mount *); +extern bool xfs_valid_lsn(struct xfs_mount *, xfs_lsn_t); + #endif /* __XFS_MOUNT_H__ */ -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B820F7F37 for ; Fri, 28 Aug 2015 13:06:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2BC68F8035 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04cbb07cbdf4e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KfYPLfO346HaV7UB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 3B375C1A4B29 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6mLV003649 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9AA02123E8A; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/9] xfsprogs: handle the log correctly on v5 supers Date: Fri, 28 Aug 2015 14:06:38 -0400 X-ASG-Orig-Subj: [PATCH 0/9] xfsprogs: handle the log correctly on v5 supers Message-Id: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's a first pass at a series to address the problem of repair putting the current LSN behind existing metadata LSNs via log zeroing. The goal is to detect when the current LSN is behind the maximum used metadata LSN in the fs, for whatever reason, and reformat the log with a higher cycle number when necessary. This is only lightly tested so far. Patch 1 is a backport of the recently posted kernel patch with the validation helper stubbed out. Patch 2 fills in the validation helper to implement max metadata LSN tracking. Patches 3-5 clean up the record logging code and add the ability to format the log to an arbitrary cycle number. Patches 6-8 update xfs_repair to detect an improper current LSN and reformat the log when necessary. Patch 9 updates xfs_repair to no longer zero the log by default in phase 2. Some notes: - This series currently only considers xfs_repair. Other utilities might have to be updated to handle the same problem. - Right now this only uses verifiers for max metadata LSN tracking. I don't believe this covers physical inodes, perhaps other data structures..? Thoughts, reviews, flames appreciated. Brian Brian Foster (9): xfs: validate metadata LSNs against log on v5 superblocks libxfs: track largest metadata LSN in use via verifiers libxfs: don't hardcode cycle 1 into unmount op header libxfs: pass lsn param to log clear and record header logging helpers libxfs: add ability to clear log to arbitrary log cycle xfs_repair: track log state throughout all recovery phases xfs_repair: process the log in no_modify mode xfs_repair: format the log with forward cycle number on v5 supers xfs_repair: don't clear the log by default copy/xfs_copy.c | 4 +- db/sb.c | 2 +- include/libxfs.h | 13 ++++-- include/xfs_mount.h | 6 +++ libxfs/libxfs_priv.h | 2 + libxfs/rdwr.c | 106 ++++++++++++++++++++++++++++++++++++++------ libxfs/util.c | 40 +++++++++++++++++ libxfs/xfs_alloc.c | 10 ++++- libxfs/xfs_attr_leaf.c | 3 ++ libxfs/xfs_btree.c | 18 +++++++- libxfs/xfs_da_btree.c | 3 ++ libxfs/xfs_dir2_block.c | 2 + libxfs/xfs_dir2_data.c | 2 + libxfs/xfs_dir2_leaf.c | 2 + libxfs/xfs_dir2_node.c | 2 + libxfs/xfs_ialloc.c | 9 +++- libxfs/xfs_sb.c | 9 ++++ libxfs/xfs_symlink_remote.c | 3 ++ mkfs/xfs_mkfs.c | 2 +- repair/phase2.c | 83 ++++++++++++++++++++++------------ repair/xfs_repair.c | 78 ++++++++++++++++++++++++++++++-- 21 files changed, 339 insertions(+), 60 deletions(-) -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 272867F3F for ; Fri, 28 Aug 2015 13:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E18538F8035 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04bdf02398e8fc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TZIIbAxHRdPiUt8u (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id C8F3C8CF6E for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nHX027619 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EBEA1123ECE; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 5/9] libxfs: add ability to clear log to arbitrary log cycle Date: Fri, 28 Aug 2015 14:06:43 -0400 X-ASG-Orig-Subj: [PATCH 5/9] libxfs: add ability to clear log to arbitrary log cycle Message-Id: <1440785207-17543-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The libxfs_log_clear() helper currently zeroes the log and writes a single log record such that the kernel code detects the log has been zeroed and mounts successfully. This is not sufficient for v5 filesystems, which must have the log cleared to an LSN that is guaranteed to be ahead of any LSN that has been previously stamped into on-disk metadata. Update libxfs_log_clear() to support the ability to format the log to an arbitrary cycle number. First, the log is physically zeroed. A log record is written to the first block of the log with the desired lsn and refers to the tail_lsn as the last record of the previous cycle. The rest of the log is filled with log records of the previous cycle. This causes the kernel to set the current LSN to start of the desired cycle number at mount time. Signed-off-by: Brian Foster --- libxfs/rdwr.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 9cd7f3d..8b6ded2 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -155,26 +155,81 @@ libxfs_log_clear( xfs_buf_t *bp; int len; xfs_lsn_t lsn; + xfs_lsn_t tail_lsn; + xfs_daddr_t blk; + xfs_daddr_t end_blk; if (!btp->dev || !fs_uuid) return -EINVAL; - if (cycle != XLOG_INIT_CYCLE) + if (cycle < XLOG_INIT_CYCLE) return -EINVAL; - lsn = xlog_assign_lsn(cycle, 0); - /* first zero the log */ libxfs_device_zero(btp, start, length); - /* then write a log record header */ + /* + * Initialize the log record length and LSNs. XLOG_INIT_CYCLE is a + * special reset case where we only write a single record where the lsn + * and tail_lsn match. Otherwise, the record lsn starts at block 0 of + * the specified cycle and points tail_lsn at the last record of the + * previous cycle. + */ len = ((version == 2) && sunit) ? BTOBB(sunit) : 2; len = MAX(len, 2); + lsn = xlog_assign_lsn(cycle, 0); + if (cycle == XLOG_INIT_CYCLE) + tail_lsn = lsn; + else + tail_lsn = xlog_assign_lsn(cycle - 1, length - len); + + /* write out the first log record */ bp = libxfs_getbufr(btp, start, len); - libxfs_log_header(XFS_BUF_PTR(bp), fs_uuid, version, sunit, fmt, lsn, - lsn, next, bp); + libxfs_log_header(XFS_BUF_PTR(bp), fs_uuid, version, sunit, fmt, + lsn, tail_lsn, next, bp); bp->b_flags |= LIBXFS_B_DIRTY; libxfs_putbufr(bp); + + /* + * There's nothing else to do if this is a log reset. The kernel detects + * the rest of the log is zeroed and starts at cycle 1. + */ + if (cycle == XLOG_INIT_CYCLE) + return 0; + + /* + * Otherwise, fill everything beyond the initial record with records of + * the previous cycle so the kernel head/tail detection works correctly. + * + * We don't particularly care about the record size or content here. + * It's only important that the headers are in place such that the + * kernel finds 1.) a clean log and 2.) the correct current cycle value. + * Therefore, bump up the record size to the max to use larger I/Os and + * improve performance. + */ + cycle--; + blk = start + len; + end_blk = start + length; + + len = min(end_blk - blk, BTOBB(BDSTRAT_SIZE)); + while (blk < end_blk) { + lsn = xlog_assign_lsn(cycle, blk - start); + tail_lsn = xlog_assign_lsn(cycle, blk - start - len); + + bp = libxfs_getbufr(btp, blk, len); + /* + * Note: pass the full buffer length as the sunit to initialize + * the entire buffer. + */ + libxfs_log_header(XFS_BUF_PTR(bp), fs_uuid, version, BBTOB(len), + fmt, lsn, tail_lsn, next, bp); + bp->b_flags |= LIBXFS_B_DIRTY; + libxfs_putbufr(bp); + + len = min(end_blk - blk, BTOBB(BDSTRAT_SIZE)); + blk += len; + } + return 0; } -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2EFB57F4E for ; Fri, 28 Aug 2015 13:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D4618F804B for ; Fri, 28 Aug 2015 11:06:51 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04cbb07cbef4e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id soTbzx8Cqk8YkJA3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id C4B028CF66 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6njj003662 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 171C2123EE2; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 7/9] xfs_repair: process the log in no_modify mode Date: Fri, 28 Aug 2015 14:06:45 -0400 X-ASG-Orig-Subj: [PATCH 7/9] xfs_repair: process the log in no_modify mode Message-Id: <1440785207-17543-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785210 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_repair does not zero the log in no_modify mode. In doing so, it also skips the function that scans the log, locates the head/tail blocks and sets the current LSN. Now that the log state is used beyond phase 2, the log scan must occur regardless of whether no_modify mode is enabled or not. Update phase 2 to always execute the log scanning code. Push down the no_modify checks into the log clearing helper such that the log is still not modified in no_modify mode. Signed-off-by: Brian Foster --- repair/phase2.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/repair/phase2.c b/repair/phase2.c index 11504e3..72132ce 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -75,7 +75,7 @@ zero_log(xfs_mount_t *mp) _("zero_log: head block %" PRId64 " tail block %" PRId64 "\n"), head_blk, tail_blk); } - if (head_blk != tail_blk) { + if (!no_modify && head_blk != tail_blk) { if (zap_log) { do_warn(_( "ALERT: The filesystem has valuable metadata changes in a log which is being\n" @@ -93,6 +93,9 @@ zero_log(xfs_mount_t *mp) } } + if (no_modify) + return; + libxfs_log_clear(log->l_dev, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), &mp->m_sb.sb_uuid, @@ -136,10 +139,8 @@ phase2( do_log(_("Phase 2 - using internal log\n")); /* Zero log if applicable */ - if (!no_modify) { - do_log(_(" - zero log...\n")); - zero_log(mp); - } + do_log(_(" - zero log...\n")); + zero_log(mp); do_log(_(" - scan filesystem freespace and inode maps...\n")); -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4272E7F50 for ; Fri, 28 Aug 2015 13:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 01FEB8F8049 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04bdf02397e8fc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BTQs5IMobYxAnXVh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id CCD72C1A4B23 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nGk006116 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E16CF123EB6; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 6/9] xfs_repair: track log state throughout all recovery phases Date: Fri, 28 Aug 2015 14:06:44 -0400 X-ASG-Orig-Subj: [PATCH 6/9] xfs_repair: track log state throughout all recovery phases Message-Id: <1440785207-17543-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_repair examines and clears the log in phase 2. Phase 2 acquires the log state in local data structures that are lost upon phase exit. v5 filesystems require that the log is formatted with a higher cycle number after the fs is repaired. This requires assessment of the log state to determine whether a reformat is necessary. Rather than duplicate the log processing code, update phase 2 to populate a globally available log data structure. Add a log pointer to xfs_mount, as exists in kernel space, that repair uses to store a reference to the log that is available to various phases. Note that this patch simply plumbs through the global log data structure and does not change behavior in any way. Signed-off-by: Brian Foster --- include/xfs_mount.h | 6 ++++++ repair/phase2.c | 34 +++++++++++++++++++--------------- repair/xfs_repair.c | 8 +++++++- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/include/xfs_mount.h b/include/xfs_mount.h index ed897a2..5ec6866 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -98,6 +98,12 @@ typedef struct xfs_mount { int qi_dqperchunk; } *m_quotainfo; + /* + * xlog is defined in libxlog and thus is not intialized by libxfs. This + * allows an application to initialize and store a reference to the log + * if warranted. + */ + struct xlog *m_log; } xfs_mount_t; /* diff --git a/repair/phase2.c b/repair/phase2.c index 0673a0c..11504e3 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -39,33 +39,33 @@ static void zero_log(xfs_mount_t *mp) { int error; - struct xlog log; xfs_daddr_t head_blk, tail_blk; + struct xlog *log = mp->m_log; - memset(&log, 0, sizeof(log)); + memset(log, 0, sizeof(struct xlog)); x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); x.lbsize = BBSIZE; if (xfs_sb_version_hassector(&mp->m_sb)) x.lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT); - log.l_dev = mp->m_logdev_targp; - log.l_logBBsize = x.logBBsize; - log.l_logBBstart = x.logBBstart; - log.l_sectBBsize = BTOBB(x.lbsize); - log.l_mp = mp; + log->l_dev = mp->m_logdev_targp; + log->l_logBBsize = x.logBBsize; + log->l_logBBstart = x.logBBstart; + log->l_sectBBsize = BTOBB(x.lbsize); + log->l_mp = mp; if (xfs_sb_version_hassector(&mp->m_sb)) { - log.l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; - ASSERT(log.l_sectbb_log <= mp->m_sectbb_log); + log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT; + ASSERT(log->l_sectbb_log <= mp->m_sectbb_log); /* for larger sector sizes, must have v2 or external log */ - ASSERT(log.l_sectbb_log == 0 || - log.l_logBBstart == 0 || + ASSERT(log->l_sectbb_log == 0 || + log->l_logBBstart == 0 || xfs_sb_version_haslogv2(&mp->m_sb)); ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT); } - log.l_sectbb_mask = (1 << log.l_sectbb_log) - 1; + log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1; - if ((error = xlog_find_tail(&log, &head_blk, &tail_blk))) { + if ((error = xlog_find_tail(log, &head_blk, &tail_blk))) { do_warn(_("zero_log: cannot find log head/tail " "(xlog_find_tail=%d), zeroing it anyway\n"), error); @@ -93,12 +93,16 @@ zero_log(xfs_mount_t *mp) } } - libxfs_log_clear(log.l_dev, - XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), + libxfs_log_clear(log->l_dev, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), &mp->m_sb.sb_uuid, xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1, mp->m_sb.sb_logsunit, XLOG_FMT, XLOG_INIT_CYCLE); + + /* update the log data structure with new state */ + error = xlog_find_tail(log, &head_blk, &tail_blk); + if (error || head_blk != tail_blk) + do_error(_("failed to clear log")); } /* diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 85a012b..0e80124 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -539,6 +539,7 @@ main(int argc, char **argv) xfs_dsb_t *dsb; xfs_buf_t *sbp; xfs_mount_t xfs_m; + struct xlog log = {0}; char *msgbuf; struct xfs_sb psb; int rval; @@ -620,7 +621,11 @@ main(int argc, char **argv) } } - /* prepare the mount structure */ + /* + * Prepare the mount structure. Point the log reference to our local + * copy so it's available to the various phases. The log bits are + * initialized in phase 2. + */ memset(&xfs_m, 0, sizeof(xfs_mount_t)); mp = libxfs_mount(&xfs_m, &psb, x.ddev, x.logdev, x.rtdev, 0); @@ -630,6 +635,7 @@ main(int argc, char **argv) progname); exit(1); } + mp->m_log = &log; /* * set XFS-independent status vars from the mount/sb structure -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 44D027F51 for ; Fri, 28 Aug 2015 13:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 124E98F8040 for ; Fri, 28 Aug 2015 11:06:51 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04bdf0239ae8fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CVYOcy5bgiKFphKh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id D39B28EB50 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nKV006118 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 069FA123EC8; Fri, 28 Aug 2015 14:06:48 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 8/9] xfs_repair: format the log with forward cycle number on v5 supers Date: Fri, 28 Aug 2015 14:06:46 -0400 X-ASG-Orig-Subj: [PATCH 8/9] xfs_repair: format the log with forward cycle number on v5 supers Message-Id: <1440785207-17543-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785210 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 v5 filesystems use the current LSN and the last modified LSN stored within fs metadata to provide correct log recovery ordering. xfs_repair historically clears the log in phase 2. This resets to the current LSN of the filesystem to the initial cycle, as if the fs was just created. This is problematic because the filesystem LSN is now behind many pre-existing metadata structures on-disk until either the current filesystem LSN catches up or those particular data structures are modified and written out. If a filesystem crash occurs in the meantime, log recovery can incorrectly skip log items and cause filesystem corruption. Update xfs_repair to check the maximum metadata LSN value against the current log state once the filesystem has been processed. If the maximum LSN exceeds the current LSN with respect to the log, reformat the log with a cycle number that exceeds that of the maximum LSN. Signed-off-by: Brian Foster --- repair/xfs_repair.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 0e80124..8285d9d 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -531,6 +531,63 @@ _("sb realtime summary inode %" PRIu64 " %sinconsistent with calculated value %u } +/* + * v5 superblock metadata track the LSN of last modification and thus require + * that the current LSN is always moving forward. The current LSN is reset if + * the log has been cleared, which puts the log behind parts of the filesystem + * on-disk and can disrupt log recovery. + * + * We have tracked the maximum LSN of every piece of metadata that has been read + * in via the read verifiers. Compare the max LSN with the log and if the log is + * behind, bump the cycle number and reformat the log. + */ +static void +format_log_max_lsn( + struct xfs_mount *mp) +{ + struct xlog *log = mp->m_log; + int max_cycle; + int max_block; + int new_cycle; + xfs_daddr_t logstart; + xfs_daddr_t logblocks; + int logversion; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + /* + * If the log is ahead of the highest metadata LSN we've seen, we're + * safe and there's nothing to do. + */ + max_cycle = CYCLE_LSN(libxfs_max_lsn); + max_block = BLOCK_LSN(libxfs_max_lsn); + if (max_cycle < log->l_curr_cycle || + (max_cycle == log->l_curr_cycle && max_block < log->l_curr_block)) + return; + + /* + * Going to the next cycle should be sufficient but we bump by a few + * counts to help cover any metadata LSNs we could have missed. + */ + new_cycle = max_cycle + 3; + logstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart); + logblocks = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); + logversion = xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1; + + do_warn(_("Maximum metadata LSN (%d:%d) is ahead of log (%d:%d).\n"), + max_cycle, max_block, log->l_curr_cycle, log->l_curr_block); + + if (no_modify) { + do_warn(_("Would format log to cycle %d.\n"), new_cycle); + return; + } + + do_warn(_("Format log to cycle %d.\n"), new_cycle); + libxfs_log_clear(log->l_dev, logstart, logblocks, &mp->m_sb.sb_uuid, + logversion, mp->m_sb.sb_logsunit, XLOG_FMT, new_cycle); +} + int main(int argc, char **argv) { @@ -896,6 +953,12 @@ _("Warning: project quota information would be cleared.\n" stop_progress_rpt(); if (no_modify) { + /* + * Warn if the current LSN is problematic and the log requires a + * reformat. + */ + format_log_max_lsn(mp); + do_log( _("No modify flag set, skipping filesystem flush and exiting.\n")); if (verbose) @@ -931,11 +994,14 @@ _("Note - stripe unit (%d) and width (%d) were copied from a backup superblock.\ libxfs_writebuf(sbp, 0); /* - * Done, flush all cached buffers and inodes. + * Done. Flush all cached buffers and inodes first to ensure all + * verifiers are run (where we discover the max metadata LSN), reformat + * the log if necessary and unmount. */ libxfs_bcache_flush(); - + format_log_max_lsn(mp); libxfs_umount(mp); + if (x.rtdev) libxfs_device_close(x.rtdev); if (x.logdev && x.logdev != x.ddev) -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7DEDF7F3F for ; Fri, 28 Aug 2015 13:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6AC218F8035 for ; Fri, 28 Aug 2015 11:06:51 -0700 (PDT) X-ASG-Debug-ID: 1440785210-04cbb07cbdf4e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QN01TTOcDh9Sr2Qu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id F20B3A2C36 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nIc024543 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 23960123ED7; Fri, 28 Aug 2015 14:06:48 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 9/9] xfs_repair: don't clear the log by default Date: Fri, 28 Aug 2015 14:06:47 -0400 X-ASG-Orig-Subj: [PATCH 9/9] xfs_repair: don't clear the log by default Message-Id: <1440785207-17543-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785210 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_repair currently clears the log regardless of whether it is corrupted, clean or contains data. This is traditionally harmless but now causes log recovery problems on v5 filesystems. v5 filesystems expect a clean log to always have an LSN out ahead of the maximum last modification LSN stamped on any bit of metadata throughout the fs. If this is not the case, repair must reformat the log with a larger cycle number after fs processing is complete. Given that unconditional log clearing actually introduces a filesystem inconsistency on v5 superblocks (that repair must subsequently recover from) and provides no tangible benefit for v4 filesystems that otherwise have a clean and covered log, it is more appropriate behavior to not clear the log by default. Update xfs_repair to always and only clear the log when the -L parameter is specified. Retain the existing logic to require -L or otherwise exit if the log appears to contain data. Adopt similar behavior if the log appears to be corrupted. Signed-off-by: Brian Foster --- repair/phase2.c | 60 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/repair/phase2.c b/repair/phase2.c index 72132ce..fe7ed2b 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -36,11 +36,13 @@ int xlog_recover_do_trans(struct xlog *log, xlog_recover_t *t, int p) } static void -zero_log(xfs_mount_t *mp) +zero_log( + struct xfs_mount *mp) { - int error; - xfs_daddr_t head_blk, tail_blk; - struct xlog *log = mp->m_log; + int error; + xfs_daddr_t head_blk; + xfs_daddr_t tail_blk; + struct xlog *log = mp->m_log; memset(log, 0, sizeof(struct xlog)); x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); @@ -65,10 +67,22 @@ zero_log(xfs_mount_t *mp) } log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1; - if ((error = xlog_find_tail(log, &head_blk, &tail_blk))) { - do_warn(_("zero_log: cannot find log head/tail " - "(xlog_find_tail=%d), zeroing it anyway\n"), + /* + * Find the log head and tail and alert the user to the situation if the + * log appears corrupted or contains data. In either case, we do not + * proceed past this point unless the user explicitly requests to zap + * the log. + */ + error = xlog_find_tail(log, &head_blk, &tail_blk); + if (error) { + do_warn( + _("zero_log: cannot find log head/tail (xlog_find_tail=%d)\n"), error); + if (!no_modify && !zap_log) + do_error(_( +"ERROR: The log head and/or tail cannot be discovered. Attempt to mount the\n" +"filesystem to replay the log or use the -L option to destroy the log and\n" +"attempt a repair.\n")); } else { if (verbose) { do_warn( @@ -93,19 +107,25 @@ zero_log(xfs_mount_t *mp) } } - if (no_modify) - return; - - libxfs_log_clear(log->l_dev, XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), - (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), - &mp->m_sb.sb_uuid, - xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1, - mp->m_sb.sb_logsunit, XLOG_FMT, XLOG_INIT_CYCLE); - - /* update the log data structure with new state */ - error = xlog_find_tail(log, &head_blk, &tail_blk); - if (error || head_blk != tail_blk) - do_error(_("failed to clear log")); + /* + * Only clear the log when explicitly requested. Doing so is unnecessary + * unless something is wrong. Further, this resets the current LSN of + * the filesystem and creates more work for repair of v5 superblock + * filesystems. + */ + if (!no_modify && zap_log) { + libxfs_log_clear(log->l_dev, + XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), + (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), + &mp->m_sb.sb_uuid, + xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1, + mp->m_sb.sb_logsunit, XLOG_FMT, XLOG_INIT_CYCLE); + + /* update the log data structure with new state */ + error = xlog_find_tail(log, &head_blk, &tail_blk); + if (error || head_blk != tail_blk) + do_error(_("failed to clear log")); + } } /* -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A6C327F3F for ; Fri, 28 Aug 2015 13:06:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 997C0304051 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04cbb07cbcf4e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EIoq19zH6UCLfBiD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 495FFA2C32 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6mN4007984 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AD784123E86; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/9] libxfs: track largest metadata LSN in use via verifiers Date: Fri, 28 Aug 2015 14:06:40 -0400 X-ASG-Orig-Subj: [PATCH 2/9] libxfs: track largest metadata LSN in use via verifiers Message-Id: <1440785207-17543-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The LSN validation helper is called in the I/O verifier codepath for metadata that embed a last-modification LSN. While the codepath exists, this is not used in userspace as in the kernel because the former doesn't have an active log. xfs_repair does need to check the validity of the LSN metadata with respect to the on-disk log, however. Use the LSN validation mechanism to track the largest LSN that has been seen. Export the value so repair can use it once it has processed the entire filesystem. Note that the helper continues to always return true to preserve existing behavior. Signed-off-by: Brian Foster --- include/libxfs.h | 1 + libxfs/util.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/libxfs.h b/include/libxfs.h index b1604e2..cc06fc6 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -134,6 +134,7 @@ typedef struct { #define LIBXFS_DIRECT 0x0020 /* can use direct I/O, not buffered */ extern char *progname; +extern xfs_lsn_t libxfs_max_lsn; extern int libxfs_init (libxfs_init_t *); extern void libxfs_destroy (void); extern int libxfs_device_to_fd (dev_t); diff --git a/libxfs/util.c b/libxfs/util.c index 96ce31f..0116e3d 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -733,13 +733,39 @@ xfs_verifier_error( /* * This is called from I/O verifiers on v5 superblock filesystems. In the * kernel, it validates the metadata LSN parameter against the current LSN of - * the active log. We don't have an active log in userspace, so just return + * the active log. We don't have an active log in userspace so always return * true. + * + * xfs_repair piggybacks off this mechanism to help track the largest metadata + * LSN in use on a filesystem. Keep a record of the largest LSN seen such that + * repair can validate it against the state of the log. */ +xfs_lsn_t libxfs_max_lsn = 0; +pthread_mutex_t libxfs_max_lsn_lock = PTHREAD_MUTEX_INITIALIZER; + bool xfs_valid_lsn( struct xfs_mount *mp, xfs_lsn_t lsn) { + int cycle = CYCLE_LSN(lsn); + int block = BLOCK_LSN(lsn); + int max_cycle; + int max_block; + + if (lsn == NULLCOMMITLSN) + return true; + + pthread_mutex_lock(&libxfs_max_lsn_lock); + + max_cycle = CYCLE_LSN(libxfs_max_lsn); + max_block = BLOCK_LSN(libxfs_max_lsn); + + if ((cycle > max_cycle) || + (cycle == max_cycle && block > max_block)) + libxfs_max_lsn = lsn; + + pthread_mutex_unlock(&libxfs_max_lsn_lock); + return true; } -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E24F07F60 for ; Fri, 28 Aug 2015 13:06:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B801D304051 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04bdf02399e8fc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dN5Dw4tZrijCwcmn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 7758FC1CAC9A for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nrR007988 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C69E5123E8C; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/9] libxfs: pass lsn param to log clear and record header logging helpers Date: Fri, 28 Aug 2015 14:06:42 -0400 X-ASG-Orig-Subj: [PATCH 4/9] libxfs: pass lsn param to log clear and record header logging helpers Message-Id: <1440785207-17543-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 In preparation to support the ability to format the log with an arbitrary cycle number, the log clear and record logging helpers must be updated to receive the desired cycle and LSN values as parameters. Update libxfs_log_clear() to receive the desired cycle number to format the log with. Define a preprocessor directive to represent the currently hardcoded case of cycle 1. Update libxfs_log_header() to receive the lsn and tail_lsn of the record to write. Use a NULL value LSN to represent the currently hardcoded behavior. All callers are updated to use the current default values. As such, this patch does not change behavior in any way. Signed-off-by: Brian Foster --- copy/xfs_copy.c | 4 ++-- db/sb.c | 2 +- include/libxfs.h | 12 ++++++++---- libxfs/rdwr.c | 26 ++++++++++++++++++++------ mkfs/xfs_mkfs.c | 2 +- repair/phase2.c | 2 +- 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 2f4f5cb..949be5f 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -1212,8 +1212,8 @@ write_log_header(int fd, wbuf *buf, xfs_mount_t *mp) offset = libxfs_log_header(p, &buf->owner->uuid, xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1, - mp->m_sb.sb_logsunit, XLOG_FMT, - next_log_chunk, buf); + mp->m_sb.sb_logsunit, XLOG_FMT, NULLCOMMITLSN, + NULLCOMMITLSN, next_log_chunk, buf); do_write(buf->owner); return roundup(logstart + offset, buf->length); diff --git a/db/sb.c b/db/sb.c index 598e787..560e653 100644 --- a/db/sb.c +++ b/db/sb.c @@ -278,7 +278,7 @@ sb_logzero(uuid_t *uuidp) (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), uuidp, xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1, - mp->m_sb.sb_logsunit, XLOG_FMT)) { + mp->m_sb.sb_logsunit, XLOG_FMT, XLOG_INIT_CYCLE)) { dbprintf(_("ERROR: cannot clear the log\n")); return 0; } diff --git a/include/libxfs.h b/include/libxfs.h index cc06fc6..6c87934 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -149,10 +149,14 @@ extern int platform_nproc(void); /* check or write log footer: specify device, log size in blocks & uuid */ typedef char *(libxfs_get_block_t)(char *, int, void *); -extern int libxfs_log_clear (struct xfs_buftarg *, xfs_daddr_t, uint, - uuid_t *, int, int, int); -extern int libxfs_log_header (char *, uuid_t *, int, int, int, - libxfs_get_block_t *, void *); +/* + * Helpers to clear the log to a particular log cycle. + */ +#define XLOG_INIT_CYCLE 1 +extern int libxfs_log_clear(struct xfs_buftarg *, xfs_daddr_t, uint, + uuid_t *, int, int, int, int); +extern int libxfs_log_header(char *, uuid_t *, int, int, int, xfs_lsn_t, + xfs_lsn_t, libxfs_get_block_t *, void *); /* Shared utility routines */ diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 3c0179f..9cd7f3d 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -149,14 +149,21 @@ libxfs_log_clear( uuid_t *fs_uuid, int version, int sunit, - int fmt) + int fmt, + int cycle) { xfs_buf_t *bp; int len; + xfs_lsn_t lsn; if (!btp->dev || !fs_uuid) return -EINVAL; + if (cycle != XLOG_INIT_CYCLE) + return -EINVAL; + + lsn = xlog_assign_lsn(cycle, 0); + /* first zero the log */ libxfs_device_zero(btp, start, length); @@ -164,8 +171,8 @@ libxfs_log_clear( len = ((version == 2) && sunit) ? BTOBB(sunit) : 2; len = MAX(len, 2); bp = libxfs_getbufr(btp, start, len); - libxfs_log_header(XFS_BUF_PTR(bp), - fs_uuid, version, sunit, fmt, next, bp); + libxfs_log_header(XFS_BUF_PTR(bp), fs_uuid, version, sunit, fmt, lsn, + lsn, next, bp); bp->b_flags |= LIBXFS_B_DIRTY; libxfs_putbufr(bp); return 0; @@ -178,6 +185,8 @@ libxfs_log_header( int version, int sunit, int fmt, + xfs_lsn_t lsn, + xfs_lsn_t tail_lsn, libxfs_get_block_t *nextfunc, void *private) { @@ -186,11 +195,16 @@ libxfs_log_header( __be32 cycle_lsn; int i, len; + if (lsn == NULLCOMMITLSN) + lsn = xlog_assign_lsn(XLOG_INIT_CYCLE, 0); + if (tail_lsn == NULLCOMMITLSN) + tail_lsn = lsn; + len = ((version == 2) && sunit) ? BTOBB(sunit) : 1; memset(p, 0, BBSIZE); head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM); - head->h_cycle = cpu_to_be32(1); + head->h_cycle = cpu_to_be32(CYCLE_LSN(lsn)); head->h_version = cpu_to_be32(version); if (len != 1) head->h_len = cpu_to_be32(sunit - BBSIZE); @@ -202,8 +216,8 @@ libxfs_log_header( head->h_fmt = cpu_to_be32(fmt); head->h_size = cpu_to_be32(XLOG_HEADER_CYCLE_SIZE); - head->h_lsn = cpu_to_be64(xlog_assign_lsn(1, 0)); - head->h_tail_lsn = cpu_to_be64(xlog_assign_lsn(1, 0)); + head->h_lsn = cpu_to_be64(lsn); + head->h_tail_lsn = cpu_to_be64(tail_lsn); memcpy(&head->h_fs_uuid, fs_uuid, sizeof(uuid_t)); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d993fc0..238d400 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2670,7 +2670,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), libxfs_log_clear(mp->m_logdev_targp, XFS_FSB_TO_DADDR(mp, logstart), (xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks), - &sbp->sb_uuid, logversion, lsunit, XLOG_FMT); + &sbp->sb_uuid, logversion, lsunit, XLOG_FMT, XLOG_INIT_CYCLE); mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 0); if (mp == NULL) { diff --git a/repair/phase2.c b/repair/phase2.c index 7e264c4..0673a0c 100644 --- a/repair/phase2.c +++ b/repair/phase2.c @@ -98,7 +98,7 @@ zero_log(xfs_mount_t *mp) (xfs_extlen_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks), &mp->m_sb.sb_uuid, xfs_sb_version_haslogv2(&mp->m_sb) ? 2 : 1, - mp->m_sb.sb_logsunit, XLOG_FMT); + mp->m_sb.sb_logsunit, XLOG_FMT, XLOG_INIT_CYCLE); } /* -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0EF4E7F37 for ; Fri, 28 Aug 2015 13:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EED488F8040 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04cbb07cbbf4e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9VdegGesLUnplbqv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 65BA3A2C33 for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nSN007986 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B9F3F123E97; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/9] xfs: validate metadata LSNs against log on v5 superblocks Date: Fri, 28 Aug 2015 14:06:39 -0400 X-ASG-Orig-Subj: [PATCH 1/9] xfs: validate metadata LSNs against log on v5 superblocks Message-Id: <1440785207-17543-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Backport of kernel commit. Replace xfs_valid_lsn() with stub. Signed-off-by: Brian Foster --- libxfs/libxfs_priv.h | 2 ++ libxfs/util.c | 14 ++++++++++++++ libxfs/xfs_alloc.c | 10 ++++++++-- libxfs/xfs_attr_leaf.c | 3 +++ libxfs/xfs_btree.c | 18 ++++++++++++++++-- libxfs/xfs_da_btree.c | 3 +++ libxfs/xfs_dir2_block.c | 2 ++ libxfs/xfs_dir2_data.c | 2 ++ libxfs/xfs_dir2_leaf.c | 2 ++ libxfs/xfs_dir2_node.c | 2 ++ libxfs/xfs_ialloc.c | 9 +++++++-- libxfs/xfs_sb.c | 9 +++++++++ libxfs/xfs_symlink_remote.c | 3 +++ 13 files changed, 73 insertions(+), 6 deletions(-) diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 2a8b850..d21e78e 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -506,4 +506,6 @@ void xfs_verifier_error(struct xfs_buf *bp); /* xfs_rtalloc.c */ int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t); +bool xfs_valid_lsn(struct xfs_mount *, xfs_lsn_t); + #endif /* __LIBXFS_INTERNAL_XFS_H__ */ diff --git a/libxfs/util.c b/libxfs/util.c index c9f9175..96ce31f 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -729,3 +729,17 @@ xfs_verifier_error( bp->b_error == -EFSBADCRC ? "CRC error" : "corruption", bp->b_bn, BBTOB(bp->b_length)); } + +/* + * This is called from I/O verifiers on v5 superblock filesystems. In the + * kernel, it validates the metadata LSN parameter against the current LSN of + * the active log. We don't have an active log in userspace, so just return + * true. + */ +bool +xfs_valid_lsn( + struct xfs_mount *mp, + xfs_lsn_t lsn) +{ + return true; +} diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 4f3008a..4a3df1f 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -464,6 +464,8 @@ xfs_agfl_verify( return false; if (be32_to_cpu(agfl->agfl_magicnum) != XFS_AGFL_MAGIC) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(XFS_BUF_TO_AGFL(bp)->agfl_lsn))) + return false; /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't @@ -2255,9 +2257,13 @@ xfs_agf_verify( { struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); - if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid)) return false; + if (!xfs_valid_lsn(mp, + be64_to_cpu(XFS_BUF_TO_AGF(bp)->agf_lsn))) + return false; + } if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index cc25068..ae49d7f 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -262,6 +262,9 @@ xfs_attr3_leaf_verify( return false; if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) return false; + + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->info.lsn))) + return false; } else { if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) return false; diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index a16ae7d..9c1296f 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -240,8 +240,15 @@ bool xfs_btree_lblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) { + if (!xfs_valid_lsn(mp, be64_to_cpu(block->bb_u.l.bb_lsn))) + return false; + return xfs_buf_verify_cksum(bp, XFS_BTREE_LBLOCK_CRC_OFF); + } return true; } @@ -272,8 +279,15 @@ bool xfs_btree_sblock_verify_crc( struct xfs_buf *bp) { - if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) { + if (!xfs_valid_lsn(mp, be64_to_cpu(block->bb_u.s.bb_lsn))) + return false; + return xfs_buf_verify_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF); + } return true; } diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index c874164..99a8ad7 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -146,6 +146,9 @@ xfs_da3_node_verify( return false; if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) return false; + + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->info.lsn))) + return false; } else { if (ichdr.magic != XFS_DA_NODE_MAGIC) return false; diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 489f301..567b5a4 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -68,6 +68,8 @@ xfs_dir3_block_verify( return false; if (be64_to_cpu(hdr3->blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->lsn))) + return false; } else { if (hdr3->magic != cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) return false; diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 0c9f529..58bbc80 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -222,6 +222,8 @@ xfs_dir3_data_verify( return false; if (be64_to_cpu(hdr3->blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->lsn))) + return false; } else { if (hdr3->magic != cpu_to_be32(XFS_DIR2_DATA_MAGIC)) return false; diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 80d03b3..37b9c4a 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -162,6 +162,8 @@ xfs_dir3_leaf_verify( return false; if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(leaf3->info.lsn))) + return false; } else { if (leaf->hdr.info.magic != cpu_to_be16(magic)) return false; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 0514cea..d03b7ff 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -95,6 +95,8 @@ xfs_dir3_free_verify( return false; if (be64_to_cpu(hdr3->blkno) != bp->b_bn) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(hdr3->lsn))) + return false; } else { if (hdr->magic != cpu_to_be32(XFS_DIR2_FREE_MAGIC)) return false; diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 93bfaea..6a0e4e2 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -2495,9 +2495,14 @@ xfs_agi_verify( struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_agi *agi = XFS_BUF_TO_AGI(bp); - if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid)) + if (xfs_sb_version_hascrc(&mp->m_sb)) { + if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid)) + return false; + if (!xfs_valid_lsn(mp, + be64_to_cpu(XFS_BUF_TO_AGI(bp)->agi_lsn))) return false; + } + /* * Validate the magic number of the agi block. */ diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index f944a58..97e2b66 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -161,6 +161,15 @@ xfs_mount_validate_sb( "Filesystem can not be safely mounted by this kernel."); return -EINVAL; } + } else if (xfs_sb_version_hascrc(sbp)) { + /* + * We can't read verify the sb LSN because the read verifier is + * called before the log is allocated and processed. We know the + * log is set up before write verifier (!check_version) calls, + * so just check it here. + */ + if (!xfs_valid_lsn(mp, sbp->sb_lsn)) + return -EINVAL; } if (xfs_sb_version_has_pquotino(sbp)) { diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index 7d46d9e..bb9f89f 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -57,6 +57,7 @@ xfs_symlink_hdr_set( if (!xfs_sb_version_hascrc(&mp->m_sb)) return 0; + memset(dsl, 0, sizeof(struct xfs_dsymlink_hdr)); dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); dsl->sl_offset = cpu_to_be32(offset); dsl->sl_bytes = cpu_to_be32(size); @@ -113,6 +114,8 @@ xfs_symlink_verify( return false; if (dsl->sl_owner == 0) return false; + if (!xfs_valid_lsn(mp, be64_to_cpu(dsl->sl_lsn))) + return false; return true; } -- 2.1.0 From bfoster@redhat.com Fri Aug 28 13:06:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7D9347F3F for ; Fri, 28 Aug 2015 13:06:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB86FAC003 for ; Fri, 28 Aug 2015 11:06:50 -0700 (PDT) X-ASG-Debug-ID: 1440785209-04cb6c4a2ade0d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dSjrBYLaWR7ULFMK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Aug 2015 11:06:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (Postfix) with ESMTPS id 6DEC48F2ED for ; Fri, 28 Aug 2015 18:06:49 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7SI6nXB027615 for ; Fri, 28 Aug 2015 14:06:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D2F1E123EBD; Fri, 28 Aug 2015 14:06:47 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/9] libxfs: don't hardcode cycle 1 into unmount op header Date: Fri, 28 Aug 2015 14:06:41 -0400 X-ASG-Orig-Subj: [PATCH 3/9] libxfs: don't hardcode cycle 1 into unmount op header Message-Id: <1440785207-17543-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1440785207-17543-1-git-send-email-bfoster@redhat.com> References: <1440785207-17543-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1440785209 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The libxfs helper to write a log record after zeroing the log fills much of the record header and unmount record with dummy data. It also hardcodes the cycle number into the transaction oh_tid field as the kernel expects to find the cycle stamped at the top of each block and the original oh_tid value packed into h_cycle_data of the record header. The log clearing code requires the ability to format the log to an arbitrary cycle number to fix v5 superblock log recovery ordering problems. As a result, the unmount record helper must not hardcode a cycle of 1. Fix up libxfs_log_header() to pack the unmount record appropriately, as is already done for extra blocks that might exist beyond the record. Use h_cycle_data for the original 32-bit word of the log record data block and stamp the cycle number in its place. This allows unmount_record() to work for arbitrary cycle numbers and libxfs_log_header() to pack a cycle value that matches the lsn used in the record header. Note that this patch does not change behavior as the lsn is still hardcoded to (1:0). Signed-off-by: Brian Foster --- libxfs/rdwr.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 4f8212f..3c0179f 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -122,7 +122,7 @@ static void unmount_record(void *p) } magic = { XLOG_UNMOUNT_TYPE, 0, 0 }; memset(p, 0, BBSIZE); - op->oh_tid = cpu_to_be32(1); + op->oh_tid = cpu_to_be32(0xb0c0d0d0); op->oh_len = cpu_to_be32(sizeof(magic)); op->oh_clientid = XFS_LOG; op->oh_flags = XLOG_UNMOUNT_TRANS; @@ -188,10 +188,6 @@ libxfs_log_header( len = ((version == 2) && sunit) ? BTOBB(sunit) : 1; - /* note that oh_tid actually contains the cycle number - * and the tid is stored in h_cycle_data[0] - that's the - * way things end up on disk. - */ memset(p, 0, BBSIZE); head->h_magicno = cpu_to_be32(XLOG_HEADER_MAGIC_NUM); head->h_cycle = cpu_to_be32(1); @@ -203,7 +199,6 @@ libxfs_log_header( head->h_crc = cpu_to_le32(0); head->h_prev_block = cpu_to_be32(-1); head->h_num_logops = cpu_to_be32(1); - head->h_cycle_data[0] = cpu_to_be32(0xb0c0d0d0); head->h_fmt = cpu_to_be32(fmt); head->h_size = cpu_to_be32(XLOG_HEADER_CYCLE_SIZE); @@ -212,11 +207,25 @@ libxfs_log_header( memcpy(&head->h_fs_uuid, fs_uuid, sizeof(uuid_t)); - len = MAX(len, 2); p = nextfunc(p, BBSIZE, private); unmount_record(p); + /* + * The kernel expects to see either a log record header magic or the LSN + * cycle at the top of every log block (for example, see + * xlog_[un]pack_data() and xlog_get_cycle()). Pack the unmount record + * block appropriately here. + */ cycle_lsn = CYCLE_LSN_DISK(head->h_lsn); + head->h_cycle_data[0] = *(__be32 *)p; + *(__be32 *)p = cycle_lsn; + + /* + * Now zero any remaining blocks in the record and stamp with the cycle. + * Note that we don't need to swap into h_cycle_data because it has + * already been initialized to zero. + */ + len = MAX(len, 2); for (i = 2; i < len; i++) { p = nextfunc(p, BBSIZE, private); memset(p, 0, BBSIZE); -- 2.1.0 From david@fromorbit.com Fri Aug 28 17:05:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CFAC07F37 for ; Fri, 28 Aug 2015 17:05:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AF5FB8F8049 for ; Fri, 28 Aug 2015 15:05:29 -0700 (PDT) X-ASG-Debug-ID: 1440799526-04cbb07cbbf9dc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Oe4lEBUeEwGdW8DJ for ; Fri, 28 Aug 2015 15:05:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B7DgCj2uBVPAUaLHldFoMFVGmqCAMBAQEGlXGFdQICAQECgTxNAQEBAQEBBwEBAQFAAT+EIwEBAQMBOhwjBQsIAxUDCSUPBSUDBxoTiCYHDsUdAQEBBwIBHxmGDoU7hQsHgxiBFAWVP4UGh2qCE5hXhDcsM4JNAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2015 07:34:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZVRlW-0003Jc-Fh; Sat, 29 Aug 2015 08:04:54 +1000 Date: Sat, 29 Aug 2015 08:04:54 +1000 From: Dave Chinner To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: <20150828220454.GC26895@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic References: <1440724990-25073-1-git-send-email-david@fromorbit.com> <20150828043253.GB26895@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1440799526 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22014 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0713 Custom rule MV0713 On Fri, Aug 28, 2015 at 08:11:20AM -0700, Sage Weil wrote: > Hi Dave, > > On Fri, 28 Aug 2015, Dave Chinner wrote: > > > > From: Dave Chinner > > > > Sage Weil reported that a ceph test workload was writing to the > > log on every fdatasync during an overwrite workload. Event tracing > > showed that the only metadata modification being made was the > > timestamp updates during the write(2) syscall, but fdatasync(2) > > is supposed to ignore them. The key observation was that the > > transactions in the log all looked like this: [....] > > --- > > Version 2: > > - include the hunk from fs/xfs/xfs_trans_inode.c that I missed > > when committing the patch locally the first time. > > I gave this a go on my machine but I'm still seeing the same symptom. OK, that implies the inode buffer has not been submitted for IO and so the inode is being held in "flushing" state for an extended period of time. > I've gathered the trace, strace, and other useful bits at > > http://newdream.net/~sage/drop/rocksdb.2/ > > This is pretty easy to reproduce with the ceph_test_keyvaluedb binary > (built on fedora 22), also in that dir: > > rm -rf kv_test_temp_dir/ > ./ceph_test_keyvaluedb --gtest_filter=KeyValueDB/KVTest.BenchCommit/1 I'll have a deeper look. Cheers, Dave. -- Dave Chinner david@fromorbit.com From drompri@mail.com Fri Aug 28 23:43:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D19257F37 for ; Fri, 28 Aug 2015 23:43:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C3C398F8035 for ; Fri, 28 Aug 2015 21:43:24 -0700 (PDT) X-ASG-Debug-ID: 1440823401-04cb6c4a2be9b70001-NocioJ Received: from xiyu.917778.com (xiyu.917778.com [89.46.100.232]) by cuda.sgi.com with ESMTP id bGG3S8qaTmJQYdd0 for ; Fri, 28 Aug 2015 21:43:22 -0700 (PDT) X-Barracuda-Envelope-From: drompri@mail.com X-Barracuda-Apparent-Source-IP: 89.46.100.232 To: xfs@oss.sgi.com Subject: Quick Question Message-ID: <3ff9c45fae08f63c60277859d044617d@thebaynet.com> X-ASG-Orig-Subj: Quick Question Date: Sat, 29 Aug 2015 06:44:04 +0200 From: "Larry North" Reply-To: wuyankunbb@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-RecptId: 10449103 X-Mailer-SID: 785 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: xiyu.917778.com[89.46.100.232] X-Barracuda-Start-Time: 1440823401 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22025 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hey there, Not sure if you got my last email but wanted to touch base again. I was wondering if you wanted to try our email marketing and lead generation solutions. We can help to grow your business fast by using our services. We have worked on a number of projects and campaigns, all our packages are tailor made and designed according to your requirements. If you are interested, I would be more than happy to reach out with more information and develop a plan that works with your business type. Thanks, Larry Contact: moriny@tom.com From drompri@mail.com Sat Aug 29 00:30:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4FD397F37 for ; Sat, 29 Aug 2015 00:30:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3365A30404E for ; Fri, 28 Aug 2015 22:30:36 -0700 (PDT) X-ASG-Debug-ID: 1440826232-04bdf02398f5ed0001-NocioJ Received: from xiyu.917778.com (xiyu.917778.com [89.46.100.232]) by cuda.sgi.com with ESMTP id g5edyW0esz8ywGgv for ; Fri, 28 Aug 2015 22:30:34 -0700 (PDT) X-Barracuda-Envelope-From: drompri@mail.com X-Barracuda-Apparent-Source-IP: 89.46.100.232 To: xfs@oss.sgi.com Subject: Quick Question Message-ID: <6771f1285fa664d7224e735b1b7f2f6e@westshorewindspirals.com> X-ASG-Orig-Subj: Quick Question Date: Sat, 29 Aug 2015 07:56:10 +0200 From: "Larry" Reply-To: wuyankunbb@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 43 X-Mailer-RecptId: 25520412 X-Mailer-SID: 821 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: xiyu.917778.com[89.46.100.232] X-Barracuda-Start-Time: 1440826232 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hey there, Not sure if you got my last email but wanted to touch base again. I was wondering if you wanted to try our email marketing and lead generation solutions. We can help to grow your business fast by using our services. We have worked on a number of projects and campaigns, all our packages are tailor made and designed according to your requirements. If you are interested, I would be more than happy to reach out with more information and develop a plan that works with your business type. Thanks, Larry Contact: moriny@tom.com From david@fromorbit.com Sat Aug 29 17:32:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C5F717F37 for ; Sat, 29 Aug 2015 17:32:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35E72AC002 for ; Sat, 29 Aug 2015 15:32:36 -0700 (PDT) X-ASG-Debug-ID: 1440887551-04cb6c4a2afbee0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 113KJ9ryCOs9omh3 for ; Sat, 29 Aug 2015 15:32:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BQEQB0MuJVPAUaLHlegxtUaal9DAEBAQEBAQaKWhSLCoV1AgIBAQKBIk0BAQEBAQEHAQEBAUABP4QkAQEEJxMcIxAIAxgJDA4LDwUlAwcaExuIEg69FQEBAQEBBQEBAQEBHRmGEIVCgm2BTAEBSwUHCoMOgRQFhyuOFoUHh2qBTUaHC4VWi3mCNRwWgVAsMwGBBAkXBIEkAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Aug 2015 08:01:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZVofE-000577-JG; Sun, 30 Aug 2015 08:31:56 +1000 Date: Sun, 30 Aug 2015 08:31:56 +1000 From: Dave Chinner To: Gavin Guo Cc: xfs@oss.sgi.com, linux-kernel Subject: Re: Possible memory allocation deadlock in kmem_alloc and hung task in xfs_log_commit_cil and xlog_cil_push Message-ID: <20150829223156.GD26895@dastard> X-ASG-Orig-Subj: Re: Possible memory allocation deadlock in kmem_alloc and hung task in xfs_log_commit_cil and xlog_cil_push References: <20150707233743.GZ7943@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1440887551 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 28, 2015 at 08:54:04PM +0800, Gavin Guo wrote: > On Wed, Jul 8, 2015 at 7:37 AM, Dave Chinner wrote: > > On Tue, Jul 07, 2015 at 05:29:43PM +0800, Gavin Guo wrote: > >> Hi all, > >> > >> Recently, we observed that there is the error message in > >> Ubuntu-3.13.0-48.80: > >> > >> "XFS: possible memory allocation deadlock in kmem_alloc (mode:0x8250)" > >> > >> repeatedly shows in the dmesg. Temporarily, our workaround is to tune the > >> parameters, such as, vfs_cache_pressure, min_free_kbytes, and dirty_ratio. > >> > >> And we also found that there are different error messages regarding the > >> hung tasks which happened in xfs_log_commit_cil and xlog_cil_push. > >> > >> The log is available at: http://paste.ubuntu.com/11835007/ > >> > >> The following link seems the same problem we suffered: > >> > >> XFS hangs with XFS: possible memory allocation deadlock in kmem_alloc > >> http://oss.sgi.com/archives/xfs/2015-03/msg00172.html > >> > >> I read the mail and found that there might be some modification regarding > >> to move the memory allocation outside the ctx lock. And I also read the > >> latest patch from February of 2015 to see if there is any new change > >> about that. Unfortunately, I didn't find anything regarding the change (may > >> be I'm not familiar with the XFS, so didn't find the commit). If it's > >> possible for someone who is familiar with the code to point out the commits > >> related to the bug if already exist or any status about the plan. > > > > No commits - the approach I thought we might be able to take to > > avoid the problem didn't work out. I have another idea of how we > > might solve the problem, but I haven't ad a chance to prototype it > > yet. > > I have read the code for a while and still can't figure out how to fix. > My current understanding is that the problem is Buddy system is running out > of memory so the XFS kmem_alloc(), > > called by xfs_log_commit_cil-> > xlog_cil_insert_items-> > xlog_cil_insert_format_items-> > kmem_zalloc, > > fail and stuck in the while loop and retry. There are also 2 other threads > running in the same time: > > 1). xfs_log_commit_cil->down_read(&cil->xc_ctx_lock); > > 2). xlog_cil_push->down_write(&cil->xc_ctx_lock); > > So, the both threads are blocked and waiting for the first kmem_zalloc() to > succeed. > > However, if there is a way to decrease the memory request or if it's > possible to elaborate more on the idea you mentioned. I know it's a > problem which cannot be solved in a short time. And I'd like to help if > there is any possibility. This is the patch I'm currently working on. It doesn't work completely yet, but it will give you an idea of how the problem needs tobe solved (read the big comment in the patch). -Dave. -- Dave Chinner david@fromorbit.com --- fs/xfs/xfs_buf_item.c | 1 + fs/xfs/xfs_dquot.c | 1 + fs/xfs/xfs_dquot_item.c | 2 + fs/xfs/xfs_extfree_item.c | 2 + fs/xfs/xfs_inode_item.c | 1 + fs/xfs/xfs_log_cil.c | 228 ++++++++++++++++++++++++++++++++++------------ 6 files changed, 177 insertions(+), 58 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 1816334..64cd236 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -831,6 +831,7 @@ xfs_buf_item_free( xfs_buf_log_item_t *bip) { xfs_buf_item_free_format(bip); + kmem_free(bip->bli_item->li_lv_shadow); kmem_zone_free(xfs_buf_item_zone, bip); } diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 4143dc7..b9e7dda 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -74,6 +74,7 @@ xfs_qm_dqdestroy( { ASSERT(list_empty(&dqp->q_lru)); + kmem_free(dqp->qli_item.li_lv_shadow); mutex_destroy(&dqp->q_qlock); kmem_zone_free(xfs_qm_dqzone, dqp); diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index 814cff9..2c7a162 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -370,6 +370,8 @@ xfs_qm_qoffend_logitem_committed( spin_lock(&ailp->xa_lock); xfs_trans_ail_delete(ailp, &qfs->qql_item, SHUTDOWN_LOG_IO_ERROR); + kmem_free(qfs->qql_item.li_lv_shadow); + kmem_free(lip->li_lv_shadow); kmem_free(qfs); kmem_free(qfe); return (xfs_lsn_t)-1; diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index adc8f8f..3842418 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -40,6 +40,7 @@ void xfs_efi_item_free( struct xfs_efi_log_item *efip) { + kmem_free(efip->efi_item.li_lv_shadow); if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS) kmem_free(efip); else @@ -329,6 +330,7 @@ static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) STATIC void xfs_efd_item_free(struct xfs_efd_log_item *efdp) { + kmem_free(efdp->efd_item.li_lv_shadow); if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS) kmem_free(efdp); else diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index bf13a5a..39ca237 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -577,6 +577,7 @@ void xfs_inode_item_destroy( xfs_inode_t *ip) { + kmem_free(ip->ili_item->li_lv_shadow); kmem_zone_free(xfs_ili_zone, ip->i_itemp); } diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index abc2ccb..ab4b98c 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -79,6 +79,145 @@ xlog_cil_init_post_recovery( log->l_cilp->xc_ctx->sequence = 1; } +static inline int +xlog_cil_iovec_space( + uint niovecs) +{ + return round_up((sizeof(struct xfs_log_vec) + + niovecs * sizeof(struct xfs_log_iovec)), + sizeof(uint64_t)); +} + +/* + * Allocate or pin log vector buffers for CIL insertion. + * + * The CIL currently uses disposable buffers for copying a snapshot of the + * modified items into the log during a push. The biggest problem with this is + * the requirement to allocate the disposable buffer during the commit if: + * a) does not exist; or + * b) it is too small + * + * If we do this allocation within xlog_cil_insert_format_items(), it is done + * under the xc_ctx_lock, which means that a CIL push cannot occur during + * the memory allocation. This means that we have a potential deadlock situation + * under low memory conditions when we have lots of dirty metadata pinned in + * the CIL and we need a CIL commit to occur to free memory. + * + * To avoid this, we need to move the memory allocation outside the + * xc_ctx_lock(), but because the log vector buffers are disposable, that opens + * up a TOCTOU race condition w.r.t. the CIL commiting and removing the log + * vector buffers between the check and the formatting of the item into the + * log vector buffer within the xc_ctx_lock. + * + * Because the log vector buffer needs to be unchanged during the CIL push + * process, we cannot share the buffer between the transaction commit (which + * modifies the buffer) and the CIL push context that is writing the changes + * into the log. This means skipping preallocation of buffer space is + * unreliable, but we most definitely do not want to be allocating and freeing + * buffers unnecessarily during commits when overwrites can be done safely. + * + * The simplest solution to this problem is to allocate a shadow buffer when a + * log item is committed for the second time, and then to only use this buffer + * if necessary. The buffer can remain attached to the log item until such time + * it is needed, and this is the buffer that is reallocated to match the size of + * the incoming modification. Then during the formatting of the item we can swap + * the active buffer with the new one if we can't reuse the existing buffer. We + * don't free the old buffer as it may be reused on the next modification if + * it's size is right, otherwise we'll free and reallocate it at that point. + * + * This function builds a vector for the changes in each log item in the + * transaction. It then works out the length of the buffer needed for each log + * item, allocates them and attaches the vector to the log item in preparation + * for the formatting step which occurs under the xc_ctx_lock. + * + * While this means the memory footprint goes up, it avoids the repeated + * alloc/free pattern that repeated modifications of an item would otherwise + * cause, and hence minimises the CPU overhead of such behaviour. + */ +static void +xfs_cil_item_alloc_shadow_lvbufs( + struct xlog *log, + struct xfs_trans *tp) +{ + list_for_each_entry(lidp, &tp->t_items, lid_trans) { + struct xfs_log_item *lip = lidp->lid_item; + struct xfs_log_vec *lv; + struct xfs_log_vec *old_lv; + int niovecs = 0; + int nbytes = 0; + int buf_size; + bool ordered = false; + + /* Skip items which aren't dirty in this transaction. */ + if (!(lidp->lid_flags & XFS_LID_DIRTY)) + continue; + + /* get number of vecs and size of data to be stored */ + lip->li_ops->iop_size(lip, &niovecs, &nbytes); + + /* + * Ordered items need to be tracked but we do not wish to write + * them. We need a logvec to track the object, but we do not + * need an iovec or buffer to be allocated for copying data. + */ + if (niovecs == XFS_LOG_VEC_ORDERED) { + ordered = true; + niovecs = 0; + nbytes = 0; + } + + /* + * We 64-bit align the length of each iovec so that the start + * of the next one is naturally aligned. We'll need to + * account for that slack space here. Then round nbytes up + * to 64-bit alignment so that the initial buffer alignment is + * easy to calculate and verify. + */ + nbytes += niovecs * sizeof(uint64_t); + nbytes = round_up(nbytes, sizeof(uint64_t)); + + /* grab the old item if it exists for reservation accounting */ + old_lv = lip->li_lv; + + /* + * The data buffer needs to start 64-bit aligned, so round up + * that space to ensure we can align it appropriately and not + * overrun the buffer. + */ + buf_size = nbytes + xlog_cil_iovec_space(niovecs); + + /* + * if we have no shadow buffer, or it is too small, we need to + * reallocate it. + */ + if (!lip->li_lv_shadow || + buf_size <= lip->li_lv_shadow->lv_size) { + + kmem_free(lip->li_lv_shadow); + + lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); + lv->lv_item = lip; + lv->lv_size = buf_size; + if (ordered) + lv->lv_buf_len = XFS_LOG_VEC_ORDERED; + else + lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; + lip->li_lv_shadow = lv; + } else { + /* same or smaller, optimise common overwrite case */ + lv = lip->li_lv_shadow; + } + + /* Ensure the lv is set up according to ->iop_size */ + lv->lv_niovecs = niovecs; + + /* The allocated data region lies beyond the iovec region */ + lv->lv_buf_len = 0; + lv->lv_bytes = 0; + lv->lv_buf = (char *)lv + xlog_cil_iovec_space(niovecs); + } + +} /* * Prepare the log item for insertion into the CIL. Calculate the difference in * log space and vectors it will consume, and if it is a new item pin it as @@ -101,7 +240,8 @@ xfs_cil_prepare_item( /* * If there is no old LV, this is the first time we've seen the item in * this CIL context and so we need to pin it. If we are replacing the - * old_lv, then remove the space it accounts for and free it. + * old_lv, then remove the space it accounts for and make it the shadow + * buffer for later freeing. */ if (!old_lv) lv->lv_item->li_ops->iop_pin(lv->lv_item); @@ -110,7 +250,7 @@ xfs_cil_prepare_item( *diff_len -= old_lv->lv_bytes; *diff_iovecs -= old_lv->lv_niovecs; - kmem_free(old_lv); + lip->li_lv_shadow = old_lv; } /* attach new log vector to log item */ @@ -134,11 +274,13 @@ xfs_cil_prepare_item( * write it out asynchronously without needing to relock the object that was * modified at the time it gets written into the iclog. * - * This function builds a vector for the changes in each log item in the - * transaction. It then works out the length of the buffer needed for each log - * item, allocates them and formats the vector for the item into the buffer. - * The buffer is then attached to the log item are then inserted into the - * Committed Item List for tracking until the next checkpoint is written out. + * This function takes the prepared log vectors attached to each log item, and + * formats the changes into the log vector buffer. The buffer it uses is + * dependent on the current state of the vector in the CIL - the shadow lv is + * guaranteed to be large enough for the current modification, but we will only + * use that if we can't reuse the existing lv. If we can't reuse the existing + * lv, then simple swap it out for the shadow lv. We don't free it - that is + * done lazily either by th enext modification or the freeing of the log item. * * We don't set up region headers during this process; we simply copy the * regions into the flat buffer. We can do this because we still have to do a @@ -171,7 +313,8 @@ xlog_cil_insert_format_items( list_for_each_entry(lidp, &tp->t_items, lid_trans) { struct xfs_log_item *lip = lidp->lid_item; struct xfs_log_vec *lv; - struct xfs_log_vec *old_lv; + struct xfs_log_vec *old_lv = NULL; + struct xfs_log_vec *shadow; int niovecs = 0; int nbytes = 0; int buf_size; @@ -181,49 +324,19 @@ xlog_cil_insert_format_items( if (!(lidp->lid_flags & XFS_LID_DIRTY)) continue; - /* get number of vecs and size of data to be stored */ - lip->li_ops->iop_size(lip, &niovecs, &nbytes); - - /* Skip items that do not have any vectors for writing */ - if (!niovecs) - continue; - /* - * Ordered items need to be tracked but we do not wish to write - * them. We need a logvec to track the object, but we do not - * need an iovec or buffer to be allocated for copying data. + * The formatting size information is already attached to + * the shadow lv on the log item. */ - if (niovecs == XFS_LOG_VEC_ORDERED) { + if (shadow->lv_buf_len == XFS_LOG_VEC_ORDERED) ordered = true; - niovecs = 0; - nbytes = 0; - } - /* - * We 64-bit align the length of each iovec so that the start - * of the next one is naturally aligned. We'll need to - * account for that slack space here. Then round nbytes up - * to 64-bit alignment so that the initial buffer alignment is - * easy to calculate and verify. - */ - nbytes += niovecs * sizeof(uint64_t); - nbytes = round_up(nbytes, sizeof(uint64_t)); - - /* grab the old item if it exists for reservation accounting */ - old_lv = lip->li_lv; - - /* - * The data buffer needs to start 64-bit aligned, so round up - * that space to ensure we can align it appropriately and not - * overrun the buffer. - */ - buf_size = nbytes + - round_up((sizeof(struct xfs_log_vec) + - niovecs * sizeof(struct xfs_log_iovec)), - sizeof(uint64_t)); + /* Skip items that do not have any vectors for writing */ + if (!shadow->lv_niovecs && !ordered) + continue; /* compare to existing item size */ - if (lip->li_lv && buf_size <= lip->li_lv->lv_size) { + if (lip->li_lv && shadow->lv_size <= lip->li_lv->lv_size) { /* same or smaller, optimise common overwrite case */ lv = lip->li_lv; lv->lv_next = NULL; @@ -237,29 +350,28 @@ xlog_cil_insert_format_items( */ *diff_iovecs -= lv->lv_niovecs; *diff_len -= lv->lv_bytes; + + /* Ensure the lv is set up according to ->iop_size */ + lv->lv_niovecs = shadow->lv_niovecs; + + /* reset the lv buffer information for new formatting */ + lv->lv_buf_len = 0; + lv->lv_bytes = 0; + lv->lv_buf = (char *)lv + + xlog_cil_iovec_space(lv->lv_niovecs) } else { - /* allocate new data chunk */ - lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); + /* switch to shadow buffer! */ + lv = shadow; lv->lv_item = lip; - lv->lv_size = buf_size; + old_lv = lip->li_lv; if (ordered) { /* track as an ordered logvec */ ASSERT(lip->li_lv == NULL); - lv->lv_buf_len = XFS_LOG_VEC_ORDERED; goto insert; } - lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; } - /* Ensure the lv is set up according to ->iop_size */ - lv->lv_niovecs = niovecs; - - /* The allocated data region lies beyond the iovec region */ - lv->lv_buf_len = 0; - lv->lv_bytes = 0; - lv->lv_buf = (char *)lv + buf_size - nbytes; ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t))); - lip->li_ops->iop_format(lip, lv); insert: ASSERT(lv->lv_buf_len <= nbytes); From weird.ab.trick-xfs=oss.sgi.com@idebath.com Sun Aug 30 02:54:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_IMAGE_ONLY_32, HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A80F7F47 for ; Sun, 30 Aug 2015 02:54:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B7B56AC009 for ; Sun, 30 Aug 2015 00:54:08 -0700 (PDT) X-ASG-Debug-ID: 1440921245-04bdf02397110a00003-NocioJ Received: from mail.idebath.com ([63.223.69.235]) by cuda.sgi.com with ESMTP id TJLzA0OMxlSQPbb9 for ; Sun, 30 Aug 2015 00:54:07 -0700 (PDT) X-Barracuda-Envelope-From: weird.ab.trick-xfs=oss.sgi.com@idebath.com X-Barracuda-Apparent-Source-IP: 63.223.69.235 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=idebath.com; h=Date:From:To:Subject:MIME-Version:Content-Type:Message-ID; i=weird.ab.trick@idebath.com; bh=9xvbP0uDzre5djtIxJ7Ff7p3uKs=; b=OnYhqN0PE3uCFoaq751sEv9Z4RVDd7FryOKHauP9oos+Jji5Ci1xhl3gQNWSjd2SwmkShQmfLn1l 3t5T4ve3tKlli4hMEnGPjcwfAUfF44YDdr767L8qI2YZV4Ff3jgp2DX6dWsgNnIjw4ldlX73tSU3 OqB3tU0ICvYKdBcjFCU= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=idebath.com; b=eu2meDtGIfZiqkokIKfv+EV+09+2etxJMUbns4GhsttrA3A/num5DYyp/62wZgtZ92bgVUDFu9gd KYl11HX991G6+BgT73K/o2/Kmji74KzPuD0id585tocPytTaQrcnjgPZHP1/HgogJzHWOdH9vbnN LOmBrg6wgC90KODt6Sw=; Received: by mail.idebath.com id hsar9u0001gq for ; Sun, 30 Aug 2015 00:41:45 -0700 (envelope-from ) Date: Sun, 30 Aug 2015 00:41:45 -0700 From: "Weird Ab Trick" To: Subject: 23-Sec exercise ACTIVATES your core and shrinks your waistline FAST MIME-Version: 1.0 X-ASG-Orig-Subj: 23-Sec exercise ACTIVATES your core and shrinks your waistline FAST Content-Type: multipart/alternative; boundary="----=_Part_4354_155782021.1440919075526" Message-ID: <0.0.0.5C2.1D0E2F7520108D4.21E44F@mail.idebath.com> X-Barracuda-Connect: UNKNOWN[63.223.69.235] X-Barracuda-Start-Time: 1440921247 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_32, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_32 BODY: HTML: images with 2800-3200 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_Part_4354_155782021.1440919075526 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 23-Sec exercise ACTIVATES your core and shrinks your waistline FAST http://www.idebath.com/hear/ed68IN61d82ZsnFjnn0ntv0Mjh30a Update Preferences- http://www.idebath.com/dc7B86gD1gd86ZsnFjnn0ntv0Mjh79e/always ------=_Part_4354_155782021.1440919075526 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit

23-Sec exercise ACTIVATES your core and shrinks your waistline FAST

Have you heard of the NEW ab training technique called a Core Activation Sequence yet?

They were originally invented by Dr. James Vegher to help his patients with chronic neck and back pain. Then...

One of his clients discovered that they worked even better for quickly shrinking your waistline and flattening your belly!

YOU should definitely check out this website if:

  • YOU Have an unsightly pouch belly or ugly beer gut that you can' t seem to get rid of
  • YOU have back, neck, shoulder or hip pain and can' t seem to find a way to make it stop
  • YOU have terrible posture and nothing seems to help
  • YOU desperately want to see a flat bell or toned abs but don' t know where to start
  • YOU are interested in learning what a Core Activation Sequence is and what it can do for you

=> 23-Second exercises ACTIVATES your core and shrinks your waistline FAST

I hope you enjoy the waist shrinking benefits from these Dr. created Core Activation Sequences...



 

* These statements have not been evaluated by the Food and Drug Administration.
This product is not intended to diagnose, treat, cure or prevent any disease.
This communication is for informational purposes only. It is not intended as medical advice.
Always consult your primary care provider before beginning any dietary supplement.
Warrior Media, INC. - 1334 Brommer St Suite B6 - Santa Cruz CA 95062 - Copyright 2015. All rights reserved.

Update Preferences








 

------=_Part_4354_155782021.1440919075526-- From terrydonn532@gmail.com Sun Aug 30 12:39:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2ACBB7F37 for ; Sun, 30 Aug 2015 12:39:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AC8F4AC002 for ; Sun, 30 Aug 2015 10:39:38 -0700 (PDT) X-ASG-Debug-ID: 1440956375-04cbb07cbd128520001-NocioJ Received: from mail-lb0-f196.google.com (mail-lb0-f196.google.com [209.85.217.196]) by cuda.sgi.com with ESMTP id 1CL2Ay2ecgyFcdjL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 30 Aug 2015 10:39:36 -0700 (PDT) X-Barracuda-Envelope-From: terrydonn532@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.196 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.196] Received: by lbbtg9 with SMTP id tg9so2007291lbb.1 for ; Sun, 30 Aug 2015 10:39:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.196] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.196] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=rqaUUQYOTCWi8XFIXi0eCMzwEuDeeXoD7ygSAXYf9aQ=; b=xeRaMHwz+mGdBYoroh0/pJeJuraE8xcYv4xTZ4Sv1z2MYycZevIlLD489jXmO3aAmx MDds9Wlb5wbO2x/AOXb3+27A4JCd5geoTPmD0ik+Q2Q3UH3b4l8jd4+Uv7XHeCMzG8NF 3egNNWa9bP2PYAkctGcywQXEhOllTdmpXkMDo4JF6LhOf5h/j5yH1Bua5EDc28SKFoDR +IAuvnz4974sd/vY/bSwNe8cQv47brqPLmUWUx4p3A9MPt36Tc1ioeo8dg8fFX0j9zZg L+XKQkxrM69q2+8hyzrE3RoPo+fZaw0QyxLK+Rz8HQ9oPHCrUErMI21xoOBZOuFsxtug CqHg== MIME-Version: 1.0 X-Received: by 10.112.168.100 with SMTP id zv4mr8363635lbb.117.1440956374680; Sun, 30 Aug 2015 10:39:34 -0700 (PDT) Received: by 10.114.231.69 with HTTP; Sun, 30 Aug 2015 10:39:34 -0700 (PDT) Reply-To: terry.donn@outlook.com Date: Sun, 30 Aug 2015 18:39:34 +0100 Message-ID: Subject: Hello,Paid to Drive with Car Wrap Advertisement Offer?? From: Terry Donald X-ASG-Orig-Subj: Hello,Paid to Drive with Car Wrap Advertisement Offer?? To: undisclosed-recipients:; Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f196.google.com[209.85.217.196] X-Barracuda-Start-Time: 1440956375 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.20 X-Barracuda-Spam-Status: No, SCORE=1.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646, BSF_SC0_SA620a, BSF_SC7_SA298e, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22064 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_MV0646 Custom rule MV0646 0.20 BSF_SC7_SA298e Custom Rule SA298e 0.50 BSF_SC0_SA620a Custom Rule SA620a -- Hello Would You Wrap Your Car in an Ad for $400 dollars Weekly. Reply if interested. Best Regards, Terry.A.Donald Hiring Manager, AdSmart Outdoor Advertising Inc. From lyne.bousquet29@corbeilelectro.ca Sun Aug 30 13:20:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=MIME_QP_LONG_LINE, SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 98BD87F37 for ; Sun, 30 Aug 2015 13:20:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8793B8F8035 for ; Sun, 30 Aug 2015 11:20:50 -0700 (PDT) X-ASG-Debug-ID: 1440958848-04cbb07cbd1290a0001-NocioJ Received: from modusmail.3menatwork.com (mail.network-3.com [64.235.193.16]) by cuda.sgi.com with ESMTP id AnNiBY18Y5CbxNiC for ; Sun, 30 Aug 2015 11:20:48 -0700 (PDT) X-Barracuda-Envelope-From: lyne.bousquet29@corbeilelectro.ca X-Barracuda-Apparent-Source-IP: 64.235.193.16 Received: from corbeilelectro.ca (unverified [127.0.0.1]) by modusmail.3menatwork.com (Vircom SMTPRS 5.70.41.18848/11174.637.164.1007027) with ESMTP id (AUTH = lyne.bousquet29@corbeilelectro.ca); Sun, 30 Aug 2015 14:08:28 -0400 X-Modus-BlackList: 127.0.0.1=OK;lyne.bousquet29@corbeilelectro.ca=OK X-Modus-Trusted: 127.0.0.1=YES X-Modus-Spam-Version: 5.70.41.18848/11174.637.164.1007027 X-Modus-Audit: FALSE;0;0;0 Message-ID: X-EM-APIVersion: 2, 0, 2, 6 X-Priority: 3 (Normal) Reply-To: "" From: "COLAS CHRISTIAN" To: colaschristianfr@gmail.com Subject: AVIS DE PROPOSITION Date: Sun, 30 Aug 2015 14:08:28 -0400 X-ASG-Orig-Subj: AVIS DE PROPOSITION MIME-Version: 1.0 Content-Type: text/plain;charset=utf-8 Content-Transfer-Encoding: quoted-printable X-SCA-Stop: [cust-FEDA44368F9E44548F4D1EBA5FC3CB50,17,32,0] X-Barracuda-Connect: mail.network-3.com[64.235.193.16] X-Barracuda-Start-Time: 1440958848 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.66 X-Barracuda-Spam-Status: No, SCORE=2.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22065 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.20 BSF_SC7_SA298e Custom Rule SA298e 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 Bonjour Vous avez besoin d'un pr=C3=AAt d'argent pour une raison quelconque ? Vous =C3=AAtes fich=C3=A9s en banque ?=20 Votre banque refuse de vous pr=C3=AAter de l'argent ?=20 Vous ne savez plus vers qui vous tourner parce que les institutions financi=C3= =A8res rejettent votre dossier de pr=C3=AAt ? J'ai la solution pour vous=2E Je suis consultant fran=C3=A7ais en investissement et je pourrais vous aider= a trouver un investisseur ou une=20 institution financi=C3=A8re pouvant vous octroyer des pr=C3=AAts d'argent ou= investir dans vos diff=C3=A9rents projets fiables=2E=20 - Pret entre particulier - Possibilit=C3=A9 d'aide financi=C3=A8re de plusieurs millions d'euros Veuillez me contacter si vous =C3=AAtes int=C3=A9ress=C3=A9=2E E-mail : col= aschristianfr@gmail=2Ecom,colaschristianfr@outlook=2Efr TEL:+13156776230 Salutations cordiale=20 COLAS CHRISTIAN From david@fromorbit.com Sun Aug 30 21:26:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F2EC29DF5 for ; Sun, 30 Aug 2015 21:26:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 552AC304032 for ; Sun, 30 Aug 2015 19:26:05 -0700 (PDT) X-ASG-Debug-ID: 1440987962-04cb6c4a281193a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JHW8L2BxFXjAynIy for ; Sun, 30 Aug 2015 19:26:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CRDgCBuuNVPAUaLHleFoMFVGmCVac2AQEBAQEBBopaix6FdQICAQECgSVNAQEBAQEBBwEBAQFAAT+EIwEBAQQ6HCMQCAMVAwklDwUlAwcaE4gtDsBsAQEBBwIBHxmGEIVChQsHgxiBFAWVQYUHh2qCE5hahDcsM4JNAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 31 Aug 2015 11:51:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZWEjM-0006vS-09; Mon, 31 Aug 2015 12:21:56 +1000 Date: Mon, 31 Aug 2015 12:21:55 +1000 From: Dave Chinner To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: <20150831022155.GE26895@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic References: <1440724990-25073-1-git-send-email-david@fromorbit.com> <20150828043253.GB26895@dastard> <20150828220454.GC26895@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150828220454.GC26895@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1440987962 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22077 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 29, 2015 at 08:04:54AM +1000, Dave Chinner wrote: > On Fri, Aug 28, 2015 at 08:11:20AM -0700, Sage Weil wrote: > > Hi Dave, > > > > On Fri, 28 Aug 2015, Dave Chinner wrote: > > > > > > From: Dave Chinner > > > > > > Sage Weil reported that a ceph test workload was writing to the > > > log on every fdatasync during an overwrite workload. Event tracing > > > showed that the only metadata modification being made was the > > > timestamp updates during the write(2) syscall, but fdatasync(2) > > > is supposed to ignore them. The key observation was that the > > > transactions in the log all looked like this: > [....] > > > > --- > > > Version 2: > > > - include the hunk from fs/xfs/xfs_trans_inode.c that I missed > > > when committing the patch locally the first time. > > > > I gave this a go on my machine but I'm still seeing the same symptom. > > OK, that implies the inode buffer has not been submitted for IO and > so the inode is being held in "flushing" state for an extended > period of time. > > > I've gathered the trace, strace, and other useful bits at > > > > http://newdream.net/~sage/drop/rocksdb.2/ > > > > This is pretty easy to reproduce with the ceph_test_keyvaluedb binary > > (built on fedora 22), also in that dir: > > > > rm -rf kv_test_temp_dir/ > > ./ceph_test_keyvaluedb --gtest_filter=KeyValueDB/KVTest.BenchCommit/1 > > I'll have a deeper look. Ok, I was assuming this is a longer running test than it is - it only takes about 2300ms to run on my test box. Hence the problem is that the inode has never been flushed out, and so it's being relogged in full on every fdatasync() operation. Another, similar change is necessary to track the changes since the last time the inode was flushed to the log. Cheers, Dave. -- Dave Chinner david@fromorbit.com From 3N_rjVQ4JA3AWbgWUVZSbvUokfUaOWZ.QcalTgcgg.gUW.Qca@trix.bounces.google.com Mon Aug 31 01:54:57 2015 Return-Path: <3N_rjVQ4JA3AWbgWUVZSbvUokfUaOWZ.QcalTgcgg.gUW.Qca@trix.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 016517F37 for ; Mon, 31 Aug 2015 01:54:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73F78AC01B for ; Sun, 30 Aug 2015 23:54:53 -0700 (PDT) X-ASG-Debug-ID: 1441004087-04cb6c4a281333b0001-NocioJ Received: from mail-io0-f200.google.com (mail-io0-f200.google.com [209.85.223.200]) by cuda.sgi.com with ESMTP id ykKFwySjZUjEKHfF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 30 Aug 2015 23:54:48 -0700 (PDT) X-Barracuda-Envelope-From: 3N_rjVQ4JA3AWbgWUVZSbvUokfUaOWZ.QcalTgcgg.gUW.Qca@trix.bounces.google.com Received: by iod35 with SMTP id 35so46844899iod.3 for ; Sun, 30 Aug 2015 23:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:message-id:date:subject:from:to:content-type; bh=MTo5KgEoKk31FoILn1jJM5RhzmYe/YM3tZjdYx8ajt4=; b=nxAbDNqanXrn2YYsLr5u0DHV4rF1ezcC+mvabABHkjjVRCTMm/JYCKBBZsfjWDcgfF s77Vhr6q++ukhxybyl26WL5yw/cvblVads0U4Rc/P7HKmS/1MRQSt3uEP2S+ye2Uqd4u KR6L4BiL9GqD/5qhau9rf6eO1oYylbDhc5CMf9xwveSrqBISyRixeGXfvA1OVwJ9W059 n9RRGY/rKNHJb1KUKH4QYL5mslheetN0AMnkEfXB2UFIC0dsFaWaqfC27v1fapc8muqA CG+Qxc9oXUIok0djW/vEn0GDZbHWSAGkKu0xpNNB3xxFO4ksETOmtkHhNhOG7g2Oc2SZ TUHQ== MIME-Version: 1.0 X-Received: by 10.50.70.5 with SMTP id i5mt5455147igu.5.1441004087706; Sun, 30 Aug 2015 23:54:47 -0700 (PDT) Reply-To: insighlen7g0wr@gmail.com X-No-Auto-Attachment: 1 Message-ID: <047d7b343b16c49082051e95e89b@google.com> Date: Mon, 31 Aug 2015 06:54:47 +0000 Subject: =?GB2312?B?sdy/qkIyQrXNvNvRr8XMv6q3otXm1f3K9NPa19S8urXE08U=?= =?GB2312?B?1sq/zbun?= From: insighlen7g0wr@gmail.com X-ASG-Orig-Subj: =?GB2312?B?sdy/qkIyQrXNvNvRr8XMv6q3otXm1f3K9NPa19S8urXE08U=?= =?GB2312?B?1sq/zbun?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b343b16c5f430051e95e81f X-Barracuda-Connect: mail-io0-f200.google.com[209.85.223.200] X-Barracuda-Start-Time: 1441004088 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22081 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b343b16c5f430051e95e81f Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 uN/Qp7aozrvL0cv3tb3Iq8fyt7bOp8TaufPLvtDQ0rXE2snP087Ev7Hqx7HU2r/Nu6cNCsSjxOLK 1rmk0ru21NK7t7TGwbHOvOTQqtDUwta7u9fUtq+3osvNv6q3otDFDQrKtc/WuN/Qp8Gqz7W/qrei uN/WysG/xL+x6r/Nu6ejoQ0K0OjSqr/Nu6fXytS0wvAs0OjSqrn6zeK/zbunwvAsuM+/7MGqz7XO 0sPHDQrBqs+118nRr1FRo7oxNzUzMjQ0OTI5DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KyPSyu9Do0qq0y8Dg08q8/sfryejWw77cytWjrLGnx7i08sTTDQoNCg0KDQoNCkkndmUgaW52 aXRlZCB5b3UgdG8gZmlsbCBvdXQgdGhlIGZvcm0gVW50aXRsZWQgZm9ybS4gVG8gZmlsbCBpdCBv dXQsDQp2aXNpdDoNCmh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvMUR5eU5Gdm9YR2h1 VllLVTlyY1p4d3ROeXBtR0hISVNHZUowQUJKYzBQb2Mvdmlld2Zvcm0/Yz0wJnc9MSZ1c3A9bWFp bF9mb3JtX2xpbmsNCg== --047d7b343b16c5f430051e95e81f Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable

=B8=DF=D0=A7=B6=A8=CE=BB=CB=D1=CB=F7= =B5=BD=C8=AB=C7=F2=B7=B6=CE=A7=C4=DA=B9=F3=CB=BE=D0=D0=D2=B5=C4=DA=C9=CF=D3= =CE=C4=BF=B1=EA=C7=B1=D4=DA=BF=CD=BB=A7

=C4=A3=C4=E2=CA=D6=B9=A4=D2=BB=B6= =D4=D2=BB=B7=B4=C6=C1=B1=CE=BC=E4=D0=AA=D0=D4=C2=D6=BB=BB=D7=D4=B6=AF=B7=A2= =CB=CD=BF=AA=B7=A2=D0=C5

=CA=B5=CF=D6=B8=DF=D0=A7=C1=AA=CF=B5=BF=AA=B7=A2= =B8=DF=D6=CA=C1=BF=C4=BF=B1=EA=BF=CD=BB=A7=A3=A1

=D0=E8=D2=AA=BF=CD=BB= =A7=D7=CA=D4=B4=C2=F0,=D0=E8=D2=AA=B9=FA=CD=E2=BF=CD=BB=A7=C2=F0,=B8=CF=BF= =EC=C1=AA=CF=B5=CE=D2=C3=C7

=C1=AA=CF=B5=D7=C9=D1=AFQQ=A3=BA1753244929-----------------------------
=C8=F4=B2=BB=D0=E8=D2=AA=B4=CB=C0=E0=D3= =CA=BC=FE=C7=EB=C9=E8=D6=C3=BE=DC=CA=D5=A3=AC=B1=A7=C7=B8=B4=F2=C4=D3

If you have trouble viewing or submitting this form, you can fill it out in= Google Forms.

Untitled form

=
    • Option 1
P= owered by
3D"Google
This content is neither create= d nor endorsed by Google.
Report Abuse - Terms of Service<= /a> - Addition= al Terms

<= /html> --047d7b343b16c5f430051e95e81f-- From ayacance@rothman.hosts.net.nz Mon Aug 31 02:08:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7971B7F56 for ; Mon, 31 Aug 2015 02:08:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C31A304059 for ; Mon, 31 Aug 2015 00:08:03 -0700 (PDT) X-ASG-Debug-ID: 1441004875-04cb6c4a2a138580001-NocioJ Received: from rothman.hosts.net.nz (rothman.hosts.net.nz [210.48.108.92]) by cuda.sgi.com with ESMTP id Vzhqk8CqVHuv8kie (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 00:07:56 -0700 (PDT) X-Barracuda-Envelope-From: ayacance@rothman.hosts.net.nz X-Barracuda-Apparent-Source-IP: 210.48.108.92 Received: from ayacance by rothman.hosts.net.nz with local (Exim 4.85) (envelope-from ) id 1ZWJC6-001PxG-UX for xfs@oss.sgi.com; Mon, 31 Aug 2015 19:07:55 +1200 To: xfs@oss.sgi.com Subject: Notification From: Westpac Bank X-ASG-Orig-Subj: Notification Reply-To: Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-Id: Date: Mon, 31 Aug 2015 19:07:54 +1200 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - rothman.hosts.net.nz X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [802 803] / [47 12] X-AntiAbuse: Sender Address Domain - rothman.hosts.net.nz X-Get-Message-Sender-Via: rothman.hosts.net.nz: authenticated_id: ayacance/only user confirmed/virtual account not confirmed X-Barracuda-Connect: rothman.hosts.net.nz[210.48.108.92] X-Barracuda-Start-Time: 1441004876 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.05 X-Barracuda-Spam-Status: No, SCORE=1.05 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22081 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag Please confirm your email address With Westpac Online.
Your next step is to confirm your email address
"Confirm my email"
Thank you for choosing Westpac Bank.
From gavin.guo@canonical.com Mon Aug 31 02:33:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CF2327F59 for ; Mon, 31 Aug 2015 02:33:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3EB0BAC004 for ; Mon, 31 Aug 2015 00:33:10 -0700 (PDT) X-ASG-Debug-ID: 1441006387-04cb6c4a2813d9f0001-NocioJ Received: from mail-yk0-f177.google.com (mail-yk0-f177.google.com [209.85.160.177]) by cuda.sgi.com with ESMTP id 8MhH0pLnYWnCquXv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 00:33:07 -0700 (PDT) X-Barracuda-Envelope-From: gavin.guo@canonical.com X-Barracuda-Apparent-Source-IP: 209.85.160.177 Received: by ykdz80 with SMTP id z80so69704872ykd.0 for ; Mon, 31 Aug 2015 00:33:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=a81T6lrQmsjuxuB4zJfWT2uZvfumTFWVrFHPZawUde8=; b=LuzBqm95NPwTPONHkeH+Z1uOzKYEMgD/EPl3abpLsP9KdZbqMtsDlCgVnBVe3TAsyQ m3XRO5YHlITrzF4Prqnm1qmNft/lauvXf4yFu73gh2WMhrkEcLo/xThaHyGGpravzstq NIWzKm+Br+5A7HheYcSchlk4HIbOSB/6Wfzv5xaPDRhyg9Vr1R6ZdoTmm0QrU0/qCuGU 4B3gaSFGR+NJqwAJs3Kp8ECqX81TGCvaC9i9uqJL6BErmPltCXJpuccT3agzwGbn5ZTp 5+DYXQAXPgOCPWllfuAdstgIxvM5JEEsACo6r90YKs2ZhGgBXOzCnSuRGeEp5FZ6/GMe tXvQ== X-Gm-Message-State: ALoCoQlrbRyqEkvTZLoh51MT1FlznDI6DTLaOZBRrFvVA9Iu8oXuOZ1fsKvw00OabI8ABDd1wF8I MIME-Version: 1.0 X-Received: by 10.129.116.138 with SMTP id p132mr19799220ywc.1.1441006386699; Mon, 31 Aug 2015 00:33:06 -0700 (PDT) Received: by 10.37.124.2 with HTTP; Mon, 31 Aug 2015 00:33:06 -0700 (PDT) In-Reply-To: <20150829223156.GD26895@dastard> References: <20150707233743.GZ7943@dastard> <20150829223156.GD26895@dastard> Date: Mon, 31 Aug 2015 15:33:06 +0800 Message-ID: Subject: Re: Possible memory allocation deadlock in kmem_alloc and hung task in xfs_log_commit_cil and xlog_cil_push From: Gavin Guo X-ASG-Orig-Subj: Re: Possible memory allocation deadlock in kmem_alloc and hung task in xfs_log_commit_cil and xlog_cil_push To: Dave Chinner Cc: xfs@oss.sgi.com, linux-kernel Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-yk0-f177.google.com[209.85.160.177] X-Barracuda-Start-Time: 1441006387 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22082 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 30, 2015 at 6:31 AM, Dave Chinner wrote: > On Fri, Aug 28, 2015 at 08:54:04PM +0800, Gavin Guo wrote: >> On Wed, Jul 8, 2015 at 7:37 AM, Dave Chinner wrote: >> > On Tue, Jul 07, 2015 at 05:29:43PM +0800, Gavin Guo wrote: >> >> Hi all, >> >> >> >> Recently, we observed that there is the error message in >> >> Ubuntu-3.13.0-48.80: >> >> >> >> "XFS: possible memory allocation deadlock in kmem_alloc (mode:0x8250)" >> >> >> >> repeatedly shows in the dmesg. Temporarily, our workaround is to tune the >> >> parameters, such as, vfs_cache_pressure, min_free_kbytes, and dirty_ratio. >> >> >> >> And we also found that there are different error messages regarding the >> >> hung tasks which happened in xfs_log_commit_cil and xlog_cil_push. >> >> >> >> The log is available at: http://paste.ubuntu.com/11835007/ >> >> >> >> The following link seems the same problem we suffered: >> >> >> >> XFS hangs with XFS: possible memory allocation deadlock in kmem_alloc >> >> http://oss.sgi.com/archives/xfs/2015-03/msg00172.html >> >> >> >> I read the mail and found that there might be some modification regarding >> >> to move the memory allocation outside the ctx lock. And I also read the >> >> latest patch from February of 2015 to see if there is any new change >> >> about that. Unfortunately, I didn't find anything regarding the change (may >> >> be I'm not familiar with the XFS, so didn't find the commit). If it's >> >> possible for someone who is familiar with the code to point out the commits >> >> related to the bug if already exist or any status about the plan. >> > >> > No commits - the approach I thought we might be able to take to >> > avoid the problem didn't work out. I have another idea of how we >> > might solve the problem, but I haven't ad a chance to prototype it >> > yet. >> >> I have read the code for a while and still can't figure out how to fix. >> My current understanding is that the problem is Buddy system is running out >> of memory so the XFS kmem_alloc(), >> >> called by xfs_log_commit_cil-> >> xlog_cil_insert_items-> >> xlog_cil_insert_format_items-> >> kmem_zalloc, >> >> fail and stuck in the while loop and retry. There are also 2 other threads >> running in the same time: >> >> 1). xfs_log_commit_cil->down_read(&cil->xc_ctx_lock); >> >> 2). xlog_cil_push->down_write(&cil->xc_ctx_lock); >> >> So, the both threads are blocked and waiting for the first kmem_zalloc() to >> succeed. >> >> However, if there is a way to decrease the memory request or if it's >> possible to elaborate more on the idea you mentioned. I know it's a >> problem which cannot be solved in a short time. And I'd like to help if >> there is any possibility. > > This is the patch I'm currently working on. It doesn't work > completely yet, but it will give you an idea of how the problem > needs tobe solved (read the big comment in the patch). > > -Dave. > -- > Dave Chinner > david@fromorbit.com > > --- > fs/xfs/xfs_buf_item.c | 1 + > fs/xfs/xfs_dquot.c | 1 + > fs/xfs/xfs_dquot_item.c | 2 + > fs/xfs/xfs_extfree_item.c | 2 + > fs/xfs/xfs_inode_item.c | 1 + > fs/xfs/xfs_log_cil.c | 228 ++++++++++++++++++++++++++++++++++------------ > 6 files changed, 177 insertions(+), 58 deletions(-) > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 1816334..64cd236 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -831,6 +831,7 @@ xfs_buf_item_free( > xfs_buf_log_item_t *bip) > { > xfs_buf_item_free_format(bip); > + kmem_free(bip->bli_item->li_lv_shadow); > kmem_zone_free(xfs_buf_item_zone, bip); > } > > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index 4143dc7..b9e7dda 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -74,6 +74,7 @@ xfs_qm_dqdestroy( > { > ASSERT(list_empty(&dqp->q_lru)); > > + kmem_free(dqp->qli_item.li_lv_shadow); > mutex_destroy(&dqp->q_qlock); > kmem_zone_free(xfs_qm_dqzone, dqp); > > diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c > index 814cff9..2c7a162 100644 > --- a/fs/xfs/xfs_dquot_item.c > +++ b/fs/xfs/xfs_dquot_item.c > @@ -370,6 +370,8 @@ xfs_qm_qoffend_logitem_committed( > spin_lock(&ailp->xa_lock); > xfs_trans_ail_delete(ailp, &qfs->qql_item, SHUTDOWN_LOG_IO_ERROR); > > + kmem_free(qfs->qql_item.li_lv_shadow); > + kmem_free(lip->li_lv_shadow); > kmem_free(qfs); > kmem_free(qfe); > return (xfs_lsn_t)-1; > diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c > index adc8f8f..3842418 100644 > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -40,6 +40,7 @@ void > xfs_efi_item_free( > struct xfs_efi_log_item *efip) > { > + kmem_free(efip->efi_item.li_lv_shadow); > if (efip->efi_format.efi_nextents > XFS_EFI_MAX_FAST_EXTENTS) > kmem_free(efip); > else > @@ -329,6 +330,7 @@ static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) > STATIC void > xfs_efd_item_free(struct xfs_efd_log_item *efdp) > { > + kmem_free(efdp->efd_item.li_lv_shadow); > if (efdp->efd_format.efd_nextents > XFS_EFD_MAX_FAST_EXTENTS) > kmem_free(efdp); > else > diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c > index bf13a5a..39ca237 100644 > --- a/fs/xfs/xfs_inode_item.c > +++ b/fs/xfs/xfs_inode_item.c > @@ -577,6 +577,7 @@ void > xfs_inode_item_destroy( > xfs_inode_t *ip) > { > + kmem_free(ip->ili_item->li_lv_shadow); > kmem_zone_free(xfs_ili_zone, ip->i_itemp); > } > > diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c > index abc2ccb..ab4b98c 100644 > --- a/fs/xfs/xfs_log_cil.c > +++ b/fs/xfs/xfs_log_cil.c > @@ -79,6 +79,145 @@ xlog_cil_init_post_recovery( > log->l_cilp->xc_ctx->sequence = 1; > } > > +static inline int > +xlog_cil_iovec_space( > + uint niovecs) > +{ > + return round_up((sizeof(struct xfs_log_vec) + > + niovecs * sizeof(struct xfs_log_iovec)), > + sizeof(uint64_t)); > +} > + > +/* > + * Allocate or pin log vector buffers for CIL insertion. > + * > + * The CIL currently uses disposable buffers for copying a snapshot of the > + * modified items into the log during a push. The biggest problem with this is > + * the requirement to allocate the disposable buffer during the commit if: > + * a) does not exist; or > + * b) it is too small > + * > + * If we do this allocation within xlog_cil_insert_format_items(), it is done > + * under the xc_ctx_lock, which means that a CIL push cannot occur during > + * the memory allocation. This means that we have a potential deadlock situation > + * under low memory conditions when we have lots of dirty metadata pinned in > + * the CIL and we need a CIL commit to occur to free memory. > + * > + * To avoid this, we need to move the memory allocation outside the > + * xc_ctx_lock(), but because the log vector buffers are disposable, that opens > + * up a TOCTOU race condition w.r.t. the CIL commiting and removing the log > + * vector buffers between the check and the formatting of the item into the > + * log vector buffer within the xc_ctx_lock. > + * > + * Because the log vector buffer needs to be unchanged during the CIL push > + * process, we cannot share the buffer between the transaction commit (which > + * modifies the buffer) and the CIL push context that is writing the changes > + * into the log. This means skipping preallocation of buffer space is > + * unreliable, but we most definitely do not want to be allocating and freeing > + * buffers unnecessarily during commits when overwrites can be done safely. > + * > + * The simplest solution to this problem is to allocate a shadow buffer when a > + * log item is committed for the second time, and then to only use this buffer > + * if necessary. The buffer can remain attached to the log item until such time > + * it is needed, and this is the buffer that is reallocated to match the size of > + * the incoming modification. Then during the formatting of the item we can swap > + * the active buffer with the new one if we can't reuse the existing buffer. We > + * don't free the old buffer as it may be reused on the next modification if > + * it's size is right, otherwise we'll free and reallocate it at that point. > + * > + * This function builds a vector for the changes in each log item in the > + * transaction. It then works out the length of the buffer needed for each log > + * item, allocates them and attaches the vector to the log item in preparation > + * for the formatting step which occurs under the xc_ctx_lock. > + * > + * While this means the memory footprint goes up, it avoids the repeated > + * alloc/free pattern that repeated modifications of an item would otherwise > + * cause, and hence minimises the CPU overhead of such behaviour. > + */ > +static void > +xfs_cil_item_alloc_shadow_lvbufs( > + struct xlog *log, > + struct xfs_trans *tp) > +{ > + list_for_each_entry(lidp, &tp->t_items, lid_trans) { > + struct xfs_log_item *lip = lidp->lid_item; > + struct xfs_log_vec *lv; > + struct xfs_log_vec *old_lv; > + int niovecs = 0; > + int nbytes = 0; > + int buf_size; > + bool ordered = false; > + > + /* Skip items which aren't dirty in this transaction. */ > + if (!(lidp->lid_flags & XFS_LID_DIRTY)) > + continue; > + > + /* get number of vecs and size of data to be stored */ > + lip->li_ops->iop_size(lip, &niovecs, &nbytes); > + > + /* > + * Ordered items need to be tracked but we do not wish to write > + * them. We need a logvec to track the object, but we do not > + * need an iovec or buffer to be allocated for copying data. > + */ > + if (niovecs == XFS_LOG_VEC_ORDERED) { > + ordered = true; > + niovecs = 0; > + nbytes = 0; > + } > + > + /* > + * We 64-bit align the length of each iovec so that the start > + * of the next one is naturally aligned. We'll need to > + * account for that slack space here. Then round nbytes up > + * to 64-bit alignment so that the initial buffer alignment is > + * easy to calculate and verify. > + */ > + nbytes += niovecs * sizeof(uint64_t); > + nbytes = round_up(nbytes, sizeof(uint64_t)); > + > + /* grab the old item if it exists for reservation accounting */ > + old_lv = lip->li_lv; > + > + /* > + * The data buffer needs to start 64-bit aligned, so round up > + * that space to ensure we can align it appropriately and not > + * overrun the buffer. > + */ > + buf_size = nbytes + xlog_cil_iovec_space(niovecs); > + > + /* > + * if we have no shadow buffer, or it is too small, we need to > + * reallocate it. > + */ > + if (!lip->li_lv_shadow || > + buf_size <= lip->li_lv_shadow->lv_size) { > + > + kmem_free(lip->li_lv_shadow); > + > + lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); > + lv->lv_item = lip; > + lv->lv_size = buf_size; > + if (ordered) > + lv->lv_buf_len = XFS_LOG_VEC_ORDERED; > + else > + lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; > + lip->li_lv_shadow = lv; > + } else { > + /* same or smaller, optimise common overwrite case */ > + lv = lip->li_lv_shadow; > + } > + > + /* Ensure the lv is set up according to ->iop_size */ > + lv->lv_niovecs = niovecs; > + > + /* The allocated data region lies beyond the iovec region */ > + lv->lv_buf_len = 0; > + lv->lv_bytes = 0; > + lv->lv_buf = (char *)lv + xlog_cil_iovec_space(niovecs); > + } > + > +} > /* > * Prepare the log item for insertion into the CIL. Calculate the difference in > * log space and vectors it will consume, and if it is a new item pin it as > @@ -101,7 +240,8 @@ xfs_cil_prepare_item( > /* > * If there is no old LV, this is the first time we've seen the item in > * this CIL context and so we need to pin it. If we are replacing the > - * old_lv, then remove the space it accounts for and free it. > + * old_lv, then remove the space it accounts for and make it the shadow > + * buffer for later freeing. > */ > if (!old_lv) > lv->lv_item->li_ops->iop_pin(lv->lv_item); > @@ -110,7 +250,7 @@ xfs_cil_prepare_item( > > *diff_len -= old_lv->lv_bytes; > *diff_iovecs -= old_lv->lv_niovecs; > - kmem_free(old_lv); > + lip->li_lv_shadow = old_lv; > } > > /* attach new log vector to log item */ > @@ -134,11 +274,13 @@ xfs_cil_prepare_item( > * write it out asynchronously without needing to relock the object that was > * modified at the time it gets written into the iclog. > * > - * This function builds a vector for the changes in each log item in the > - * transaction. It then works out the length of the buffer needed for each log > - * item, allocates them and formats the vector for the item into the buffer. > - * The buffer is then attached to the log item are then inserted into the > - * Committed Item List for tracking until the next checkpoint is written out. > + * This function takes the prepared log vectors attached to each log item, and > + * formats the changes into the log vector buffer. The buffer it uses is > + * dependent on the current state of the vector in the CIL - the shadow lv is > + * guaranteed to be large enough for the current modification, but we will only > + * use that if we can't reuse the existing lv. If we can't reuse the existing > + * lv, then simple swap it out for the shadow lv. We don't free it - that is > + * done lazily either by th enext modification or the freeing of the log item. > * > * We don't set up region headers during this process; we simply copy the > * regions into the flat buffer. We can do this because we still have to do a > @@ -171,7 +313,8 @@ xlog_cil_insert_format_items( > list_for_each_entry(lidp, &tp->t_items, lid_trans) { > struct xfs_log_item *lip = lidp->lid_item; > struct xfs_log_vec *lv; > - struct xfs_log_vec *old_lv; > + struct xfs_log_vec *old_lv = NULL; > + struct xfs_log_vec *shadow; > int niovecs = 0; > int nbytes = 0; > int buf_size; > @@ -181,49 +324,19 @@ xlog_cil_insert_format_items( > if (!(lidp->lid_flags & XFS_LID_DIRTY)) > continue; > > - /* get number of vecs and size of data to be stored */ > - lip->li_ops->iop_size(lip, &niovecs, &nbytes); > - > - /* Skip items that do not have any vectors for writing */ > - if (!niovecs) > - continue; > - > /* > - * Ordered items need to be tracked but we do not wish to write > - * them. We need a logvec to track the object, but we do not > - * need an iovec or buffer to be allocated for copying data. > + * The formatting size information is already attached to > + * the shadow lv on the log item. > */ > - if (niovecs == XFS_LOG_VEC_ORDERED) { > + if (shadow->lv_buf_len == XFS_LOG_VEC_ORDERED) > ordered = true; > - niovecs = 0; > - nbytes = 0; > - } > > - /* > - * We 64-bit align the length of each iovec so that the start > - * of the next one is naturally aligned. We'll need to > - * account for that slack space here. Then round nbytes up > - * to 64-bit alignment so that the initial buffer alignment is > - * easy to calculate and verify. > - */ > - nbytes += niovecs * sizeof(uint64_t); > - nbytes = round_up(nbytes, sizeof(uint64_t)); > - > - /* grab the old item if it exists for reservation accounting */ > - old_lv = lip->li_lv; > - > - /* > - * The data buffer needs to start 64-bit aligned, so round up > - * that space to ensure we can align it appropriately and not > - * overrun the buffer. > - */ > - buf_size = nbytes + > - round_up((sizeof(struct xfs_log_vec) + > - niovecs * sizeof(struct xfs_log_iovec)), > - sizeof(uint64_t)); > + /* Skip items that do not have any vectors for writing */ > + if (!shadow->lv_niovecs && !ordered) > + continue; > > /* compare to existing item size */ > - if (lip->li_lv && buf_size <= lip->li_lv->lv_size) { > + if (lip->li_lv && shadow->lv_size <= lip->li_lv->lv_size) { > /* same or smaller, optimise common overwrite case */ > lv = lip->li_lv; > lv->lv_next = NULL; > @@ -237,29 +350,28 @@ xlog_cil_insert_format_items( > */ > *diff_iovecs -= lv->lv_niovecs; > *diff_len -= lv->lv_bytes; > + > + /* Ensure the lv is set up according to ->iop_size */ > + lv->lv_niovecs = shadow->lv_niovecs; > + > + /* reset the lv buffer information for new formatting */ > + lv->lv_buf_len = 0; > + lv->lv_bytes = 0; > + lv->lv_buf = (char *)lv + > + xlog_cil_iovec_space(lv->lv_niovecs) > } else { > - /* allocate new data chunk */ > - lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); > + /* switch to shadow buffer! */ > + lv = shadow; > lv->lv_item = lip; > - lv->lv_size = buf_size; > + old_lv = lip->li_lv; > if (ordered) { > /* track as an ordered logvec */ > ASSERT(lip->li_lv == NULL); > - lv->lv_buf_len = XFS_LOG_VEC_ORDERED; > goto insert; > } > - lv->lv_iovecp = (struct xfs_log_iovec *)&lv[1]; > } > > - /* Ensure the lv is set up according to ->iop_size */ > - lv->lv_niovecs = niovecs; > - > - /* The allocated data region lies beyond the iovec region */ > - lv->lv_buf_len = 0; > - lv->lv_bytes = 0; > - lv->lv_buf = (char *)lv + buf_size - nbytes; > ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t))); > - > lip->li_ops->iop_format(lip, lv); > insert: > ASSERT(lv->lv_buf_len <= nbytes); Really thanks for your patch. I'll study the patch first to figure out the idea. Gavin From david@fromorbit.com Mon Aug 31 03:07:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1542E7F5F for ; Mon, 31 Aug 2015 03:07:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 093D3304032 for ; Mon, 31 Aug 2015 01:07:02 -0700 (PDT) X-ASG-Debug-ID: 1441008419-04cb6c4a2a1448e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id iX58vDHOEBFDTIvk for ; Mon, 31 Aug 2015 01:07:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2A/EACwCuRVPAUaLHlegxuBPYJVg3yjTQEBAQEBAQaKWpETAgIBAQKBH00BAQEBAQEHAQEBAUABP4QjAQEBAwEnExwjBQsIAxgJJQ8FJQMHGhOIJgfBTQEBAQEGAgEfGYYQhUKFCweDGIEUAQSVQYxxgU2EMpRuhDcsM4JNAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 31 Aug 2015 17:36:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZWK7F-0007NU-Qz; Mon, 31 Aug 2015 18:06:57 +1000 Date: Mon, 31 Aug 2015 18:06:57 +1000 From: Dave Chinner To: Scott Wood Cc: trivial@kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 21/22] xfs: %pF is only for function pointers Message-ID: <20150831080657.GF26895@dastard> X-ASG-Orig-Subj: Re: [PATCH 21/22] xfs: %pF is only for function pointers References: <1426130037-17956-1-git-send-email-scottwood@freescale.com> <1426130037-17956-21-git-send-email-scottwood@freescale.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1426130037-17956-21-git-send-email-scottwood@freescale.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1441008420 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22082 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 11, 2015 at 10:13:56PM -0500, Scott Wood wrote: > Use %pS for actual addresses, otherwise you'll get bad output > on arches like ppc64 where %pF expects a function descriptor. > > Signed-off-by: Scott Wood > Cc: xfs@oss.sgi.com Scott, I've just found that this change (commit 65dd297 "xfs: %pF is only for function pointers") breaks the symbolic printing in XFS trace events on x86_64. eg. > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 51372e3..b5ac81e 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -115,7 +115,7 @@ DECLARE_EVENT_CLASS(xfs_perag_class, > __entry->refcount = refcount; > __entry->caller_ip = caller_ip; > ), > - TP_printk("dev %d:%d agno %u refcount %d caller %pf", > + TP_printk("dev %d:%d agno %u refcount %d caller %ps", > MAJOR(__entry->dev), MINOR(__entry->dev), > __entry->agno, > __entry->refcount, This results in output like this: 760.828474: xfs_perag_get: dev 253:32 agno 13 refcount 10 caller 0xffffffff814eef02s 760.828476: xfs_perag_put: dev 253:32 agno 13 refcount 9 caller 0xffffffff814eefe8s When I revert this commit, I get: 71.911265: xfs_perag_get: dev 253:32 agno 0 refcount 11 caller xfs_extent_busy_insert 71.911266: xfs_perag_put: dev 253:32 agno 0 refcount 10 caller xfs_extent_busy_insert Which is exactly what we should be getting from the tracing. I'm using trace-cmd to gather and print the events, and it breaks both old and current versions of trace-cmd. Can you please look into why this change broke the tracing output on x86-64 - if there is no obvious/easy fix for it, then I'm simply going to revert it because having the tracing work correctly on x86-64 is far more important to us than ppc64 or ia64.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 31 03:48:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3E3167F56 for ; Mon, 31 Aug 2015 03:48:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1547D304043 for ; Mon, 31 Aug 2015 01:48:19 -0700 (PDT) X-ASG-Debug-ID: 1441010896-04bdf0239912bb50001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qRevSsyPzyHSBLTZ for ; Mon, 31 Aug 2015 01:48:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BLEADjE+RVPAUaLHleFoMFVGmCVadJAQEBAQEBBopaFIsKgkODMgICAQECgSFNAQEBAQEBBwEBAQFAAT+EIwEBAQQ6HCMQCAMVAwklDwUlAwcaE4gtDsFYAQEIAgEfGYYQhUKEQkkHhCwFhyuOFoUHh2qCE5hahDcsM4EGgUcBAQE Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 31 Aug 2015 18:18:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZWKlC-0007SN-Nj; Mon, 31 Aug 2015 18:48:14 +1000 Date: Mon, 31 Aug 2015 18:48:14 +1000 From: Dave Chinner To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: <20150831084814.GG26895@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic References: <1440724990-25073-1-git-send-email-david@fromorbit.com> <20150828043253.GB26895@dastard> <20150828220454.GC26895@dastard> <20150831022155.GE26895@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150831022155.GE26895@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1441010896 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 31, 2015 at 12:21:55PM +1000, Dave Chinner wrote: > On Sat, Aug 29, 2015 at 08:04:54AM +1000, Dave Chinner wrote: > > On Fri, Aug 28, 2015 at 08:11:20AM -0700, Sage Weil wrote: > > > Hi Dave, > > > > > > On Fri, 28 Aug 2015, Dave Chinner wrote: > > > > > > > > From: Dave Chinner > > > > > > > > Sage Weil reported that a ceph test workload was writing to the > > > > log on every fdatasync during an overwrite workload. Event tracing > > > > showed that the only metadata modification being made was the > > > > timestamp updates during the write(2) syscall, but fdatasync(2) > > > > is supposed to ignore them. The key observation was that the > > > > transactions in the log all looked like this: > > [....] > > > > > > --- > > > > Version 2: > > > > - include the hunk from fs/xfs/xfs_trans_inode.c that I missed > > > > when committing the patch locally the first time. > > > > > > I gave this a go on my machine but I'm still seeing the same symptom. > > > > OK, that implies the inode buffer has not been submitted for IO and > > so the inode is being held in "flushing" state for an extended > > period of time. > > > > > I've gathered the trace, strace, and other useful bits at > > > > > > http://newdream.net/~sage/drop/rocksdb.2/ > > > > > > This is pretty easy to reproduce with the ceph_test_keyvaluedb binary > > > (built on fedora 22), also in that dir: > > > > > > rm -rf kv_test_temp_dir/ > > > ./ceph_test_keyvaluedb --gtest_filter=KeyValueDB/KVTest.BenchCommit/1 > > > > I'll have a deeper look. > > Ok, I was assuming this is a longer running test than it is - it > only takes about 2300ms to run on my test box. Hence the problem is > that the inode has never been flushed out, and so it's being > relogged in full on every fdatasync() operation. Another, similar > change is necessary to track the changes since the last time the > inode was flushed to the log. This is more complex than I expected, and I ended up chasing down a rathole because performance is now *highly variable*. Before making these changes, the performance was consistent at 2.3-2.6s for a test run on my test machine. It's on SSDs, with a 1GB BBWC in front of them, so there's minimal IO latency, and hence the average commit latency was around 2.5ms for the original (bad) fdatasync behaviour. priming now doing small writes 1024 commits in 2.582939, avg latency 0.0025224 [ OK ] KeyValueDB/KVTest.BenchCommit/1 (2600 ms) [----------] 1 test from KeyValueDB/KVTest (2600 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (2600 ms total) [ PASSED ] 1 test. Now I see the test often complete in about 1.1s, or ~1.1ms per write/fdatasync operation. That's definitely an improvement, priming now doing small writes 1024 commits in 1.133530, avg latency 0.00110696 [ OK ] KeyValueDB/KVTest.BenchCommit/1 (1148 ms) [----------] 1 test from KeyValueDB/KVTest (1148 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (1149 ms total) [ PASSED ] 1 test. but every 4-5 test runs I'd see a test run that would take 8s to complete: priming now doing small writes 1024 commits in 8.373202, avg latency 0.00817696 [ OK ] KeyValueDB/KVTest.BenchCommit/1 (8429 ms) [----------] 1 test from KeyValueDB/KVTest (8430 ms total) [----------] Global test environment tear-down [==========] 1 test from 1 test case ran. (8430 ms total) [ PASSED ] 1 test. This is completely reproducable, and very annoying as it doesn't happen without these fdatasync optimisation patches. After taking a tangent to find a tracepoint regression that was getting in my way, I found that there was a significant pause between the inode locking calls within xfs_file_fsync and the inode locking calls on the buffered write. Roughly 8ms, in fact, on almost every call. After adding a couple more test trace points into the XFS fsync code, it turns out that a hardware cache flush is causing the delay. That is, because we aren't doing log writes that trigger cache flushes and FUA writes, we have to issue a blkdev_issue_flush() call from xfs_file_fsync and that is taking 8ms to complete. IOWs, on my hardware, making fdatasync work correctly completely destroys workload determinism. The full fsync adds 1ms to each operation, but it is constant and unchanging. The fdatasyncs fast most of the time, but every so often the cache flush blows performance all to hell and so over time (e.g. 100 test runs) fdatasync is little faster than using a full fsync. So, that's the rat hole I've been down today - once again proving that Modern Storage Hardware Still Sucks. Anyway, I'm going to do correctness testing now that I know the performance problems are hardware and not software..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sage@newdream.net Mon Aug 31 07:40:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C5C8729DF5 for ; Mon, 31 Aug 2015 07:40:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4E8EAAC005 for ; Mon, 31 Aug 2015 05:40:08 -0700 (PDT) X-ASG-Debug-ID: 1441024804-04cb6c4a29156070001-NocioJ Received: from cobra.newdream.net (cobra.newdream.net [66.33.216.30]) by cuda.sgi.com with ESMTP id xCepLHiZrlan7CRa for ; Mon, 31 Aug 2015 05:40:04 -0700 (PDT) X-Barracuda-Envelope-From: sage@newdream.net X-Barracuda-Apparent-Source-IP: 66.33.216.30 Received: from cobra.newdream.net (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id 20BC9800BB; Mon, 31 Aug 2015 05:40:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=newdream.net; h=date:from :to:cc:subject:in-reply-to:message-id:references:mime-version :content-type; s=newdream.net; bh=Ff5fs5nj6rthBWfuI5cLuchbJ00=; b= FsqMoe7cRJHiH7pevYnorriP85qXZKBN4AxLKZyuGG+MkzHgFN7bId5MLP93mof8 JXqeUR/eburmamtPbkgbMdaG1yNOHmc/q0ilfwq7NvQHv02X9cese5KUG/obNwTJ RvhH9oXsN9enBlg7LSf2WXR0EX0onJr6Qa2ih8K2PT4= Received: by cobra.newdream.net (Postfix, from userid 1031) id 1F2088133E; Mon, 31 Aug 2015 05:40:04 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id 1E2FD800BB; Mon, 31 Aug 2015 05:40:04 -0700 (PDT) Date: Mon, 31 Aug 2015 05:40:04 -0700 (PDT) From: Sage Weil To: Dave Chinner cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic In-Reply-To: <20150831084814.GG26895@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: References: <1440724990-25073-1-git-send-email-david@fromorbit.com> <20150828043253.GB26895@dastard> <20150828220454.GC26895@dastard> <20150831022155.GE26895@dastard> <20150831084814.GG26895@dastard> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: cobra.newdream.net[66.33.216.30] X-Barracuda-Start-Time: 1441024804 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22087 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, 31 Aug 2015, Dave Chinner wrote: > On Mon, Aug 31, 2015 at 12:21:55PM +1000, Dave Chinner wrote: > > On Sat, Aug 29, 2015 at 08:04:54AM +1000, Dave Chinner wrote: > > > On Fri, Aug 28, 2015 at 08:11:20AM -0700, Sage Weil wrote: > > > > Hi Dave, > > > > > > > > On Fri, 28 Aug 2015, Dave Chinner wrote: > > > > > > > > > > From: Dave Chinner > > > > > > > > > > Sage Weil reported that a ceph test workload was writing to the > > > > > log on every fdatasync during an overwrite workload. Event tracing > > > > > showed that the only metadata modification being made was the > > > > > timestamp updates during the write(2) syscall, but fdatasync(2) > > > > > is supposed to ignore them. The key observation was that the > > > > > transactions in the log all looked like this: > > > [....] > > > > > > > > --- > > > > > Version 2: > > > > > - include the hunk from fs/xfs/xfs_trans_inode.c that I missed > > > > > when committing the patch locally the first time. > > > > > > > > I gave this a go on my machine but I'm still seeing the same symptom. > > > > > > OK, that implies the inode buffer has not been submitted for IO and > > > so the inode is being held in "flushing" state for an extended > > > period of time. > > > > > > > I've gathered the trace, strace, and other useful bits at > > > > > > > > http://newdream.net/~sage/drop/rocksdb.2/ > > > > > > > > This is pretty easy to reproduce with the ceph_test_keyvaluedb binary > > > > (built on fedora 22), also in that dir: > > > > > > > > rm -rf kv_test_temp_dir/ > > > > ./ceph_test_keyvaluedb --gtest_filter=KeyValueDB/KVTest.BenchCommit/1 > > > > > > I'll have a deeper look. > > > > Ok, I was assuming this is a longer running test than it is - it > > only takes about 2300ms to run on my test box. Hence the problem is > > that the inode has never been flushed out, and so it's being > > relogged in full on every fdatasync() operation. Another, similar > > change is necessary to track the changes since the last time the > > inode was flushed to the log. > > This is more complex than I expected, and I ended up chasing down a > rathole because performance is now *highly variable*. > > Before making these changes, the performance was consistent at > 2.3-2.6s for a test run on my test machine. It's on SSDs, with a 1GB > BBWC in front of them, so there's minimal IO latency, and hence the > average commit latency was around 2.5ms for the original (bad) > fdatasync behaviour. > > priming > now doing small writes > 1024 commits in 2.582939, avg latency 0.0025224 > [ OK ] KeyValueDB/KVTest.BenchCommit/1 (2600 ms) > [----------] 1 test from KeyValueDB/KVTest (2600 ms total) > > [----------] Global test environment tear-down > [==========] 1 test from 1 test case ran. (2600 ms total) > [ PASSED ] 1 test. > > > Now I see the test often complete in about 1.1s, or ~1.1ms per > write/fdatasync operation. That's definitely an improvement, > > priming > now doing small writes > 1024 commits in 1.133530, avg latency 0.00110696 > [ OK ] KeyValueDB/KVTest.BenchCommit/1 (1148 ms) > [----------] 1 test from KeyValueDB/KVTest (1148 ms total) > > [----------] Global test environment tear-down > [==========] 1 test from 1 test case ran. (1149 ms total) > [ PASSED ] 1 test. > > but every 4-5 test runs I'd see a test run that would take 8s to > complete: > > priming > now doing small writes > 1024 commits in 8.373202, avg latency 0.00817696 > [ OK ] KeyValueDB/KVTest.BenchCommit/1 (8429 ms) > [----------] 1 test from KeyValueDB/KVTest (8430 ms total) > > [----------] Global test environment tear-down > [==========] 1 test from 1 test case ran. (8430 ms total) > [ PASSED ] 1 test. > > This is completely reproducable, and very annoying as it doesn't > happen without these fdatasync optimisation patches. Note that rocksdb itself might be doing something nondeterministic too (like writing out 4mb sst files from the priming stage). Though it sounds like that isn't (the only thing) happening here... and it certainly wouldn't account for 7 seconds. > After taking a tangent to find a tracepoint regression that was > getting in my way, I found that there was a significant pause > between the inode locking calls within xfs_file_fsync and the inode > locking calls on the buffered write. Roughly 8ms, in fact, on almost > every call. After adding a couple more test trace points into the > XFS fsync code, it turns out that a hardware cache flush is causing > the delay. That is, because we aren't doing log writes that trigger > cache flushes and FUA writes, we have to issue a > blkdev_issue_flush() call from xfs_file_fsync and that is taking 8ms > to complete. This is where my understanding of block layer flushing really breaks down, but in both cases we're issues flush requests to the hardware, right? Is the difference that the log write is a FUA flush request with data, and blkdev_issue_flush() issues a flush request without associated data? > IOWs, on my hardware, making fdatasync work correctly completely > destroys workload determinism. The full fsync adds 1ms to each > operation, but it is constant and unchanging. The fdatasyncs fast > most of the time, but every so often the cache flush blows > performance all to hell and so over time (e.g. 100 test runs) > fdatasync is little faster than using a full fsync. > > So, that's the rat hole I've been down today - once again proving > that Modern Storage Hardware Still Sucks. > > Anyway, I'm going to do correctness testing now that I know the > performance problems are hardware and not software..... Thanks, Dave! Sorry this snowballed... sage From eguan@redhat.com Mon Aug 31 08:30:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0E86C29DF5 for ; Mon, 31 Aug 2015 08:30:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 814B7AC005 for ; Mon, 31 Aug 2015 06:30:11 -0700 (PDT) X-ASG-Debug-ID: 1441027809-04cbb07cbc16db50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id r4z6sH5qwC0Vxbq2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 06:30:10 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 7E5BCC23AFEA; Mon, 31 Aug 2015 13:30:09 +0000 (UTC) Received: from localhost (dhcp-12-142.nay.redhat.com [10.66.12.142]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7VDU6XQ030672; Mon, 31 Aug 2015 09:30:08 -0400 From: Eryu Guan To: fstests@vger.kernel.org Cc: djeffery@redhat.com, xfs@oss.sgi.com, david@fromorbit.com, Eryu Guan Subject: [PATCH] generic: test partial block device failure Date: Mon, 31 Aug 2015 21:28:24 +0800 X-ASG-Orig-Subj: [PATCH] generic: test partial block device failure Message-Id: <1441027704-25185-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1441027810 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Calls like fsync() should report failure on partial I/O failure, e.g. a single failed disk in a raid 0 stripe. This test is motivated by an XFS bug, and this commit fixed the issue xfs: return errors from partial I/O failures to files This case is written by David Jeffery originally. Signed-off-by: Eryu Guan --- Tested this case on 4.2-rc7 kernel and test failed as expected, and test passed on 4.2-rc7+patch kernel. ExtN and btrfs all passed the test. tests/generic/107 | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/107.out | 2 ++ tests/generic/group | 1 + 3 files changed, 101 insertions(+) create mode 100755 tests/generic/107 create mode 100644 tests/generic/107.out diff --git a/tests/generic/107 b/tests/generic/107 new file mode 100755 index 0000000..84e9354 --- /dev/null +++ b/tests/generic/107 @@ -0,0 +1,98 @@ +#! /bin/bash +# FS QA Test 107 +# +# Test partial block device failure. Calls like fsync() should report failure +# on partial I/O failure, e.g. a single failed disk in a raid 0 stripe. +# +# Test motivated by an XFS bug, and this commit fixed the issue +# xfs: return errors from partial I/O failures to files +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 Red Hat Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + echo running > /sys/block/`_short_dev $SCSI_DEBUG_DEV`/device/state + $UMOUNT_PROG $SCRATCH_MNT >>$seqres.full 2>&1 + $LVM_PROG vgremove -f $vgname >>$seqres.full 2>&1 + $LVM_PROG pvremove -f $SCRATCH_DEV $SCSI_DEBUG_DEV >>$seqres.full 2>&1 + _put_scsi_debug_dev + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/scsi_debug + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch_nocheck +_require_block_device $SCRATCH_DEV +_require_scsi_debug +_require_command "$LVM_PROG" lvm + +lvname=lv_$seq +vgname=vg_$seq +rm -f $seqres.full + +# _get_scsi_debug_dev returns a scsi debug device with 128M in size by default +SCSI_DEBUG_DEV=`_get_scsi_debug_dev` +if [ "$SCSI_DEBUG_DEV" == "" ]; then + _fail "Failed to initialize scsi debug device" +fi +echo "SCSI debug device $SCSI_DEBUG_DEV" >>$seqres.full + +# create striped volume with 4MB stripe size +$LVM_PROG pvcreate -f $SCSI_DEBUG_DEV $SCRATCH_DEV >>$seqres.full 2>&1 +$LVM_PROG vgcreate -f $vgname $SCSI_DEBUG_DEV $SCRATCH_DEV >>$seqres.full 2>&1 +$LVM_PROG lvcreate --yes -i 2 -I 4m -l 100%FREE -n $lvname $vgname \ + >>$seqres.full 2>&1 +# wait for lv creation to fully complete +$UDEV_SETTLE_PROG >>$seqres.full 2>&1 + +# _mkfs_dev exits the test on failure, this makes sure test lv is created by +# above vgcreate/lvcreate operations +_mkfs_dev /dev/mapper/$vgname-$lvname + +_mount /dev/mapper/$vgname-$lvname $SCRATCH_MNT + +# create a test file with contiguous blocks which will span across the 2 disks +$XFS_IO_PROG -f -c "pwrite 0 16M" -c fsync $SCRATCH_MNT/testfile >>$seqres.full + +# offline the scsi debug device +echo offline > /sys/block/`_short_dev $SCSI_DEBUG_DEV`/device/state + +# write to an allocated area of the test file with writes which spans both disks +# and call fsync, the fsync should report failure +$XFS_IO_PROG -c "pwrite -b 1M 0 6M" -c fsync $SCRATCH_MNT/testfile \ + >>$seqres.full + +status=0 +exit diff --git a/tests/generic/107.out b/tests/generic/107.out new file mode 100644 index 0000000..9d57184 --- /dev/null +++ b/tests/generic/107.out @@ -0,0 +1,2 @@ +QA output created by 107 +fsync: Input/output error diff --git a/tests/generic/group b/tests/generic/group index a33536e..4ccbb09 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -109,6 +109,7 @@ 104 auto quick metadata 105 acl auto quick 106 auto quick metadata +107 auto quick rw 112 rw aio auto quick 113 rw aio auto quick 117 attr auto quick -- 1.8.3.1 From bfoster@redhat.com Mon Aug 31 13:02:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9BBDA7F47 for ; Mon, 31 Aug 2015 13:02:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C5288F804B for ; Mon, 31 Aug 2015 11:02:26 -0700 (PDT) X-ASG-Debug-ID: 1441044145-04cbb07cbd17a290001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WB3qEWNkey6eAQGN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 11:02:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id C0427550DA; Mon, 31 Aug 2015 18:02:24 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7VI2OGR017918; Mon, 31 Aug 2015 14:02:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D9D09123E8A; Mon, 31 Aug 2015 14:02:22 -0400 (EDT) Date: Mon, 31 Aug 2015 14:02:22 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: Introduce writeback context for writepages Message-ID: <20150831180221.GA16371@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: Introduce writeback context for writepages References: <1440479153-1584-1-git-send-email-david@fromorbit.com> <1440479153-1584-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440479153-1584-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1441044145 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 25, 2015 at 03:05:51PM +1000, Dave Chinner wrote: > From: Dave Chinner > > xfs_vm_writepages() calls generic_writepages to writeback a range of > a file, but then xfs_vm_writepage() clusters pages itself as it does > not have any context it can pass between->writepage calls from > __write_cache_pages(). > > Introduce a writeback context for xfs_vm_writepages() and call > __write_cache_pages directly with our own writepage callback so that > we can pass that context to each writepage invocation. This > encapsulates the current mapping, whether it is valid or not, the > current ioend and it's IO type and the ioend chain being built. > > This requires us to move the ioend submission up to the level where > the writepage context is declared. This does mean we do not submit > IO until we packaged the entire writeback range, but with the block > plugging in the writepages call this is the way IO is submitted, > anyway. > Ok, but the comment for blk_start_plug() mentions some kind of flush on task sleep mechanism. I could be wrong, but I take this to mean there are cases where I/O can initiate before the plug is stopped. Does deferring the I/O submission across writepages defeat that heuristic in any way? My (preliminary) understanding is that while the I/O submission would still be deferred by the plug in the same way in most cases, we're potentially holding back I/Os from the block infrastructure until the entire writepages sequence is complete. > It also means that we need to handle discontiguous page ranges. If > the pages sent down by write_cache_pages to the writepage callback > are discontiguous, we need to detect this and put each discontiguous > page range into individual ioends. This is needed to ensure that the > ioend accurately represents the range of the file that it covers so > that file size updates during IO completion set the size correctly. > Failure to take into account the discontiguous ranges results in > files being too small when writeback patterns are non-sequential. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_aops.c | 277 ++++++++++++++++++++++++++++-------------------------- > 1 file changed, 146 insertions(+), 131 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 89fad6b..93bf13c 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -36,6 +36,18 @@ > #include > #include > ... > @@ -1151,29 +1135,36 @@ xfs_vm_writepage( > if (end_index > last_index) > end_index = last_index; > > - xfs_cluster_write(inode, page->index + 1, &imap, &ioend, > - wbc, end_index); > + xfs_cluster_write(inode, page->index + 1, wpc, wbc, end_index); > } > > - > - /* > - * Reserve log space if we might write beyond the on-disk inode size. > - */ > - err = 0; > - if (ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) > - err = xfs_setfilesize_trans_alloc(ioend); > - > - xfs_submit_ioend(wbc, iohead, err); > - > return 0; > > error: > - if (iohead) > - xfs_cancel_ioend(iohead); > + /* > + * We have to fail the iohead here because we buffers locked in the > + * ioend chain. If we don't do this, we'll deadlock invalidating the > + * page as that tries to lock the buffers on the page. Also, because we > + * have set pages under writeback, we have to run IO completion to mark > + * the error state of the IO appropriately, so we can't cancel the ioend > + * directly here. That means we have to mark this page as under > + * writeback if we included any buffers from it in the ioend chain. > + */ > + if (count) > + xfs_start_page_writeback(page, 0, count); > + xfs_writepage_submit(wpc, wbc, err); What are the error handling ramifications here for the previous, pending ioends? Previously, it looks like we would either fail in xfs_map_blocks() or submit I/O for each extent mapping. In other words, errors were not taken into consideration by the time we get into/past xfs_cluster_write(). Now it looks as though writepages carries on chaining ioends until we're done or hit an error, and then the entire ioend chain is subject to the error. I suppose a mapping error here is indicative of a larger problem, but do we really want to fail the entire writeback here? (If nothing else, the comments above should probably touch on this case). Brian > > - xfs_aops_discard_page(page); > - ClearPageUptodate(page); > - unlock_page(page); > + /* > + * We can only discard the page we had the IO error on if we haven't > + * included it in the ioend above. If it has already been errored out, > + * the it is unlocked and we can't touch it here. > + */ > + if (!count) { > + xfs_aops_discard_page(page); > + ClearPageUptodate(page); > + unlock_page(page); > + } > + mapping_set_error(page->mapping, err); > return err; > > redirty: > @@ -1183,12 +1174,36 @@ redirty: > } > > STATIC int > +xfs_vm_writepage( > + struct page *page, > + struct writeback_control *wbc) > +{ > + struct xfs_writepage_ctx wpc = { > + .io_type = XFS_IO_OVERWRITE, > + }; > + int ret; > + > + ret = xfs_do_writepage(page, wbc, &wpc); > + if (ret) > + return ret; > + return xfs_writepage_submit(&wpc, wbc, ret); > +} > + > +STATIC int > xfs_vm_writepages( > struct address_space *mapping, > struct writeback_control *wbc) > { > + struct xfs_writepage_ctx wpc = { > + .io_type = XFS_IO_OVERWRITE, > + }; > + int ret; > + > xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED); > - return generic_writepages(mapping, wbc); > + ret = write_cache_pages(mapping, wbc, xfs_do_writepage, &wpc); > + if (ret) > + return ret; > + return xfs_writepage_submit(&wpc, wbc, ret); > } > > /* > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 31 13:19:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4111C7F47 for ; Mon, 31 Aug 2015 13:19:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5D4EAC006 for ; Mon, 31 Aug 2015 11:19:36 -0700 (PDT) X-ASG-Debug-ID: 1441045175-04cbb07cbb17a930001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oTHIo0Y5fzrjGk5m (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 11:19:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id C5A9D223; Mon, 31 Aug 2015 18:19:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7VIJXNd027788; Mon, 31 Aug 2015 14:19:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 67605123E8A; Mon, 31 Aug 2015 14:19:32 -0400 (EDT) Date: Mon, 31 Aug 2015 14:19:32 -0400 From: Brian Foster To: Lucas Stach Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: add mssing inode cache attempts counter increment Message-ID: <20150831181931.GB16371@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: add mssing inode cache attempts counter increment References: <1440702261-3018-1-git-send-email-dev@lynxeye.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440702261-3018-1-git-send-email-dev@lynxeye.de> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1441045175 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 27, 2015 at 09:04:21PM +0200, Lucas Stach wrote: > Increasing the inode cache attempt counter was apparently dropped while > refactoring the cache code and so stayed at the initial 0 value. Add the > increment back to make the runtime stats more useful. > > Signed-off-by: Lucas Stach > --- Heh, this goes back to: bf90424 [XFS] Combine the XFS and Linux inodes ... from 2008. :) Reviewed-by: Brian Foster > fs/xfs/xfs_icache.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index 76a9f27..0a326bd 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -412,6 +412,8 @@ xfs_iget( > if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) > return -EINVAL; > > + XFS_STATS_INC(xs_ig_attempts); > + > /* get the perag structure and ensure that it's inode capable */ > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); > agino = XFS_INO_TO_AGINO(mp, ino); > -- > 2.4.3 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 31 13:19:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 65E3D7F47 for ; Mon, 31 Aug 2015 13:19:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 315AC304032 for ; Mon, 31 Aug 2015 11:19:56 -0700 (PDT) X-ASG-Debug-ID: 1441045178-04bdf0239713a0e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zqZYAFQ2n1QZftG8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 11:19:38 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 29656A4CD6 for ; Mon, 31 Aug 2015 18:19:38 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-103.bos.redhat.com [10.18.41.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7VIJb38031735; Mon, 31 Aug 2015 14:19:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 806B8123E8A; Mon, 31 Aug 2015 14:19:36 -0400 (EDT) Date: Mon, 31 Aug 2015 14:19:36 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: fix error gotos in xfs_setattr_nonsize Message-ID: <20150831181935.GC16371@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix error gotos in xfs_setattr_nonsize References: <55DF80BA.9020101@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <55DF80BA.9020101@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1441045178 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 27, 2015 at 04:27:22PM -0500, Eric Sandeen wrote: > As the code stands today, if xfs_trans_reserve() fails, we > goto out_dqrele, which does not free the allocated transaction. > > Fix up the goto targets to undo everything properly. > > Addresses-Coverity-Id: 145571 > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > > Full disclosure: build tested only, as these are error paths > which we don't easily fail... > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 766b23f..8294132 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -609,7 +609,7 @@ xfs_setattr_nonsize( > tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); > if (error) > - goto out_dqrele; > + goto out_trans_cancel; > > xfs_ilock(ip, XFS_ILOCK_EXCL); > > @@ -640,7 +640,7 @@ xfs_setattr_nonsize( > NULL, capable(CAP_FOWNER) ? > XFS_QMOPT_FORCE_RES : 0); > if (error) /* out of quota */ > - goto out_trans_cancel; > + goto out_unlock; > } > } > > @@ -729,10 +729,10 @@ xfs_setattr_nonsize( > > return 0; > > +out_unlock: > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > out_trans_cancel: > xfs_trans_cancel(tp); > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > -out_dqrele: > xfs_qm_dqrele(udqp); > xfs_qm_dqrele(gdqp); > return error; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:42:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 84E807F47 for ; Mon, 31 Aug 2015 13:42:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59F248F8035 for ; Mon, 31 Aug 2015 11:42:01 -0700 (PDT) X-ASG-Debug-ID: 1441046518-04cb6c0e0f00730001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bpi9hgrFYQ6XXvdx (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:41:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWU1m-0000AT-E8; Mon, 31 Aug 2015 18:41:58 +0000 Date: Mon, 31 Aug 2015 11:41:58 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: remove nonblocking mode from xfs_vm_writepage Message-ID: <20150831184158.GA349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: remove nonblocking mode from xfs_vm_writepage References: <1440479153-1584-1-git-send-email-david@fromorbit.com> <1440479153-1584-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440479153-1584-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441046519 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:56:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE1707F47 for ; Mon, 31 Aug 2015 13:56:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF0418F804B for ; Mon, 31 Aug 2015 11:56:15 -0700 (PDT) X-ASG-Debug-ID: 1441047373-04cb6c0e0d00b40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HXqF4LA8wMHXlda0 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:56:14 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUFY-0006T2-Oq; Mon, 31 Aug 2015 18:56:12 +0000 Date: Mon, 31 Aug 2015 11:56:12 -0700 From: Christoph Hellwig To: Brian Foster Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: Introduce writeback context for writepages Message-ID: <20150831185612.GB349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: Introduce writeback context for writepages References: <1440479153-1584-1-git-send-email-david@fromorbit.com> <1440479153-1584-3-git-send-email-david@fromorbit.com> <20150831180221.GA16371@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150831180221.GA16371@bfoster.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047374 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 31, 2015 at 02:02:22PM -0400, Brian Foster wrote: > Ok, but the comment for blk_start_plug() mentions some kind of flush on > task sleep mechanism. I could be wrong, but I take this to mean there > are cases where I/O can initiate before the plug is stopped. Does > deferring the I/O submission across writepages defeat that heuristic in > any way? My (preliminary) understanding is that while the I/O submission > would still be deferred by the plug in the same way in most cases, we're > potentially holding back I/Os from the block infrastructure until the > entire writepages sequence is complete. Yes, we do. But the reason why the block layer needs to flush the plug on context switch is because we only have a limited bio mempool, and if processes that are not running consume that we can't make guaranteed progress. The XFS writeback code doesn't allocate bios until the end we are not affected by that particular issues, although we still need to worry about our own ioend mempools. Sidenote: Jens now has the arbitrarily sized bio code in his queue for 4.3. With that we could replace our ioends with bios that have a little private data and simplify the submission phase of the writeback code significantly. From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:57:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1CD087F47 for ; Mon, 31 Aug 2015 13:57:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E671B8F804B for ; Mon, 31 Aug 2015 11:57:08 -0700 (PDT) X-ASG-Debug-ID: 1441047423-04cb6c0e0f00b90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ed6qT5oqWHmdHXE2 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:57:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUGN-0006Wm-IQ; Mon, 31 Aug 2015 18:57:03 +0000 Date: Mon, 31 Aug 2015 11:57:03 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 01/11] xfsprogs: Add a way to compile without blkid Message-ID: <20150831185703.GC349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfsprogs: Add a way to compile without blkid References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-1-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047424 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 26, 2015 at 02:02:25PM +0200, Jan Tulak wrote: > Because not all platforms have up-to-date blkid with required > functions, allow at least partial functionality by adding > --enable-blkid=yes/no optional configure argument. > > When blkid is disabled, signature detection and device geometry > detection doesn't work. Looks good, Reviewed-by: Christoph Hellwig From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:58:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C72D7F47 for ; Mon, 31 Aug 2015 13:58:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 703468F8035 for ; Mon, 31 Aug 2015 11:58:19 -0700 (PDT) X-ASG-Debug-ID: 1441047498-04cb6c0e0d00be0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id JDZU4mb9Y8go8Vii (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:58:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUHZ-0006ia-Sd; Mon, 31 Aug 2015 18:58:17 +0000 Date: Mon, 31 Aug 2015 11:58:17 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX Message-ID: <20150831185817.GD349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/11] xfsprogs: avoid dependency on linux XATTR_SIZE/LIST_MAX References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-2-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-2-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047498 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > index b1c0c10..d532f44 100644 > --- a/libhandle/handle.c > +++ b/libhandle/handle.c > @@ -21,6 +21,8 @@ > #include "xfs.h" > #include "handle.h" > #include "parent.h" > +#include "xfs/xfs_arch.h" > +#include "xfs/xfs_format.h" These headers should not be used in libhandle. As mentioned last time I think libhandle should get it's own LIBHANDLE_XATTR_LIST_MAX define, separate frome the one for the on disk format. From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:58:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6FF57F47 for ; Mon, 31 Aug 2015 13:58:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67DE4AC005 for ; Mon, 31 Aug 2015 11:58:36 -0700 (PDT) X-ASG-Debug-ID: 1441047514-04bdf06dd600e20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GVRZGhSjMJVOH9br (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:58:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUHq-0006k6-Ek; Mon, 31 Aug 2015 18:58:34 +0000 Date: Mon, 31 Aug 2015 11:58:34 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 03/11] xfsprogs: Add includes required for OS X builds (delta) Message-ID: <20150831185834.GE349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/11] xfsprogs: Add includes required for OS X builds (delta) References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-3-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-3-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047514 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:59:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B4A57F47 for ; Mon, 31 Aug 2015 13:59:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D5E3AC004 for ; Mon, 31 Aug 2015 11:59:03 -0700 (PDT) X-ASG-Debug-ID: 1441047543-04bdf06dd600e70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 0HOk6MmiLIzugqBw (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:59:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUIJ-0006o3-43; Mon, 31 Aug 2015 18:59:03 +0000 Date: Mon, 31 Aug 2015 11:59:03 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 04/11] xfsprogs: Add autoconf check for fsetxattr call Message-ID: <20150831185903.GF349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/11] xfsprogs: Add autoconf check for fsetxattr call References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-4-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-4-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047543 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks ok, Reviewed-by: Christoph Hellwig From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:59:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D41957F47 for ; Mon, 31 Aug 2015 13:59:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8F51304032 for ; Mon, 31 Aug 2015 11:59:16 -0700 (PDT) X-ASG-Debug-ID: 1441047555-04bdf06dd900e90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YjfFwYaWfzgfGOX3 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:59:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUIV-0006pp-P9; Mon, 31 Aug 2015 18:59:15 +0000 Date: Mon, 31 Aug 2015 11:59:15 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 05/11] xfsprogs: uuid changes for OS X Message-ID: <20150831185915.GG349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/11] xfsprogs: uuid changes for OS X References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-5-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-5-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047555 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:59:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B70347F47 for ; Mon, 31 Aug 2015 13:59:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C5078F804C for ; Mon, 31 Aug 2015 11:59:28 -0700 (PDT) X-ASG-Debug-ID: 1441047566-04cbb06aca00cd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bjzVcqMV0NY3Xq1j (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:59:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUIg-0006s1-Mi; Mon, 31 Aug 2015 18:59:26 +0000 Date: Mon, 31 Aug 2015 11:59:26 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 06/11] xfsprogs: Remove conflicting define for OS X Message-ID: <20150831185926.GH349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/11] xfsprogs: Remove conflicting define for OS X References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-6-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-6-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047567 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 13:59:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 58ED17F47 for ; Mon, 31 Aug 2015 13:59:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CA9E304032 for ; Mon, 31 Aug 2015 11:59:46 -0700 (PDT) X-ASG-Debug-ID: 1441047584-04cb6c0e0f00c50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Or06k4A3sGMVbXmS (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 11:59:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUIy-0006wy-Ob; Mon, 31 Aug 2015 18:59:44 +0000 Date: Mon, 31 Aug 2015 11:59:44 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 07/11] xfsprogs: add nftw64 translation for OS X Message-ID: <20150831185944.GI349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/11] xfsprogs: add nftw64 translation for OS X References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-7-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-7-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047585 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 26, 2015 at 02:02:31PM +0200, Jan Tulak wrote: > OS X has only nftw variant - not the 64 suffix used in xfs. Can you just use a #define? From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 14:00:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 032337F47 for ; Mon, 31 Aug 2015 14:00:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB9BB304039 for ; Mon, 31 Aug 2015 12:00:10 -0700 (PDT) X-ASG-Debug-ID: 1441047605-04bdf06dd600ef0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 56JjVccgYSOTaJDy (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 12:00:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUJJ-0007iy-1J; Mon, 31 Aug 2015 19:00:05 +0000 Date: Mon, 31 Aug 2015 12:00:05 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 08/11] xfsprogs: Add a timer implementation for OS X Message-ID: <20150831190005.GJ349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/11] xfsprogs: Add a timer implementation for OS X References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-8-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-8-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047605 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 26, 2015 at 02:02:32PM +0200, Jan Tulak wrote: > OS X does not have the timer used in xfs_repair. > Add a simple implementation providing the required > capabilities. This doesn't look like it would actually work. From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 14:01:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 391387F47 for ; Mon, 31 Aug 2015 14:01:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F0BA8F804C for ; Mon, 31 Aug 2015 12:01:22 -0700 (PDT) X-ASG-Debug-ID: 1441047680-04cbb06acd00db0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Jf8rfyVS43TG5ThG (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 12:01:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUKW-00009t-LF; Mon, 31 Aug 2015 19:01:20 +0000 Date: Mon, 31 Aug 2015 12:01:20 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 10/11] xfsprogs: add dummy mntent for OS X Message-ID: <20150831190120.GK349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/11] xfsprogs: add dummy mntent for OS X References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-10-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-10-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047681 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 26, 2015 at 02:02:34PM +0200, Jan Tulak wrote: > Because these calls are used only by xfs_fsr, which can't > work on OS X unless a way how to mount XFS is found, > there is not use in implementing these calls. Take a look at the quota code for the BSD alternative to mntent. That code should be moved into a common location and used by fsr. From BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 31 14:01:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EB0C27F47 for ; Mon, 31 Aug 2015 14:01:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CFC10304032 for ; Mon, 31 Aug 2015 12:01:45 -0700 (PDT) X-ASG-Debug-ID: 1441047704-04cbb06acc00de0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id SiEHvUv9NPxYdANj (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Aug 2015 12:01:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0df038ff8ab1394fc04d+4390+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZWUKs-0000Hn-Ui; Mon, 31 Aug 2015 19:01:42 +0000 Date: Mon, 31 Aug 2015 12:01:42 -0700 From: Christoph Hellwig To: Jan Tulak Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH 11/11] xfsprogs: add dummy mremap for OS X Message-ID: <20150831190142.GL349@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/11] xfsprogs: add dummy mremap for OS X References: <1440590449-20372-1-git-send-email-jtulak@redhat.com> <1440590555-20463-1-git-send-email-jtulak@redhat.com> <1440590555-20463-11-git-send-email-jtulak@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1440590555-20463-11-git-send-email-jtulak@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1441047704 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22095 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS NAK - just don't compile the mremap support in xfs_io if support for it is missing in the OS. From rostedt@goodmis.org Mon Aug 31 14:45:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AF4A07F47 for ; Mon, 31 Aug 2015 14:45:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83624304032 for ; Mon, 31 Aug 2015 12:45:27 -0700 (PDT) X-ASG-Debug-ID: 1441050324-04cbb06aca01d80001-NocioJ Received: from smtprelay.hostedemail.com (smtprelay0129.hostedemail.com [216.40.44.129]) by cuda.sgi.com with ESMTP id tm1EPtMQTWPJyeB4 for ; Mon, 31 Aug 2015 12:45:25 -0700 (PDT) X-Barracuda-Envelope-From: rostedt@goodmis.org X-Barracuda-Apparent-Source-IP: 216.40.44.129 Received: from filter.hostedemail.com (unknown [216.40.38.60]) by smtprelay08.hostedemail.com (Postfix) with ESMTP id B7C3629DDFA; Mon, 31 Aug 2015 19:45:24 +0000 (UTC) X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-HE-Tag: tank55_2f2552d1cf454 X-Filterd-Recvd-Size: 1775 Received: from gandalf.local.home (cpe-67-246-153-56.stny.res.rr.com [67.246.153.56]) (Authenticated sender: rostedt@goodmis.org) by omf12.hostedemail.com (Postfix) with ESMTPA; Mon, 31 Aug 2015 19:45:23 +0000 (UTC) Date: Mon, 31 Aug 2015 15:45:21 -0400 From: Steven Rostedt To: Scott Wood Cc: Dave Chinner , , , Subject: Re: [PATCH 21/22] xfs: %pF is only for function pointers Message-ID: <20150831154521.1c9353b6@gandalf.local.home> X-ASG-Orig-Subj: Re: [PATCH 21/22] xfs: %pF is only for function pointers In-Reply-To: <1441049065.4966.38.camel@freescale.com> References: <1426130037-17956-1-git-send-email-scottwood@freescale.com> <1426130037-17956-21-git-send-email-scottwood@freescale.com> <20150831080657.GF26895@dastard> <1441049065.4966.38.camel@freescale.com> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.28; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay0129.hostedemail.com[216.40.44.129] X-Barracuda-Start-Time: 1441050325 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22096 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 31 Aug 2015 14:24:25 -0500 Scott Wood wrote: > > Can you please look into why this change broke the tracing output > > on x86-64 - if there is no obvious/easy fix for it, then I'm simply > > going to revert it because having the tracing work correctly on > > x86-64 is far more important to us than ppc64 or ia64.... > > It looks like the cause is that TP_printk() is not really printk() -- it > actually passes the format to userspace which has its own, not 100% > compatible implementation pretty_print() in tools/lib/traceevent/event- > parse.c. %pf in that function behaves like %ps in the kernel, and %ps is > absent. > We can fix that with adding %ps to the traceevent library. -- Steve From rostedt@goodmis.org Mon Aug 31 15:05:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 772677F47 for ; Mon, 31 Aug 2015 15:05:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0AF63AC00A for ; Mon, 31 Aug 2015 13:05:55 -0700 (PDT) X-ASG-Debug-ID: 1441051554-04bdf06dd7026f0001-NocioJ Received: from smtprelay.hostedemail.com (smtprelay0022.hostedemail.com [216.40.44.22]) by cuda.sgi.com with ESMTP id HFeEGoxBbDLGfKV0 for ; Mon, 31 Aug 2015 13:05:54 -0700 (PDT) X-Barracuda-Envelope-From: rostedt@goodmis.org X-Barracuda-Apparent-Source-IP: 216.40.44.22 Received: from filter.hostedemail.com (unknown [216.40.38.60]) by smtprelay08.hostedemail.com (Postfix) with ESMTP id BE2D229DE46; Mon, 31 Aug 2015 20:05:53 +0000 (UTC) X-Session-Marker: 726F737465647440676F6F646D69732E6F7267 X-HE-Tag: land43_507f37a07c83a X-Filterd-Recvd-Size: 1894 Received: from gandalf.local.home (cpe-67-246-153-56.stny.res.rr.com [67.246.153.56]) (Authenticated sender: rostedt@goodmis.org) by omf06.hostedemail.com (Postfix) with ESMTPA; Mon, 31 Aug 2015 20:05:53 +0000 (UTC) Date: Mon, 31 Aug 2015 16:05:51 -0400 From: Steven Rostedt To: Scott Wood Cc: Dave Chinner , , , Subject: Re: [PATCH 21/22] xfs: %pF is only for function pointers Message-ID: <20150831160551.4e4fb61c@gandalf.local.home> X-ASG-Orig-Subj: Re: [PATCH 21/22] xfs: %pF is only for function pointers In-Reply-To: <1441051104.4966.41.camel@freescale.com> References: <1426130037-17956-1-git-send-email-scottwood@freescale.com> <1426130037-17956-21-git-send-email-scottwood@freescale.com> <20150831080657.GF26895@dastard> <1441049065.4966.38.camel@freescale.com> <20150831154521.1c9353b6@gandalf.local.home> <1441051104.4966.41.camel@freescale.com> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.28; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay0022.hostedemail.com[216.40.44.22] X-Barracuda-Start-Time: 1441051554 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22096 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, 31 Aug 2015 14:58:24 -0500 Scott Wood wrote: > > We can fix that with adding %ps to the traceevent library. > > I wasn't sure if this would be considered a stable ABI issue, as it's not > about the events themselves, but about the event mechanism. When it comes to trace events, there's a fine line about the use space stable ABI. Even Linus has mentioned that tracing and perf counters are "special", as the two are not about a feature of the kernel, but instead a way to see how the kernel works internally. I've fixed up trace-cmd and libtraceevent more than once in the past due to changes in the kernel. Unless it truly breaks the tool, it should be fine to fix up tracepoints to handle small changes like this. -- Steve From david@fromorbit.com Mon Aug 31 16:51:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A64367F47 for ; Mon, 31 Aug 2015 16:51:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 606FB304039 for ; Mon, 31 Aug 2015 14:51:32 -0700 (PDT) X-ASG-Debug-ID: 1441057889-04bdf06dd705a30001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id nRXrIVuZMgubwySl for ; Mon, 31 Aug 2015 14:51:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DGCADOy+RVPAUaLHldgxtUaYJVp1ABAQEBAQEGlXOFeQQCAoEsTQEBAQEBAQcBAQEBQAE/hCQBAQQ6HCMQCAMYCSUPBSUDBxoTiC3GbQEBAQEGAgEbBBmGEIVBhQsHhCwFlUGFB4dqmm2ENywzgk0BAQE Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 01 Sep 2015 07:21:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZWWz9-0000NT-MM; Tue, 01 Sep 2015 07:51:27 +1000 Date: Tue, 1 Sep 2015 07:51:27 +1000 From: Dave Chinner To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic Message-ID: <20150831215127.GH26895@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: timestamp updates cause excessive fdatasync log traffic References: <1440724990-25073-1-git-send-email-david@fromorbit.com> <20150828043253.GB26895@dastard> <20150828220454.GC26895@dastard> <20150831022155.GE26895@dastard> <20150831084814.GG26895@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1441057889 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22099 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 31, 2015 at 05:40:04AM -0700, Sage Weil wrote: > On Mon, 31 Aug 2015, Dave Chinner wrote: > > After taking a tangent to find a tracepoint regression that was > > getting in my way, I found that there was a significant pause > > between the inode locking calls within xfs_file_fsync and the inode > > locking calls on the buffered write. Roughly 8ms, in fact, on almost > > every call. After adding a couple more test trace points into the > > XFS fsync code, it turns out that a hardware cache flush is causing > > the delay. That is, because we aren't doing log writes that trigger > > cache flushes and FUA writes, we have to issue a > > blkdev_issue_flush() call from xfs_file_fsync and that is taking 8ms > > to complete. > > This is where my understanding of block layer flushing really breaks down, > but in both cases we're issues flush requests to the hardware, right? Is > the difference that the log write is a FUA flush request with data, and > blkdev_issue_flush() issues a flush request without associated data? Pretty much, though th elog write also does a cache flush before the FUA write. i.e. The log writes consist of a bio with data issued via: submit_bio(REQ_FUA | REQ_FLUSH | WRITE_SYNC, bio); blkdev_issue_flush consists of an empty bio issued via: submit_bio(REQ_FLUSH | WRITE_SYNC, bio); So from a block layer and filesystem point of view there is little difference, and the only difference at the SCSI layer is the WRITE w/ FUA that is issued after the cache flush in the log write case (see https://lwn.net/Articles/400541/ fo a bit more background). I haven't looked any deeper than this so far - I don't have time right now to do so... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 31 17:17:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1FA5E7F47 for ; Mon, 31 Aug 2015 17:17:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CBE758F8049 for ; Mon, 31 Aug 2015 15:17:46 -0700 (PDT) X-ASG-Debug-ID: 1441059464-04bdf06dd807520001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id VGITHPnWVTyyLJe2 for ; Mon, 31 Aug 2015 15:17:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DtCACC0eRVPAUaLHldgxuBPYJVg3yjVAEBAQEBAQabbAQCAoErTQEBAQEBAQcBAQEBQAE/hCMBAQEDATocIwULCAMOCgklDwUlAwcaE4gmB8ZyAQEIAiAZhhCFQYQyWQeELAWMbohTjHGabYQ3LDOBBYFIAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail06.adl6.internode.on.net with ESMTP; 01 Sep 2015 07:47:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZWXOZ-0000Q1-2j; Tue, 01 Sep 2015 08:17:43 +1000 Date: Tue, 1 Sep 2015 08:17:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: Introduce writeback context for writepages Message-ID: <20150831221743.GI26895@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: Introduce writeback context for writepages References: <1440479153-1584-1-git-send-email-david@fromorbit.com> <1440479153-1584-3-git-send-email-david@fromorbit.com> <20150831180221.GA16371@bfoster.bfoster> <20150831185612.GB349@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150831185612.GB349@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1441059464 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22099 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 31, 2015 at 11:56:12AM -0700, Christoph Hellwig wrote: > On Mon, Aug 31, 2015 at 02:02:22PM -0400, Brian Foster wrote: > > Ok, but the comment for blk_start_plug() mentions some kind of flush on > > task sleep mechanism. I could be wrong, but I take this to mean there > > are cases where I/O can initiate before the plug is stopped. Does > > deferring the I/O submission across writepages defeat that heuristic in > > any way? My (preliminary) understanding is that while the I/O submission > > would still be deferred by the plug in the same way in most cases, we're > > potentially holding back I/Os from the block infrastructure until the > > entire writepages sequence is complete. > > Yes, we do. But the reason why the block layer needs to flush the > plug on context switch is because we only have a limited bio mempool, > and if processes that are not running consume that we can't make > guaranteed progress. The XFS writeback code doesn't allocate bios > until the end we are not affected by that particular issues, although > we still need to worry about our own ioend mempools. The patch changes the bio allocation patterns - it allocates them on the fly and holds them, so we could potentially exhaust the bio mempool with this submission technique. The ioend allocation pattern is different, too, because we only used to have 1 per buffer on a writepage call and the last one was used for the write clustering. > Sidenote: Jens now has the arbitrarily sized bio code in his queue > for 4.3. With that we could replace our ioends with bios that have > a little private data and simplify the submission phase of the > writeback code significantly. Yes, I've been keeping an eye on that and waiting for it to land as it solves many of the above problems. I still wanted to get the write cluster infrastructure changes underway, though, so I can work on making the writeback path not use bufferheads at all... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 31 20:08:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F43A7F47 for ; Mon, 31 Aug 2015 20:08:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB64CAC003 for ; Mon, 31 Aug 2015 18:08:43 -0700 (PDT) X-ASG-Debug-ID: 1441069718-04cb6c0e0f090d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id SBzoZGMuXdRHoo0m for ; Mon, 31 Aug 2015 18:08:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DACgAL+uRVPAUaLHldgxsjMWmCVYN8o0gMAQEBAQEBBopaixMChX0EgTBNAQEBAQEBBwEBAQFAAT+FADskNAUlAwctiC2hbaUTGYYQimqCFwxBgTEFlUGFB4drgU2MZIQJiDWBcAwBgjosM4JNAQEB Received: from ppp121-44-26-5.lns20.syd4.internode.on.net (HELO dastard) ([121.44.26.5]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Sep 2015 10:23:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1ZWZpG-0000gc-Tu for xfs@oss.sgi.com; Tue, 01 Sep 2015 10:53:26 +1000 Date: Tue, 1 Sep 2015 10:53:26 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 5d54b8c Message-ID: <20150901005326.GP3902@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 5d54b8c MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="EXKGNeO8l0xGFBjy" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1441069718 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22105 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --EXKGNeO8l0xGFBjy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. This is the final update that will occur for the 4.3 merge window. Once this has sat in linux-next for a couple of days (assuming no problems arise) I'll tag it and send a pull request to Linus.... The new head of the for-next branch is commit: 5d54b8c Merge branch 'xfs-misc-fixes-for-4.3-4' into for-next New Commits: Darrick J. Wong (1): [dfdd4ac] libxfs: bad magic number should set da block buffer error Dave Chinner (1): [5d54b8c] Merge branch 'xfs-misc-fixes-for-4.3-4' into for-next David Jeffery (1): [c9eb256] xfs: return errors from partial I/O failures to files Eric Sandeen (1): [1a7ccad] xfs: fix error gotos in xfs_setattr_nonsize Lucas Stach (1): [8774cf8] xfs: add mssing inode cache attempts counter increment Code Diffstat: fs/xfs/libxfs/xfs_da_btree.c | 1 + fs/xfs/xfs_aops.c | 3 ++- fs/xfs/xfs_icache.c | 2 ++ fs/xfs/xfs_iops.c | 8 ++++---- 4 files changed, 9 insertions(+), 5 deletions(-) --=20 Dave Chinner david@fromorbit.com --EXKGNeO8l0xGFBjy Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJV5PcGAAoJEK3oKUf0dfodVVwP/Rjg5o0IWZefUEAjPauQUqk9 F9L7YZc9bvDxDxkG/KBosn1lv3/2+uZdjISa/NjxRn1IVlmdgalhHbz7L7oklWl2 TrM6g266e6NuB5YtB1CxphmWnIhpwl/EN6MhF/DiKBVY3AKmq/MRHGvthCOVamCh 5qnwTrl3O95GZrPsZ+OlcMD2tULXie5Tb1KOU7sq5UE1o2Yb4wEMfJNmW7N/m3Ee d+UMXreFhyzNWgMNAbFr3TyZHegP5+shXITT8h/D9mvXqqePwRbsadrUwjsmhOXQ sufFVEardSvSpHOKY9Y+jRAby5nOcCVxhO0duHxlfMnRazVgSQfdfAdDnsJnXRPV hlsJEaEi7byRlmiKvS2npTk44cH+EOACvH2Wy9FlftMzs5q+cboS9VCXhXqBGHDM TNneHFkdhzPh1JDnMdQFEaDEmKfd+wB2vznH3gO5tgfGf4Zy+KCVd97t6mgIoykW nZtNQe8YyDf5NpLsZZ0u0Ffyw576GPY81EPSpJX52ItcE/aBhMMfsudmt8cTZllG x2V/44ciGeBlUvJgj11ccxQTBdtNZ/XszdWq3dvVLOnLfiEE+2GMFoYKh5IucKCl CbkgzK5t+03I2dIU9peFlHgSAnQQBI8JUYedN+5AzDZtmvdJ1KNM0vgG+JO+Faaf P4BdMFsBG83qHIYM9fgE =jNNi -----END PGP SIGNATURE----- --EXKGNeO8l0xGFBjy-- From qiaojianfeng@unitedstack.com Mon Aug 31 22:55:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7C0ED7F47 for ; Mon, 31 Aug 2015 22:55:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2996DAC003 for ; Mon, 31 Aug 2015 20:55:17 -0700 (PDT) X-ASG-Debug-ID: 1441079715-04bdf06dd70db80001-NocioJ Received: from smtpproxy21.qq.com (smtpproxy21.qq.com [184.105.206.83]) by cuda.sgi.com with ESMTP id rpLyWmeDcouJ5IAZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Aug 2015 20:55:15 -0700 (PDT) X-Barracuda-Envelope-From: qiaojianfeng@unitedstack.com X-Barracuda-Apparent-Source-IP: 184.105.206.83 X-QQ-mid: bizesmtp11t1441079708t389t19 Received: from Jevons-MacBook-Pro.local (unknown [182.48.117.114]) by esmtp4.qq.com (ESMTP) with SMTP id 0 for ; Tue, 01 Sep 2015 11:55:05 +0800 (CST) X-QQ-SSF: 01400000002000F0F332B00A0000000 X-QQ-FEAT: Tp2hW+Mew+f3sjimmSHKFTqO5aL1sujNyX2Ej6DO8DtamlsNu4gA1D91zm07g z8ZkFhSDDPTH2lfNuqAPnpoZnRBhJr625Rr2wvtaT+R7aKsfNTbGSgLor2VW68Pjp3ifswL vakhScvpkOFQRPE7OYLLD/PZfuWYjiRWpLmeuTmZp9fyZbz9TmSv5Bv1jZTiyqr74UqUuxK iZvyEgPw7E2JMXFRUc4F//ic83w+IvHPMEtl64TnLYTaV5zuv2j3CPvDE1BDTQu4= X-QQ-GoodBg: 2 To: xfs@oss.sgi.com From: Jevon Qiao Subject: Ask help on an issue 'XFS (sd*): discard failed for extent, error 5' Message-ID: <55E52198.7070607@unitedstack.com> X-ASG-Orig-Subj: Ask help on an issue 'XFS (sd*): discard failed for extent, error 5' Date: Tue, 1 Sep 2015 11:55:04 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Thunderbird/38.0.1 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------000208040907060202040503" X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpproxy21.qq.com[184.105.206.83] X-Barracuda-Start-Time: 1441079715 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------000208040907060202040503 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi All, Currently, I notice that there are lot's of errors written in the /var/log/messages file. 2015-08-29T23:58:54.477236+00:00 server-68 kernel: sd 0:0:4:0: [sdc] 2015-08-29T23:58:54.477255+00:00 server-68 kernel: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE 2015-08-29T23:58:54.477256+00:00 server-68 kernel: sd 0:0:4:0: [sdc] 2015-08-29T23:58:54.477257+00:00 server-68 kernel: Sense Key : Illegal Request [current] 2015-08-29T23:58:54.477258+00:00 server-68 kernel: sd 0:0:4:0: [sdc] 2015-08-29T23:58:54.477259+00:00 server-68 kernel: Add. Sense: Invalid field in parameter list 2015-08-29T23:58:54.477260+00:00 server-68 kernel: sd 0:0:4:0: [sdc] CDB: 2015-08-29T23:58:54.477261+00:00 server-68 kernel: Unmap/Read sub-channel: 42 00 00 00 00 00 00 00 18 00 2015-08-29T23:58:54.477263+00:00 server-68 kernel: end_request: critical target error, dev sdc, sector 325046824 2015-08-29T23:58:54.477268+00:00 server-68 kernel: XFS (sdc2): discard failed for extent [0x64815,2021], error 5 Has anyone encountered the same issue before? How can you solve it? Thanks, Jevon --------------000208040907060202040503 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit Hi All,

Currently, I notice that there are lot's of errors written in the /var/log/messages file.
2015-08-29T23:58:54.477236+00:00 server-68 kernel: sd 0:0:4:0: [sdc]
2015-08-29T23:58:54.477255+00:00 server-68 kernel: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
2015-08-29T23:58:54.477256+00:00 server-68 kernel: sd 0:0:4:0: [sdc]
2015-08-29T23:58:54.477257+00:00 server-68 kernel: Sense Key : Illegal Request [current]
2015-08-29T23:58:54.477258+00:00 server-68 kernel: sd 0:0:4:0: [sdc]
2015-08-29T23:58:54.477259+00:00 server-68 kernel: Add. Sense: Invalid field in parameter list
2015-08-29T23:58:54.477260+00:00 server-68 kernel: sd 0:0:4:0: [sdc] CDB:
2015-08-29T23:58:54.477261+00:00 server-68 kernel: Unmap/Read sub-channel: 42 00 00 00 00 00 00 00 18 00
2015-08-29T23:58:54.477263+00:00 server-68 kernel: end_request: critical target error, dev sdc, sector 325046824
2015-08-29T23:58:54.477268+00:00 server-68 kernel: XFS (sdc2): discard failed for extent [0x64815,2021], error 5
Has anyone encountered the same issue before? How can you solve it?

Thanks,
Jevon
--------------000208040907060202040503-- From sandeen@sandeen.net Mon Aug 31 23:28:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7AD77F47 for ; Mon, 31 Aug 2015 23:28:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6042304032 for ; Mon, 31 Aug 2015 21:28:40 -0700 (PDT) X-ASG-Debug-ID: 1441081718-04cb6c0e0c0c560001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ax6WKDfHzaVWmRII for ; Mon, 31 Aug 2015 21:28:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1D61763C77A5; Mon, 31 Aug 2015 23:28:38 -0500 (CDT) Subject: Re: Ask help on an issue 'XFS (sd*): discard failed for extent, error 5' To: Jevon Qiao , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Ask help on an issue 'XFS (sd*): discard failed for extent, error 5' References: <55E52198.7070607@unitedstack.com> From: Eric Sandeen Message-ID: <55E52975.8020005@sandeen.net> Date: Mon, 31 Aug 2015 23:28:37 -0500 MIME-Version: 1.0 In-Reply-To: <55E52198.7070607@unitedstack.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1441081718 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.22110 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/31/15 10:55 PM, Jevon Qiao wrote: > Hi All, > > Currently, I notice that there are lot's of errors written in the /var/log/messages file. > > 2015-08-29T23:58:54.477236+00:00 server-68 kernel: sd 0:0:4:0: [sdc] > 2015-08-29T23:58:54.477255+00:00 server-68 kernel: Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE > 2015-08-29T23:58:54.477256+00:00 server-68 kernel: sd 0:0:4:0: [sdc] > 2015-08-29T23:58:54.477257+00:00 server-68 kernel: Sense Key : Illegal Request [current] > 2015-08-29T23:58:54.477258+00:00 server-68 kernel: sd 0:0:4:0: [sdc] > 2015-08-29T23:58:54.477259+00:00 server-68 kernel: Add. Sense: Invalid field in parameter list > 2015-08-29T23:58:54.477260+00:00 server-68 kernel: sd 0:0:4:0: [sdc] CDB: > 2015-08-29T23:58:54.477261+00:00 server-68 kernel: Unmap/Read sub-channel: 42 00 00 00 00 00 00 00 18 00 > 2015-08-29T23:58:54.477263+00:00 server-68 kernel: end_request: critical target error, dev sdc, sector 325046824 > 2015-08-29T23:58:54.477268+00:00 server-68 kernel: XFS (sdc2): discard failed for extent [0x64815,2021], error 5 > > Has anyone encountered the same issue before? How can you solve it? Looks like xfs is simply reacting to errors from the storage; I'd try to get to the bottom of why you're getting all those scsi errors. But probably not on the xfs list. :) -Eric > Thanks, > Jevon > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >